diff options
970 files changed, 51369 insertions, 33164 deletions
diff --git a/AUTHORS.md b/AUTHORS.md index 43b4917382..430bb2dcd4 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -36,6 +36,7 @@ name is available. Andy Moss (MillionOstrich) Anish Bhobe (KidRigger) Anton Yabchinskiy (a12n) + Anutrix Aren Villanueva (kurikaesu) Ariel Manzur (punto-) Bastiaan Olij (BastiaanOlij) @@ -68,6 +69,7 @@ name is available. Gerrit Großkopf (Grosskopf) Gilles Roudiere (groud) Guilherme Felipe de C. G. da Silva (guilhermefelipecgs) + Hanif A (hbina) Hein-Pieter van Braam (hpvb) Hiroshi Ogawa (hi-ogawa) homer666 @@ -128,6 +130,7 @@ name is available. romulox-x Ruslan Mustakov (endragor) Saniko (sanikoyes) + santouits SaracenOne sersoong Simon Wenner (swenner) diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index 326581a492..94e182e47e 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -165,12 +165,12 @@ License: Expat and Bitstream Vera Fonts Copyright Files: ./thirdparty/freetype/ Comment: The FreeType Project -Copyright: 1996-2018, David Turner, Robert Wilhelm, and Werner Lemberg. +Copyright: 1996-2019, David Turner, Robert Wilhelm, and Werner Lemberg. License: FTL Files: ./thirdparty/glad/ Comment: glad -Copyright: 2013-2018, David Herberth +Copyright: 2013-2019, David Herberth License: Expat Files: ./thirdparty/jpeg_compressor/ @@ -301,7 +301,7 @@ License: BSD-3-clause Files: ./thirdparty/misc/stb_truetype.h ./thirdparty/misc/stb_vorbis.c Comment: stb libraries -Copyright: 2007-2017, Sean Barrett +Copyright: 2007-2019, Sean Barrett License: public-domain Files: ./thirdparty/misc/triangulator.cpp @@ -330,8 +330,8 @@ License: BSD-3-clause Files: ./thirdparty/pcre2/ Comment: PCRE2 -Copyright: 1997-2018, University of Cambridge, - 2009-2018, Zoltan Herczeg +Copyright: 1997-2019, University of Cambridge, + 2009-2019, Zoltan Herczeg License: BSD-3-clause Files: ./thirdparty/pvrtccompressor/ @@ -351,7 +351,7 @@ License: Expat Files: ./thirdparty/tinyexr/ Comment: TinyEXR -Copyright: 2014-2018, Syoyo Fujita +Copyright: 2014-2019, Syoyo Fujita 2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC License: BSD-3-clause @@ -20,8 +20,8 @@ generous deed immortalized in the next stable release of Godot Engine. ## Mini sponsors + AD Ford Alan Beauchamp - Aleksandar Kordic Anandarup Mallik Andrew Dunai Brandon Lamb @@ -30,8 +30,10 @@ generous deed immortalized in the next stable release of Godot Engine. Christoph Woinke Denis Malyavin Edward Flick + Gamechuck GameDev.net GameDev.tv + Grady Hein-Pieter van Braam Jacob McKenney Javary Co. @@ -46,7 +48,6 @@ generous deed immortalized in the next stable release of Godot Engine. Patrick Aarstad Slobodan Milnovic Stephan Lanfermann - Stephen Telford Steve VilliHaukka Xananax @@ -59,7 +60,6 @@ generous deed immortalized in the next stable release of Godot Engine. David Gehrig Ed Morley Florian Krick - Grady Jakub Grzesik K9Kraken Manuele Finocchiaro @@ -77,11 +77,14 @@ generous deed immortalized in the next stable release of Godot Engine. Carlo Cabanilla Daniel James David Giardi + David Snopek Edward E Florian Breisch Gero + GiulianoB Javier Roman Jay Horton + Jonathan Turner Jon Smith Jon Woodward Justo Delgado Baudà @@ -89,13 +92,12 @@ generous deed immortalized in the next stable release of Godot Engine. Kommentgames Krzysztof Dluzniewski Luke + Maciej Pendolski Moonwards Mored1984 - paul gruenbacher Paul LaMotte Péter Magyar Rob Messick - Ross Esmond Ryan Badour Scott Wadden Sergey @@ -103,7 +105,6 @@ generous deed immortalized in the next stable release of Godot Engine. Svenne Krap Tom Langwaldt William Wold - Wyatt Goodin Alex Khayrullin Chris Goddard @@ -115,6 +116,7 @@ generous deed immortalized in the next stable release of Godot Engine. Ian Richard Kunert Ivan Trombley Joan Fons + Joshua Flores Krzysztof Jankowski Lord Bloodhound Lucas Ferreira Franca @@ -135,7 +137,6 @@ generous deed immortalized in the next stable release of Godot Engine. Xavier PATRICELLI Adam Neumann - Alessandra Pereyra Alexander J Maynard Alexey Dyadchenko Andrew Bowen @@ -150,7 +151,6 @@ generous deed immortalized in the next stable release of Godot Engine. Daniel Daniel Eichler David White - Deadly Lampshade Eric Eric Monson Eugenio Hugo Salgüero Jáñez @@ -158,7 +158,6 @@ generous deed immortalized in the next stable release of Godot Engine. Francisco Javier Moreno Carracedo gavlig GGGames.org - Giles Montgomery Guilherme Felipe de C. G. da Silva Heath Hayes Hysteria @@ -166,14 +165,12 @@ generous deed immortalized in the next stable release of Godot Engine. Jared White Jesse Nave Jose Malheiro - Joshua Flores Joshua Lesperance Juan T Chen Juraj Móza Kasper Jeppesen Klaus The. Klavdij Voncina - Leandro Voltolino Maarten Elings Markus Fehr Markus Wiesner @@ -190,6 +187,7 @@ generous deed immortalized in the next stable release of Godot Engine. Paul Hocker Paul Von Zimmerman Pete Goodwin + pl Ranoller Samuel Judd Scott Pilet @@ -198,37 +196,37 @@ generous deed immortalized in the next stable release of Godot Engine. Thomas Krampl Tobias Bocanegra Urho - WytRabbit Xavier Fumado Beltran ## Silver donors 1D_Inc + Abby Jones Abraham Haskins Adam Brunnmeier Adam Carr Adam Nakonieczny Adam Smeltzer Adisibio + Adrian Demetrescu Agustinus Arya Aidan O'Flannagain + Albin Jonasson Svärdsby Alder Stefano Alessandro Senese - Alexander Gillberg Alexander Koppe Alex Davies-Moore - Alice Robinson Andreas Evers Andreas Krampitz + Andreas Lundmark Andreas Schüle - Andrew Peart + Andrés RodrÃguez + Andrzej Skalski Anthony Bongiovanni Anthony Staunton Antony K. Jones Arda Erol - Artem Bashev Arthur S. Muszynski - Artistofdeath Aubrey Falconer Avencherus B A @@ -238,8 +236,6 @@ generous deed immortalized in the next stable release of Godot Engine. Benedikt Ben Phelan Ben Vercammen - Ben Woodley - Berbank Bernd Jänichen Black Block Blair Allen @@ -261,9 +257,9 @@ generous deed immortalized in the next stable release of Godot Engine. Collin Shooltz Dag Sundin Söderström Daniel Johnson + DanielMaximiano Daniel Reed - Danny Welch - Dave Watts + Daniel Tebbutt David Bullock David Cravens David May @@ -330,20 +326,23 @@ generous deed immortalized in the next stable release of Godot Engine. Josh 'Cheeseness' Bush Juanfran Juan Negrier + Juan Velandia Judd Jueast Julian Murgia + Kamuna Kasier Bald0 KC Chan + Keedong Park kickmaniac Kiyohiro Kawamura (kyorohiro) + Kjetil Haugland Klagsam Klassix KR McGinley KsyTek Games Kuan Cheang kycho - Leviathan Hunter Levi Lindsey Linus Lind Lundgren Lionel Gaillard @@ -357,6 +356,7 @@ generous deed immortalized in the next stable release of Godot Engine. Malik Nejer Marc Urlus Marcus Richter + Markus Lohaus Markus Michael Egger Martin Holas Matthew Little @@ -365,6 +365,7 @@ generous deed immortalized in the next stable release of Godot Engine. mhilbrunner Michael Dürwald Michael Gringauz + Michael Haney Michael Labbe Mikael Olsson Mikayla Hutchinson @@ -372,7 +373,6 @@ generous deed immortalized in the next stable release of Godot Engine. Mitchell J. Wagner mlevin cantu MoM - Moritz Laass MuffinManKen Natrim nee @@ -382,9 +382,11 @@ generous deed immortalized in the next stable release of Godot Engine. Niclas Eriksen Nicolás Montaña Nicolas SAN AGUSTIN + Nima Farid Nithin Jino NZ Omar Delarosa + omzee Oscar Norlander Pafka Pan Ip @@ -393,16 +395,19 @@ generous deed immortalized in the next stable release of Godot Engine. Paul Gieske Paul Mason PaweÅ‚ Kowal - Philip O. Staiger Pierre-Igor Berthet Pietro Vertechi Pitsanu Tongprasin Point08 Poryg + Rafael Delboni Rafa Laguna Rafal Wyszomirski + rainerLinux Raphael Leroux + Remi Rampin Rémi Verschelde + Rezgi Ricardo Alcantara Robert Farr (Larington) Robert Hernandez @@ -410,6 +415,8 @@ generous deed immortalized in the next stable release of Godot Engine. Roger Smith Roland RzÄ…sa Roman Tinkov + Ryan + Ryan Brooks Ryan Groom Ryan Hentz Saad Khoudmi @@ -418,6 +425,7 @@ generous deed immortalized in the next stable release of Godot Engine. Sasori Olkof Scott D. Yelich Sebastian Michailidis + sgnsajgon Shane Sicienski Shane Spoor Simon Ledam @@ -425,16 +433,14 @@ generous deed immortalized in the next stable release of Godot Engine. SK Sootstone Stonepyre - Thibault Barbaroux + Taylor Fahlman thomas Thomas Bell Thomas Kelly Thomas Kurz tiansheng li - Tim Tim Drumheller Tim Gudex - Timo Schmidt Timothy B. MacDonald Tobbun Tom Larrow @@ -446,8 +452,6 @@ generous deed immortalized in the next stable release of Godot Engine. Tyler Stafos UltyX Vaiktorg - Valeria Viana Gusmao - Veodok Victor Vigilant Watch waka nya @@ -457,7 +461,8 @@ generous deed immortalized in the next stable release of Godot Engine. Will William Hogben Wout Standaert - Yeung Si Xiang + Wyatt Goodin + Yegor ## Bronze donors diff --git a/SConstruct b/SConstruct index 7b0c644aea..aa5e3a98c8 100644 --- a/SConstruct +++ b/SConstruct @@ -311,6 +311,10 @@ if selected_platform in platform_list: # must happen after the flags, so when flags are used by configure, stuff happens (ie, ssl on x11) detect.configure(env) + # Enable C++11 support + if not env.msvc: + env.Append(CXXFLAGS=['-std=c++11']) + # Configure compiler warnings if env.msvc: # Truncations, narrowing conversions, signed/unsigned comparisons... @@ -422,7 +426,7 @@ if selected_platform in platform_list: if (can_build): config.configure(env) env.module_list.append(x) - + # Get doc classes paths (if present) try: doc_classes = config.get_doc_classes() @@ -522,13 +526,23 @@ if selected_platform in platform_list: env.AppendUnique(CPPDEFINES=[header[1]]) elif selected_platform != "": + if selected_platform == "list": + print("The following platforms are available:\n") + else: + print('Invalid target platform "' + selected_platform + '".') + print("The following platforms were detected:\n") - print("Invalid target platform: " + selected_platform) - print("The following platforms were detected:") for x in platform_list: print("\t" + x) + print("\nPlease run SCons again and select a valid platform: platform=<string>") + if selected_platform == "list": + # Exit early to suppress the rest of the built-in SCons messages + sys.exit(0) + else: + sys.exit(255) + # The following only makes sense when the env is defined, and assumes it is if 'env' in locals(): screen = sys.stdout diff --git a/core/SCsub b/core/SCsub index bf1b34bebe..85e5f1b089 100644 --- a/core/SCsub +++ b/core/SCsub @@ -142,7 +142,7 @@ env.Depends("#core/io/certs_compressed.gen.h", ["#thirdparty/certs/ca-certificat env.CommandNoCache("#core/io/certs_compressed.gen.h", "#thirdparty/certs/ca-certificates.crt", run_in_subprocess(core_builders.make_certs_header)) # Make binders -env.CommandNoCache(['method_bind.gen.inc', 'method_bind_ext.gen.inc'], 'make_binders.py', run_in_subprocess(make_binders.run)) +env.CommandNoCache(['method_bind.gen.inc', 'method_bind_ext.gen.inc', 'method_bind_free_func.gen.inc'], 'make_binders.py', run_in_subprocess(make_binders.run)) # Authors env.Depends('#core/authors.gen.h', "../AUTHORS.md") diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index 34bbdb2c75..b41b84ab1e 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -2941,6 +2941,10 @@ float _Engine::get_physics_jitter_fix() const { return Engine::get_singleton()->get_physics_jitter_fix(); } +float _Engine::get_physics_interpolation_fraction() const { + return Engine::get_singleton()->get_physics_interpolation_fraction(); +} + void _Engine::set_target_fps(int p_fps) { Engine::get_singleton()->set_target_fps(p_fps); } @@ -3029,6 +3033,7 @@ void _Engine::_bind_methods() { ClassDB::bind_method(D_METHOD("get_iterations_per_second"), &_Engine::get_iterations_per_second); ClassDB::bind_method(D_METHOD("set_physics_jitter_fix", "physics_jitter_fix"), &_Engine::set_physics_jitter_fix); ClassDB::bind_method(D_METHOD("get_physics_jitter_fix"), &_Engine::get_physics_jitter_fix); + ClassDB::bind_method(D_METHOD("get_physics_interpolation_fraction"), &_Engine::get_physics_interpolation_fraction); ClassDB::bind_method(D_METHOD("set_target_fps", "target_fps"), &_Engine::set_target_fps); ClassDB::bind_method(D_METHOD("get_target_fps"), &_Engine::get_target_fps); diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 3be5a08752..f0f86e003f 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -746,6 +746,7 @@ public: void set_physics_jitter_fix(float p_threshold); float get_physics_jitter_fix() const; + float get_physics_interpolation_fraction() const; void set_target_fps(int p_fps); int get_target_fps() const; diff --git a/core/class_db.cpp b/core/class_db.cpp index 2cbf53ba0b..49e3f94d8f 100644 --- a/core/class_db.cpp +++ b/core/class_db.cpp @@ -480,6 +480,7 @@ uint64_t ClassDB::get_api_hash(APIType p_api) { for (List<StringName>::Element *F = snames.front(); F; F = F->next()) { PropertySetGet *psg = t->property_setget.getptr(F->get()); + ERR_FAIL_COND_V(!psg, 0); hash = hash_djb2_one_64(F->get().hash(), hash); hash = hash_djb2_one_64(psg->setter.hash(), hash); @@ -1148,7 +1149,7 @@ Variant::Type ClassDB::get_property_type(const StringName &p_class, const String return Variant::NIL; } -StringName ClassDB::get_property_setter(StringName p_class, const StringName p_property) { +StringName ClassDB::get_property_setter(StringName p_class, const StringName &p_property) { ClassInfo *type = classes.getptr(p_class); ClassInfo *check = type; @@ -1165,7 +1166,7 @@ StringName ClassDB::get_property_setter(StringName p_class, const StringName p_p return StringName(); } -StringName ClassDB::get_property_getter(StringName p_class, const StringName p_property) { +StringName ClassDB::get_property_getter(StringName p_class, const StringName &p_property) { ClassInfo *type = classes.getptr(p_class); ClassInfo *check = type; diff --git a/core/class_db.h b/core/class_db.h index 237ae9b806..3d9a695f02 100644 --- a/core/class_db.h +++ b/core/class_db.h @@ -337,8 +337,8 @@ public: static bool has_property(const StringName &p_class, const StringName &p_property, bool p_no_inheritance = false); static int get_property_index(const StringName &p_class, const StringName &p_property, bool *r_is_valid = NULL); static Variant::Type get_property_type(const StringName &p_class, const StringName &p_property, bool *r_is_valid = NULL); - static StringName get_property_setter(StringName p_class, const StringName p_property); - static StringName get_property_getter(StringName p_class, const StringName p_property); + static StringName get_property_setter(StringName p_class, const StringName &p_property); + static StringName get_property_getter(StringName p_class, const StringName &p_property); static bool has_method(StringName p_class, StringName p_method, bool p_no_inheritance = false); static void set_method_flags(StringName p_class, StringName p_method, int p_flags); diff --git a/core/engine.cpp b/core/engine.cpp index 2d8473fbd9..0dd0459403 100644 --- a/core/engine.cpp +++ b/core/engine.cpp @@ -227,6 +227,7 @@ Engine::Engine() { frames_drawn = 0; ips = 60; physics_jitter_fix = 0.5; + _physics_interpolation_fraction = 0.0f; _frame_delay = 0; _fps = 1; _target_fps = 0; diff --git a/core/engine.h b/core/engine.h index 15665fee29..192e8e67a0 100644 --- a/core/engine.h +++ b/core/engine.h @@ -63,6 +63,7 @@ private: float _time_scale; bool _pixel_snap; uint64_t _physics_frames; + float _physics_interpolation_fraction; uint64_t _idle_frames; bool _in_physics; @@ -95,6 +96,7 @@ public: bool is_in_physics_frame() const { return _in_physics; } uint64_t get_idle_frame_ticks() const { return _frame_ticks; } float get_idle_frame_step() const { return _frame_step; } + float get_physics_interpolation_fraction() const { return _physics_interpolation_fraction; } void set_time_scale(float p_scale); float get_time_scale() const; diff --git a/core/image.cpp b/core/image.cpp index a88395204a..10778eced6 100644 --- a/core/image.cpp +++ b/core/image.cpp @@ -240,27 +240,27 @@ int Image::get_format_block_size(Format p_format) { case FORMAT_RGTC_RG: { //bc5 case case FORMAT_DXT1: return 4; - } break; + } case FORMAT_PVRTC2: case FORMAT_PVRTC2A: { return 4; - } break; + } case FORMAT_PVRTC4A: case FORMAT_PVRTC4: { return 4; - } break; + } case FORMAT_ETC: { return 4; - } break; + } case FORMAT_BPTC_RGBA: case FORMAT_BPTC_RGBF: case FORMAT_BPTC_RGBFU: { return 4; - } break; + } case FORMAT_ETC2_R11: //etc2 case FORMAT_ETC2_R11S: //signed: NOT srgb. case FORMAT_ETC2_RG11: @@ -270,7 +270,7 @@ int Image::get_format_block_size(Format p_format) { case FORMAT_ETC2_RGB8A1: { return 4; - } break; + } default: { } } @@ -852,7 +852,7 @@ static void _scale_lanczos(const uint8_t *__restrict p_src, uint8_t *__restrict static void _overlay(const uint8_t *__restrict p_src, uint8_t *__restrict p_dst, float p_alpha, uint32_t p_width, uint32_t p_height, uint32_t p_pixel_size) { - uint16_t alpha = CLAMP((uint16_t)(p_alpha * 256.0f), 0, 256); + uint16_t alpha = MIN((uint16_t)(p_alpha * 256.0f), 256); for (uint32_t i = 0; i < p_width * p_height * p_pixel_size; i++) { @@ -2421,38 +2421,36 @@ Color Image::get_pixel(int p_x, int p_y) const { case FORMAT_L8: { float l = ptr[ofs] / 255.0; return Color(l, l, l, 1); - } break; + } case FORMAT_LA8: { float l = ptr[ofs * 2 + 0] / 255.0; float a = ptr[ofs * 2 + 1] / 255.0; return Color(l, l, l, a); - } break; + } case FORMAT_R8: { float r = ptr[ofs] / 255.0; return Color(r, 0, 0, 1); - } break; + } case FORMAT_RG8: { float r = ptr[ofs * 2 + 0] / 255.0; float g = ptr[ofs * 2 + 1] / 255.0; return Color(r, g, 0, 1); - } break; + } case FORMAT_RGB8: { float r = ptr[ofs * 3 + 0] / 255.0; float g = ptr[ofs * 3 + 1] / 255.0; float b = ptr[ofs * 3 + 2] / 255.0; return Color(r, g, b, 1); - - } break; + } case FORMAT_RGBA8: { float r = ptr[ofs * 4 + 0] / 255.0; float g = ptr[ofs * 4 + 1] / 255.0; float b = ptr[ofs * 4 + 2] / 255.0; float a = ptr[ofs * 4 + 3] / 255.0; return Color(r, g, b, a); - - } break; + } case FORMAT_RGBA4444: { uint16_t u = ((uint16_t *)ptr)[ofs]; float r = (u & 0xF) / 15.0; @@ -2460,8 +2458,7 @@ Color Image::get_pixel(int p_x, int p_y) const { float b = ((u >> 8) & 0xF) / 15.0; float a = ((u >> 12) & 0xF) / 15.0; return Color(r, g, b, a); - - } break; + } case FORMAT_RGBA5551: { uint16_t u = ((uint16_t *)ptr)[ofs]; @@ -2470,25 +2467,25 @@ Color Image::get_pixel(int p_x, int p_y) const { float b = ((u >> 10) & 0x1F) / 15.0; float a = ((u >> 15) & 0x1) / 1.0; return Color(r, g, b, a); - } break; + } case FORMAT_RF: { float r = ((float *)ptr)[ofs]; return Color(r, 0, 0, 1); - } break; + } case FORMAT_RGF: { float r = ((float *)ptr)[ofs * 2 + 0]; float g = ((float *)ptr)[ofs * 2 + 1]; return Color(r, g, 0, 1); - } break; + } case FORMAT_RGBF: { float r = ((float *)ptr)[ofs * 3 + 0]; float g = ((float *)ptr)[ofs * 3 + 1]; float b = ((float *)ptr)[ofs * 3 + 2]; return Color(r, g, b, 1); - } break; + } case FORMAT_RGBAF: { float r = ((float *)ptr)[ofs * 4 + 0]; @@ -2496,25 +2493,25 @@ Color Image::get_pixel(int p_x, int p_y) const { float b = ((float *)ptr)[ofs * 4 + 2]; float a = ((float *)ptr)[ofs * 4 + 3]; return Color(r, g, b, a); - } break; + } case FORMAT_RH: { uint16_t r = ((uint16_t *)ptr)[ofs]; return Color(Math::half_to_float(r), 0, 0, 1); - } break; + } case FORMAT_RGH: { uint16_t r = ((uint16_t *)ptr)[ofs * 2 + 0]; uint16_t g = ((uint16_t *)ptr)[ofs * 2 + 1]; return Color(Math::half_to_float(r), Math::half_to_float(g), 0, 1); - } break; + } case FORMAT_RGBH: { uint16_t r = ((uint16_t *)ptr)[ofs * 3 + 0]; uint16_t g = ((uint16_t *)ptr)[ofs * 3 + 1]; uint16_t b = ((uint16_t *)ptr)[ofs * 3 + 2]; return Color(Math::half_to_float(r), Math::half_to_float(g), Math::half_to_float(b), 1); - } break; + } case FORMAT_RGBAH: { uint16_t r = ((uint16_t *)ptr)[ofs * 4 + 0]; @@ -2522,18 +2519,15 @@ Color Image::get_pixel(int p_x, int p_y) const { uint16_t b = ((uint16_t *)ptr)[ofs * 4 + 2]; uint16_t a = ((uint16_t *)ptr)[ofs * 4 + 3]; return Color(Math::half_to_float(r), Math::half_to_float(g), Math::half_to_float(b), Math::half_to_float(a)); - } break; + } case FORMAT_RGBE9995: { return Color::from_rgbe9995(((uint32_t *)ptr)[ofs]); - - } break; + } default: { ERR_EXPLAIN("Can't get_pixel() on compressed image, sorry."); ERR_FAIL_V(Color()); } } - - return Color(); } void Image::set_pixelv(const Point2 &p_dst, const Color &p_color) { diff --git a/core/input_map.cpp b/core/input_map.cpp index 04911787a8..165999f081 100644 --- a/core/input_map.cpp +++ b/core/input_map.cpp @@ -202,7 +202,7 @@ bool InputMap::event_get_action_status(const Ref<InputEvent> &p_event, const Str if (p_pressed != NULL) *p_pressed = input_event_action->is_pressed(); if (p_strength != NULL) - *p_strength = (*p_pressed) ? input_event_action->get_strength() : 0.0f; + *p_strength = (p_pressed != NULL && *p_pressed) ? input_event_action->get_strength() : 0.0f; return input_event_action->get_action() == p_action; } diff --git a/core/io/packet_peer.cpp b/core/io/packet_peer.cpp index c77c81f9e2..1e4ea715b3 100644 --- a/core/io/packet_peer.cpp +++ b/core/io/packet_peer.cpp @@ -110,10 +110,11 @@ Error PacketPeer::put_var(const Variant &p_packet, bool p_full_objects) { Variant PacketPeer::_bnd_get_var(bool p_allow_objects) { Variant var; - get_var(var, p_allow_objects); + Error err = get_var(var, p_allow_objects); + ERR_FAIL_COND_V(err != OK, Variant()); return var; -}; +} Error PacketPeer::_put_packet(const PoolVector<uint8_t> &p_buffer) { return put_packet_buffer(p_buffer); diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index 861e34e415..146480e5a2 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -712,14 +712,14 @@ Error ResourceInteractiveLoaderBinary::poll() { if (!obj) { error = ERR_FILE_CORRUPT; ERR_EXPLAIN(local_path + ":Resource of unrecognized type in file: " + t); + ERR_FAIL_V(ERR_FILE_CORRUPT); } - ERR_FAIL_COND_V(!obj, ERR_FILE_CORRUPT); Resource *r = Object::cast_to<Resource>(obj); if (!r) { error = ERR_FILE_CORRUPT; - memdelete(obj); //bye ERR_EXPLAIN(local_path + ":Resource type in resource field not a resource, type is: " + obj->get_class()); + memdelete(obj); //bye ERR_FAIL_V(ERR_FILE_CORRUPT); } diff --git a/core/io/resource_saver.cpp b/core/io/resource_saver.cpp index 0cecca904d..e2c1c3402a 100644 --- a/core/io/resource_saver.cpp +++ b/core/io/resource_saver.cpp @@ -137,7 +137,6 @@ Error ResourceSaver::save(const String &p_path, const RES &p_resource, uint32_t save_callback(p_resource, p_path); return OK; - } else { } } diff --git a/core/io/stream_peer.cpp b/core/io/stream_peer.cpp index acf72dbba5..84b8554d54 100644 --- a/core/io/stream_peer.cpp +++ b/core/io/stream_peer.cpp @@ -369,7 +369,9 @@ Variant StreamPeer::get_var(bool p_allow_objects) { ERR_FAIL_COND_V(err != OK, Variant()); Variant ret; - decode_variant(ret, var.ptr(), len, NULL, p_allow_objects); + err = decode_variant(ret, var.ptr(), len, NULL, p_allow_objects); + ERR_FAIL_COND_V(err != OK, Variant()); + return ret; } diff --git a/core/make_binders.py b/core/make_binders.py index 5c1c66cab6..c38db5cef4 100644 --- a/core/make_binders.py +++ b/core/make_binders.py @@ -191,6 +191,96 @@ MethodBind* create_method_bind($ifret R$ $ifnoret void$ (T::*p_method)($arg, P@$ """ +template_typed_free_func = """ +#ifdef TYPED_METHOD_BIND +template<class T $ifret ,class R$ $ifargs ,$ $arg, class P@$> +class FunctionBind$argc$$ifret R$$ifconst C$ : public MethodBind { +public: + + $ifret R$ $ifnoret void$ (*method) ($ifconst const$ T *$ifargs , $$arg, P@$); +#ifdef DEBUG_METHODS_ENABLED + virtual Variant::Type _gen_argument_type(int p_arg) const { return _get_argument_type(p_arg); } + virtual GodotTypeInfo::Metadata get_argument_meta(int p_arg) const { + $ifret if (p_arg==-1) return GetTypeInfo<R>::METADATA;$ + $arg if (p_arg==(@-1)) return GetTypeInfo<P@>::METADATA; + $ + return GodotTypeInfo::METADATA_NONE; + } + Variant::Type _get_argument_type(int p_argument) const { + $ifret if (p_argument==-1) return (Variant::Type)GetTypeInfo<R>::VARIANT_TYPE;$ + $arg if (p_argument==(@-1)) return (Variant::Type)GetTypeInfo<P@>::VARIANT_TYPE; + $ + return Variant::NIL; + } + virtual PropertyInfo _gen_argument_type_info(int p_argument) const { + $ifret if (p_argument==-1) return GetTypeInfo<R>::get_class_info();$ + $arg if (p_argument==(@-1)) return GetTypeInfo<P@>::get_class_info(); + $ + return PropertyInfo(); + } +#endif + virtual String get_instance_class() const { + return T::get_class_static(); + } + + virtual Variant call(Object* p_object,const Variant** p_args,int p_arg_count, Variant::CallError& r_error) { + + T *instance=Object::cast_to<T>(p_object); + r_error.error=Variant::CallError::CALL_OK; +#ifdef DEBUG_METHODS_ENABLED + + ERR_FAIL_COND_V(!instance,Variant()); + if (p_arg_count>get_argument_count()) { + r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; + r_error.argument=get_argument_count(); + return Variant(); + + } + if (p_arg_count<(get_argument_count()-get_default_argument_count())) { + + r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; + r_error.argument=get_argument_count()-get_default_argument_count(); + return Variant(); + } + $arg CHECK_ARG(@); + $ +#endif + $ifret Variant ret = $(method)(instance$ifargs , $$arg, _VC(@)$); + $ifret return Variant(ret);$ + $ifnoret return Variant();$ + } + +#ifdef PTRCALL_ENABLED + virtual void ptrcall(Object*p_object,const void** p_args,void *r_ret) { + + T *instance=Object::cast_to<T>(p_object); + $ifret PtrToArg<R>::encode( $ (method)(instance$ifargs , $$arg, PtrToArg<P@>::convert(p_args[@-1])$) $ifret ,r_ret)$ ; + } +#endif + FunctionBind$argc$$ifret R$$ifconst C$ () { +#ifdef DEBUG_METHODS_ENABLED + _set_const($ifconst true$$ifnoconst false$); + _generate_argument_types($argc$); +#else + set_argument_count($argc$); +#endif + + $ifret _set_returns(true); $ + }; +}; + +template<class T $ifret ,class R$ $ifargs ,$ $arg, class P@$> +MethodBind* create_method_bind($ifret R$ $ifnoret void$ (*p_method)($ifconst const$ T *$ifargs , $$arg, P@$) ) { + + FunctionBind$argc$$ifret R$$ifconst C$<T $ifret ,R$ $ifargs ,$ $arg, P@$> * a = memnew( (FunctionBind$argc$$ifret R$$ifconst C$<T $ifret ,R$ $ifargs ,$ $arg, P@$>) ); + a->method=p_method; + return a; +} +#endif +""" + + + def make_version(template, nargs, argmax, const, ret): intext = template @@ -244,9 +334,6 @@ def make_version(template, nargs, argmax, const, ret): elif (cmd == "noarg"): for i in range(nargs + 1, argmax + 1): outtext += data.replace("@", str(i)) - elif (cmd == "noarg"): - for i in range(nargs + 1, argmax + 1): - outtext += data.replace("@", str(i)) from_pos = end + 1 @@ -259,6 +346,9 @@ def run(target, source, env): versions_ext = 6 text = "" text_ext = "" + text_free_func = "#ifndef METHOD_BIND_FREE_FUNC_H\n#define METHOD_BIND_FREE_FUNC_H\n" + text_free_func += "\n//including this header file allows method binding to use free functions\n" + text_free_func += "//note that the free function must have a pointer to an instance of the class as its first parameter\n" for i in range(0, versions + 1): @@ -276,12 +366,22 @@ def run(target, source, env): else: text += t + text_free_func += make_version(template_typed_free_func, i, versions, False, False) + text_free_func += make_version(template_typed_free_func, i, versions, False, True) + text_free_func += make_version(template_typed_free_func, i, versions, True, False) + text_free_func += make_version(template_typed_free_func, i, versions, True, True) + + text_free_func += "#endif" + with open(target[0], "w") as f: f.write(text) with open(target[1], "w") as f: f.write(text_ext) + with open(target[2], "w") as f: + f.write(text_free_func) + if __name__ == '__main__': from platform_methods import subprocess_main diff --git a/core/map.h b/core/map.h index a701ba36f7..c8197639f2 100644 --- a/core/map.h +++ b/core/map.h @@ -38,7 +38,7 @@ */ // based on the very nice implementation of rb-trees by: -// http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html +// https://web.archive.org/web/20120507164830/http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html template <class K, class V, class C = Comparator<K>, class A = DefaultAllocator> class Map { diff --git a/core/math/SCsub b/core/math/SCsub index aa98c34f79..0995298a4b 100644 --- a/core/math/SCsub +++ b/core/math/SCsub @@ -22,7 +22,7 @@ if not has_module: env_thirdparty = env_math.Clone() env_thirdparty.disable_warnings() # Custom config file - env_thirdparty.Append(CPPDEFINES=[('MBEDTLS_CONFIG_FILE', "thirdparty/mbedtls/include/godot_core_mbedtls_config.h")]) + env_thirdparty.Append(CPPDEFINES=[('MBEDTLS_CONFIG_FILE', '\\"thirdparty/mbedtls/include/godot_core_mbedtls_config.h\\"')]) thirdparty_mbedtls_dir = "#thirdparty/mbedtls/library/" thirdparty_mbedtls_sources = [ "aes.c", diff --git a/core/math/basis.cpp b/core/math/basis.cpp index 1540bc8fe1..400f342018 100644 --- a/core/math/basis.cpp +++ b/core/math/basis.cpp @@ -852,7 +852,7 @@ void Basis::set_quat_scale(const Quat &p_quat, const Vector3 &p_scale) { rotate(p_quat); } -void Basis::set_diagonal(const Vector3 p_diag) { +void Basis::set_diagonal(const Vector3 &p_diag) { elements[0][0] = p_diag.x; elements[0][1] = 0; elements[0][2] = 0; diff --git a/core/math/basis.h b/core/math/basis.h index 75037c2c52..d3adad3d90 100644 --- a/core/math/basis.h +++ b/core/math/basis.h @@ -153,7 +153,7 @@ public: int get_orthogonal_index() const; void set_orthogonal_index(int p_index); - void set_diagonal(const Vector3 p_diag); + void set_diagonal(const Vector3 &p_diag); bool is_orthogonal() const; bool is_diagonal() const; diff --git a/core/math/bsp_tree.cpp b/core/math/bsp_tree.cpp index a12f9fee2e..cfa698282e 100644 --- a/core/math/bsp_tree.cpp +++ b/core/math/bsp_tree.cpp @@ -192,7 +192,7 @@ int BSP_Tree::get_points_inside(const Vector3 *p_points, int p_point_count) cons #ifdef DEBUG_ENABLED int plane_count = planes.size(); uint16_t plane = nodesptr[idx].plane; - ERR_FAIL_INDEX_V(plane, plane_count, false); + ERR_FAIL_UNSIGNED_INDEX_V(plane, plane_count, false); #endif idx = planesptr[nodesptr[idx].plane].is_point_over(point) ? nodes[idx].over : nodes[idx].under; @@ -258,7 +258,7 @@ bool BSP_Tree::point_is_inside(const Vector3 &p_point) const { #ifdef DEBUG_ENABLED int plane_count = planes.size(); uint16_t plane = nodesptr[idx].plane; - ERR_FAIL_INDEX_V(plane, plane_count, false); + ERR_FAIL_UNSIGNED_INDEX_V(plane, plane_count, false); #endif bool over = planesptr[nodesptr[idx].plane].is_point_over(p_point); diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp index 8b3b6c82f3..30c0cab909 100644 --- a/core/math/camera_matrix.cpp +++ b/core/math/camera_matrix.cpp @@ -302,8 +302,8 @@ Vector<Plane> CameraMatrix::get_projection_planes(const Transform &p_transform) /** Fast Plane Extraction from combined modelview/projection matrices. * References: - * http://www.markmorley.com/opengl/frustumculling.html - * http://www2.ravensoft.com/users/ggribb/plane%20extraction.pdf + * https://web.archive.org/web/20011221205252/http://www.markmorley.com/opengl/frustumculling.html + * https://web.archive.org/web/20061020020112/http://www2.ravensoft.com/users/ggribb/plane%20extraction.pdf */ Vector<Plane> planes; diff --git a/core/math/expression.cpp b/core/math/expression.cpp index b52658e2cf..15eea1d308 100644 --- a/core/math/expression.cpp +++ b/core/math/expression.cpp @@ -52,6 +52,7 @@ const char *Expression::func_name[Expression::FUNC_MAX] = { "sqrt", "fmod", "fposmod", + "posmod", "floor", "ceil", "round", @@ -67,6 +68,7 @@ const char *Expression::func_name[Expression::FUNC_MAX] = { "step_decimals", "stepify", "lerp", + "lerp_angle", "inverse_lerp", "range_lerp", "smoothstep", @@ -175,6 +177,7 @@ int Expression::get_func_argument_count(BuiltinFunc p_func) { case MATH_ATAN2: case MATH_FMOD: case MATH_FPOSMOD: + case MATH_POSMOD: case MATH_POW: case MATH_EASE: case MATH_STEPIFY: @@ -188,6 +191,7 @@ int Expression::get_func_argument_count(BuiltinFunc p_func) { case COLORN: return 2; case MATH_LERP: + case MATH_LERP_ANGLE: case MATH_INVERSE_LERP: case MATH_SMOOTHSTEP: case MATH_MOVE_TOWARD: @@ -283,6 +287,12 @@ void Expression::exec_func(BuiltinFunc p_func, const Variant **p_inputs, Variant VALIDATE_ARG_NUM(1); *r_return = Math::fposmod((double)*p_inputs[0], (double)*p_inputs[1]); } break; + case MATH_POSMOD: { + + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + *r_return = Math::posmod((int)*p_inputs[0], (int)*p_inputs[1]); + } break; case MATH_FLOOR: { VALIDATE_ARG_NUM(0); @@ -387,6 +397,13 @@ void Expression::exec_func(BuiltinFunc p_func, const Variant **p_inputs, Variant VALIDATE_ARG_NUM(2); *r_return = Math::lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]); } break; + case MATH_LERP_ANGLE: { + + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + VALIDATE_ARG_NUM(2); + *r_return = Math::lerp_angle((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]); + } break; case MATH_INVERSE_LERP: { VALIDATE_ARG_NUM(0); @@ -793,17 +810,13 @@ Error Expression::_get_token(Token &r_token) { #define GET_CHAR() (str_ofs >= expression.length() ? 0 : expression[str_ofs++]) CharType cchar = GET_CHAR(); - if (cchar == 0) { - r_token.type = TK_EOF; - return OK; - } switch (cchar) { case 0: { r_token.type = TK_EOF; return OK; - } break; + }; case '{': { r_token.type = TK_CURLY_BRACKET_OPEN; diff --git a/core/math/expression.h b/core/math/expression.h index 1113bb6587..833220592c 100644 --- a/core/math/expression.h +++ b/core/math/expression.h @@ -51,6 +51,7 @@ public: MATH_SQRT, MATH_FMOD, MATH_FPOSMOD, + MATH_POSMOD, MATH_FLOOR, MATH_CEIL, MATH_ROUND, @@ -66,6 +67,7 @@ public: MATH_STEP_DECIMALS, MATH_STEPIFY, MATH_LERP, + MATH_LERP_ANGLE, MATH_INVERSE_LERP, MATH_RANGE_LERP, MATH_SMOOTHSTEP, diff --git a/core/math/math_funcs.cpp b/core/math/math_funcs.cpp index 7a2e74a413..f04e40cb6c 100644 --- a/core/math/math_funcs.cpp +++ b/core/math/math_funcs.cpp @@ -79,6 +79,15 @@ int Math::step_decimals(double p_step) { return 0; } +// Only meant for editor usage in float ranges, where a step of 0 +// means that decimal digits should not be limited in String::num. +int Math::range_step_decimals(double p_step) { + if (p_step < 0.0000000000001) { + return 16; // Max value hardcoded in String::num + } + return step_decimals(p_step); +} + double Math::dectime(double p_value, double p_amount, double p_step) { double sgn = p_value < 0 ? -1.0 : 1.0; double val = Math::abs(p_value); diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index 0e3bd8a318..a712356ddc 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -198,6 +198,13 @@ public: value += 0.0; return value; } + static _ALWAYS_INLINE_ int posmod(int p_x, int p_y) { + int value = p_x % p_y; + if ((value < 0 && p_y > 0) || (value > 0 && p_y < 0)) { + value += p_y; + } + return value; + } static _ALWAYS_INLINE_ double deg2rad(double p_y) { return p_y * Math_PI / 180.0; } static _ALWAYS_INLINE_ float deg2rad(float p_y) { return p_y * Math_PI / 180.0; } @@ -208,6 +215,17 @@ public: static _ALWAYS_INLINE_ double lerp(double p_from, double p_to, double p_weight) { return p_from + (p_to - p_from) * p_weight; } static _ALWAYS_INLINE_ float lerp(float p_from, float p_to, float p_weight) { return p_from + (p_to - p_from) * p_weight; } + static _ALWAYS_INLINE_ double lerp_angle(double p_from, double p_to, double p_weight) { + double difference = fmod(p_to - p_from, Math_TAU); + double distance = fmod(2.0 * difference, Math_TAU) - difference; + return p_from + distance * p_weight; + } + static _ALWAYS_INLINE_ float lerp_angle(float p_from, float p_to, float p_weight) { + float difference = fmod(p_to - p_from, (float)Math_TAU); + float distance = fmod(2.0f * difference, (float)Math_TAU) - difference; + return p_from + distance * p_weight; + } + static _ALWAYS_INLINE_ double inverse_lerp(double p_from, double p_to, double p_value) { return (p_value - p_from) / (p_to - p_from); } static _ALWAYS_INLINE_ float inverse_lerp(float p_from, float p_to, float p_value) { return (p_value - p_from) / (p_to - p_from); } @@ -252,6 +270,7 @@ public: // double only, as these functions are mainly used by the editor and not performance-critical, static double ease(double p_x, double p_c); static int step_decimals(double p_step); + static int range_step_decimals(double p_step); static double stepify(double p_value, double p_step); static double dectime(double p_value, double p_amount, double p_step); diff --git a/core/math/vector3.h b/core/math/vector3.h index 811a207138..45bdfee487 100644 --- a/core/math/vector3.h +++ b/core/math/vector3.h @@ -219,10 +219,6 @@ Vector3 Vector3::linear_interpolate(const Vector3 &p_b, real_t p_t) const { } Vector3 Vector3::slerp(const Vector3 &p_b, real_t p_t) const { -#ifdef MATH_CHECKS - ERR_FAIL_COND_V(!is_normalized(), Vector3()); -#endif - real_t theta = angle_to(p_b); return rotated(cross(p_b).normalized(), theta * p_t); } diff --git a/core/object.h b/core/object.h index 1e0b22c086..dce1cc74ae 100644 --- a/core/object.h +++ b/core/object.h @@ -58,7 +58,7 @@ enum PropertyHint { PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc" PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) use "attenuation" hint string to revert (flip h), "full" to also include in/out. (ie: "attenuation,inout") PROPERTY_HINT_LENGTH, ///< hint_text= "length" (as integer) - PROPERTY_HINT_SPRITE_FRAME, + PROPERTY_HINT_SPRITE_FRAME, // FIXME: Obsolete: drop whenever we can break compat. Keeping now for GDNative compat. PROPERTY_HINT_KEY_ACCEL, ///< hint_text= "length" (as integer) PROPERTY_HINT_FLAGS, ///< hint_text= "flag1,flag2,etc" (as bit flags) PROPERTY_HINT_LAYERS_2D_RENDER, @@ -104,7 +104,8 @@ enum PropertyUsageFlags { PROPERTY_USAGE_INTERNATIONALIZED = 64, //hint for internationalized strings PROPERTY_USAGE_GROUP = 128, //used for grouping props in the editor PROPERTY_USAGE_CATEGORY = 256, - //those below are deprecated thanks to ClassDB's now class value cache + // FIXME: Drop in 4.0, possibly reorder other flags? + // Those below are deprecated thanks to ClassDB's now class value cache //PROPERTY_USAGE_STORE_IF_NONZERO = 512, //only store if nonzero //PROPERTY_USAGE_STORE_IF_NONONE = 1024, //only store if false PROPERTY_USAGE_NO_INSTANCE_STATE = 2048, @@ -121,6 +122,7 @@ enum PropertyUsageFlags { PROPERTY_USAGE_HIGH_END_GFX = 1 << 22, PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT = 1 << 23, PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT = 1 << 24, + PROPERTY_USAGE_KEYING_INCREMENTS = 1 << 25, // Used in inspector to increment property when keyed in animation player PROPERTY_USAGE_DEFAULT = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK, PROPERTY_USAGE_DEFAULT_INTL = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK | PROPERTY_USAGE_INTERNATIONALIZED, @@ -179,6 +181,15 @@ struct PropertyInfo { usage(PROPERTY_USAGE_DEFAULT) { } + bool operator==(const PropertyInfo &p_info) const { + return ((type == p_info.type) && + (name == p_info.name) && + (class_name == p_info.class_name) && + (hint == p_info.hint) && + (hint_string == p_info.hint_string) && + (usage == p_info.usage)); + } + bool operator<(const PropertyInfo &p_info) const { return name < p_info.name; } diff --git a/core/os/dir_access.cpp b/core/os/dir_access.cpp index 0cdb5b41b7..b444f0ae1e 100644 --- a/core/os/dir_access.cpp +++ b/core/os/dir_access.cpp @@ -179,14 +179,6 @@ Error DirAccess::make_dir_recursive(String p_dir) { return OK; } -String DirAccess::get_next(bool *p_is_dir) { - - String next = get_next(); - if (p_is_dir) - *p_is_dir = current_is_dir(); - return next; -} - String DirAccess::fix_path(String p_path) const { switch (_access_type) { diff --git a/core/os/dir_access.h b/core/os/dir_access.h index bde19bd5ae..704eedae5b 100644 --- a/core/os/dir_access.h +++ b/core/os/dir_access.h @@ -71,7 +71,6 @@ protected: public: virtual Error list_dir_begin() = 0; ///< This starts dir listing - virtual String get_next(bool *p_is_dir); // compatibility virtual String get_next() = 0; virtual bool current_is_dir() const = 0; virtual bool current_is_hidden() const = 0; diff --git a/core/pool_allocator.cpp b/core/pool_allocator.cpp index 094352b5cc..9b342ef913 100644 --- a/core/pool_allocator.cpp +++ b/core/pool_allocator.cpp @@ -611,7 +611,7 @@ PoolAllocator::PoolAllocator(void *p_mem, int p_size, int p_align, bool p_needs_ PoolAllocator::PoolAllocator(int p_align, int p_size, bool p_needs_locking, int p_max_entries) { ERR_FAIL_COND(p_align < 1); - mem_ptr = Memory::alloc_static(p_size + p_align, "PoolAllocator()"); + mem_ptr = Memory::alloc_static(p_size + p_align, true); uint8_t *mem8 = (uint8_t *)mem_ptr; uint64_t ofs = (uint64_t)mem8; if (ofs % p_align) diff --git a/core/pool_vector.h b/core/pool_vector.h index 98a52c6938..3d28d86803 100644 --- a/core/pool_vector.h +++ b/core/pool_vector.h @@ -458,7 +458,7 @@ public: bool is_locked() const { return alloc && alloc->lock > 0; } - inline const T operator[](int p_index) const; + inline T operator[](int p_index) const; Error resize(int p_size); @@ -502,7 +502,7 @@ void PoolVector<T>::push_back(const T &p_val) { } template <class T> -const T PoolVector<T>::operator[](int p_index) const { +T PoolVector<T>::operator[](int p_index) const { CRASH_BAD_INDEX(p_index, size()); diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 3597e2b818..c1d4967f55 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -487,7 +487,7 @@ void ProjectSettings::set_registering_order(bool p_enable) { registering_order = p_enable; } -Error ProjectSettings::_load_settings_binary(const String p_path) { +Error ProjectSettings::_load_settings_binary(const String &p_path) { Error err; FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err); @@ -530,7 +530,7 @@ Error ProjectSettings::_load_settings_binary(const String p_path) { return OK; } -Error ProjectSettings::_load_settings_text(const String p_path) { +Error ProjectSettings::_load_settings_text(const String &p_path) { Error err; FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err); @@ -593,7 +593,7 @@ Error ProjectSettings::_load_settings_text(const String p_path) { } } -Error ProjectSettings::_load_settings_text_or_binary(const String p_text_path, const String p_bin_path) { +Error ProjectSettings::_load_settings_text_or_binary(const String &p_text_path, const String &p_bin_path) { // Attempt first to load the text-based project.godot file Error err_text = _load_settings_text(p_text_path); diff --git a/core/project_settings.h b/core/project_settings.h index 0ff18ab3f5..d7651417d5 100644 --- a/core/project_settings.h +++ b/core/project_settings.h @@ -97,9 +97,9 @@ protected: static ProjectSettings *singleton; - Error _load_settings_text(const String p_path); - Error _load_settings_binary(const String p_path); - Error _load_settings_text_or_binary(const String p_text_path, const String p_bin_path); + Error _load_settings_text(const String &p_path); + Error _load_settings_binary(const String &p_path); + Error _load_settings_text_or_binary(const String &p_text_path, const String &p_bin_path); Error _save_settings_text(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom = CustomMap(), const String &p_custom_features = String()); Error _save_settings_binary(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom = CustomMap(), const String &p_custom_features = String()); diff --git a/core/set.h b/core/set.h index 81250068af..b2c717880d 100644 --- a/core/set.h +++ b/core/set.h @@ -39,7 +39,7 @@ */ // based on the very nice implementation of rb-trees by: -// http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html +// https://web.archive.org/web/20120507164830/http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html template <class T, class C = Comparator<T>, class A = DefaultAllocator> class Set { diff --git a/core/string_name.cpp b/core/string_name.cpp index 10b71ad3ac..b1a8bfb849 100644 --- a/core/string_name.cpp +++ b/core/string_name.cpp @@ -205,7 +205,6 @@ StringName::StringName(const char *p_name) { // exists lock->unlock(); return; - } else { } } @@ -253,7 +252,6 @@ StringName::StringName(const StaticCString &p_static_string) { // exists lock->unlock(); return; - } else { } } @@ -301,7 +299,6 @@ StringName::StringName(const String &p_name) { // exists lock->unlock(); return; - } else { } } diff --git a/core/type_info.h b/core/type_info.h index d85a63ee42..61ec7b2f20 100644 --- a/core/type_info.h +++ b/core/type_info.h @@ -83,15 +83,13 @@ enum Metadata { }; } +// If the compiler fails because it's trying to instantiate the primary 'GetTypeInfo' template +// instead of one of the specializations, it's most likely because the type 'T' is not supported. +// If 'T' is a class that inherits 'Object', make sure it can see the actual class declaration +// instead of a forward declaration. You can always forward declare 'T' in a header file, and then +// include the actual declaration of 'T' in the source file where 'GetTypeInfo<T>' is instantiated. template <class T, typename = void> -struct GetTypeInfo { - static const Variant::Type VARIANT_TYPE = Variant::NIL; - static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; - static inline PropertyInfo get_class_info() { - ERR_PRINT("GetTypeInfo fallback. Bug!"); - return PropertyInfo(); // Not "Nil", this is an error - } -}; +struct GetTypeInfo; #define MAKE_TYPE_INFO(m_type, m_var_type) \ template <> \ @@ -283,10 +281,7 @@ inline StringName __constant_get_enum_name(T param, const String &p_constant) { return GetTypeInfo<T>::get_class_info().class_name; } -#define CLASS_INFO(m_type) \ - (GetTypeInfo<m_type *>::VARIANT_TYPE != Variant::NIL ? \ - GetTypeInfo<m_type *>::get_class_info() : \ - GetTypeInfo<m_type>::get_class_info()) +#define CLASS_INFO(m_type) (GetTypeInfo<m_type *>::get_class_info()) #else diff --git a/core/ustring.cpp b/core/ustring.cpp index 706e8a3cc1..ed401c3763 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -2729,6 +2729,51 @@ bool String::is_quoted() const { return is_enclosed_in("\"") || is_enclosed_in("'"); } +int String::_count(const String &p_string, int p_from, int p_to, bool p_case_insensitive) const { + if (p_string.empty()) { + return 0; + } + int len = length(); + int slen = p_string.length(); + if (len < slen) { + return 0; + } + String str; + if (p_from >= 0 && p_to >= 0) { + if (p_to == 0) { + p_to = len; + } else if (p_from >= p_to) { + return 0; + } + if (p_from == 0 && p_to == len) { + str = String(); + str.copy_from_unchecked(&c_str()[0], len); + } else { + str = substr(p_from, p_to - p_from); + } + } else { + return 0; + } + int c = 0; + int idx = -1; + do { + idx = p_case_insensitive ? str.findn(p_string) : str.find(p_string); + if (idx != -1) { + str = str.substr(idx + slen, str.length() - slen); + ++c; + } + } while (idx != -1); + return c; +} + +int String::count(const String &p_string, int p_from, int p_to) const { + return _count(p_string, p_from, p_to, false); +} + +int String::countn(const String &p_string, int p_from, int p_to) const { + return _count(p_string, p_from, p_to, true); +} + bool String::_base_is_subsequence_of(const String &p_string, bool case_insensitive) const { int len = length(); @@ -3338,7 +3383,7 @@ String String::http_unescape() const { if ((ord1 >= '0' && ord1 <= '9') || (ord1 >= 'A' && ord1 <= 'Z')) { CharType ord2 = ord_at(i + 2); if ((ord2 >= '0' && ord2 <= '9') || (ord2 >= 'A' && ord2 <= 'Z')) { - char bytes[2] = { (char)ord1, (char)ord2 }; + char bytes[3] = { (char)ord1, (char)ord2, 0 }; res += (char)strtol(bytes, NULL, 16); i += 2; } diff --git a/core/ustring.h b/core/ustring.h index 8a52c53238..3eb5c47b3a 100644 --- a/core/ustring.h +++ b/core/ustring.h @@ -137,6 +137,7 @@ class String { void copy_from(const CharType &p_char); void copy_from_unchecked(const CharType *p_char, const int p_length); bool _base_is_subsequence_of(const String &p_string, bool case_insensitive) const; + int _count(const String &p_string, int p_from, int p_to, bool p_case_insensitive) const; public: enum { @@ -279,6 +280,9 @@ public: String to_upper() const; String to_lower() const; + int count(const String &p_string, int p_from = 0, int p_to = 0) const; + int countn(const String &p_string, int p_from = 0, int p_to = 0) const; + String left(int p_pos) const; String right(int p_pos) const; String dedent() const; diff --git a/core/variant.cpp b/core/variant.cpp index fe9623d068..1574af5239 100644 --- a/core/variant.cpp +++ b/core/variant.cpp @@ -1834,8 +1834,6 @@ inline DA _convert_array_from_variant(const Variant &p_variant) { return DA(); } } - - return DA(); } Variant::operator Array() const { @@ -2299,7 +2297,7 @@ Variant::Variant(const Object *p_object) { Variant::Variant(const Dictionary &p_dictionary) { type = DICTIONARY; - memnew_placement(_data._mem, (Dictionary)(p_dictionary)); + memnew_placement(_data._mem, Dictionary(p_dictionary)); } Variant::Variant(const Array &p_array) { diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 3fdd18a630..1f6e5bb653 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -70,7 +70,7 @@ struct _VariantCall { for (int i = 0; i < arg_count; i++) { - if (!tptr[i] || tptr[i] == p_args[i]->type) + if (tptr[i] == Variant::NIL || tptr[i] == p_args[i]->type) continue; // all good if (!Variant::can_convert(p_args[i]->type, tptr[i])) { r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; @@ -237,6 +237,8 @@ struct _VariantCall { VCALL_LOCALMEM1R(String, casecmp_to); VCALL_LOCALMEM1R(String, nocasecmp_to); VCALL_LOCALMEM0R(String, length); + VCALL_LOCALMEM3R(String, count); + VCALL_LOCALMEM3R(String, countn); VCALL_LOCALMEM2R(String, substr); VCALL_LOCALMEM2R(String, find); VCALL_LOCALMEM1R(String, find_last); @@ -912,7 +914,7 @@ struct _VariantCall { static void Quat_init2(Variant &r_ret, const Variant **p_args) { - r_ret = Quat(((Vector3)(*p_args[0])), ((float)(*p_args[1]))); + r_ret = Quat(((Vector3)(*p_args[0])), ((real_t)(*p_args[1]))); } static void Quat_init3(Variant &r_ret, const Variant **p_args) { @@ -1502,6 +1504,9 @@ void register_variant_methods() { ADDFUNC2R(STRING, INT, String, find, STRING, "what", INT, "from", varray(0)); + ADDFUNC3R(STRING, INT, String, count, STRING, "what", INT, "from", INT, "to", varray(0, 0)); + ADDFUNC3R(STRING, INT, String, countn, STRING, "what", INT, "from", INT, "to", varray(0, 0)); + ADDFUNC1R(STRING, INT, String, find_last, STRING, "what", varray()); ADDFUNC2R(STRING, INT, String, findn, STRING, "what", INT, "from", varray(0)); ADDFUNC2R(STRING, INT, String, rfind, STRING, "what", INT, "from", varray(-1)); diff --git a/core/variant_op.cpp b/core/variant_op.cpp index d677c7776a..ea9e29e744 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -2613,7 +2613,7 @@ bool Variant::in(const Variant &p_index, bool *r_valid) const { if (r_valid) { *r_valid = false; } - return "Attempted get on stray pointer."; + return true; // Attempted get on stray pointer. } } #endif diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp index d5513bc2d7..07212ec669 100644 --- a/core/variant_parser.cpp +++ b/core/variant_parser.cpp @@ -1537,8 +1537,6 @@ Error VariantParser::parse_tag_assign_eof(Stream *p_stream, int &line, String &r Token token; get_token(p_stream, token, line, r_err_str); Error err = parse_value(token, r_value, p_stream, line, r_err_str, p_res_parser); - if (err) { - } return err; } } else if (c == '\n') { diff --git a/doc/classes/ARVRServer.xml b/doc/classes/ARVRServer.xml index af1a1b0fff..b71a18858f 100644 --- a/doc/classes/ARVRServer.xml +++ b/doc/classes/ARVRServer.xml @@ -107,7 +107,7 @@ </method> </methods> <members> - <member name="primary_interface" type="ARVRInterface" setter="set_primary_interface" getter="get_primary_interface" default="null"> + <member name="primary_interface" type="ARVRInterface" setter="set_primary_interface" getter="get_primary_interface"> </member> <member name="world_scale" type="float" setter="set_world_scale" getter="get_world_scale" default="1.0"> Allows you to adjust the scale to your game's units. Most AR/VR platforms assume a scale of 1 game world unit = 1 real world meter. diff --git a/doc/classes/AStar.xml b/doc/classes/AStar.xml index 99e2db6d83..6d7adc9935 100644 --- a/doc/classes/AStar.xml +++ b/doc/classes/AStar.xml @@ -44,8 +44,8 @@ <description> Adds a new point at the given position with the given identifier. The algorithm prefers points with lower [code]weight_scale[/code] to form a path. The [code]id[/code] must be 0 or larger, and the [code]weight_scale[/code] must be 1 or larger. [codeblock] - var as = AStar.new() - as.add_point(1, Vector3(1, 0, 0), 4) # Adds the point (1, 0, 0) with weight_scale 4 and id 1 + var astar = AStar.new() + astar.add_point(1, Vector3(1, 0, 0), 4) # Adds the point (1, 0, 0) with weight_scale 4 and id 1 [/codeblock] If there already exists a point for the given [code]id[/code], its position and weight scale are updated to the given values. </description> @@ -80,10 +80,10 @@ <description> Creates a segment between the given points. If [code]bidirectional[/code] is [code]false[/code], only movement from [code]id[/code] to [code]to_id[/code] is allowed, not the reverse direction. [codeblock] - var as = AStar.new() - as.add_point(1, Vector3(1, 1, 0)) - as.add_point(2, Vector3(0, 5, 0)) - as.connect_points(1, 2, false) + var astar = AStar.new() + astar.add_point(1, Vector3(1, 1, 0)) + astar.add_point(2, Vector3(0, 5, 0)) + astar.connect_points(1, 2, false) [/codeblock] </description> </method> @@ -122,11 +122,11 @@ <description> Returns the closest position to [code]to_position[/code] that resides inside a segment between two connected points. [codeblock] - var as = AStar.new() - as.add_point(1, Vector3(0, 0, 0)) - as.add_point(2, Vector3(0, 5, 0)) - as.connect_points(1, 2) - var res = as.get_closest_position_in_segment(Vector3(3, 3, 0)) # Returns (0, 3, 0) + var astar = AStar.new() + astar.add_point(1, Vector3(0, 0, 0)) + astar.add_point(2, Vector3(0, 5, 0)) + astar.connect_points(1, 2) + var res = astar.get_closest_position_in_segment(Vector3(3, 3, 0)) # Returns (0, 3, 0) [/codeblock] The result is in the segment that goes from [code]y = 0[/code] to [code]y = 5[/code]. It's the closest position in the segment to the given point. </description> @@ -141,19 +141,18 @@ <description> Returns an array with the IDs of the points that form the path found by AStar between the given points. The array is ordered from the starting point to the ending point of the path. [codeblock] - var as = AStar.new() - as.add_point(1, Vector3(0, 0, 0)) - as.add_point(2, Vector3(0, 1, 0), 1) # Default weight is 1 - as.add_point(3, Vector3(1, 1, 0)) - as.add_point(4, Vector3(2, 0, 0)) + var astar = AStar.new() + astar.add_point(1, Vector3(0, 0, 0)) + astar.add_point(2, Vector3(0, 1, 0), 1) # Default weight is 1 + astar.add_point(3, Vector3(1, 1, 0)) + astar.add_point(4, Vector3(2, 0, 0)) - as.connect_points(1, 2, false) - as.connect_points(2, 3, false) - as.connect_points(4, 3, false) - as.connect_points(1, 4, false) - as.connect_points(5, 4, false) + astar.connect_points(1, 2, false) + astar.connect_points(2, 3, false) + astar.connect_points(4, 3, false) + astar.connect_points(1, 4, false) - var res = as.get_id_path(1, 3) # Returns [1, 2, 3] + var res = astar.get_id_path(1, 3) # Returns [1, 2, 3] [/codeblock] If you change the 2nd point's weight to 3, then the result will be [code][1, 4, 3][/code] instead, because now even though the distance is longer, it's "easier" to get through point 4 than through point 2. </description> @@ -166,16 +165,16 @@ <description> Returns an array with the IDs of the points that form the connection with the given point. [codeblock] - var as = AStar.new() - as.add_point(1, Vector3(0, 0, 0)) - as.add_point(2, Vector3(0, 1, 0)) - as.add_point(3, Vector3(1, 1, 0)) - as.add_point(4, Vector3(2, 0, 0)) + var astar = AStar.new() + astar.add_point(1, Vector3(0, 0, 0)) + astar.add_point(2, Vector3(0, 1, 0)) + astar.add_point(3, Vector3(1, 1, 0)) + astar.add_point(4, Vector3(2, 0, 0)) - as.connect_points(1, 2, true) - as.connect_points(1, 3, true) + astar.connect_points(1, 2, true) + astar.connect_points(1, 3, true) - var neighbors = as.get_point_connections(1) # Returns [2, 3] + var neighbors = astar.get_point_connections(1) # Returns [2, 3] [/codeblock] </description> </method> diff --git a/doc/classes/AStar2D.xml b/doc/classes/AStar2D.xml index 526d1c16da..9d51330139 100644 --- a/doc/classes/AStar2D.xml +++ b/doc/classes/AStar2D.xml @@ -21,8 +21,8 @@ <description> Adds a new point at the given position with the given identifier. The algorithm prefers points with lower [code]weight_scale[/code] to form a path. The [code]id[/code] must be 0 or larger, and the [code]weight_scale[/code] must be 1 or larger. [codeblock] - var as = AStar2D.new() - as.add_point(1, Vector2(1, 0), 4) # Adds the point (1, 0) with weight_scale 4 and id 1 + var astar = AStar2D.new() + astar.add_point(1, Vector2(1, 0), 4) # Adds the point (1, 0) with weight_scale 4 and id 1 [/codeblock] If there already exists a point for the given [code]id[/code], its position and weight scale are updated to the given values. </description> @@ -57,10 +57,10 @@ <description> Creates a segment between the given points. If [code]bidirectional[/code] is [code]false[/code], only movement from [code]id[/code] to [code]to_id[/code] is allowed, not the reverse direction. [codeblock] - var as = AStar2D.new() - as.add_point(1, Vector2(1, 1)) - as.add_point(2, Vector2(0, 5)) - as.connect_points(1, 2, false) + var astar = AStar2D.new() + astar.add_point(1, Vector2(1, 1)) + astar.add_point(2, Vector2(0, 5)) + astar.connect_points(1, 2, false) [/codeblock] </description> </method> @@ -99,11 +99,11 @@ <description> Returns the closest position to [code]to_position[/code] that resides inside a segment between two connected points. [codeblock] - var as = AStar2D.new() - as.add_point(1, Vector2(0, 0)) - as.add_point(2, Vector2(0, 5)) - as.connect_points(1, 2) - var res = as.get_closest_position_in_segment(Vector2(3, 3)) # Returns (0, 3) + var astar = AStar2D.new() + astar.add_point(1, Vector2(0, 0)) + astar.add_point(2, Vector2(0, 5)) + astar.connect_points(1, 2) + var res = astar.get_closest_position_in_segment(Vector2(3, 3)) # Returns (0, 3) [/codeblock] The result is in the segment that goes from [code]y = 0[/code] to [code]y = 5[/code]. It's the closest position in the segment to the given point. </description> @@ -118,19 +118,18 @@ <description> Returns an array with the IDs of the points that form the path found by AStar2D between the given points. The array is ordered from the starting point to the ending point of the path. [codeblock] - var as = AStar2D.new() - as.add_point(1, Vector2(0, 0)) - as.add_point(2, Vector2(0, 1), 1) # Default weight is 1 - as.add_point(3, Vector2(1, 1)) - as.add_point(4, Vector2(2, 0)) + var astar = AStar2D.new() + astar.add_point(1, Vector2(0, 0)) + astar.add_point(2, Vector2(0, 1), 1) # Default weight is 1 + astar.add_point(3, Vector2(1, 1)) + astar.add_point(4, Vector2(2, 0)) - as.connect_points(1, 2, false) - as.connect_points(2, 3, false) - as.connect_points(4, 3, false) - as.connect_points(1, 4, false) - as.connect_points(5, 4, false) + astar.connect_points(1, 2, false) + astar.connect_points(2, 3, false) + astar.connect_points(4, 3, false) + astar.connect_points(1, 4, false) - var res = as.get_id_path(1, 3) # Returns [1, 2, 3] + var res = astar.get_id_path(1, 3) # Returns [1, 2, 3] [/codeblock] If you change the 2nd point's weight to 3, then the result will be [code][1, 4, 3][/code] instead, because now even though the distance is longer, it's "easier" to get through point 4 than through point 2. </description> @@ -143,16 +142,16 @@ <description> Returns an array with the IDs of the points that form the connection with the given point. [codeblock] - var as = AStar2D.new() - as.add_point(1, Vector2(0, 0)) - as.add_point(2, Vector2(0, 1)) - as.add_point(3, Vector2(1, 1)) - as.add_point(4, Vector2(2, 0)) + var astar = AStar2D.new() + astar.add_point(1, Vector2(0, 0)) + astar.add_point(2, Vector2(0, 1)) + astar.add_point(3, Vector2(1, 1)) + astar.add_point(4, Vector2(2, 0)) - as.connect_points(1, 2, true) - as.connect_points(1, 3, true) + astar.connect_points(1, 2, true) + astar.connect_points(1, 3, true) - var neighbors = as.get_point_connections(1) # Returns [2, 3] + var neighbors = astar.get_point_connections(1) # Returns [2, 3] [/codeblock] </description> </method> diff --git a/doc/classes/AnimatedSprite.xml b/doc/classes/AnimatedSprite.xml index 72d1fa4881..10ee4222c8 100644 --- a/doc/classes/AnimatedSprite.xml +++ b/doc/classes/AnimatedSprite.xml @@ -51,7 +51,7 @@ <member name="frame" type="int" setter="set_frame" getter="get_frame" default="0"> The displayed animation frame's index. </member> - <member name="frames" type="SpriteFrames" setter="set_sprite_frames" getter="get_sprite_frames" default="null"> + <member name="frames" type="SpriteFrames" setter="set_sprite_frames" getter="get_sprite_frames"> The [SpriteFrames] resource containing the animation(s). </member> <member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2( 0, 0 )"> diff --git a/doc/classes/AnimatedSprite3D.xml b/doc/classes/AnimatedSprite3D.xml index ff7d2fb9eb..eac5822d53 100644 --- a/doc/classes/AnimatedSprite3D.xml +++ b/doc/classes/AnimatedSprite3D.xml @@ -40,7 +40,7 @@ <member name="frame" type="int" setter="set_frame" getter="get_frame" default="0"> The displayed animation frame's index. </member> - <member name="frames" type="SpriteFrames" setter="set_sprite_frames" getter="get_sprite_frames" default="null"> + <member name="frames" type="SpriteFrames" setter="set_sprite_frames" getter="get_sprite_frames"> The [SpriteFrames] resource containing the animation(s). </member> <member name="playing" type="bool" setter="_set_playing" getter="_is_playing" default="false"> diff --git a/doc/classes/AnimationNodeTransition.xml b/doc/classes/AnimationNodeTransition.xml index 4d2a11578f..82839b6bab 100644 --- a/doc/classes/AnimationNodeTransition.xml +++ b/doc/classes/AnimationNodeTransition.xml @@ -7,6 +7,42 @@ <tutorials> </tutorials> <methods> + <method name="get_input_caption" qualifiers="const"> + <return type="String"> + </return> + <argument index="0" name="input" type="int"> + </argument> + <description> + </description> + </method> + <method name="is_input_set_as_auto_advance" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="input" type="int"> + </argument> + <description> + </description> + </method> + <method name="set_input_as_auto_advance"> + <return type="void"> + </return> + <argument index="0" name="input" type="int"> + </argument> + <argument index="1" name="enable" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_input_caption"> + <return type="void"> + </return> + <argument index="0" name="input" type="int"> + </argument> + <argument index="1" name="caption" type="String"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="input_0/auto_advance" type="bool" setter="set_input_as_auto_advance" getter="is_input_set_as_auto_advance"> diff --git a/doc/classes/AnimationTree.xml b/doc/classes/AnimationTree.xml index 70c1b783df..d1c24e466d 100644 --- a/doc/classes/AnimationTree.xml +++ b/doc/classes/AnimationTree.xml @@ -43,7 +43,7 @@ </member> <member name="root_motion_track" type="NodePath" setter="set_root_motion_track" getter="get_root_motion_track" default="NodePath("")"> </member> - <member name="tree_root" type="AnimationNode" setter="set_tree_root" getter="get_tree_root" default="null"> + <member name="tree_root" type="AnimationNode" setter="set_tree_root" getter="get_tree_root"> </member> </members> <constants> diff --git a/doc/classes/AtlasTexture.xml b/doc/classes/AtlasTexture.xml index 1363287dc1..5b0a06a7fb 100644 --- a/doc/classes/AtlasTexture.xml +++ b/doc/classes/AtlasTexture.xml @@ -12,7 +12,7 @@ <methods> </methods> <members> - <member name="atlas" type="Texture" setter="set_atlas" getter="get_atlas" default="null"> + <member name="atlas" type="Texture" setter="set_atlas" getter="get_atlas"> The texture that contains the atlas. Can be any [Texture] subtype. </member> <member name="filter_clip" type="bool" setter="set_filter_clip" getter="has_filter_clip" default="false"> diff --git a/doc/classes/AudioEffectChorus.xml b/doc/classes/AudioEffectChorus.xml index 13bc6ac097..4da125ba63 100644 --- a/doc/classes/AudioEffectChorus.xml +++ b/doc/classes/AudioEffectChorus.xml @@ -9,6 +9,114 @@ <tutorials> </tutorials> <methods> + <method name="get_voice_cutoff_hz" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <description> + </description> + </method> + <method name="get_voice_delay_ms" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <description> + </description> + </method> + <method name="get_voice_depth_ms" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <description> + </description> + </method> + <method name="get_voice_level_db" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <description> + </description> + </method> + <method name="get_voice_pan" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <description> + </description> + </method> + <method name="get_voice_rate_hz" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <description> + </description> + </method> + <method name="set_voice_cutoff_hz"> + <return type="void"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <argument index="1" name="cutoff_hz" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_voice_delay_ms"> + <return type="void"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <argument index="1" name="delay_ms" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_voice_depth_ms"> + <return type="void"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <argument index="1" name="depth_ms" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_voice_level_db"> + <return type="void"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <argument index="1" name="level_db" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_voice_pan"> + <return type="void"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <argument index="1" name="pan" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_voice_rate_hz"> + <return type="void"> + </return> + <argument index="0" name="voice_idx" type="int"> + </argument> + <argument index="1" name="rate_hz" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="dry" type="float" setter="set_dry" getter="get_dry" default="1.0"> diff --git a/doc/classes/AudioStreamPlayer.xml b/doc/classes/AudioStreamPlayer.xml index 92f3a9bd73..4bc29335ff 100644 --- a/doc/classes/AudioStreamPlayer.xml +++ b/doc/classes/AudioStreamPlayer.xml @@ -65,7 +65,7 @@ <member name="playing" type="bool" setter="_set_playing" getter="is_playing" default="false"> If [code]true[/code], audio is playing. </member> - <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream" default="null"> + <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream"> The [AudioStream] object to be played. </member> <member name="stream_paused" type="bool" setter="set_stream_paused" getter="get_stream_paused" default="false"> diff --git a/doc/classes/AudioStreamPlayer2D.xml b/doc/classes/AudioStreamPlayer2D.xml index 362a096810..4734aff770 100644 --- a/doc/classes/AudioStreamPlayer2D.xml +++ b/doc/classes/AudioStreamPlayer2D.xml @@ -71,7 +71,7 @@ <member name="playing" type="bool" setter="_set_playing" getter="is_playing" default="false"> If [code]true[/code], audio is playing. </member> - <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream" default="null"> + <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream"> The [AudioStream] object to be played. </member> <member name="stream_paused" type="bool" setter="set_stream_paused" getter="get_stream_paused" default="false"> diff --git a/doc/classes/AudioStreamPlayer3D.xml b/doc/classes/AudioStreamPlayer3D.xml index d722f2164d..a73f96d082 100644 --- a/doc/classes/AudioStreamPlayer3D.xml +++ b/doc/classes/AudioStreamPlayer3D.xml @@ -95,7 +95,7 @@ <member name="playing" type="bool" setter="_set_playing" getter="is_playing" default="false"> If [code]true[/code], audio is playing. </member> - <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream" default="null"> + <member name="stream" type="AudioStream" setter="set_stream" getter="get_stream"> The [AudioStream] object to be played. </member> <member name="stream_paused" type="bool" setter="set_stream_paused" getter="get_stream_paused" default="false"> diff --git a/doc/classes/AudioStreamRandomPitch.xml b/doc/classes/AudioStreamRandomPitch.xml index 9c73a64537..a2ee314d92 100644 --- a/doc/classes/AudioStreamRandomPitch.xml +++ b/doc/classes/AudioStreamRandomPitch.xml @@ -11,7 +11,7 @@ <methods> </methods> <members> - <member name="audio_stream" type="AudioStream" setter="set_audio_stream" getter="get_audio_stream" default="null"> + <member name="audio_stream" type="AudioStream" setter="set_audio_stream" getter="get_audio_stream"> The current [AudioStream]. </member> <member name="random_pitch" type="float" setter="set_random_pitch" getter="get_random_pitch" default="1.1"> diff --git a/doc/classes/BakedLightmap.xml b/doc/classes/BakedLightmap.xml index 4baf3a6bb2..4a1381295f 100644 --- a/doc/classes/BakedLightmap.xml +++ b/doc/classes/BakedLightmap.xml @@ -18,12 +18,14 @@ <argument index="1" name="create_visual_debug" type="bool" default="false"> </argument> <description> + Bakes the lightmaps within the currently edited scene. </description> </method> <method name="debug_bake"> <return type="void"> </return> <description> + Executes a dry run bake of lightmaps within the currently edited scene. </description> </method> </methods> @@ -32,8 +34,10 @@ Grid subdivision size for lightmapper calculation. The default value will work for most cases. Increase for better lighting on small details or if your scene is very large. </member> <member name="bake_default_texels_per_unit" type="float" setter="set_bake_default_texels_per_unit" getter="get_bake_default_texels_per_unit" default="20.0"> + If a [member Mesh.lightmap_size_hint] isn't specified, the lightmap baker will dynamically set the lightmap size using this value. This value is measured in texels per world unit. The maximum lightmap texture size is 4096x4096. </member> <member name="bake_energy" type="float" setter="set_energy" getter="get_energy" default="1.0"> + Multiplies the light sources' intensity by this value. For instance, if the value is set to 2, lights will be twice as bright. If the value is set to 0.5, lights will be half as bright. </member> <member name="bake_extents" type="Vector3" setter="set_extents" getter="get_extents" default="Vector3( 10, 10, 10 )"> The size of the affected area. @@ -45,6 +49,7 @@ Lightmapping mode. See [enum BakeMode]. </member> <member name="bake_propagation" type="float" setter="set_propagation" getter="get_propagation" default="1.0"> + Defines how far the light will travel before it is no longer effective. The higher the number, the farther the light will travel. For instance, if the value is set to 2, the light will go twice as far. If the value is set to 0.5, the light will only go half as far. </member> <member name="bake_quality" type="int" setter="set_bake_quality" getter="get_bake_quality" enum="BakedLightmap.BakeQuality" default="1"> Three quality modes are available. Higher quality requires more rendering time. See [enum BakeQuality]. @@ -55,7 +60,7 @@ <member name="image_path" type="String" setter="set_image_path" getter="get_image_path" default="".""> The location where lightmaps will be saved. </member> - <member name="light_data" type="BakedLightmapData" setter="set_light_data" getter="get_light_data" default="null"> + <member name="light_data" type="BakedLightmapData" setter="set_light_data" getter="get_light_data"> The calculated light data. </member> </members> diff --git a/doc/classes/BaseButton.xml b/doc/classes/BaseButton.xml index f306adced2..9d1c80d3be 100644 --- a/doc/classes/BaseButton.xml +++ b/doc/classes/BaseButton.xml @@ -54,7 +54,7 @@ <member name="enabled_focus_mode" type="int" setter="set_enabled_focus_mode" getter="get_enabled_focus_mode" enum="Control.FocusMode" default="2"> Focus access mode to use when switching between enabled/disabled (see [member Control.focus_mode] and [member disabled]). </member> - <member name="group" type="ButtonGroup" setter="set_button_group" getter="get_button_group" default="null"> + <member name="group" type="ButtonGroup" setter="set_button_group" getter="get_button_group"> [ButtonGroup] associated to the button. </member> <member name="keep_pressed_outside" type="bool" setter="set_keep_pressed_outside" getter="is_keep_pressed_outside" default="false"> @@ -63,7 +63,7 @@ <member name="pressed" type="bool" setter="set_pressed" getter="is_pressed" default="false"> If [code]true[/code], the button's state is pressed. Means the button is pressed down or toggled (if toggle_mode is active). </member> - <member name="shortcut" type="ShortCut" setter="set_shortcut" getter="get_shortcut" default="null"> + <member name="shortcut" type="ShortCut" setter="set_shortcut" getter="get_shortcut"> [ShortCut] associated to the button. </member> <member name="shortcut_in_tooltip" type="bool" setter="set_shortcut_in_tooltip" getter="is_shortcut_in_tooltip_enabled" default="true"> diff --git a/doc/classes/BitmapFont.xml b/doc/classes/BitmapFont.xml index 5ec4947f46..16a28978d5 100644 --- a/doc/classes/BitmapFont.xml +++ b/doc/classes/BitmapFont.xml @@ -110,7 +110,7 @@ <member name="distance_field" type="bool" setter="set_distance_field_hint" getter="is_distance_field_hint" default="false"> If [code]true[/code], distance field hint is enabled. </member> - <member name="fallback" type="BitmapFont" setter="set_fallback" getter="get_fallback" default="null"> + <member name="fallback" type="BitmapFont" setter="set_fallback" getter="get_fallback"> The fallback font. </member> <member name="height" type="float" setter="set_height" getter="get_height" default="1.0"> diff --git a/doc/classes/Button.xml b/doc/classes/Button.xml index 3d8730b588..adf826c26b 100644 --- a/doc/classes/Button.xml +++ b/doc/classes/Button.xml @@ -20,7 +20,7 @@ <member name="flat" type="bool" setter="set_flat" getter="is_flat" default="false"> Flat buttons don't display decoration. </member> - <member name="icon" type="Texture" setter="set_button_icon" getter="get_button_icon" default="null"> + <member name="icon" type="Texture" setter="set_button_icon" getter="get_button_icon"> Button's icon, if text is present the icon will be placed before the text. </member> <member name="text" type="String" setter="set_text" getter="get_text" default=""""> @@ -45,11 +45,11 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="font_color_disabled" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )"> </theme_item> - <theme_item name="font_color_hover" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_hover" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> diff --git a/doc/classes/CPUParticles.xml b/doc/classes/CPUParticles.xml index 8152a52c86..e68b0feb2d 100644 --- a/doc/classes/CPUParticles.xml +++ b/doc/classes/CPUParticles.xml @@ -19,6 +19,38 @@ Sets this node's properties to match a given [Particles] node with an assigned [ParticlesMaterial]. </description> </method> + <method name="get_param" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles.Parameter"> + </argument> + <description> + </description> + </method> + <method name="get_param_curve" qualifiers="const"> + <return type="Curve"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles.Parameter"> + </argument> + <description> + </description> + </method> + <method name="get_param_randomness" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles.Parameter"> + </argument> + <description> + </description> + </method> + <method name="get_particle_flag" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="CPUParticles.Flags"> + </argument> + <description> + </description> + </method> <method name="restart"> <return type="void"> </return> @@ -26,6 +58,46 @@ Restarts the particle emitter. </description> </method> + <method name="set_param"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles.Parameter"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_param_curve"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles.Parameter"> + </argument> + <argument index="1" name="curve" type="Curve"> + </argument> + <description> + </description> + </method> + <method name="set_param_randomness"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles.Parameter"> + </argument> + <argument index="1" name="randomness" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_particle_flag"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="CPUParticles.Flags"> + </argument> + <argument index="1" name="enable" type="bool"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="amount" type="int" setter="set_amount" getter="get_amount" default="8"> @@ -34,7 +106,7 @@ <member name="angle" type="float" setter="set_param" getter="get_param" default="0.0"> Initial rotation applied to each particle, in degrees. </member> - <member name="angle_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="angle_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's rotation will be animated along this [Curve]. </member> <member name="angle_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -43,7 +115,7 @@ <member name="angular_velocity" type="float" setter="set_param" getter="get_param" default="0.0"> Initial angular velocity applied to each particle. Sets the speed of rotation of the particle. </member> - <member name="angular_velocity_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="angular_velocity_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's angular velocity will vary along this [Curve]. </member> <member name="angular_velocity_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -52,7 +124,7 @@ <member name="anim_offset" type="float" setter="set_param" getter="get_param" default="0.0"> Particle animation offset. </member> - <member name="anim_offset_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="anim_offset_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's animation offset will vary along this [Curve]. </member> <member name="anim_offset_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -61,7 +133,7 @@ <member name="anim_speed" type="float" setter="set_param" getter="get_param" default="0.0"> Particle animation speed. </member> - <member name="anim_speed_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="anim_speed_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's animation speed will vary along this [Curve]. </member> <member name="anim_speed_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -70,13 +142,13 @@ <member name="color" type="Color" setter="set_color" getter="get_color" default="Color( 1, 1, 1, 1 )"> Unused for 3D particles. </member> - <member name="color_ramp" type="Gradient" setter="set_color_ramp" getter="get_color_ramp" default="null"> + <member name="color_ramp" type="Gradient" setter="set_color_ramp" getter="get_color_ramp"> Unused for 3D particles. </member> <member name="damping" type="float" setter="set_param" getter="get_param" default="0.0"> The rate at which particles lose velocity. </member> - <member name="damping_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="damping_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Damping will vary along this [Curve]. </member> <member name="damping_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -133,7 +205,7 @@ <member name="hue_variation" type="float" setter="set_param" getter="get_param" default="0.0"> Initial hue variation applied to each particle. </member> - <member name="hue_variation_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="hue_variation_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's hue will vary along this [Curve]. </member> <member name="hue_variation_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -148,10 +220,13 @@ <member name="lifetime" type="float" setter="set_lifetime" getter="get_lifetime" default="1.0"> Amount of time each particle will exist. </member> + <member name="lifetime_randomness" type="float" setter="set_lifetime_randomness" getter="get_lifetime_randomness" default="0.0"> + Particle lifetime randomness ratio. + </member> <member name="linear_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Linear acceleration applied to each particle in the direction of motion. </member> - <member name="linear_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="linear_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's linear acceleration will vary along this [Curve]. </member> <member name="linear_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -160,7 +235,7 @@ <member name="local_coords" type="bool" setter="set_use_local_coordinates" getter="get_use_local_coordinates" default="true"> If [code]true[/code], particles use the parent node's coordinate space. If [code]false[/code], they use global coordinates. </member> - <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh" default="null"> + <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> The [Mesh] used for each particle. If [code]null[/code], particles will be spheres. </member> <member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot" default="false"> @@ -182,7 +257,7 @@ <member name="radial_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Radial acceleration applied to each particle. Makes particle accelerate away from origin. </member> - <member name="radial_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="radial_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's radial acceleration will vary along this [Curve]. </member> <member name="radial_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -194,7 +269,7 @@ <member name="scale_amount" type="float" setter="set_param" getter="get_param" default="1.0"> Initial scale applied to each particle. </member> - <member name="scale_amount_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="scale_amount_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's scale will vary along this [Curve]. </member> <member name="scale_amount_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -209,7 +284,7 @@ <member name="tangential_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Tangential acceleration applied to each particle. Tangential acceleration is perpendicular to the particle's velocity giving the particles a swirling motion. </member> - <member name="tangential_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="tangential_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's tangential acceleration will vary along this [Curve]. </member> <member name="tangential_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -227,52 +302,52 @@ Particles are drawn in order of depth. </constant> <constant name="PARAM_INITIAL_LINEAR_VELOCITY" value="0" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set initial velocity properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set initial velocity properties. </constant> <constant name="PARAM_ANGULAR_VELOCITY" value="1" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set angular velocity properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set angular velocity properties. </constant> <constant name="PARAM_ORBIT_VELOCITY" value="2" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set orbital velocity properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set orbital velocity properties. </constant> <constant name="PARAM_LINEAR_ACCEL" value="3" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set linear acceleration properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set linear acceleration properties. </constant> <constant name="PARAM_RADIAL_ACCEL" value="4" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set radial acceleration properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set radial acceleration properties. </constant> <constant name="PARAM_TANGENTIAL_ACCEL" value="5" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set tangential acceleration properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set tangential acceleration properties. </constant> <constant name="PARAM_DAMPING" value="6" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set damping properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set damping properties. </constant> <constant name="PARAM_ANGLE" value="7" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set angle properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set angle properties. </constant> <constant name="PARAM_SCALE" value="8" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set scale properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set scale properties. </constant> <constant name="PARAM_HUE_VARIATION" value="9" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set hue variation properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set hue variation properties. </constant> <constant name="PARAM_ANIM_SPEED" value="10" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set animation speed properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set animation speed properties. </constant> <constant name="PARAM_ANIM_OFFSET" value="11" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set animation offset properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set animation offset properties. </constant> <constant name="PARAM_MAX" value="12" enum="Parameter"> Represents the size of the [enum Parameter] enum. </constant> <constant name="FLAG_ALIGN_Y_TO_VELOCITY" value="0" enum="Flags"> - Use with [method set_flag] to set [member flag_align_y]. + Use with [method set_particle_flag] to set [member flag_align_y]. </constant> <constant name="FLAG_ROTATE_Y" value="1" enum="Flags"> - Use with [method set_flag] to set [member flag_rotate_y]. + Use with [method set_particle_flag] to set [member flag_rotate_y]. </constant> <constant name="FLAG_DISABLE_Z" value="2" enum="Flags"> - Use with [method set_flag] to set [member flag_disable_z]. + Use with [method set_particle_flag] to set [member flag_disable_z]. </constant> <constant name="FLAG_MAX" value="3" enum="Flags"> Represents the size of the [enum Flags] enum. diff --git a/doc/classes/CPUParticles2D.xml b/doc/classes/CPUParticles2D.xml index 585b8b5f5b..c8dbffb4cb 100644 --- a/doc/classes/CPUParticles2D.xml +++ b/doc/classes/CPUParticles2D.xml @@ -20,6 +20,38 @@ Sets this node's properties to match a given [Particles2D] node with an assigned [ParticlesMaterial]. </description> </method> + <method name="get_param" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles2D.Parameter"> + </argument> + <description> + </description> + </method> + <method name="get_param_curve" qualifiers="const"> + <return type="Curve"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles2D.Parameter"> + </argument> + <description> + </description> + </method> + <method name="get_param_randomness" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles2D.Parameter"> + </argument> + <description> + </description> + </method> + <method name="get_particle_flag" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="CPUParticles2D.Flags"> + </argument> + <description> + </description> + </method> <method name="restart"> <return type="void"> </return> @@ -27,6 +59,46 @@ Restarts the particle emitter. </description> </method> + <method name="set_param"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles2D.Parameter"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_param_curve"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles2D.Parameter"> + </argument> + <argument index="1" name="curve" type="Curve"> + </argument> + <description> + </description> + </method> + <method name="set_param_randomness"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="CPUParticles2D.Parameter"> + </argument> + <argument index="1" name="randomness" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_particle_flag"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="CPUParticles2D.Flags"> + </argument> + <argument index="1" name="enable" type="bool"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="amount" type="int" setter="set_amount" getter="get_amount" default="8"> @@ -35,7 +107,7 @@ <member name="angle" type="float" setter="set_param" getter="get_param" default="0.0"> Initial rotation applied to each particle, in degrees. </member> - <member name="angle_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="angle_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's rotation will be animated along this [Curve]. </member> <member name="angle_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -44,7 +116,7 @@ <member name="angular_velocity" type="float" setter="set_param" getter="get_param" default="0.0"> Initial angular velocity applied to each particle. Sets the speed of rotation of the particle. </member> - <member name="angular_velocity_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="angular_velocity_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's angular velocity will vary along this [Curve]. </member> <member name="angular_velocity_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -53,7 +125,7 @@ <member name="anim_offset" type="float" setter="set_param" getter="get_param" default="0.0"> Particle animation offset. </member> - <member name="anim_offset_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="anim_offset_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's animation offset will vary along this [Curve]. </member> <member name="anim_offset_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -62,7 +134,7 @@ <member name="anim_speed" type="float" setter="set_param" getter="get_param" default="0.0"> Particle animation speed. </member> - <member name="anim_speed_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="anim_speed_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's animation speed will vary along this [Curve]. </member> <member name="anim_speed_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -71,13 +143,13 @@ <member name="color" type="Color" setter="set_color" getter="get_color" default="Color( 1, 1, 1, 1 )"> Each particle's initial color. If [member texture] is defined, it will be multiplied by this color. </member> - <member name="color_ramp" type="Gradient" setter="set_color_ramp" getter="get_color_ramp" default="null"> + <member name="color_ramp" type="Gradient" setter="set_color_ramp" getter="get_color_ramp"> Each particle's color will vary along this [Gradient]. </member> <member name="damping" type="float" setter="set_param" getter="get_param" default="0.0"> The rate at which particles lose velocity. </member> - <member name="damping_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="damping_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Damping will vary along this [Curve]. </member> <member name="damping_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -127,7 +199,7 @@ <member name="hue_variation" type="float" setter="set_param" getter="get_param" default="0.0"> Initial hue variation applied to each particle. </member> - <member name="hue_variation_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="hue_variation_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's hue will vary along this [Curve]. </member> <member name="hue_variation_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -142,10 +214,13 @@ <member name="lifetime" type="float" setter="set_lifetime" getter="get_lifetime" default="1.0"> Amount of time each particle will exist. </member> + <member name="lifetime_randomness" type="float" setter="set_lifetime_randomness" getter="get_lifetime_randomness" default="0.0"> + Particle lifetime randomness ratio. + </member> <member name="linear_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Linear acceleration applied to each particle in the direction of motion. </member> - <member name="linear_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="linear_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's linear acceleration will vary along this [Curve]. </member> <member name="linear_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -154,7 +229,7 @@ <member name="local_coords" type="bool" setter="set_use_local_coordinates" getter="get_use_local_coordinates" default="true"> If [code]true[/code], particles use the parent node's coordinate space. If [code]false[/code], they use global coordinates. </member> - <member name="normalmap" type="Texture" setter="set_normalmap" getter="get_normalmap" default="null"> + <member name="normalmap" type="Texture" setter="set_normalmap" getter="get_normalmap"> Normal map to be used for the [member texture] property. </member> <member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot" default="false"> @@ -163,7 +238,7 @@ <member name="orbit_velocity" type="float" setter="set_param" getter="get_param" default="0.0"> Orbital velocity applied to each particle. Makes the particles circle around origin. Specified in number of full rotations around origin per second. </member> - <member name="orbit_velocity_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="orbit_velocity_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's orbital velocity will vary along this [Curve]. </member> <member name="orbit_velocity_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -175,7 +250,7 @@ <member name="radial_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Radial acceleration applied to each particle. Makes particle accelerate away from origin. </member> - <member name="radial_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="radial_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's radial acceleration will vary along this [Curve]. </member> <member name="radial_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -187,7 +262,7 @@ <member name="scale_amount" type="float" setter="set_param" getter="get_param" default="1.0"> Initial scale applied to each particle. </member> - <member name="scale_amount_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="scale_amount_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's scale will vary along this [Curve]. </member> <member name="scale_amount_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -202,13 +277,13 @@ <member name="tangential_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Tangential acceleration applied to each particle. Tangential acceleration is perpendicular to the particle's velocity giving the particles a swirling motion. </member> - <member name="tangential_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve" default="null"> + <member name="tangential_accel_curve" type="Curve" setter="set_param_curve" getter="get_param_curve"> Each particle's tangential acceleration will vary along this [Curve]. </member> <member name="tangential_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> Tangential acceleration randomness ratio. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> Particle texture. If [code]null[/code], particles will be squares. </member> </members> @@ -220,46 +295,46 @@ Particles are drawn in order of remaining lifetime. </constant> <constant name="PARAM_INITIAL_LINEAR_VELOCITY" value="0" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set initial velocity properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set initial velocity properties. </constant> <constant name="PARAM_ANGULAR_VELOCITY" value="1" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set angular velocity properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set angular velocity properties. </constant> <constant name="PARAM_ORBIT_VELOCITY" value="2" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set orbital velocity properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set orbital velocity properties. </constant> <constant name="PARAM_LINEAR_ACCEL" value="3" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set linear acceleration properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set linear acceleration properties. </constant> <constant name="PARAM_RADIAL_ACCEL" value="4" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set radial acceleration properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set radial acceleration properties. </constant> <constant name="PARAM_TANGENTIAL_ACCEL" value="5" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set tangential acceleration properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set tangential acceleration properties. </constant> <constant name="PARAM_DAMPING" value="6" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set damping properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set damping properties. </constant> <constant name="PARAM_ANGLE" value="7" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set angle properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set angle properties. </constant> <constant name="PARAM_SCALE" value="8" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set scale properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set scale properties. </constant> <constant name="PARAM_HUE_VARIATION" value="9" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set hue variation properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set hue variation properties. </constant> <constant name="PARAM_ANIM_SPEED" value="10" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set animation speed properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set animation speed properties. </constant> <constant name="PARAM_ANIM_OFFSET" value="11" enum="Parameter"> - Use with [method set_param], [method set_param_randomness], and [method set_param_texture] to set animation offset properties. + Use with [method set_param], [method set_param_randomness], and [method set_param_curve] to set animation offset properties. </constant> <constant name="PARAM_MAX" value="12" enum="Parameter"> Represents the size of the [enum Parameter] enum. </constant> <constant name="FLAG_ALIGN_Y_TO_VELOCITY" value="0" enum="Flags"> - Use with [method set_flag] to set [member flag_align_y]. + Use with [method set_particle_flag] to set [member flag_align_y]. </constant> <constant name="FLAG_ROTATE_Y" value="1" enum="Flags"> Present for consistency with 3D particle nodes, not used in 2D. diff --git a/doc/classes/Camera.xml b/doc/classes/Camera.xml index c22413ae7e..d410800141 100644 --- a/doc/classes/Camera.xml +++ b/doc/classes/Camera.xml @@ -171,7 +171,7 @@ <member name="doppler_tracking" type="int" setter="set_doppler_tracking" getter="get_doppler_tracking" enum="Camera.DopplerTracking" default="0"> If not [constant DOPPLER_TRACKING_DISABLED], this camera will simulate the Doppler effect for objects changed in particular [code]_process[/code] methods. See [enum DopplerTracking] for possible values. </member> - <member name="environment" type="Environment" setter="set_environment" getter="get_environment" default="null"> + <member name="environment" type="Environment" setter="set_environment" getter="get_environment"> The [Environment] to use for this camera. </member> <member name="far" type="float" setter="set_zfar" getter="get_zfar" default="100.0"> diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml index e9a9f22e82..750b6851b6 100644 --- a/doc/classes/Camera2D.xml +++ b/doc/classes/Camera2D.xml @@ -45,6 +45,22 @@ Returns the location of the [Camera2D]'s screen-center, relative to the origin. </description> </method> + <method name="get_drag_margin" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> + <method name="get_limit" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> <method name="make_current"> <return type="void"> </return> @@ -60,6 +76,26 @@ This has no effect if smoothing is disabled. </description> </method> + <method name="set_drag_margin"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="drag_margin" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_limit"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="limit" type="int"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="anchor_mode" type="int" setter="set_anchor_mode" getter="get_anchor_mode" enum="Camera2D.AnchorMode" default="1"> diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index 5ac825ddcd..87b8f5c83d 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -223,8 +223,13 @@ </argument> <argument index="2" name="filled" type="bool" default="true"> </argument> + <argument index="3" name="width" type="float" default="1.0"> + </argument> + <argument index="4" name="antialiased" type="bool" default="false"> + </argument> <description> - Draws a colored rectangle. + Draws a rectangle. If [code]filled[/code] is [code]true[/code], the rectangle will be filled with the [code]color[/code] specified. If [code]filled[/code] is [code]false[/code], the rectangle will be drawn as a stroke with the [code]color[/code] and [code]width[/code] specified. If [code]antialiased[/code] is [code]true[/code], the lines will be antialiased. + [b]Note:[/b] [code]width[/code] and [code]antialiased[/code] are only effective if [code]filled[/code] is [code]false[/code]. </description> </method> <method name="draw_set_transform"> @@ -514,7 +519,7 @@ <member name="light_mask" type="int" setter="set_light_mask" getter="get_light_mask" default="1"> The rendering layers in which this [CanvasItem] responds to [Light2D] nodes. </member> - <member name="material" type="Material" setter="set_material" getter="get_material" default="null"> + <member name="material" type="Material" setter="set_material" getter="get_material"> The material applied to textures on this [CanvasItem]. </member> <member name="modulate" type="Color" setter="set_modulate" getter="get_modulate" default="Color( 1, 1, 1, 1 )"> diff --git a/doc/classes/CheckBox.xml b/doc/classes/CheckBox.xml index 5583775f95..80b5e90717 100644 --- a/doc/classes/CheckBox.xml +++ b/doc/classes/CheckBox.xml @@ -23,11 +23,11 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="font_color_disabled" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )"> </theme_item> - <theme_item name="font_color_hover" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_hover" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="font_color_hover_pressed" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> diff --git a/doc/classes/CheckButton.xml b/doc/classes/CheckButton.xml index daed9128a9..f4d0e0657b 100644 --- a/doc/classes/CheckButton.xml +++ b/doc/classes/CheckButton.xml @@ -21,11 +21,11 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="font_color_disabled" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )"> </theme_item> - <theme_item name="font_color_hover" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_hover" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="font_color_hover_pressed" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> diff --git a/doc/classes/CollisionObject2D.xml b/doc/classes/CollisionObject2D.xml index eb69a4aed4..b9ec9480cf 100644 --- a/doc/classes/CollisionObject2D.xml +++ b/doc/classes/CollisionObject2D.xml @@ -19,7 +19,7 @@ <argument index="2" name="shape_idx" type="int"> </argument> <description> - Accepts unhandled [InputEvent]s. [code]shape_idx[/code] is the child index of the clicked [Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up these events. + Accepts unhandled [InputEvent]s. Requires [member input_pickable] to be [code]true[/code]. [code]shape_idx[/code] is the child index of the clicked [Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up these events. </description> </method> <method name="create_shape_owner"> @@ -227,17 +227,17 @@ <argument index="2" name="shape_idx" type="int"> </argument> <description> - Emitted when an input event occurs. Requires [code]input_pickable[/code] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. See [method _input_event] for details. + Emitted when an input event occurs. Requires [member input_pickable] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. See [method _input_event] for details. </description> </signal> <signal name="mouse_entered"> <description> - Emitted when the mouse pointer enters any of this object's shapes. Requires [code]input_pickable[/code] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. + Emitted when the mouse pointer enters any of this object's shapes. Requires [member input_pickable] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. </description> </signal> <signal name="mouse_exited"> <description> - Emitted when the mouse pointer exits all this object's shapes. Requires [code]input_pickable[/code] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. + Emitted when the mouse pointer exits all this object's shapes. Requires [member input_pickable] to be [code]true[/code] and at least one [code]collision_layer[/code] bit to be set. </description> </signal> </signals> diff --git a/doc/classes/CollisionShape.xml b/doc/classes/CollisionShape.xml index bbbc07e6d3..c34c0be839 100644 --- a/doc/classes/CollisionShape.xml +++ b/doc/classes/CollisionShape.xml @@ -31,7 +31,7 @@ <member name="disabled" type="bool" setter="set_disabled" getter="is_disabled" default="false"> A disabled collision shape has no effect in the world. </member> - <member name="shape" type="Shape" setter="set_shape" getter="get_shape" default="null"> + <member name="shape" type="Shape" setter="set_shape" getter="get_shape"> The actual shape owned by this collision shape. </member> </members> diff --git a/doc/classes/CollisionShape2D.xml b/doc/classes/CollisionShape2D.xml index fa002bc881..5fd8826a98 100644 --- a/doc/classes/CollisionShape2D.xml +++ b/doc/classes/CollisionShape2D.xml @@ -20,7 +20,7 @@ </member> <member name="one_way_collision_margin" type="float" setter="set_one_way_collision_margin" getter="get_one_way_collision_margin" default="1.0"> </member> - <member name="shape" type="Shape2D" setter="set_shape" getter="get_shape" default="null"> + <member name="shape" type="Shape2D" setter="set_shape" getter="get_shape"> The actual shape owned by this collision shape. </member> </members> diff --git a/doc/classes/ConeTwistJoint.xml b/doc/classes/ConeTwistJoint.xml index ad9c2b3a35..4c95a4bef9 100644 --- a/doc/classes/ConeTwistJoint.xml +++ b/doc/classes/ConeTwistJoint.xml @@ -11,6 +11,24 @@ <tutorials> </tutorials> <methods> + <method name="get_param" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="ConeTwistJoint.Param"> + </argument> + <description> + </description> + </method> + <method name="set_param"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="ConeTwistJoint.Param"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="bias" type="float" setter="set_param" getter="get_param" default="0.3"> diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml index d25c2b31ee..69fec750a2 100644 --- a/doc/classes/Control.xml +++ b/doc/classes/Control.xml @@ -173,6 +173,14 @@ The methods [method can_drop_data] and [method drop_data] must be implemented on controls that want to receive drop data. </description> </method> + <method name="get_anchor" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> <method name="get_begin" qualifiers="const"> <return type="Vector2"> </return> @@ -240,6 +248,14 @@ Returns [member margin_right] and [member margin_bottom]. </description> </method> + <method name="get_focus_neighbour" qualifiers="const"> + <return type="NodePath"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> <method name="get_focus_owner" qualifiers="const"> <return type="Control"> </return> @@ -274,6 +290,14 @@ <description> </description> </method> + <method name="get_margin" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> <method name="get_minimum_size" qualifiers="const"> <return type="Vector2"> </return> @@ -574,6 +598,16 @@ Sets [member margin_right] and [member margin_bottom] at the same time. </description> </method> + <method name="set_focus_neighbour"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="neighbour" type="NodePath"> + </argument> + <description> + </description> + </method> <method name="set_global_position"> <return type="void"> </return> @@ -584,6 +618,16 @@ <description> </description> </method> + <method name="set_margin"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="offset" type="float"> + </argument> + <description> + </description> + </method> <method name="set_margins_preset"> <return type="void"> </return> @@ -744,7 +788,7 @@ <member name="size_flags_vertical" type="int" setter="set_v_size_flags" getter="get_v_size_flags" default="1"> Tells the parent [Container] nodes how they should resize and place the node on the Y axis. Use one of the [code]SIZE_*[/code] constants to change the flags. See the constants to learn what each does. </member> - <member name="theme" type="Theme" setter="set_theme" getter="get_theme" default="null"> + <member name="theme" type="Theme" setter="set_theme" getter="get_theme"> Changing this property replaces the current [Theme] resource this node and all its [Control] children use. </member> </members> diff --git a/doc/classes/CurveTexture.xml b/doc/classes/CurveTexture.xml index 666284138b..e8df560a4c 100644 --- a/doc/classes/CurveTexture.xml +++ b/doc/classes/CurveTexture.xml @@ -11,7 +11,7 @@ <methods> </methods> <members> - <member name="curve" type="Curve" setter="set_curve" getter="get_curve" default="null"> + <member name="curve" type="Curve" setter="set_curve" getter="get_curve"> The [code]curve[/code] rendered onto the texture. </member> <member name="width" type="int" setter="set_width" getter="get_width" default="2048"> diff --git a/doc/classes/DirectionalLight.xml b/doc/classes/DirectionalLight.xml index 4d0ff7f13b..687e7519b2 100644 --- a/doc/classes/DirectionalLight.xml +++ b/doc/classes/DirectionalLight.xml @@ -21,7 +21,7 @@ <member name="directional_shadow_depth_range" type="int" setter="set_shadow_depth_range" getter="get_shadow_depth_range" enum="DirectionalLight.ShadowDepthRange" default="0"> Optimizes shadow rendering for detail versus movement. See [enum ShadowDepthRange]. </member> - <member name="directional_shadow_max_distance" type="float" setter="set_param" getter="get_param" default="200.0"> + <member name="directional_shadow_max_distance" type="float" setter="set_param" getter="get_param" default="100.0"> The maximum distance for shadow splits. </member> <member name="directional_shadow_mode" type="int" setter="set_shadow_mode" getter="get_shadow_mode" enum="DirectionalLight.ShadowMode" default="2"> diff --git a/doc/classes/DynamicFont.xml b/doc/classes/DynamicFont.xml index b7710068a6..0820d4e1b6 100644 --- a/doc/classes/DynamicFont.xml +++ b/doc/classes/DynamicFont.xml @@ -40,6 +40,14 @@ Returns the number of fallback fonts. </description> </method> + <method name="get_spacing" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="type" type="int"> + </argument> + <description> + </description> + </method> <method name="remove_fallback"> <return type="void"> </return> @@ -60,6 +68,16 @@ Sets the fallback font at index [code]idx[/code]. </description> </method> + <method name="set_spacing"> + <return type="void"> + </return> + <argument index="0" name="type" type="int"> + </argument> + <argument index="1" name="value" type="int"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="extra_spacing_bottom" type="int" setter="set_spacing" getter="get_spacing" default="0"> @@ -74,7 +92,7 @@ <member name="extra_spacing_top" type="int" setter="set_spacing" getter="get_spacing" default="0"> Extra spacing at the top in pixels. </member> - <member name="font_data" type="DynamicFontData" setter="set_font_data" getter="get_font_data" default="null"> + <member name="font_data" type="DynamicFontData" setter="set_font_data" getter="get_font_data"> The font data. </member> <member name="outline_color" type="Color" setter="set_outline_color" getter="get_outline_color" default="Color( 1, 1, 1, 1 )"> diff --git a/doc/classes/EditorInterface.xml b/doc/classes/EditorInterface.xml index 6f07682b04..d55e810c9e 100644 --- a/doc/classes/EditorInterface.xml +++ b/doc/classes/EditorInterface.xml @@ -166,6 +166,7 @@ <argument index="0" name="file" type="String"> </argument> <description> + Selects the file, with the path provided by [code]file[/code], in the FileSystem dock. </description> </method> <method name="set_plugin_enabled"> diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml index bd9a100267..fddc5e9d36 100644 --- a/doc/classes/EditorPlugin.xml +++ b/doc/classes/EditorPlugin.xml @@ -29,7 +29,7 @@ <argument index="1" name="title" type="String"> </argument> <description> - Adds a control to the bottom panel (together with Output, Debug, Animation, etc). Returns a reference to the button added. It's up to you to hide/show the button when needed. When your plugin is deactivated, make sure to remove your custom control with [method remove_control_from_bottom_panel] and free it with [code]queue_free()[/code]. + Adds a control to the bottom panel (together with Output, Debug, Animation, etc). Returns a reference to the button added. It's up to you to hide/show the button when needed. When your plugin is deactivated, make sure to remove your custom control with [method remove_control_from_bottom_panel] and free it with [method Node.queue_free]. </description> </method> <method name="add_control_to_container"> @@ -40,9 +40,9 @@ <argument index="1" name="control" type="Control"> </argument> <description> - Adds a custom control to a container (see [code]CONTAINER_*[/code] enum). There are many locations where custom controls can be added in the editor UI. + Adds a custom control to a container (see [enum CustomControlContainer]). There are many locations where custom controls can be added in the editor UI. Please remember that you have to manage the visibility of your custom controls yourself (and likely hide it after adding it). - When your plugin is deactivated, make sure to remove your custom control with [method remove_control_from_container] and free it with [code]queue_free()[/code]. + When your plugin is deactivated, make sure to remove your custom control with [method remove_control_from_container] and free it with [method Node.queue_free]. </description> </method> <method name="add_control_to_dock"> @@ -53,9 +53,9 @@ <argument index="1" name="control" type="Control"> </argument> <description> - Adds the control to a specific dock slot (see [code]DOCK_*[/code] enum for options). + Adds the control to a specific dock slot (see [enum DockSlot] for options). If the dock is repositioned and as long as the plugin is active, the editor will save the dock position on further sessions. - When your plugin is deactivated, make sure to remove your custom control with [method remove_control_from_docks] and free it with [code]queue_free()[/code]. + When your plugin is deactivated, make sure to remove your custom control with [method remove_control_from_docks] and free it with [method Node.queue_free]. </description> </method> <method name="add_custom_type"> @@ -167,6 +167,7 @@ <return type="void"> </return> <description> + Called by the engine when the user disables the [EditorPlugin] in the Plugin tab of the project settings window. </description> </method> <method name="edit" qualifiers="virtual"> @@ -182,6 +183,7 @@ <return type="void"> </return> <description> + Called by the engine when the user enables the [EditorPlugin] in the Plugin tab of the project settings window. </description> </method> <method name="forward_canvas_draw_over_viewport" qualifiers="virtual"> @@ -190,12 +192,6 @@ <argument index="0" name="overlay" type="Control"> </argument> <description> - This method is called when there is an input event in the 2D viewport, e.g. the user clicks with the mouse in the 2D space (canvas GUI). Keep in mind that for this method to be called you have to first declare the virtual method [method handles] so the editor knows that you want to work with the workspace: - [codeblock] - func handles(object): - return true - [/codeblock] - Also note that the edited scene must have a root node. </description> </method> <method name="forward_canvas_force_draw_over_viewport" qualifiers="virtual"> @@ -212,6 +208,22 @@ <argument index="0" name="event" type="InputEvent"> </argument> <description> + Called when there is a root node in the current edited scene, [method handles] is implemented and an [InputEvent] happens in the 2D viewport. Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] consumes the [code]event[/code], otherwise forwards [code]event[/code] to other Editor classes. Example: + [codeblock] + # Prevents the InputEvent to reach other Editor classes + func forward_canvas_gui_input(event): + var forward = true + return forward + [/codeblock] + Must [code]return false[/code] in order to forward the [InputEvent] to other Editor classes. Example: + [codeblock] + # Consumes InputEventMouseMotion and forwards other InputEvent types + func forward_canvas_gui_input(event): + var forward = false + if event is InputEventMouseMotion: + forward = true + return forward + [/codeblock] </description> </method> <method name="forward_spatial_gui_input" qualifiers="virtual"> @@ -222,12 +234,22 @@ <argument index="1" name="event" type="InputEvent"> </argument> <description> - This method is called when there is an input event in the 3D viewport, e.g. the user clicks with the mouse in the 3D space (spatial GUI). Keep in mind that for this method to be called you have to first declare the virtual method [method handles] so the editor knows that you want to work with the workspace: + Called when there is a root node in the current edited scene, [method handles] is implemented and an [InputEvent] happens in the 3D viewport. Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] consumes the [code]event[/code], otherwise forwards [code]event[/code] to other Editor classes. Example: + [codeblock] + # Prevents the InputEvent to reach other Editor classes + func forward_spatial_gui_input(camera, event): + var forward = true + return forward + [/codeblock] + Must [code]return false[/code] in order to forward the [InputEvent] to other Editor classes. Example: [codeblock] - func handles(object): - return true + # Consumes InputEventMouseMotion and forwards other InputEvent types + func forward_spatial_gui_input(camera, event): + var forward = false + if event is InputEventMouseMotion: + forward = true + return forward [/codeblock] - Also note that the edited scene must have a root node. </description> </method> <method name="get_breakpoints" qualifiers="virtual"> @@ -349,7 +371,7 @@ <argument index="0" name="control" type="Control"> </argument> <description> - Removes the control from the bottom panel. You have to manually [code]queue_free()[/code] the control. + Removes the control from the bottom panel. You have to manually [method Node.queue_free] the control. </description> </method> <method name="remove_control_from_container"> @@ -360,7 +382,7 @@ <argument index="1" name="control" type="Control"> </argument> <description> - Removes the control from the specified container. You have to manually [code]queue_free()[/code] the control. + Removes the control from the specified container. You have to manually [method Node.queue_free] the control. </description> </method> <method name="remove_control_from_docks"> @@ -369,7 +391,7 @@ <argument index="0" name="control" type="Control"> </argument> <description> - Removes the control from the dock. You have to manually [code]queue_free()[/code] the control. + Removes the control from the dock. You have to manually [method Node.queue_free] the control. </description> </method> <method name="remove_custom_type"> diff --git a/doc/classes/EditorSceneImporter.xml b/doc/classes/EditorSceneImporter.xml index 4707543c91..96d8ce698d 100644 --- a/doc/classes/EditorSceneImporter.xml +++ b/doc/classes/EditorSceneImporter.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="EditorSceneImporter" inherits="Reference" category="Core" version="3.2"> <brief_description> + Imports scenes from third-parties' 3D files. </brief_description> <description> </description> diff --git a/doc/classes/Engine.xml b/doc/classes/Engine.xml index 60a807c304..187e13d7bd 100644 --- a/doc/classes/Engine.xml +++ b/doc/classes/Engine.xml @@ -72,6 +72,13 @@ Returns the main loop object (see [MainLoop] and [SceneTree]). </description> </method> + <method name="get_physics_interpolation_fraction" qualifiers="const"> + <return type="float"> + </return> + <description> + Returns the fraction through the current physics tick we are at the time of rendering the frame. This can be used to implement fixed timestep interpolation. + </description> + </method> <method name="get_singleton" qualifiers="const"> <return type="Object"> </return> diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml index 9df8ae1aa5..cc3d5a1139 100644 --- a/doc/classes/Environment.xml +++ b/doc/classes/Environment.xml @@ -15,12 +15,30 @@ <link>https://docs.godotengine.org/en/latest/tutorials/3d/high_dynamic_range.html</link> </tutorials> <methods> + <method name="is_glow_level_enabled" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="idx" type="int"> + </argument> + <description> + </description> + </method> + <method name="set_glow_level"> + <return type="void"> + </return> + <argument index="0" name="idx" type="int"> + </argument> + <argument index="1" name="enabled" type="bool"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="adjustment_brightness" type="float" setter="set_adjustment_brightness" getter="get_adjustment_brightness" default="1.0"> Global brightness value of the rendered scene (default value is 1). </member> - <member name="adjustment_color_correction" type="Texture" setter="set_adjustment_color_correction" getter="get_adjustment_color_correction" default="null"> + <member name="adjustment_color_correction" type="Texture" setter="set_adjustment_color_correction" getter="get_adjustment_color_correction"> Applies the provided [Texture] resource to affect the global color aspect of the rendered scene. </member> <member name="adjustment_contrast" type="float" setter="set_adjustment_contrast" getter="get_adjustment_contrast" default="1.0"> @@ -71,7 +89,7 @@ <member name="background_mode" type="int" setter="set_background" getter="get_background" enum="Environment.BGMode" default="0"> Defines the mode of background. </member> - <member name="background_sky" type="Sky" setter="set_sky" getter="get_sky" default="null"> + <member name="background_sky" type="Sky" setter="set_sky" getter="get_sky"> [Sky] resource defined as background. </member> <member name="background_sky_custom_fov" type="float" setter="set_sky_custom_fov" getter="get_sky_custom_fov" default="0.0"> diff --git a/doc/classes/GIProbe.xml b/doc/classes/GIProbe.xml index 6f672bd01a..a9192d1942 100644 --- a/doc/classes/GIProbe.xml +++ b/doc/classes/GIProbe.xml @@ -30,7 +30,7 @@ </member> <member name="compress" type="bool" setter="set_compress" getter="is_compressed" default="false"> </member> - <member name="data" type="GIProbeData" setter="set_probe_data" getter="get_probe_data" default="null"> + <member name="data" type="GIProbeData" setter="set_probe_data" getter="get_probe_data"> </member> <member name="dynamic_range" type="int" setter="set_dynamic_range" getter="get_dynamic_range" default="4"> </member> diff --git a/doc/classes/Generic6DOFJoint.xml b/doc/classes/Generic6DOFJoint.xml index 91a1cb1cd4..bc34f3ac0d 100644 --- a/doc/classes/Generic6DOFJoint.xml +++ b/doc/classes/Generic6DOFJoint.xml @@ -9,6 +9,114 @@ <tutorials> </tutorials> <methods> + <method name="get_flag_x" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="Generic6DOFJoint.Flag"> + </argument> + <description> + </description> + </method> + <method name="get_flag_y" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="Generic6DOFJoint.Flag"> + </argument> + <description> + </description> + </method> + <method name="get_flag_z" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="Generic6DOFJoint.Flag"> + </argument> + <description> + </description> + </method> + <method name="get_param_x" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="Generic6DOFJoint.Param"> + </argument> + <description> + </description> + </method> + <method name="get_param_y" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="Generic6DOFJoint.Param"> + </argument> + <description> + </description> + </method> + <method name="get_param_z" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="Generic6DOFJoint.Param"> + </argument> + <description> + </description> + </method> + <method name="set_flag_x"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="Generic6DOFJoint.Flag"> + </argument> + <argument index="1" name="value" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_flag_y"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="Generic6DOFJoint.Flag"> + </argument> + <argument index="1" name="value" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_flag_z"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="Generic6DOFJoint.Flag"> + </argument> + <argument index="1" name="value" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_param_x"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="Generic6DOFJoint.Param"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_param_y"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="Generic6DOFJoint.Param"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_param_z"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="Generic6DOFJoint.Param"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="angular_limit_x/damping" type="float" setter="set_param_x" getter="get_param_x" default="1.0"> diff --git a/doc/classes/GeometryInstance.xml b/doc/classes/GeometryInstance.xml index eb1847a055..b108e1be7c 100644 --- a/doc/classes/GeometryInstance.xml +++ b/doc/classes/GeometryInstance.xml @@ -9,6 +9,14 @@ <tutorials> </tutorials> <methods> + <method name="get_flag" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="GeometryInstance.Flags"> + </argument> + <description> + </description> + </method> <method name="set_custom_aabb"> <return type="void"> </return> @@ -18,6 +26,16 @@ Overrides the bounding box of this node with a custom one. To remove it, set an [AABB] with all fields set to zero. </description> </method> + <method name="set_flag"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="GeometryInstance.Flags"> + </argument> + <argument index="1" name="value" type="bool"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="cast_shadow" type="int" setter="set_cast_shadows_setting" getter="get_cast_shadows_setting" enum="GeometryInstance.ShadowCastingSetting" default="1"> @@ -38,7 +56,7 @@ <member name="lod_min_hysteresis" type="float" setter="set_lod_min_hysteresis" getter="get_lod_min_hysteresis" default="0.0"> The GeometryInstance's min LOD margin. </member> - <member name="material_override" type="Material" setter="set_material_override" getter="get_material_override" default="null"> + <member name="material_override" type="Material" setter="set_material_override" getter="get_material_override"> The material override for the whole geometry. If there is a material in [code]material_override[/code], it will be used instead of any material set in any material slot of the mesh. </member> diff --git a/doc/classes/GradientTexture.xml b/doc/classes/GradientTexture.xml index ef46491e02..3492b2e261 100644 --- a/doc/classes/GradientTexture.xml +++ b/doc/classes/GradientTexture.xml @@ -11,7 +11,7 @@ <methods> </methods> <members> - <member name="gradient" type="Gradient" setter="set_gradient" getter="get_gradient" default="null"> + <member name="gradient" type="Gradient" setter="set_gradient" getter="get_gradient"> The [Gradient] that will be used to fill the texture. </member> <member name="width" type="int" setter="set_width" getter="get_width" default="2048"> diff --git a/doc/classes/GraphEdit.xml b/doc/classes/GraphEdit.xml index 111bf2109e..62f247a941 100644 --- a/doc/classes/GraphEdit.xml +++ b/doc/classes/GraphEdit.xml @@ -233,6 +233,9 @@ Signal sent when user dragging connection from output port into empty space of the graph. </description> </signal> + <signal name="copy_nodes_request"> + Signal sent when the user presses [code]Ctrl + C[/code]. + </signal> <signal name="delete_nodes_request"> <description> Signal sent when a GraphNode is attempted to be removed from the GraphEdit. @@ -263,6 +266,9 @@ Emitted when a GraphNode is selected. </description> </signal> + <signal name="paste_nodes_request"> + Signal sent when the user presses [code]Ctrl + V[/code]. + </signal> <signal name="popup_request"> <argument index="0" name="position" type="Vector2"> </argument> diff --git a/doc/classes/HTTPRequest.xml b/doc/classes/HTTPRequest.xml index 306f17ea44..53ee0b6132 100644 --- a/doc/classes/HTTPRequest.xml +++ b/doc/classes/HTTPRequest.xml @@ -68,6 +68,8 @@ <member name="max_redirects" type="int" setter="set_max_redirects" getter="get_max_redirects" default="8"> Maximum number of allowed redirects. </member> + <member name="timeout" type="int" setter="set_timeout" getter="get_timeout" default="0"> + </member> <member name="use_threads" type="bool" setter="set_use_threads" getter="is_using_threads" default="false"> If [code]true[/code], multithreading is used to improve performance. </member> @@ -123,5 +125,7 @@ <constant name="RESULT_REDIRECT_LIMIT_REACHED" value="11" enum="Result"> Request reached its maximum redirect limit, see [member max_redirects]. </constant> + <constant name="RESULT_TIMEOUT" value="12" enum="Result"> + </constant> </constants> </class> diff --git a/doc/classes/HingeJoint.xml b/doc/classes/HingeJoint.xml index 0ac67be96c..4582e36da6 100644 --- a/doc/classes/HingeJoint.xml +++ b/doc/classes/HingeJoint.xml @@ -9,6 +9,42 @@ <tutorials> </tutorials> <methods> + <method name="get_flag" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="HingeJoint.Flag"> + </argument> + <description> + </description> + </method> + <method name="get_param" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="HingeJoint.Param"> + </argument> + <description> + </description> + </method> + <method name="set_flag"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="HingeJoint.Flag"> + </argument> + <argument index="1" name="enabled" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_param"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="HingeJoint.Param"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="angular_limit/bias" type="float" setter="set_param" getter="get_param" default="0.3"> diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml index 65d5fbedc3..8cd69ba0da 100644 --- a/doc/classes/Image.xml +++ b/doc/classes/Image.xml @@ -469,13 +469,7 @@ </method> </methods> <members> - <member name="data" type="Dictionary" setter="_set_data" getter="_get_data" default="{ -"data": PoolByteArray( ), -"format": "Lum8", -"height": 0, -"mipmaps": false, -"width": 0 -}"> + <member name="data" type="Dictionary" setter="_set_data" getter="_get_data" default="{"data": PoolByteArray( ),"format": "Lum8","height": 0,"mipmaps": false,"width": 0}"> Holds all of the image's color data in a given format. See [code]FORMAT_*[/code] constants. </member> </members> diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml index efd8d33faf..91ebcd52f6 100644 --- a/doc/classes/Input.xml +++ b/doc/classes/Input.xml @@ -222,7 +222,7 @@ <argument index="0" name="action" type="String"> </argument> <description> - Returns [code]true[/code] if you are pressing the action event. + Returns [code]true[/code] if you are pressing the action event. Note that if an action has multiple buttons asigned and more than one of them is pressed, releasing one button will release the action, even if some other button assigned to this action is still pressed. </description> </method> <method name="is_joy_button_pressed" qualifiers="const"> @@ -318,6 +318,7 @@ <description> Sets the default cursor shape to be used in the viewport instead of [constant CURSOR_ARROW]. [b]Note:[/b] If you want to change the default cursor shape for [Control]'s nodes, use [member Control.mouse_default_cursor_shape] instead. + [b]Note:[/b] This method generates an [InputEventMouseMotion] to update cursor immediately. </description> </method> <method name="set_mouse_mode"> @@ -392,7 +393,7 @@ Makes the mouse cursor hidden if it is visible. </constant> <constant name="MOUSE_MODE_CAPTURED" value="2" enum="MouseMode"> - Captures the mouse. The mouse will be hidden and unable to leave the game window, but it will still register movement and mouse button presses. + Captures the mouse. The mouse will be hidden and unable to leave the game window, but it will still register movement and mouse button presses. On Windows and Linux, the mouse will use raw input mode, which means the reported movement will be unaffected by the OS' mouse acceleration settings. </constant> <constant name="MOUSE_MODE_CONFINED" value="3" enum="MouseMode"> Makes the mouse cursor visible but confines it to the game window. diff --git a/doc/classes/InputEvent.xml b/doc/classes/InputEvent.xml index f2c00908f6..4c8d83adba 100644 --- a/doc/classes/InputEvent.xml +++ b/doc/classes/InputEvent.xml @@ -17,6 +17,8 @@ <argument index="0" name="with_event" type="InputEvent"> </argument> <description> + Returns [code]true[/code] if the given input event and this input event can be added together (only for events of type [InputEventMouseMotion]). + The given input event's position, global position and speed will be copied. The resulting [code]relative[/code] is a sum of both events. Both events' modifiers have to be identical. </description> </method> <method name="as_text" qualifiers="const"> @@ -32,6 +34,7 @@ <argument index="0" name="action" type="String"> </argument> <description> + Returns a value between 0.0 and 1.0 depending on the given actions' state. Useful for getting the value of events of type [InputEventJoypadMotion]. </description> </method> <method name="is_action" qualifiers="const"> @@ -88,6 +91,7 @@ <argument index="0" name="event" type="InputEvent"> </argument> <description> + Returns [code]true[/code] if the given input event is checking for the same key ([InputEventKey]), button ([InputEventJoypadButton]) or action ([InputEventAction]). </description> </method> <method name="xformed_by" qualifiers="const"> @@ -98,6 +102,7 @@ <argument index="1" name="local_ofs" type="Vector2" default="Vector2( 0, 0 )"> </argument> <description> + Returns a copy of the given input event which has been offset by [code]local_ofs[/code] and transformed by [code]xform[/code]. Relevant for events of type [InputEventMouseButton], [InputEventMouseMotion], [InputEventScreenTouch], [InputEventScreenDrag], [InputEventMagnifyGesture] and [InputEventPanGesture]. </description> </method> </methods> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 95c0e663ce..8515d1063d 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -505,7 +505,7 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.627451, 0.627451, 0.627451, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.63, 0.63, 0.63, 1 )"> </theme_item> <theme_item name="font_color_selected" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> diff --git a/doc/classes/KinematicBody.xml b/doc/classes/KinematicBody.xml index b4e6b0abab..2fab689f89 100644 --- a/doc/classes/KinematicBody.xml +++ b/doc/classes/KinematicBody.xml @@ -5,13 +5,21 @@ </brief_description> <description> Kinematic bodies are special types of bodies that are meant to be user-controlled. They are not affected by physics at all; to other types of bodies, such as a character or a rigid body, these are the same as a static body. However, they have two main uses: - [b]Simulated motion:[/b] When these bodies are moved manually, either from code or from an AnimationPlayer (with process mode set to fixed), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). + [b]Simulated motion:[/b] When these bodies are moved manually, either from code or from an [AnimationPlayer] (with [member AnimationPlayer.playback_process_mode] set to "physics"), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). [b]Kinematic characters:[/b] KinematicBody also has an API for moving objects (the [method move_and_collide] and [method move_and_slide] methods) while performing collision tests. This makes them really useful to implement characters that collide against a world, but that don't require advanced physics. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/physics/kinematic_character_2d.html</link> </tutorials> <methods> + <method name="get_axis_lock" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="axis" type="int" enum="PhysicsServer.BodyAxis"> + </argument> + <description> + </description> + </method> <method name="get_floor_velocity" qualifiers="const"> <return type="Vector3"> </return> @@ -120,6 +128,16 @@ As long as the [code]snap[/code] vector is in contact with the ground, the body will remain attached to the surface. This means you must disable snap in order to jump, for example. You can do this by setting[code]snap[/code] to[code](0, 0, 0)[/code] or by using [method move_and_slide] instead. </description> </method> + <method name="set_axis_lock"> + <return type="void"> + </return> + <argument index="0" name="axis" type="int" enum="PhysicsServer.BodyAxis"> + </argument> + <argument index="1" name="lock" type="bool"> + </argument> + <description> + </description> + </method> <method name="test_move"> <return type="bool"> </return> diff --git a/doc/classes/KinematicBody2D.xml b/doc/classes/KinematicBody2D.xml index 39d84c6e31..99a83765eb 100644 --- a/doc/classes/KinematicBody2D.xml +++ b/doc/classes/KinematicBody2D.xml @@ -5,7 +5,7 @@ </brief_description> <description> Kinematic bodies are special types of bodies that are meant to be user-controlled. They are not affected by physics at all; to other types of bodies, such as a character or a rigid body, these are the same as a static body. However, they have two main uses: - [b]Simulated motion:[/b] When these bodies are moved manually, either from code or from an AnimationPlayer (with process mode set to fixed), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). + [b]Simulated motion:[/b] When these bodies are moved manually, either from code or from an [AnimationPlayer] (with [member AnimationPlayer.playback_process_mode] set to "physics"), the physics will automatically compute an estimate of their linear and angular velocity. This makes them very useful for moving platforms or other AnimationPlayer-controlled objects (like a door, a bridge that opens, etc). [b]Kinematic characters:[/b] KinematicBody2D also has an API for moving objects (the [method move_and_collide] and [method move_and_slide] methods) while performing collision tests. This makes them really useful to implement characters that collide against a world, but that don't require advanced physics. </description> <tutorials> @@ -76,6 +76,7 @@ </argument> <description> Moves the body along the vector [code]rel_vec[/code]. The body will stop if it collides. Returns a [KinematicCollision2D], which contains information about the collision. + If [code]test_only[/code] is [code]true[/code], the body does not move but the would-be collision information is given. </description> </method> <method name="move_and_slide"> diff --git a/doc/classes/KinematicCollision.xml b/doc/classes/KinematicCollision.xml index 4ce28b25c9..44447c8fc8 100644 --- a/doc/classes/KinematicCollision.xml +++ b/doc/classes/KinematicCollision.xml @@ -12,7 +12,7 @@ <methods> </methods> <members> - <member name="collider" type="Object" setter="" getter="get_collider" default="null"> + <member name="collider" type="Object" setter="" getter="get_collider"> The colliding body. </member> <member name="collider_id" type="int" setter="" getter="get_collider_id" default="0"> @@ -21,7 +21,7 @@ <member name="collider_metadata" type="Variant" setter="" getter="get_collider_metadata"> The colliding body's metadata. See [Object]. </member> - <member name="collider_shape" type="Object" setter="" getter="get_collider_shape" default="null"> + <member name="collider_shape" type="Object" setter="" getter="get_collider_shape"> The colliding body's shape. </member> <member name="collider_shape_index" type="int" setter="" getter="get_collider_shape_index" default="0"> @@ -30,7 +30,7 @@ <member name="collider_velocity" type="Vector3" setter="" getter="get_collider_velocity" default="Vector3( 0, 0, 0 )"> The colliding object's velocity. </member> - <member name="local_shape" type="Object" setter="" getter="get_local_shape" default="null"> + <member name="local_shape" type="Object" setter="" getter="get_local_shape"> The moving object's colliding shape. </member> <member name="normal" type="Vector3" setter="" getter="get_normal" default="Vector3( 0, 0, 0 )"> diff --git a/doc/classes/KinematicCollision2D.xml b/doc/classes/KinematicCollision2D.xml index 91cee3d05a..51c2277fb2 100644 --- a/doc/classes/KinematicCollision2D.xml +++ b/doc/classes/KinematicCollision2D.xml @@ -12,7 +12,7 @@ <methods> </methods> <members> - <member name="collider" type="Object" setter="" getter="get_collider" default="null"> + <member name="collider" type="Object" setter="" getter="get_collider"> The colliding body. </member> <member name="collider_id" type="int" setter="" getter="get_collider_id" default="0"> @@ -21,7 +21,7 @@ <member name="collider_metadata" type="Variant" setter="" getter="get_collider_metadata"> The colliding body's metadata. See [Object]. </member> - <member name="collider_shape" type="Object" setter="" getter="get_collider_shape" default="null"> + <member name="collider_shape" type="Object" setter="" getter="get_collider_shape"> The colliding body's shape. </member> <member name="collider_shape_index" type="int" setter="" getter="get_collider_shape_index" default="0"> @@ -30,7 +30,7 @@ <member name="collider_velocity" type="Vector2" setter="" getter="get_collider_velocity" default="Vector2( 0, 0 )"> The colliding object's velocity. </member> - <member name="local_shape" type="Object" setter="" getter="get_local_shape" default="null"> + <member name="local_shape" type="Object" setter="" getter="get_local_shape"> The moving object's colliding shape. </member> <member name="normal" type="Vector2" setter="" getter="get_normal" default="Vector2( 0, 0 )"> diff --git a/doc/classes/Light.xml b/doc/classes/Light.xml index 64d8442180..6ef7c2652d 100644 --- a/doc/classes/Light.xml +++ b/doc/classes/Light.xml @@ -10,6 +10,24 @@ <link>https://docs.godotengine.org/en/latest/tutorials/3d/lights_and_shadows.html</link> </tutorials> <methods> + <method name="get_param" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="Light.Param"> + </argument> + <description> + </description> + </method> + <method name="set_param"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="Light.Param"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="editor_only" type="bool" setter="set_editor_only" getter="is_editor_only" default="false"> diff --git a/doc/classes/Light2D.xml b/doc/classes/Light2D.xml index 88ad371983..f61be5a5af 100644 --- a/doc/classes/Light2D.xml +++ b/doc/classes/Light2D.xml @@ -70,7 +70,7 @@ <member name="shadow_item_cull_mask" type="int" setter="set_item_shadow_cull_mask" getter="get_item_shadow_cull_mask" default="1"> The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders with a matching shadow mask will cast shadows. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> [Texture] used for the Light2D's appearance. </member> <member name="texture_scale" type="float" setter="set_texture_scale" getter="get_texture_scale" default="1.0"> diff --git a/doc/classes/LightOccluder2D.xml b/doc/classes/LightOccluder2D.xml index 55978aa0a1..c7d52e6ef4 100644 --- a/doc/classes/LightOccluder2D.xml +++ b/doc/classes/LightOccluder2D.xml @@ -15,7 +15,7 @@ <member name="light_mask" type="int" setter="set_occluder_light_mask" getter="get_occluder_light_mask" default="1"> The LightOccluder2D's light mask. The LightOccluder2D will cast shadows only from Light2D(s) that have the same light mask(s). </member> - <member name="occluder" type="OccluderPolygon2D" setter="set_occluder_polygon" getter="get_occluder_polygon" default="null"> + <member name="occluder" type="OccluderPolygon2D" setter="set_occluder_polygon" getter="get_occluder_polygon"> The [OccluderPolygon2D] used to compute the shadow. </member> </members> diff --git a/doc/classes/Line2D.xml b/doc/classes/Line2D.xml index 106c736147..3cb04b8b89 100644 --- a/doc/classes/Line2D.xml +++ b/doc/classes/Line2D.xml @@ -75,7 +75,7 @@ <member name="end_cap_mode" type="int" setter="set_end_cap_mode" getter="get_end_cap_mode" enum="Line2D.LineCapMode" default="0"> Controls the style of the line's last point. Use [code]LINE_CAP_*[/code] constants. </member> - <member name="gradient" type="Gradient" setter="set_gradient" getter="get_gradient" default="null"> + <member name="gradient" type="Gradient" setter="set_gradient" getter="get_gradient"> The gradient is drawn through the whole line from start to finish. The default color will not be used if a gradient is set. </member> <member name="joint_mode" type="int" setter="set_joint_mode" getter="get_joint_mode" enum="Line2D.LineJointMode" default="0"> @@ -90,7 +90,7 @@ <member name="sharp_limit" type="float" setter="set_sharp_limit" getter="get_sharp_limit" default="2.0"> The direction difference in radians between vector points. This value is only used if [code]joint mode[/code] is set to [constant LINE_JOINT_SHARP]. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> The texture used for the line's texture. Uses [code]texture_mode[/code] for drawing style. </member> <member name="texture_mode" type="int" setter="set_texture_mode" getter="get_texture_mode" enum="Line2D.LineTextureMode" default="0"> @@ -99,7 +99,7 @@ <member name="width" type="float" setter="set_width" getter="get_width" default="10.0"> The line's width. </member> - <member name="width_curve" type="Curve" setter="set_curve" getter="get_curve" default="null"> + <member name="width_curve" type="Curve" setter="set_curve" getter="get_curve"> The line's width varies with the curve. The original width is simply multiply by the value of the Curve. </member> </members> diff --git a/doc/classes/LineEdit.xml b/doc/classes/LineEdit.xml index 482ec28c56..d90a290fdc 100644 --- a/doc/classes/LineEdit.xml +++ b/doc/classes/LineEdit.xml @@ -187,21 +187,21 @@ <theme_items> <theme_item name="clear" type="Texture"> </theme_item> - <theme_item name="clear_button_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="clear_button_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="clear_button_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> - <theme_item name="cursor_color" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="cursor_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="focus" type="StyleBox"> </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="font_color_selected" type="Color" default="Color( 0, 0, 0, 1 )"> </theme_item> - <theme_item name="font_color_uneditable" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 0.5 )"> + <theme_item name="font_color_uneditable" type="Color" default="Color( 0.88, 0.88, 0.88, 0.5 )"> </theme_item> <theme_item name="minimum_spaces" type="int" default="12"> </theme_item> @@ -209,7 +209,7 @@ </theme_item> <theme_item name="read_only" type="StyleBox"> </theme_item> - <theme_item name="selection_color" type="Color" default="Color( 0.490196, 0.490196, 0.490196, 1 )"> + <theme_item name="selection_color" type="Color" default="Color( 0.49, 0.49, 0.49, 1 )"> </theme_item> </theme_items> </class> diff --git a/doc/classes/LinkButton.xml b/doc/classes/LinkButton.xml index 5dfb55a8dd..3e6b5e8c1a 100644 --- a/doc/classes/LinkButton.xml +++ b/doc/classes/LinkButton.xml @@ -32,9 +32,9 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> - <theme_item name="font_color_hover" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_hover" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> diff --git a/doc/classes/Material.xml b/doc/classes/Material.xml index 80d8b674f3..f584c5207a 100644 --- a/doc/classes/Material.xml +++ b/doc/classes/Material.xml @@ -11,7 +11,7 @@ <methods> </methods> <members> - <member name="next_pass" type="Material" setter="set_next_pass" getter="get_next_pass" default="null"> + <member name="next_pass" type="Material" setter="set_next_pass" getter="get_next_pass"> </member> <member name="render_priority" type="int" setter="set_render_priority" getter="get_render_priority" default="0"> </member> diff --git a/doc/classes/MenuButton.xml b/doc/classes/MenuButton.xml index 609bf6317a..40d2160baa 100644 --- a/doc/classes/MenuButton.xml +++ b/doc/classes/MenuButton.xml @@ -46,11 +46,11 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="font_color_disabled" type="Color" default="Color( 1, 1, 1, 0.3 )"> </theme_item> - <theme_item name="font_color_hover" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_hover" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> diff --git a/doc/classes/MeshInstance.xml b/doc/classes/MeshInstance.xml index e7dbb8e017..c577635c98 100644 --- a/doc/classes/MeshInstance.xml +++ b/doc/classes/MeshInstance.xml @@ -59,7 +59,7 @@ </method> </methods> <members> - <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh" default="null"> + <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> The [Mesh] resource for the instance. </member> <member name="skeleton" type="NodePath" setter="set_skeleton_path" getter="get_skeleton_path" default="NodePath("..")"> diff --git a/doc/classes/MeshInstance2D.xml b/doc/classes/MeshInstance2D.xml index a44b009fb6..4b38b9aa96 100644 --- a/doc/classes/MeshInstance2D.xml +++ b/doc/classes/MeshInstance2D.xml @@ -12,13 +12,13 @@ <methods> </methods> <members> - <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh" default="null"> + <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> The [Mesh] that will be drawn by the [MeshInstance2D]. </member> - <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map" default="null"> + <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map"> The normal map that will be used if using the default [CanvasItemMaterial]. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> The [Texture] that will be used if using the default [CanvasItemMaterial]. Can be accessed as [code]TEXTURE[/code] in CanvasItem shader. </member> </members> diff --git a/doc/classes/MeshTexture.xml b/doc/classes/MeshTexture.xml index 4ec8268cc5..f8e02d1851 100644 --- a/doc/classes/MeshTexture.xml +++ b/doc/classes/MeshTexture.xml @@ -11,13 +11,13 @@ <methods> </methods> <members> - <member name="base_texture" type="Texture" setter="set_base_texture" getter="get_base_texture" default="null"> + <member name="base_texture" type="Texture" setter="set_base_texture" getter="get_base_texture"> Sets the base texture that the Mesh will use to draw. </member> <member name="image_size" type="Vector2" setter="set_image_size" getter="get_image_size" default="Vector2( 0, 0 )"> Sets the size of the image, needed for reference. </member> - <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh" default="null"> + <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> Sets the mesh used to draw. It must be a mesh using 2D vertices. </member> </members> diff --git a/doc/classes/MultiMesh.xml b/doc/classes/MultiMesh.xml index 295f23a92c..8a72aa155b 100644 --- a/doc/classes/MultiMesh.xml +++ b/doc/classes/MultiMesh.xml @@ -123,7 +123,7 @@ <member name="instance_count" type="int" setter="set_instance_count" getter="get_instance_count" default="0"> Number of instances that will get drawn. This clears and (re)sizes the buffers. By default, all instances are drawn but you can limit this with [member visible_instance_count]. </member> - <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh" default="null"> + <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> Mesh to be drawn. </member> <member name="transform_format" type="int" setter="set_transform_format" getter="get_transform_format" enum="MultiMesh.TransformFormat" default="0"> diff --git a/doc/classes/MultiMeshInstance.xml b/doc/classes/MultiMeshInstance.xml index 5e8cb83a39..16f16fdc8b 100644 --- a/doc/classes/MultiMeshInstance.xml +++ b/doc/classes/MultiMeshInstance.xml @@ -14,7 +14,7 @@ <methods> </methods> <members> - <member name="multimesh" type="MultiMesh" setter="set_multimesh" getter="get_multimesh" default="null"> + <member name="multimesh" type="MultiMesh" setter="set_multimesh" getter="get_multimesh"> The [MultiMesh] resource that will be used and shared among all instances of the [MultiMeshInstance]. </member> </members> diff --git a/doc/classes/MultiMeshInstance2D.xml b/doc/classes/MultiMeshInstance2D.xml index 28cee1aeba..8509986c3c 100644 --- a/doc/classes/MultiMeshInstance2D.xml +++ b/doc/classes/MultiMeshInstance2D.xml @@ -12,13 +12,13 @@ <methods> </methods> <members> - <member name="multimesh" type="MultiMesh" setter="set_multimesh" getter="get_multimesh" default="null"> + <member name="multimesh" type="MultiMesh" setter="set_multimesh" getter="get_multimesh"> The [MultiMesh] that will be drawn by the [MultiMeshInstance2D]. </member> - <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map" default="null"> + <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map"> The normal map that will be used if using the default [CanvasItemMaterial]. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> The [Texture] that will be used if using the default [CanvasItemMaterial]. Can be accessed as [code]TEXTURE[/code] in CanvasItem shader. </member> </members> diff --git a/doc/classes/NavigationMeshInstance.xml b/doc/classes/NavigationMeshInstance.xml index a6266aac0a..2f9cc58aea 100644 --- a/doc/classes/NavigationMeshInstance.xml +++ b/doc/classes/NavigationMeshInstance.xml @@ -11,7 +11,7 @@ <members> <member name="enabled" type="bool" setter="set_enabled" getter="is_enabled" default="true"> </member> - <member name="navmesh" type="NavigationMesh" setter="set_navigation_mesh" getter="get_navigation_mesh" default="null"> + <member name="navmesh" type="NavigationMesh" setter="set_navigation_mesh" getter="get_navigation_mesh"> </member> </members> <constants> diff --git a/doc/classes/NavigationPolygonInstance.xml b/doc/classes/NavigationPolygonInstance.xml index 26cc7fbf31..83f3386af6 100644 --- a/doc/classes/NavigationPolygonInstance.xml +++ b/doc/classes/NavigationPolygonInstance.xml @@ -11,7 +11,7 @@ <members> <member name="enabled" type="bool" setter="set_enabled" getter="is_enabled" default="true"> </member> - <member name="navpoly" type="NavigationPolygon" setter="set_navigation_polygon" getter="get_navigation_polygon" default="null"> + <member name="navpoly" type="NavigationPolygon" setter="set_navigation_polygon" getter="get_navigation_polygon"> </member> </members> <constants> diff --git a/doc/classes/NinePatchRect.xml b/doc/classes/NinePatchRect.xml index 0723d50ba1..f191b08d96 100644 --- a/doc/classes/NinePatchRect.xml +++ b/doc/classes/NinePatchRect.xml @@ -9,6 +9,24 @@ <tutorials> </tutorials> <methods> + <method name="get_patch_margin" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> + <method name="set_patch_margin"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="value" type="int"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="axis_stretch_horizontal" type="int" setter="set_h_axis_stretch_mode" getter="get_h_axis_stretch_mode" enum="NinePatchRect.AxisStretchMode" default="0"> @@ -35,7 +53,7 @@ <member name="region_rect" type="Rect2" setter="set_region_rect" getter="get_region_rect" default="Rect2( 0, 0, 0, 0 )"> Rectangular region of the texture to sample from. If you're working with an atlas, use this property to define the area the 9-slice should use. All other properties are relative to this one. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> The node's texture resource. </member> </members> diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index d73c85a6d9..c770e78c7c 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -463,7 +463,7 @@ Returns the absolute directory path where user data is written ([code]user://[/code]). On Linux, this is [code]~/.local/share/godot/app_userdata/[project_name][/code], or [code]~/.local/share/[custom_name][/code] if [code]use_custom_user_dir[/code] is set. On macOS, this is [code]~/Library/Application Support/Godot/app_userdata/[project_name][/code], or [code]~/Library/Application Support/[custom_name][/code] if [code]use_custom_user_dir[/code] is set. - On Windows, this is [code]%APPDATA%/Godot/app_userdata/[project_name][/code], or [code]%APPDATA%/[custom_name][/code] if [code]use_custom_user_dir[/code] is set. + On Windows, this is [code]%APPDATA%\Godot\app_userdata\[project_name][/code], or [code]%APPDATA%\[custom_name][/code] if [code]use_custom_user_dir[/code] is set. [code]%APPDATA%[/code] expands to [code]%USERPROFILE%\AppData\Roaming[/code]. If the project name is empty, [code]user://[/code] falls back to [code]res://[/code]. </description> </method> diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml index c44495ead9..0c2566e845 100644 --- a/doc/classes/OptionButton.xml +++ b/doc/classes/OptionButton.xml @@ -229,11 +229,11 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="font_color_disabled" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )"> </theme_item> - <theme_item name="font_color_hover" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_hover" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> diff --git a/doc/classes/PackedScene.xml b/doc/classes/PackedScene.xml index f01ef78c02..0400f2704b 100644 --- a/doc/classes/PackedScene.xml +++ b/doc/classes/PackedScene.xml @@ -65,17 +65,7 @@ </method> </methods> <members> - <member name="_bundled" type="Dictionary" setter="_set_bundled_scene" getter="_get_bundled_scene" default="{ -"conn_count": 0, -"conns": PoolIntArray( ), -"editable_instances": [ ], -"names": PoolStringArray( ), -"node_count": 0, -"node_paths": [ ], -"nodes": PoolIntArray( ), -"variants": [ ], -"version": 2 -}"> + <member name="_bundled" type="Dictionary" setter="_set_bundled_scene" getter="_get_bundled_scene" default="{"conn_count": 0,"conns": PoolIntArray( ),"editable_instances": [ ],"names": PoolStringArray( ),"node_count": 0,"node_paths": [ ],"nodes": PoolIntArray( ),"variants": [ ],"version": 2}"> A dictionary representation of the scene contents. Available keys include "rnames" and "variants" for resources, "node_count", "nodes", "node_paths" for nodes, "editable_instances" for base scene children overrides, "conn_count" and "conns" for signal connections, and "version" for the format style of the PackedScene. </member> diff --git a/doc/classes/PanoramaSky.xml b/doc/classes/PanoramaSky.xml index 93a8bc6166..96aefc0623 100644 --- a/doc/classes/PanoramaSky.xml +++ b/doc/classes/PanoramaSky.xml @@ -11,7 +11,7 @@ <methods> </methods> <members> - <member name="panorama" type="Texture" setter="set_panorama" getter="get_panorama" default="null"> + <member name="panorama" type="Texture" setter="set_panorama" getter="get_panorama"> [Texture] to be applied to the PanoramaSky. </member> </members> diff --git a/doc/classes/Particles.xml b/doc/classes/Particles.xml index 7ff99ebb73..fb74c5a3d4 100644 --- a/doc/classes/Particles.xml +++ b/doc/classes/Particles.xml @@ -18,6 +18,14 @@ Returns the axis-aligned bounding box that contains all the particles that are active in the current frame. </description> </method> + <method name="get_draw_pass_mesh" qualifiers="const"> + <return type="Mesh"> + </return> + <argument index="0" name="pass" type="int"> + </argument> + <description> + </description> + </method> <method name="restart"> <return type="void"> </return> @@ -25,6 +33,16 @@ Restarts the particle emission, clearing existing particles. </description> </method> + <method name="set_draw_pass_mesh"> + <return type="void"> + </return> + <argument index="0" name="pass" type="int"> + </argument> + <argument index="1" name="mesh" type="Mesh"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="amount" type="int" setter="set_amount" getter="get_amount" default="8"> @@ -33,7 +51,7 @@ <member name="draw_order" type="int" setter="set_draw_order" getter="get_draw_order" enum="Particles.DrawOrder" default="0"> Particle draw order. Uses [code]DRAW_ORDER_*[/code] values. </member> - <member name="draw_pass_1" type="Mesh" setter="set_draw_pass_mesh" getter="get_draw_pass_mesh" default="null"> + <member name="draw_pass_1" type="Mesh" setter="set_draw_pass_mesh" getter="get_draw_pass_mesh"> [Mesh] that is drawn for the first draw pass. </member> <member name="draw_pass_2" type="Mesh" setter="set_draw_pass_mesh" getter="get_draw_pass_mesh"> @@ -72,7 +90,7 @@ <member name="preprocess" type="float" setter="set_pre_process_time" getter="get_pre_process_time" default="0.0"> Amount of time to preprocess the particles before animation starts. Lets you start the animation some time after particles have started emitting. </member> - <member name="process_material" type="Material" setter="set_process_material" getter="get_process_material" default="null"> + <member name="process_material" type="Material" setter="set_process_material" getter="get_process_material"> [Material] for processing particles. Can be a [ParticlesMaterial] or a [ShaderMaterial]. </member> <member name="randomness" type="float" setter="set_randomness_ratio" getter="get_randomness_ratio" default="0.0"> diff --git a/doc/classes/Particles2D.xml b/doc/classes/Particles2D.xml index 52b0c846ca..7c7b42ce88 100644 --- a/doc/classes/Particles2D.xml +++ b/doc/classes/Particles2D.xml @@ -51,7 +51,7 @@ <member name="local_coords" type="bool" setter="set_use_local_coordinates" getter="get_use_local_coordinates" default="true"> If [code]true[/code], particles use the parent node's coordinate space. If [code]false[/code], they use global coordinates. </member> - <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map" default="null"> + <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map"> Normal map to be used for the [member texture] property. </member> <member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot" default="false"> @@ -60,7 +60,7 @@ <member name="preprocess" type="float" setter="set_pre_process_time" getter="get_pre_process_time" default="0.0"> Particle system starts as if it had already run for this many seconds. </member> - <member name="process_material" type="Material" setter="set_process_material" getter="get_process_material" default="null"> + <member name="process_material" type="Material" setter="set_process_material" getter="get_process_material"> [Material] for processing particles. Can be a [ParticlesMaterial] or a [ShaderMaterial]. </member> <member name="randomness" type="float" setter="set_randomness_ratio" getter="get_randomness_ratio" default="0.0"> @@ -69,7 +69,7 @@ <member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0"> Particle system's running speed scaling ratio. A value of [code]0[/code] can be used to pause the particles. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> Particle texture. If [code]null[/code], particles will be squares. </member> <member name="visibility_rect" type="Rect2" setter="set_visibility_rect" getter="get_visibility_rect" default="Rect2( -100, -100, 200, 200 )"> diff --git a/doc/classes/ParticlesMaterial.xml b/doc/classes/ParticlesMaterial.xml index ff8e01c6c9..64751cdf76 100644 --- a/doc/classes/ParticlesMaterial.xml +++ b/doc/classes/ParticlesMaterial.xml @@ -11,13 +11,85 @@ <tutorials> </tutorials> <methods> + <method name="get_flag" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="ParticlesMaterial.Flags"> + </argument> + <description> + </description> + </method> + <method name="get_param" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="ParticlesMaterial.Parameter"> + </argument> + <description> + </description> + </method> + <method name="get_param_randomness" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="ParticlesMaterial.Parameter"> + </argument> + <description> + </description> + </method> + <method name="get_param_texture" qualifiers="const"> + <return type="Texture"> + </return> + <argument index="0" name="param" type="int" enum="ParticlesMaterial.Parameter"> + </argument> + <description> + </description> + </method> + <method name="set_flag"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="ParticlesMaterial.Flags"> + </argument> + <argument index="1" name="enable" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_param"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="ParticlesMaterial.Parameter"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_param_randomness"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="ParticlesMaterial.Parameter"> + </argument> + <argument index="1" name="randomness" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_param_texture"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="ParticlesMaterial.Parameter"> + </argument> + <argument index="1" name="texture" type="Texture"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="angle" type="float" setter="set_param" getter="get_param" default="0.0"> Initial rotation applied to each particle, in degrees. Only applied when [member flag_disable_z] or [member flag_rotate_y] are [code]true[/code] or the [SpatialMaterial] being used to draw the particle is using [constant SpatialMaterial.BILLBOARD_PARTICLES]. </member> - <member name="angle_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="angle_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's rotation will be animated along this [CurveTexture]. </member> <member name="angle_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -27,7 +99,7 @@ Initial angular velocity applied to each particle. Sets the speed of rotation of the particle. Only applied when [member flag_disable_z] or [member flag_rotate_y] are [code]true[/code] or the [SpatialMaterial] being used to draw the particle is using [constant SpatialMaterial.BILLBOARD_PARTICLES]. </member> - <member name="angular_velocity_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="angular_velocity_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's angular velocity will vary along this [CurveTexture]. </member> <member name="angular_velocity_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -36,7 +108,7 @@ <member name="anim_offset" type="float" setter="set_param" getter="get_param" default="0.0"> Particle animation offset. </member> - <member name="anim_offset_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="anim_offset_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's animation offset will vary along this [CurveTexture]. </member> <member name="anim_offset_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -45,7 +117,7 @@ <member name="anim_speed" type="float" setter="set_param" getter="get_param" default="0.0"> Particle animation speed. </member> - <member name="anim_speed_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="anim_speed_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's animation speed will vary along this [CurveTexture]. </member> <member name="anim_speed_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -54,13 +126,13 @@ <member name="color" type="Color" setter="set_color" getter="get_color" default="Color( 1, 1, 1, 1 )"> Each particle's initial color. If the [Particles2D]'s [code]texture[/code] is defined, it will be multiplied by this color. To have particle display color in a [SpatialMaterial] make sure to set [member SpatialMaterial.vertex_color_use_as_albedo] to [code]true[/code]. </member> - <member name="color_ramp" type="Texture" setter="set_color_ramp" getter="get_color_ramp" default="null"> + <member name="color_ramp" type="Texture" setter="set_color_ramp" getter="get_color_ramp"> Each particle's color will vary along this [GradientTexture]. </member> <member name="damping" type="float" setter="set_param" getter="get_param" default="0.0"> The rate at which particles lose velocity. </member> - <member name="damping_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="damping_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Damping will vary along this [CurveTexture]. </member> <member name="damping_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -108,7 +180,7 @@ <member name="hue_variation" type="float" setter="set_param" getter="get_param" default="0.0"> Initial hue variation applied to each particle. </member> - <member name="hue_variation_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="hue_variation_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's hue will vary along this [CurveTexture]. </member> <member name="hue_variation_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -120,10 +192,13 @@ <member name="initial_velocity_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> Initial velocity randomness ratio. </member> + <member name="lifetime_randomness" type="float" setter="set_lifetime_randomness" getter="get_lifetime_randomness" default="0.0"> + Particle lifetime randomness ratio. + </member> <member name="linear_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Linear acceleration applied to each particle in the direction of motion. </member> - <member name="linear_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="linear_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's linear acceleration will vary along this [CurveTexture]. </member> <member name="linear_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -142,7 +217,7 @@ <member name="radial_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Radial acceleration applied to each particle. Makes particle accelerate away from origin. </member> - <member name="radial_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="radial_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's radial acceleration will vary along this [CurveTexture]. </member> <member name="radial_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -151,7 +226,7 @@ <member name="scale" type="float" setter="set_param" getter="get_param" default="1.0"> Initial scale applied to each particle. </member> - <member name="scale_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="scale_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's scale will vary along this [CurveTexture]. </member> <member name="scale_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> @@ -163,19 +238,19 @@ <member name="tangential_accel" type="float" setter="set_param" getter="get_param" default="0.0"> Tangential acceleration applied to each particle. Tangential acceleration is perpendicular to the particle's velocity giving the particles a swirling motion. </member> - <member name="tangential_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture" default="null"> + <member name="tangential_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture"> Each particle's tangential acceleration will vary along this [CurveTexture]. </member> <member name="tangential_accel_random" type="float" setter="set_param_randomness" getter="get_param_randomness" default="0.0"> Tangential acceleration randomness ratio. </member> - <member name="trail_color_modifier" type="GradientTexture" setter="set_trail_color_modifier" getter="get_trail_color_modifier" default="null"> + <member name="trail_color_modifier" type="GradientTexture" setter="set_trail_color_modifier" getter="get_trail_color_modifier"> Trail particles' color will vary along this [GradientTexture]. </member> <member name="trail_divisor" type="int" setter="set_trail_divisor" getter="get_trail_divisor" default="1"> Emitter will emit [code]amount[/code] divided by [code]trail_divisor[/code] particles. The remaining particles will be used as trail(s). </member> - <member name="trail_size_modifier" type="CurveTexture" setter="set_trail_size_modifier" getter="get_trail_size_modifier" default="null"> + <member name="trail_size_modifier" type="CurveTexture" setter="set_trail_size_modifier" getter="get_trail_size_modifier"> Trail particles' size will vary along this [CurveTexture]. </member> </members> diff --git a/doc/classes/Path.xml b/doc/classes/Path.xml index 5c1100e670..12ae8fd3d5 100644 --- a/doc/classes/Path.xml +++ b/doc/classes/Path.xml @@ -12,11 +12,7 @@ <methods> </methods> <members> - <member name="curve" type="Curve3D" setter="set_curve" getter="get_curve" default="Object(Curve3D,"resource_local_to_scene":false,"resource_name":"","bake_interval":0.2,"_data":{ -"points": PoolVector3Array( ), -"tilts": PoolRealArray( ) -},"up_vector_enabled":true,"script":null) -"> + <member name="curve" type="Curve3D" setter="set_curve" getter="get_curve"> A [Curve3D] describing the path. </member> </members> diff --git a/doc/classes/Path2D.xml b/doc/classes/Path2D.xml index 960cd5163d..b49a3d928d 100644 --- a/doc/classes/Path2D.xml +++ b/doc/classes/Path2D.xml @@ -12,10 +12,7 @@ <methods> </methods> <members> - <member name="curve" type="Curve2D" setter="set_curve" getter="get_curve" default="Object(Curve2D,"resource_local_to_scene":false,"resource_name":"","bake_interval":5.0,"_data":{ -"points": PoolVector2Array( ) -},"script":null) -"> + <member name="curve" type="Curve2D" setter="set_curve" getter="get_curve"> A [Curve2D] describing the path. </member> </members> diff --git a/doc/classes/Physics2DTestMotionResult.xml b/doc/classes/Physics2DTestMotionResult.xml index 410bffc0f0..752b50922d 100644 --- a/doc/classes/Physics2DTestMotionResult.xml +++ b/doc/classes/Physics2DTestMotionResult.xml @@ -9,7 +9,7 @@ <methods> </methods> <members> - <member name="collider" type="Object" setter="" getter="get_collider" default="null"> + <member name="collider" type="Object" setter="" getter="get_collider"> </member> <member name="collider_id" type="int" setter="" getter="get_collider_id" default="0"> </member> diff --git a/doc/classes/PinJoint.xml b/doc/classes/PinJoint.xml index 10ae3d27d9..647a59feef 100644 --- a/doc/classes/PinJoint.xml +++ b/doc/classes/PinJoint.xml @@ -9,6 +9,24 @@ <tutorials> </tutorials> <methods> + <method name="get_param" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="PinJoint.Param"> + </argument> + <description> + </description> + </method> + <method name="set_param"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="PinJoint.Param"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="params/bias" type="float" setter="set_param" getter="get_param" default="0.3"> diff --git a/doc/classes/PointMesh.xml b/doc/classes/PointMesh.xml new file mode 100644 index 0000000000..dc7dd065cf --- /dev/null +++ b/doc/classes/PointMesh.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="PointMesh" inherits="PrimitiveMesh" category="Core" version="3.2"> + <brief_description> + Mesh with a single Point primitive. + </brief_description> + <description> + The PointMesh is made from a single point. Instead of relying on triangles, points are rendered as a single rectangle on the screen with a constant size. They are intended to be used with Particle systems, but can be used as a cheap way to render constant size billboarded sprites (for example in a point cloud). + PointMeshes, must be used with a material that has a point size. Point size can be accessed in a shader with [code]POINT_SIZE[/code], or in a [SpatialMaterial] by setting [member SpatialMaterial.flags_use_point_size] and the variable [member SpatialMaterial.params_point_size]. + When using PointMeshes, properties that normally alter vertices will be ignored, including billboard mode, grow, and cull face. + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <constants> + </constants> +</class> diff --git a/doc/classes/Polygon2D.xml b/doc/classes/Polygon2D.xml index 6fc0d76d02..7c2aa468ab 100644 --- a/doc/classes/Polygon2D.xml +++ b/doc/classes/Polygon2D.xml @@ -104,7 +104,7 @@ </member> <member name="skeleton" type="NodePath" setter="set_skeleton" getter="get_skeleton" default="NodePath("")"> </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> The polygon's fill texture. Use [code]uv[/code] to set texture coordinates. </member> <member name="texture_offset" type="Vector2" setter="set_texture_offset" getter="get_texture_offset" default="Vector2( 0, 0 )"> diff --git a/doc/classes/PoolIntArray.xml b/doc/classes/PoolIntArray.xml index 730833b097..28a28b2bba 100644 --- a/doc/classes/PoolIntArray.xml +++ b/doc/classes/PoolIntArray.xml @@ -6,6 +6,7 @@ <description> An [Array] specifically designed to hold integer values ([int]). Optimized for memory usage, does not fragment the memory. [b]Note:[/b] This type is passed by value and not by reference. + [b]Note:[/b] This type is limited to signed 32-bit integers, which means it can only take values in the interval [code][-2^31, 2^31 - 1][/code], i.e. [code][-2147483648, 2147483647][/code]. Exceeding those bounds will wrap around. In comparison, [int] uses signed 64-bit integers which can hold much larger values. </description> <tutorials> </tutorials> diff --git a/doc/classes/PopupMenu.xml b/doc/classes/PopupMenu.xml index a05aff9a59..3d6693da15 100644 --- a/doc/classes/PopupMenu.xml +++ b/doc/classes/PopupMenu.xml @@ -598,7 +598,7 @@ <theme_item name="font" type="Font"> Sets a custom [Font]. </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> Sets a custom [Color] for the [Font]. </theme_item> <theme_item name="font_color_accel" type="Color" default="Color( 0.7, 0.7, 0.7, 0.8 )"> @@ -606,7 +606,7 @@ <theme_item name="font_color_disabled" type="Color" default="Color( 0.4, 0.4, 0.4, 0.8 )"> Sets a custom [Color] for disabled text. </theme_item> - <theme_item name="font_color_hover" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color_hover" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> Sets a custom [Color] for the hovered text. </theme_item> <theme_item name="hover" type="StyleBox"> diff --git a/doc/classes/PrimitiveMesh.xml b/doc/classes/PrimitiveMesh.xml index 83d4dea5b1..b0e69bd089 100644 --- a/doc/classes/PrimitiveMesh.xml +++ b/doc/classes/PrimitiveMesh.xml @@ -24,7 +24,7 @@ <member name="flip_faces" type="bool" setter="set_flip_faces" getter="get_flip_faces" default="false"> If set, the order of the vertices in each triangle are reversed resulting in the backside of the mesh being drawn. Result is the same as using *CULL_BACK* in [SpatialMaterial]. </member> - <member name="material" type="Material" setter="set_material" getter="get_material" default="null"> + <member name="material" type="Material" setter="set_material" getter="get_material"> The current [Material] of the primitive mesh. </member> </members> diff --git a/doc/classes/ProgressBar.xml b/doc/classes/ProgressBar.xml index a8168958cf..96d377fd5e 100644 --- a/doc/classes/ProgressBar.xml +++ b/doc/classes/ProgressBar.xml @@ -24,7 +24,7 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="font_color_shadow" type="Color" default="Color( 0, 0, 0, 1 )"> </theme_item> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 3e9e063c0c..80d21e07ea 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -164,7 +164,7 @@ <member name="android/modules" type="String" setter="" getter="" default=""""> Comma-separated list of custom Android modules (which must have been built in the Android export templates) using their Java package path, e.g. [code]org/godotengine/org/GodotPaymentV3,org/godotengine/godot/MyCustomSingleton"[/code]. </member> - <member name="application/boot_splash/bg_color" type="Color" setter="" getter="" default="Color( 0.137255, 0.137255, 0.137255, 1 )"> + <member name="application/boot_splash/bg_color" type="Color" setter="" getter="" default="Color( 0.14, 0.14, 0.14, 1 )"> Background color for the boot splash. </member> <member name="application/boot_splash/fullsize" type="bool" setter="" getter="" default="true"> @@ -434,92 +434,31 @@ <member name="gui/timers/text_edit_idle_detect_sec" type="float" setter="" getter="" default="3"> Timer for detecting idle in the editor (in seconds). </member> - <member name="input/ui_accept" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"unicode":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777222,"unicode":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) - ] -}"> - </member> - <member name="input/ui_cancel" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null) - ] -}"> - </member> - <member name="input/ui_down" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) - ] -}"> - </member> - <member name="input/ui_end" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777230,"unicode":0,"echo":false,"script":null) - ] -}"> - </member> - <member name="input/ui_focus_next" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777218,"unicode":0,"echo":false,"script":null) - ] -}"> - </member> - <member name="input/ui_focus_prev" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777218,"unicode":0,"echo":false,"script":null) - ] -}"> - </member> - <member name="input/ui_home" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777229,"unicode":0,"echo":false,"script":null) - ] -}"> - </member> - <member name="input/ui_left" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) - ] -}"> - </member> - <member name="input/ui_page_down" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777236,"unicode":0,"echo":false,"script":null) - ] -}"> - </member> - <member name="input/ui_page_up" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777235,"unicode":0,"echo":false,"script":null) - ] -}"> - </member> - <member name="input/ui_right" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null) - ] -}"> - </member> - <member name="input/ui_select" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":3,"pressure":0.0,"pressed":false,"script":null) - ] -}"> - </member> - <member name="input/ui_up" type="Dictionary" setter="" getter="" default="{ -"deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) - ] -}"> + <member name="input/ui_accept" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"unicode":0,"echo":false,"script":null), Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777222,"unicode":0,"echo":false,"script":null), Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null), Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) ]}"> + </member> + <member name="input/ui_cancel" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"unicode":0,"echo":false,"script":null), Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null) ]}"> + </member> + <member name="input/ui_down" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null), Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) ]}"> + </member> + <member name="input/ui_end" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777230,"unicode":0,"echo":false,"script":null) ]}"> + </member> + <member name="input/ui_focus_next" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777218,"unicode":0,"echo":false,"script":null) ]}"> + </member> + <member name="input/ui_focus_prev" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777218,"unicode":0,"echo":false,"script":null) ]}"> + </member> + <member name="input/ui_home" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777229,"unicode":0,"echo":false,"script":null) ]}"> + </member> + <member name="input/ui_left" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null), Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) ]}"> + </member> + <member name="input/ui_page_down" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777236,"unicode":0,"echo":false,"script":null) ]}"> + </member> + <member name="input/ui_page_up" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777235,"unicode":0,"echo":false,"script":null) ]}"> + </member> + <member name="input/ui_right" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null), Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null) ]}"> + </member> + <member name="input/ui_select" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null), Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":3,"pressure":0.0,"pressed":false,"script":null) ]}"> + </member> + <member name="input/ui_up" type="Dictionary" setter="" getter="" default="{"deadzone": 0.5,"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null), Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) ]}"> </member> <member name="input_devices/pointing/emulate_mouse_from_touch" type="bool" setter="" getter="" default="true"> If [code]true[/code], sends mouse input events when tapping or swiping on the touchscreen. @@ -720,6 +659,8 @@ <member name="network/limits/packet_peer_stream/max_buffer_po2" type="int" setter="" getter="" default="16"> Default size of packet peer stream for deserializing Godot data. Over this size, data is dropped. </member> + <member name="network/limits/tcp/connect_timeout_seconds" type="int" setter="" getter="" default="30"> + </member> <member name="network/limits/websocket_client/max_in_buffer_kb" type="int" setter="" getter="" default="64"> </member> <member name="network/limits/websocket_client/max_in_packets" type="int" setter="" getter="" default="1024"> @@ -786,6 +727,12 @@ <member name="rendering/limits/rendering/max_renderable_elements" type="int" setter="" getter="" default="65536"> Max amount of elements renderable in a frame. If more than this are visible per frame, they will be dropped. Keep in mind elements refer to mesh surfaces and not meshes themselves. </member> + <member name="rendering/limits/rendering/max_renderable_lights" type="int" setter="" getter="" default="4096"> + Max number of lights renderable in a frame. If more than this number are used, they will be ignored. On some systems (particularly web) setting this number as low as possible can increase the speed of shader compilation. + </member> + <member name="rendering/limits/rendering/max_renderable_reflections" type="int" setter="" getter="" default="1024"> + Max number of reflection probes renderable in a frame. If more than this number are used, they will be ignored. On some systems (particularly web) setting this number as low as possible can increase the speed of shader compilation. + </member> <member name="rendering/limits/time/time_rollover_secs" type="float" setter="" getter="" default="3600"> Shaders have a time variable that constantly increases. At some point, it needs to be rolled back to zero to avoid precision errors on shader animations. This setting specifies when (in seconds). </member> @@ -884,7 +831,7 @@ <member name="rendering/quality/subsurface_scattering/weight_samples" type="bool" setter="" getter="" default="true"> Weight subsurface scattering samples. Helps to avoid reading samples from unrelated parts of the screen. </member> - <member name="rendering/quality/voxel_cone_tracing/high_quality" type="bool" setter="" getter="" default="true"> + <member name="rendering/quality/voxel_cone_tracing/high_quality" type="bool" setter="" getter="" default="false"> Use high-quality voxel cone tracing. This results in better-looking reflections, but is much more expensive on the GPU. </member> <member name="rendering/threads/thread_model" type="int" setter="" getter="" default="1"> @@ -905,7 +852,7 @@ <member name="rendering/vram_compression/import_s3tc" type="bool" setter="" getter="" default="true"> If [code]true[/code], the texture importer will import VRAM-compressed textures using the S3 Texture Compression algorithm. This algorithm is only supported on desktop platforms and consoles. </member> - <member name="script" type="Script" setter="" getter="" default="null"> + <member name="script" type="Script" setter="" getter=""> </member> </members> <constants> diff --git a/doc/classes/ProxyTexture.xml b/doc/classes/ProxyTexture.xml index d403196022..a36f670c42 100644 --- a/doc/classes/ProxyTexture.xml +++ b/doc/classes/ProxyTexture.xml @@ -9,7 +9,7 @@ <methods> </methods> <members> - <member name="base" type="Texture" setter="set_base" getter="get_base" default="null"> + <member name="base" type="Texture" setter="set_base" getter="get_base"> </member> </members> <constants> diff --git a/doc/classes/RemoteTransform.xml b/doc/classes/RemoteTransform.xml index 4628ef8519..377f9cc34b 100644 --- a/doc/classes/RemoteTransform.xml +++ b/doc/classes/RemoteTransform.xml @@ -10,6 +10,13 @@ <tutorials> </tutorials> <methods> + <method name="force_update_cache"> + <return type="void"> + </return> + <description> + [RemoteTransform] caches the remote node. It may not notice if the remote node disappears; [method force_update_cache] forces it to update the cache again. + </description> + </method> </methods> <members> <member name="remote_path" type="NodePath" setter="set_remote_node" getter="get_remote_node" default="NodePath("")"> diff --git a/doc/classes/RemoteTransform2D.xml b/doc/classes/RemoteTransform2D.xml index 6a317724a0..f5d509782f 100644 --- a/doc/classes/RemoteTransform2D.xml +++ b/doc/classes/RemoteTransform2D.xml @@ -10,6 +10,13 @@ <tutorials> </tutorials> <methods> + <method name="force_update_cache"> + <return type="void"> + </return> + <description> + [RemoteTransform2D] caches the remote node. It may not notice if the remote node disappears; [method force_update_cache] forces it to update the cache again. + </description> + </method> </methods> <members> <member name="remote_path" type="NodePath" setter="set_remote_node" getter="get_remote_node" default="NodePath("")"> diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml index 405eb59563..81f5f44866 100644 --- a/doc/classes/RichTextLabel.xml +++ b/doc/classes/RichTextLabel.xml @@ -331,7 +331,7 @@ </theme_item> <theme_item name="focus" type="StyleBox"> </theme_item> - <theme_item name="font_color_selected" type="Color" default="Color( 0.490196, 0.490196, 0.490196, 1 )"> + <theme_item name="font_color_selected" type="Color" default="Color( 0.49, 0.49, 0.49, 1 )"> </theme_item> <theme_item name="font_color_shadow" type="Color" default="Color( 0, 0, 0, 0 )"> </theme_item> diff --git a/doc/classes/RigidBody.xml b/doc/classes/RigidBody.xml index a705789413..4378fc3ffe 100644 --- a/doc/classes/RigidBody.xml +++ b/doc/classes/RigidBody.xml @@ -82,6 +82,14 @@ Applies a torque impulse which will be affected by the body mass and shape. This will rotate the body around the [code]impulse[/code] vector passed. </description> </method> + <method name="get_axis_lock" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="axis" type="int" enum="PhysicsServer.BodyAxis"> + </argument> + <description> + </description> + </method> <method name="get_colliding_bodies" qualifiers="const"> <return type="Array"> </return> @@ -90,6 +98,16 @@ [b]Note:[/b] The result of this test is not immediate after moving objects. For performance, list of collisions is updated once per frame and before the physics step. Consider using signals instead. </description> </method> + <method name="set_axis_lock"> + <return type="void"> + </return> + <argument index="0" name="axis" type="int" enum="PhysicsServer.BodyAxis"> + </argument> + <argument index="1" name="lock" type="bool"> + </argument> + <description> + </description> + </method> <method name="set_axis_velocity"> <return type="void"> </return> @@ -164,7 +182,7 @@ <member name="mode" type="int" setter="set_mode" getter="get_mode" enum="RigidBody.Mode" default="0"> The body mode. See [enum Mode] for possible values. </member> - <member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override" default="null"> + <member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override"> </member> <member name="sleeping" type="bool" setter="set_sleeping" getter="is_sleeping" default="false"> If [code]true[/code], the body is sleeping and will not calculate forces until woken up by a collision or the [code]apply_impulse[/code] method. diff --git a/doc/classes/RigidBody2D.xml b/doc/classes/RigidBody2D.xml index 907a82d51d..f280dc81c2 100644 --- a/doc/classes/RigidBody2D.xml +++ b/doc/classes/RigidBody2D.xml @@ -168,7 +168,7 @@ <member name="mode" type="int" setter="set_mode" getter="get_mode" enum="RigidBody2D.Mode" default="0"> The body's mode. See [enum Mode] for possible values. </member> - <member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override" default="null"> + <member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override"> </member> <member name="sleeping" type="bool" setter="set_sleeping" getter="is_sleeping" default="false"> If [code]true[/code], the body is sleeping and will not calculate forces until woken up by a collision or by using [method apply_impulse] or [method add_force]. diff --git a/doc/classes/ShaderMaterial.xml b/doc/classes/ShaderMaterial.xml index 01d9055569..ef355c4417 100644 --- a/doc/classes/ShaderMaterial.xml +++ b/doc/classes/ShaderMaterial.xml @@ -48,7 +48,7 @@ </method> </methods> <members> - <member name="shader" type="Shader" setter="set_shader" getter="get_shader" default="null"> + <member name="shader" type="Shader" setter="set_shader" getter="get_shader"> The [Shader] program used to render this material. </member> </members> diff --git a/doc/classes/ShortCut.xml b/doc/classes/ShortCut.xml index 44a10ba598..4c5dc0e77b 100644 --- a/doc/classes/ShortCut.xml +++ b/doc/classes/ShortCut.xml @@ -35,7 +35,7 @@ </method> </methods> <members> - <member name="shortcut" type="InputEvent" setter="set_shortcut" getter="get_shortcut" default="null"> + <member name="shortcut" type="InputEvent" setter="set_shortcut" getter="get_shortcut"> The shortcut's [InputEvent]. Generally the [InputEvent] is a keyboard key, though it can be any [InputEvent]. </member> diff --git a/doc/classes/SliderJoint.xml b/doc/classes/SliderJoint.xml index a91f67f107..3f22b5a37c 100644 --- a/doc/classes/SliderJoint.xml +++ b/doc/classes/SliderJoint.xml @@ -9,6 +9,24 @@ <tutorials> </tutorials> <methods> + <method name="get_param" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="param" type="int" enum="SliderJoint.Param"> + </argument> + <description> + </description> + </method> + <method name="set_param"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="SliderJoint.Param"> + </argument> + <argument index="1" name="value" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="angular_limit/damping" type="float" setter="set_param" getter="get_param" default="0.0"> diff --git a/doc/classes/SpatialMaterial.xml b/doc/classes/SpatialMaterial.xml index 5e18e72f90..df315d7430 100644 --- a/doc/classes/SpatialMaterial.xml +++ b/doc/classes/SpatialMaterial.xml @@ -10,12 +10,66 @@ <link>https://docs.godotengine.org/en/latest/tutorials/3d/spatial_material.html</link> </tutorials> <methods> + <method name="get_feature" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="feature" type="int" enum="SpatialMaterial.Feature"> + </argument> + <description> + </description> + </method> + <method name="get_flag" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="SpatialMaterial.Flags"> + </argument> + <description> + </description> + </method> + <method name="get_texture" qualifiers="const"> + <return type="Texture"> + </return> + <argument index="0" name="param" type="int" enum="SpatialMaterial.TextureParam"> + </argument> + <description> + </description> + </method> + <method name="set_feature"> + <return type="void"> + </return> + <argument index="0" name="feature" type="int" enum="SpatialMaterial.Feature"> + </argument> + <argument index="1" name="enable" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_flag"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="SpatialMaterial.Flags"> + </argument> + <argument index="1" name="enable" type="bool"> + </argument> + <description> + </description> + </method> + <method name="set_texture"> + <return type="void"> + </return> + <argument index="0" name="param" type="int" enum="SpatialMaterial.TextureParam"> + </argument> + <argument index="1" name="texture" type="Texture"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="albedo_color" type="Color" setter="set_albedo" getter="get_albedo" default="Color( 1, 1, 1, 1 )"> The material's base color. </member> - <member name="albedo_texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="albedo_texture" type="Texture" setter="set_texture" getter="get_texture"> </member> <member name="anisotropy" type="float" setter="set_anisotropy" getter="get_anisotropy"> The strength of the anisotropy effect. @@ -136,9 +190,9 @@ General reflectivity amount. [b]Note:[/b] unlike [member metallic], this is not energy-conserving, so it should be left at [code]0.5[/code] in most cases. See also [member roughness]. </member> - <member name="metallic_texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="metallic_texture" type="Texture" setter="set_texture" getter="get_texture"> </member> - <member name="metallic_texture_channel" type="int" setter="set_metallic_texture_channel" getter="get_metallic_texture_channel" enum="SpatialMaterial.TextureChannel" default="2"> + <member name="metallic_texture_channel" type="int" setter="set_metallic_texture_channel" getter="get_metallic_texture_channel" enum="SpatialMaterial.TextureChannel" default="0"> </member> <member name="normal_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> If [code]true[/code], normal mapping is enabled. @@ -221,9 +275,9 @@ <member name="roughness" type="float" setter="set_roughness" getter="get_roughness" default="1.0"> Surface reflection. A value of [code]0[/code] represents a perfect mirror while a value of [code]1[/code] completely blurs the reflection. See also [member metallic]. </member> - <member name="roughness_texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="roughness_texture" type="Texture" setter="set_texture" getter="get_texture"> </member> - <member name="roughness_texture_channel" type="int" setter="set_roughness_texture_channel" getter="get_roughness_texture_channel" enum="SpatialMaterial.TextureChannel" default="1"> + <member name="roughness_texture_channel" type="int" setter="set_roughness_texture_channel" getter="get_roughness_texture_channel" enum="SpatialMaterial.TextureChannel" default="0"> </member> <member name="subsurf_scatter_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> If [code]true[/code], subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges. diff --git a/doc/classes/SpringArm.xml b/doc/classes/SpringArm.xml index 16b4b846e4..438d96f2b3 100644 --- a/doc/classes/SpringArm.xml +++ b/doc/classes/SpringArm.xml @@ -41,7 +41,7 @@ </member> <member name="margin" type="float" setter="set_margin" getter="get_margin" default="0.01"> </member> - <member name="shape" type="Shape" setter="set_shape" getter="get_shape" default="null"> + <member name="shape" type="Shape" setter="set_shape" getter="get_shape"> </member> <member name="spring_length" type="float" setter="set_length" getter="get_length" default="1.0"> </member> diff --git a/doc/classes/Sprite.xml b/doc/classes/Sprite.xml index c14ae43f66..b77db1ce9a 100644 --- a/doc/classes/Sprite.xml +++ b/doc/classes/Sprite.xml @@ -46,10 +46,13 @@ <member name="frame" type="int" setter="set_frame" getter="get_frame" default="0"> Current frame to display from sprite sheet. [member vframes] or [member hframes] must be greater than 1. </member> + <member name="frame_coords" type="Vector2" setter="set_frame_coords" getter="get_frame_coords" default="Vector2( 0, 0 )"> + Coordinates of the frame to display from sprite sheet. This is as an alias for the [member frame] property. [member vframes] or [member hframes] must be greater than 1. + </member> <member name="hframes" type="int" setter="set_hframes" getter="get_hframes" default="1"> The number of columns in the sprite sheet. </member> - <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map" default="null"> + <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map"> The normal map gives depth to the Sprite. </member> <member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2( 0, 0 )"> @@ -64,7 +67,7 @@ <member name="region_rect" type="Rect2" setter="set_region_rect" getter="get_region_rect" default="Rect2( 0, 0, 0, 0 )"> The region of the atlas texture to display. [member region_enabled] must be [code]true[/code]. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> [Texture] object to draw. </member> <member name="vframes" type="int" setter="set_vframes" getter="get_vframes" default="1"> diff --git a/doc/classes/Sprite3D.xml b/doc/classes/Sprite3D.xml index 78004c60ee..e458d4301e 100644 --- a/doc/classes/Sprite3D.xml +++ b/doc/classes/Sprite3D.xml @@ -14,6 +14,9 @@ <member name="frame" type="int" setter="set_frame" getter="get_frame" default="0"> Current frame to display from sprite sheet. [member vframes] or [member hframes] must be greater than 1. </member> + <member name="frame_coords" type="Vector2" setter="set_frame_coords" getter="get_frame_coords" default="Vector2( 0, 0 )"> + Coordinates of the frame to display from sprite sheet. This is as an alias for the [member frame] property. [member vframes] or [member hframes] must be greater than 1. + </member> <member name="hframes" type="int" setter="set_hframes" getter="get_hframes" default="1"> The number of columns in the sprite sheet. </member> @@ -23,7 +26,7 @@ <member name="region_rect" type="Rect2" setter="set_region_rect" getter="get_region_rect" default="Rect2( 0, 0, 0, 0 )"> The region of the atlas texture to display. [member region_enabled] must be [code]true[/code]. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> [Texture] object to draw. </member> <member name="vframes" type="int" setter="set_vframes" getter="get_vframes" default="1"> diff --git a/doc/classes/SpriteBase3D.xml b/doc/classes/SpriteBase3D.xml index 9c5ed213a8..5529da909d 100644 --- a/doc/classes/SpriteBase3D.xml +++ b/doc/classes/SpriteBase3D.xml @@ -15,12 +15,30 @@ <description> </description> </method> + <method name="get_draw_flag" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="flag" type="int" enum="SpriteBase3D.DrawFlags"> + </argument> + <description> + </description> + </method> <method name="get_item_rect" qualifiers="const"> <return type="Rect2"> </return> <description> </description> </method> + <method name="set_draw_flag"> + <return type="void"> + </return> + <argument index="0" name="flag" type="int" enum="SpriteBase3D.DrawFlags"> + </argument> + <argument index="1" name="enabled" type="bool"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="alpha_cut" type="int" setter="set_alpha_cut_mode" getter="get_alpha_cut_mode" enum="SpriteBase3D.AlphaCutMode" default="0"> diff --git a/doc/classes/StaticBody.xml b/doc/classes/StaticBody.xml index 878d76a2e3..a9709d00df 100644 --- a/doc/classes/StaticBody.xml +++ b/doc/classes/StaticBody.xml @@ -27,7 +27,7 @@ The body's friction, from 0 (frictionless) to 1 (full friction). Deprecated, use [member PhysicsMaterial.friction] instead via [member physics_material_override]. </member> - <member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override" default="null"> + <member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override"> </member> </members> <constants> diff --git a/doc/classes/StaticBody2D.xml b/doc/classes/StaticBody2D.xml index 4522a50557..4a7f71b667 100644 --- a/doc/classes/StaticBody2D.xml +++ b/doc/classes/StaticBody2D.xml @@ -26,7 +26,7 @@ The body's friction. Values range from [code]0[/code] (no friction) to [code]1[/code] (full friction). Deprecated, use [member PhysicsMaterial.friction] instead via [member physics_material_override]. </member> - <member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override" default="null"> + <member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override"> </member> </members> <constants> diff --git a/doc/classes/StreamTexture.xml b/doc/classes/StreamTexture.xml index 20cbadb5f0..9c7adea079 100644 --- a/doc/classes/StreamTexture.xml +++ b/doc/classes/StreamTexture.xml @@ -9,6 +9,14 @@ <tutorials> </tutorials> <methods> + <method name="load"> + <return type="int" enum="Error"> + </return> + <argument index="0" name="path" type="String"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="load_path" type="String" setter="load" getter="get_load_path" default=""""> diff --git a/doc/classes/String.xml b/doc/classes/String.xml index e513a44b1d..f6ec85c87d 100644 --- a/doc/classes/String.xml +++ b/doc/classes/String.xml @@ -272,6 +272,32 @@ Performs a case-sensitive comparison to another string. Returns [code]-1[/code] if less than, [code]+1[/code] if greater than, or [code]0[/code] if equal. </description> </method> + <method name="count"> + <return type="int"> + </return> + <argument index="0" name="what" type="String"> + </argument> + <argument index="1" name="from" type="int" default="0"> + </argument> + <argument index="2" name="to" type="int" default="0"> + </argument> + <description> + Returns the number of occurrences of substring [code]what[/code] between [code]from[/code] and [code]to[/code] positions. If [code]from[/code] and [code]to[/code] equals 0 the whole string will be used. If only [code]to[/code] equals 0 the remained substring will be used. + </description> + </method> + <method name="countn"> + <return type="int"> + </return> + <argument index="0" name="what" type="String"> + </argument> + <argument index="1" name="from" type="int" default="0"> + </argument> + <argument index="2" name="to" type="int" default="0"> + </argument> + <description> + Returns the number of occurrences of substring [code]what[/code] (ignoring case) between [code]from[/code] and [code]to[/code] positions. If [code]from[/code] and [code]to[/code] equals 0 the whole string will be used. If only [code]to[/code] equals 0 the remained substring will be used. + </description> + </method> <method name="dedent"> <return type="String"> </return> diff --git a/doc/classes/StyleBox.xml b/doc/classes/StyleBox.xml index 6b8f076211..1d873ef0b1 100644 --- a/doc/classes/StyleBox.xml +++ b/doc/classes/StyleBox.xml @@ -31,6 +31,14 @@ <description> </description> </method> + <method name="get_default_margin" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> <method name="get_margin" qualifiers="const"> <return type="float"> </return> @@ -55,6 +63,16 @@ Returns the "offset" of a stylebox. This helper function returns a value equivalent to [code]Vector2(style.get_margin(MARGIN_LEFT), style.get_margin(MARGIN_TOP))[/code]. </description> </method> + <method name="set_default_margin"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="offset" type="float"> + </argument> + <description> + </description> + </method> <method name="test_mask" qualifiers="const"> <return type="bool"> </return> diff --git a/doc/classes/StyleBoxFlat.xml b/doc/classes/StyleBoxFlat.xml index 28f49f831c..05ee79eef2 100644 --- a/doc/classes/StyleBoxFlat.xml +++ b/doc/classes/StyleBoxFlat.xml @@ -24,12 +24,46 @@ <tutorials> </tutorials> <methods> + <method name="get_border_width" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> <method name="get_border_width_min" qualifiers="const"> <return type="int"> </return> <description> </description> </method> + <method name="get_corner_radius" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="corner" type="int" enum="Corner"> + </argument> + <description> + </description> + </method> + <method name="get_expand_margin" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> + <method name="set_border_width"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="width" type="int"> + </argument> + <description> + </description> + </method> <method name="set_border_width_all"> <return type="void"> </return> @@ -38,6 +72,16 @@ <description> </description> </method> + <method name="set_corner_radius"> + <return type="void"> + </return> + <argument index="0" name="corner" type="int" enum="Corner"> + </argument> + <argument index="1" name="radius" type="int"> + </argument> + <description> + </description> + </method> <method name="set_corner_radius_all"> <return type="void"> </return> @@ -60,6 +104,16 @@ <description> </description> </method> + <method name="set_expand_margin"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="size" type="float"> + </argument> + <description> + </description> + </method> <method name="set_expand_margin_all"> <return type="void"> </return> diff --git a/doc/classes/StyleBoxTexture.xml b/doc/classes/StyleBoxTexture.xml index e51120f269..d5efc80846 100644 --- a/doc/classes/StyleBoxTexture.xml +++ b/doc/classes/StyleBoxTexture.xml @@ -9,6 +9,22 @@ <tutorials> </tutorials> <methods> + <method name="get_expand_margin_size" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> + <method name="get_margin_size" qualifiers="const"> + <return type="float"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> <method name="set_expand_margin_all"> <return type="void"> </return> @@ -31,6 +47,26 @@ <description> </description> </method> + <method name="set_expand_margin_size"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="size" type="float"> + </argument> + <description> + </description> + </method> + <method name="set_margin_size"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="size" type="float"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="axis_stretch_horizontal" type="int" setter="set_h_axis_stretch_mode" getter="get_h_axis_stretch_mode" enum="StyleBoxTexture.AxisStretchMode" default="0"> @@ -74,14 +110,14 @@ <member name="modulate_color" type="Color" setter="set_modulate" getter="get_modulate" default="Color( 1, 1, 1, 1 )"> Modulates the color of the texture when this style box is drawn. </member> - <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map" default="null"> + <member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map"> The normal map to use when drawing this style box. </member> <member name="region_rect" type="Rect2" setter="set_region_rect" getter="get_region_rect" default="Rect2( 0, 0, 0, 0 )"> Species a sub region of the texture to use. This is equivalent to first wrapping the texture in an [AtlasTexture] with the same region. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> The texture to use when drawing this style box. </member> </members> diff --git a/doc/classes/TabContainer.xml b/doc/classes/TabContainer.xml index 2eb8411078..22b009a15a 100644 --- a/doc/classes/TabContainer.xml +++ b/doc/classes/TabContainer.xml @@ -189,11 +189,11 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color_bg" type="Color" default="Color( 0.690196, 0.690196, 0.690196, 1 )"> + <theme_item name="font_color_bg" type="Color" default="Color( 0.69, 0.69, 0.69, 1 )"> </theme_item> <theme_item name="font_color_disabled" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )"> </theme_item> - <theme_item name="font_color_fg" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_fg" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="hseparation" type="int" default="4"> </theme_item> diff --git a/doc/classes/Tabs.xml b/doc/classes/Tabs.xml index b6d702ba45..6bd7b8c2c3 100644 --- a/doc/classes/Tabs.xml +++ b/doc/classes/Tabs.xml @@ -260,11 +260,11 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color_bg" type="Color" default="Color( 0.690196, 0.690196, 0.690196, 1 )"> + <theme_item name="font_color_bg" type="Color" default="Color( 0.69, 0.69, 0.69, 1 )"> </theme_item> <theme_item name="font_color_disabled" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )"> </theme_item> - <theme_item name="font_color_fg" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_fg" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="hseparation" type="int" default="4"> </theme_item> diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml index e665178809..22c769330d 100644 --- a/doc/classes/TextEdit.xml +++ b/doc/classes/TextEdit.xml @@ -520,7 +520,7 @@ </constant> </constants> <theme_items> - <theme_item name="background_color" type="Color" default="Color( 0, 0, 0, 0 )"> + <theme_item name="background_color" type="Color" default="Color( 0, 0, 0, 1 )"> Sets the background [Color] of this [TextEdit]. [member syntax_highlighting] has to be enabled. </theme_item> <theme_item name="bookmark_color" type="Color" default="Color( 0.08, 0.49, 0.98, 1 )"> @@ -533,17 +533,17 @@ </theme_item> <theme_item name="caret_background_color" type="Color" default="Color( 0, 0, 0, 1 )"> </theme_item> - <theme_item name="caret_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="caret_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="code_folding_color" type="Color" default="Color( 0.8, 0.8, 0.8, 0.8 )"> </theme_item> <theme_item name="completion" type="StyleBox"> </theme_item> - <theme_item name="completion_background_color" type="Color" default="Color( 0.172549, 0.164706, 0.196078, 1 )"> + <theme_item name="completion_background_color" type="Color" default="Color( 0.17, 0.16, 0.2, 1 )"> </theme_item> - <theme_item name="completion_existing_color" type="Color" default="Color( 0.87451, 0.87451, 0.87451, 0.129412 )"> + <theme_item name="completion_existing_color" type="Color" default="Color( 0.87, 0.87, 0.87, 0.13 )"> </theme_item> - <theme_item name="completion_font_color" type="Color" default="Color( 0.666667, 0.666667, 0.666667, 1 )"> + <theme_item name="completion_font_color" type="Color" default="Color( 0.67, 0.67, 0.67, 1 )"> </theme_item> <theme_item name="completion_lines" type="int" default="7"> </theme_item> @@ -553,7 +553,7 @@ </theme_item> <theme_item name="completion_scroll_width" type="int" default="3"> </theme_item> - <theme_item name="completion_selected_color" type="Color" default="Color( 0.262745, 0.258824, 0.266667, 1 )"> + <theme_item name="completion_selected_color" type="Color" default="Color( 0.26, 0.26, 0.27, 1 )"> </theme_item> <theme_item name="current_line_color" type="Color" default="Color( 0.25, 0.25, 0.26, 0.8 )"> Sets the [Color] of the breakpoints. [member breakpoint_gutter] has to be enabled. @@ -569,16 +569,16 @@ <theme_item name="font" type="Font"> Sets the default [Font]. </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> Sets the font [Color]. </theme_item> - <theme_item name="font_color_readonly" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 0.5 )"> + <theme_item name="font_color_readonly" type="Color" default="Color( 0.88, 0.88, 0.88, 0.5 )"> </theme_item> <theme_item name="font_color_selected" type="Color" default="Color( 0, 0, 0, 1 )"> </theme_item> - <theme_item name="function_color" type="Color" default="Color( 0.4, 0.635294, 0.807843, 1 )"> + <theme_item name="function_color" type="Color" default="Color( 0.4, 0.64, 0.81, 1 )"> </theme_item> - <theme_item name="line_number_color" type="Color" default="Color( 0.666667, 0.666667, 0.666667, 0.4 )"> + <theme_item name="line_number_color" type="Color" default="Color( 0.67, 0.67, 0.67, 0.4 )"> Sets the [Color] of the line numbers. [member show_line_numbers] has to be enabled. </theme_item> <theme_item name="line_spacing" type="int" default="4"> @@ -587,24 +587,24 @@ <theme_item name="mark_color" type="Color" default="Color( 1, 0.4, 0.4, 0.4 )"> Sets the [Color] of marked text. </theme_item> - <theme_item name="member_variable_color" type="Color" default="Color( 0.901961, 0.305882, 0.34902, 1 )"> + <theme_item name="member_variable_color" type="Color" default="Color( 0.9, 0.31, 0.35, 1 )"> </theme_item> <theme_item name="normal" type="StyleBox"> Sets the [StyleBox] of this [TextEdit]. </theme_item> - <theme_item name="number_color" type="Color" default="Color( 0.921569, 0.584314, 0.196078, 1 )"> + <theme_item name="number_color" type="Color" default="Color( 0.92, 0.58, 0.2, 1 )"> </theme_item> <theme_item name="read_only" type="StyleBox"> Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled. </theme_item> - <theme_item name="safe_line_number_color" type="Color" default="Color( 0.666667, 0.784314, 0.666667, 0.6 )"> + <theme_item name="safe_line_number_color" type="Color" default="Color( 0.67, 0.78, 0.67, 0.6 )"> </theme_item> - <theme_item name="selection_color" type="Color" default="Color( 0.490196, 0.490196, 0.490196, 1 )"> + <theme_item name="selection_color" type="Color" default="Color( 0.49, 0.49, 0.49, 1 )"> Sets the highlight [Color] of text selections. </theme_item> <theme_item name="space" type="Texture"> </theme_item> - <theme_item name="symbol_color" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="symbol_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="tab" type="Texture"> Sets a custom [Texture] for tab text characters. diff --git a/doc/classes/TextureButton.xml b/doc/classes/TextureButton.xml index e3396a10c2..899ab8b875 100644 --- a/doc/classes/TextureButton.xml +++ b/doc/classes/TextureButton.xml @@ -18,22 +18,22 @@ <member name="stretch_mode" type="int" setter="set_stretch_mode" getter="get_stretch_mode" enum="TextureButton.StretchMode" default="0"> Controls the texture's behavior when you resize the node's bounding rectangle, [b]only if[/b] [member expand] is [code]true[/code]. Set it to one of the [code]STRETCH_*[/code] constants. See the constants to learn more. </member> - <member name="texture_click_mask" type="BitMap" setter="set_click_mask" getter="get_click_mask" default="null"> + <member name="texture_click_mask" type="BitMap" setter="set_click_mask" getter="get_click_mask"> Pure black and white [BitMap] image to use for click detection. On the mask, white pixels represent the button's clickable area. Use it to create buttons with curved shapes. </member> - <member name="texture_disabled" type="Texture" setter="set_disabled_texture" getter="get_disabled_texture" default="null"> + <member name="texture_disabled" type="Texture" setter="set_disabled_texture" getter="get_disabled_texture"> Texture to display when the node is disabled. See [member BaseButton.disabled]. </member> - <member name="texture_focused" type="Texture" setter="set_focused_texture" getter="get_focused_texture" default="null"> + <member name="texture_focused" type="Texture" setter="set_focused_texture" getter="get_focused_texture"> Texture to display when the node has mouse or keyboard focus. </member> - <member name="texture_hover" type="Texture" setter="set_hover_texture" getter="get_hover_texture" default="null"> + <member name="texture_hover" type="Texture" setter="set_hover_texture" getter="get_hover_texture"> Texture to display when the mouse hovers the node. </member> - <member name="texture_normal" type="Texture" setter="set_normal_texture" getter="get_normal_texture" default="null"> + <member name="texture_normal" type="Texture" setter="set_normal_texture" getter="get_normal_texture"> Texture to display by default, when the node is [b]not[/b] in the disabled, focused, hover or pressed state. </member> - <member name="texture_pressed" type="Texture" setter="set_pressed_texture" getter="get_pressed_texture" default="null"> + <member name="texture_pressed" type="Texture" setter="set_pressed_texture" getter="get_pressed_texture"> Texture to display on mouse down over the node, if the node has keyboard focus and the player presses the Enter key or if the player presses the [member BaseButton.shortcut] key. </member> </members> diff --git a/doc/classes/TextureLayered.xml b/doc/classes/TextureLayered.xml index a9ad5c251d..232df8f59b 100644 --- a/doc/classes/TextureLayered.xml +++ b/doc/classes/TextureLayered.xml @@ -83,14 +83,7 @@ </method> </methods> <members> - <member name="data" type="Dictionary" setter="_set_data" getter="_get_data" default="{ -"depth": 0, -"flags": 4, -"format": 37, -"height": 0, -"layers": [ ], -"width": 0 -}"> + <member name="data" type="Dictionary" setter="_set_data" getter="_get_data" default="{"depth": 0,"flags": 4,"format": 37,"height": 0,"layers": [ ],"width": 0}"> </member> <member name="flags" type="int" setter="set_flags" getter="get_flags" default="4"> </member> diff --git a/doc/classes/TextureProgress.xml b/doc/classes/TextureProgress.xml index 409d005067..4f8ea6438b 100644 --- a/doc/classes/TextureProgress.xml +++ b/doc/classes/TextureProgress.xml @@ -9,6 +9,24 @@ <tutorials> </tutorials> <methods> + <method name="get_stretch_margin" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <description> + </description> + </method> + <method name="set_stretch_margin"> + <return type="void"> + </return> + <argument index="0" name="margin" type="int" enum="Margin"> + </argument> + <argument index="1" name="value" type="int"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="fill_mode" type="int" setter="set_fill_mode" getter="get_fill_mode" default="0"> @@ -39,14 +57,14 @@ <member name="stretch_margin_top" type="int" setter="set_stretch_margin" getter="get_stretch_margin" default="0"> The height of the 9-patch's top row. </member> - <member name="texture_over" type="Texture" setter="set_over_texture" getter="get_over_texture" default="null"> + <member name="texture_over" type="Texture" setter="set_over_texture" getter="get_over_texture"> [Texture] that draws over the progress bar. Use it to add highlights or an upper-frame that hides part of [member texture_progress]. </member> - <member name="texture_progress" type="Texture" setter="set_progress_texture" getter="get_progress_texture" default="null"> + <member name="texture_progress" type="Texture" setter="set_progress_texture" getter="get_progress_texture"> [Texture] that clips based on the node's [code]value[/code] and [member fill_mode]. As [code]value[/code] increased, the texture fills up. It shows entirely when [code]value[/code] reaches [code]max_value[/code]. It doesn't show at all if [code]value[/code] is equal to [code]min_value[/code]. The [code]value[/code] property comes from [Range]. See [member Range.value], [member Range.min_value], [member Range.max_value]. </member> - <member name="texture_under" type="Texture" setter="set_under_texture" getter="get_under_texture" default="null"> + <member name="texture_under" type="Texture" setter="set_under_texture" getter="get_under_texture"> [Texture] that draws under the progress bar. The bar's background. </member> <member name="tint_over" type="Color" setter="set_tint_over" getter="get_tint_over" default="Color( 1, 1, 1, 1 )"> diff --git a/doc/classes/TextureRect.xml b/doc/classes/TextureRect.xml index 8320d535ea..be46459b21 100644 --- a/doc/classes/TextureRect.xml +++ b/doc/classes/TextureRect.xml @@ -23,7 +23,7 @@ <member name="stretch_mode" type="int" setter="set_stretch_mode" getter="get_stretch_mode" enum="TextureRect.StretchMode" default="0"> Controls the texture's behavior when resizing the node's bounding rectangle. See [enum StretchMode]. </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> The node's [Texture] resource. </member> </members> diff --git a/doc/classes/Theme.xml b/doc/classes/Theme.xml index 9c2676a55a..e4db9243ef 100644 --- a/doc/classes/Theme.xml +++ b/doc/classes/Theme.xml @@ -335,7 +335,7 @@ </method> </methods> <members> - <member name="default_font" type="Font" setter="set_default_font" getter="get_default_font" default="null"> + <member name="default_font" type="Font" setter="set_default_font" getter="get_default_font"> The theme's default font. </member> </members> diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml index 3f9c2e8647..efb7a0d900 100644 --- a/doc/classes/TileMap.xml +++ b/doc/classes/TileMap.xml @@ -306,7 +306,7 @@ <member name="occluder_light_mask" type="int" setter="set_occluder_light_mask" getter="get_occluder_light_mask" default="1"> The light mask assigned to all light occluders in the TileMap. The TileSet's light occluders will cast shadows only from Light2D(s) that have the same light mask(s). </member> - <member name="tile_set" type="TileSet" setter="set_tileset" getter="get_tileset" default="null"> + <member name="tile_set" type="TileSet" setter="set_tileset" getter="get_tileset"> The assigned [TileSet]. </member> </members> diff --git a/doc/classes/ToolButton.xml b/doc/classes/ToolButton.xml index 3511987474..f617c2a94f 100644 --- a/doc/classes/ToolButton.xml +++ b/doc/classes/ToolButton.xml @@ -23,11 +23,11 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="font_color_disabled" type="Color" default="Color( 0.9, 0.95, 1, 0.3 )"> </theme_item> - <theme_item name="font_color_hover" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="font_color_hover" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> diff --git a/doc/classes/TouchScreenButton.xml b/doc/classes/TouchScreenButton.xml index fd9f96a41e..fccfb4cd6d 100644 --- a/doc/classes/TouchScreenButton.xml +++ b/doc/classes/TouchScreenButton.xml @@ -21,19 +21,19 @@ <member name="action" type="String" setter="set_action" getter="get_action" default=""""> The button's action. Actions can be handled with [InputEventAction]. </member> - <member name="bitmask" type="BitMap" setter="set_bitmask" getter="get_bitmask" default="null"> + <member name="bitmask" type="BitMap" setter="set_bitmask" getter="get_bitmask"> The button's bitmask. </member> - <member name="normal" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="normal" type="Texture" setter="set_texture" getter="get_texture"> The button's texture for the normal state. </member> <member name="passby_press" type="bool" setter="set_passby_press" getter="is_passby_press_enabled" default="false"> If [code]true[/code], pass-by presses are enabled. </member> - <member name="pressed" type="Texture" setter="set_texture_pressed" getter="get_texture_pressed" default="null"> + <member name="pressed" type="Texture" setter="set_texture_pressed" getter="get_texture_pressed"> The button's texture for the pressed state. </member> - <member name="shape" type="Shape2D" setter="set_shape" getter="get_shape" default="null"> + <member name="shape" type="Shape2D" setter="set_shape" getter="get_shape"> The button's shape. </member> <member name="shape_centered" type="bool" setter="set_shape_centered" getter="is_shape_centered" default="true"> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index 416a9eb656..c2b7901c05 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -182,7 +182,7 @@ <argument index="1" name="expand" type="bool"> </argument> <description> - If [code]true[/code], the column will have the "Expand" flag of [Control]. + If [code]true[/code], the column will have the "Expand" flag of [Control]. Columns that have the "Expand" flag will use their "min_width" in a similar fashion to [member Control.size_flags_stretch_ratio]. </description> </method> <method name="set_column_min_width"> @@ -193,7 +193,7 @@ <argument index="1" name="min_width" type="int"> </argument> <description> - Sets the minimum width of a column. + Sets the minimum width of a column. Columns that have the "Expand" flag will use their "min_width" in a similar fashion to [member Control.size_flags_stretch_ratio]. </description> </method> <method name="set_column_title"> @@ -382,7 +382,7 @@ </theme_item> <theme_item name="custom_button" type="StyleBox"> </theme_item> - <theme_item name="custom_button_font_highlight" type="Color" default="Color( 0.941176, 0.941176, 0.941176, 1 )"> + <theme_item name="custom_button_font_highlight" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )"> </theme_item> <theme_item name="custom_button_hover" type="StyleBox"> </theme_item> @@ -396,7 +396,7 @@ </theme_item> <theme_item name="font" type="Font"> </theme_item> - <theme_item name="font_color" type="Color" default="Color( 0.690196, 0.690196, 0.690196, 1 )"> + <theme_item name="font_color" type="Color" default="Color( 0.69, 0.69, 0.69, 1 )"> </theme_item> <theme_item name="font_color_selected" type="Color" default="Color( 1, 1, 1, 1 )"> </theme_item> @@ -408,7 +408,7 @@ </theme_item> <theme_item name="item_margin" type="int" default="12"> </theme_item> - <theme_item name="relationship_line_color" type="Color" default="Color( 0.27451, 0.27451, 0.27451, 1 )"> + <theme_item name="relationship_line_color" type="Color" default="Color( 0.27, 0.27, 0.27, 1 )"> </theme_item> <theme_item name="scroll_border" type="int" default="4"> </theme_item> @@ -422,7 +422,7 @@ </theme_item> <theme_item name="selection_color" type="Color" default="Color( 0.1, 0.1, 1, 0.8 )"> </theme_item> - <theme_item name="title_button_color" type="Color" default="Color( 0.878431, 0.878431, 0.878431, 1 )"> + <theme_item name="title_button_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )"> </theme_item> <theme_item name="title_button_font" type="Font"> </theme_item> diff --git a/doc/classes/TreeItem.xml b/doc/classes/TreeItem.xml index d9c7013d34..56b4b21525 100644 --- a/doc/classes/TreeItem.xml +++ b/doc/classes/TreeItem.xml @@ -337,6 +337,19 @@ Sets the given column's button [Texture] at index [code]button_idx[/code] to [code]button[/code]. </description> </method> + <method name="set_button_disabled"> + <return type="void"> + </return> + <argument index="0" name="column" type="int"> + </argument> + <argument index="1" name="button_idx" type="int"> + </argument> + <argument index="2" name="disabled" type="bool"> + </argument> + <description> + If [code]true[/code], disables the button at index [code]button_idx[/code] in column [code]column[/code]. + </description> + </method> <method name="set_cell_mode"> <return type="void"> </return> diff --git a/doc/classes/Variant.xml b/doc/classes/Variant.xml index eb07c70cc6..522e131b45 100644 --- a/doc/classes/Variant.xml +++ b/doc/classes/Variant.xml @@ -5,6 +5,19 @@ </brief_description> <description> A Variant takes up only 20 bytes and can store almost any engine datatype inside of it. Variants are rarely used to hold information for long periods of time. Instead, they are used mainly for communication, editing, serialization and moving data around. + A Variant: + - Can store almost any datatype. + - Can perform operations between many variants. GDScript uses Variant as its atomic/native datatype. + - Can be hashed, so it can be compared quickly to other variants. + - Can be used to convert safely between datatypes. + - Can be used to abstract calling methods and their arguments. Godot exports all its functions through variants. + - Can be used to defer calls or move data between threads. + - Can be serialized as binary and stored to disk, or transferred via network. + - Can be serialized to text and use it for printing values and editable settings. + - Can work as an exported property, so the editor can edit it universally. + - Can be used for dictionaries, arrays, parsers, etc. + [b]Containers ([Array] and [Dictionary]):[/b] Both are implemented using variants. A [Dictionary] can match any datatype used as key to any other datatype. An [Array] just holds an array of Variants. Of course, a Variant can also hold a [Dictionary] and an [Array] inside, making it even more flexible. + Modifications to a container will modify all references to it. A [Mutex] should be created to lock it if multi-threaded access is desired. </description> <tutorials> </tutorials> diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml index 0c96c50c58..237b596fad 100644 --- a/doc/classes/Vector2.xml +++ b/doc/classes/Vector2.xml @@ -4,7 +4,7 @@ Vector used for 2D math. </brief_description> <description> - 2-element structure that can be used to represent positions in 2d space or any other pair of numeric values. + 2-element structure that can be used to represent positions in 2D space or any other pair of numeric values. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/math/index.html</link> diff --git a/doc/classes/VehicleWheel.xml b/doc/classes/VehicleWheel.xml index 6de6429531..ff6004bcba 100644 --- a/doc/classes/VehicleWheel.xml +++ b/doc/classes/VehicleWheel.xml @@ -13,6 +13,7 @@ <return type="float"> </return> <description> + Returns the rotational speed of the wheel in revolutions per minute. </description> </method> <method name="get_skidinfo" qualifiers="const"> @@ -31,12 +32,23 @@ </method> </methods> <members> + <member name="brake" type="float" setter="set_brake" getter="get_brake" default="0.0"> + Slows down the wheel by applying a braking force. The wheel is only slowed down if it is in contact with a surface. The force you need to apply to adequately slow down your vehicle depends on the [member RigidBody.mass] of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 30 range for hard braking. + </member> <member name="damping_compression" type="float" setter="set_damping_compression" getter="get_damping_compression" default="0.83"> The damping applied to the spring when the spring is being compressed. This value should be between 0.0 (no damping) and 1.0. A value of 0.0 means the car will keep bouncing as the spring keeps its energy. A good value for this is around 0.3 for a normal car, 0.5 for a race car. </member> <member name="damping_relaxation" type="float" setter="set_damping_relaxation" getter="get_damping_relaxation" default="0.88"> The damping applied to the spring when relaxing. This value should be between 0.0 (no damping) and 1.0. This value should always be slightly higher than the [member damping_compression] property. For a [member damping_compression] value of 0.3, try a relaxation value of 0.5. </member> + <member name="engine_force" type="float" setter="set_engine_force" getter="get_engine_force" default="0.0"> + Accelerates the wheel by applying an engine force. The wheel is only speed up if it is in contact with a surface. The [member RigidBody.mass] of the vehicle has an effect on the acceleration of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 50 range for acceleration. + [b]Note:[/b] The simulation does not take the effect of gears into account, you will need to add logic for this if you wish to simulate gears. + A negative value will result in the wheel reversing. + </member> + <member name="steering" type="float" setter="set_steering" getter="get_steering" default="0.0"> + The steering angle for the wheel. Setting this to a non-zero value will result in the vehicle turning when it's moving. + </member> <member name="suspension_max_force" type="float" setter="set_suspension_max_force" getter="get_suspension_max_force" default="6000.0"> The maximum force the spring can resist. This value should be higher than a quarter of the [member RigidBody.mass] of the [VehicleBody] or the spring will not carry the weight of the vehicle. Good results are often obtained by a value that is about 3× to 4× this number. </member> @@ -47,10 +59,10 @@ This is the distance the suspension can travel. As Godot units are equivalent to meters, keep this setting relatively low. Try a value between 0.1 and 0.3 depending on the type of car. </member> <member name="use_as_steering" type="bool" setter="set_use_as_steering" getter="is_used_as_steering" default="false"> - If [code]true[/code], this wheel will be turned when the car steers. + If [code]true[/code], this wheel will be turned when the car steers. This value is used in conjunction with [member VehicleBody.steering] and ignored if you are using the per-wheel [member steering] value instead. </member> <member name="use_as_traction" type="bool" setter="set_use_as_traction" getter="is_used_as_traction" default="false"> - If [code]true[/code], this wheel transfers engine force to the ground to propel the vehicle forward. + If [code]true[/code], this wheel transfers engine force to the ground to propel the vehicle forward. This value is used in conjunction with [member VehicleBody.engine_force] and ignored if you are using the per-wheel [member engine_force] value instead. </member> <member name="wheel_friction_slip" type="float" setter="set_friction_slip" getter="get_friction_slip" default="10.5"> This determines how much grip this wheel has. It is combined with the friction setting of the surface the wheel is in contact with. 0.0 means no grip, 1.0 is normal grip. For a drift car setup, try setting the grip of the rear wheels slightly lower than the front wheels, or use a lower value to simulate tire wear. diff --git a/doc/classes/VideoPlayer.xml b/doc/classes/VideoPlayer.xml index 45341cee74..18a85d496f 100644 --- a/doc/classes/VideoPlayer.xml +++ b/doc/classes/VideoPlayer.xml @@ -64,7 +64,7 @@ <member name="paused" type="bool" setter="set_paused" getter="is_paused" default="false"> If [code]true[/code], the video is paused. </member> - <member name="stream" type="VideoStream" setter="set_stream" getter="get_stream" default="null"> + <member name="stream" type="VideoStream" setter="set_stream" getter="get_stream"> </member> <member name="stream_position" type="float" setter="set_stream_position" getter="get_stream_position"> The current position of the stream, in seconds. diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml index 5d5a62456f..117c4835eb 100644 --- a/doc/classes/Viewport.xml +++ b/doc/classes/Viewport.xml @@ -67,6 +67,14 @@ Returns information about the viewport from the rendering pipeline. </description> </method> + <method name="get_shadow_atlas_quadrant_subdiv" qualifiers="const"> + <return type="int" enum="Viewport.ShadowAtlasQuadrantSubdiv"> + </return> + <argument index="0" name="quadrant" type="int"> + </argument> + <description> + </description> + </method> <method name="get_size_override" qualifiers="const"> <return type="Vector2"> </return> @@ -155,6 +163,16 @@ <description> </description> </method> + <method name="set_shadow_atlas_quadrant_subdiv"> + <return type="void"> + </return> + <argument index="0" name="quadrant" type="int"> + </argument> + <argument index="1" name="subdiv" type="int" enum="Viewport.ShadowAtlasQuadrantSubdiv"> + </argument> + <description> + </description> + </method> <method name="set_size_override"> <return type="void"> </return> @@ -277,7 +295,7 @@ <member name="usage" type="int" setter="set_usage" getter="get_usage" enum="Viewport.Usage" default="2"> The rendering mode of viewport. </member> - <member name="world" type="World" setter="set_world" getter="get_world" default="null"> + <member name="world" type="World" setter="set_world" getter="get_world"> The custom [World] which can be used as 3D environment source. </member> <member name="world_2d" type="World2D" setter="set_world_2d" getter="get_world_2d"> diff --git a/doc/classes/VisibilityEnabler.xml b/doc/classes/VisibilityEnabler.xml index 4acb4d87c1..e3c7d05fce 100644 --- a/doc/classes/VisibilityEnabler.xml +++ b/doc/classes/VisibilityEnabler.xml @@ -9,6 +9,24 @@ <tutorials> </tutorials> <methods> + <method name="is_enabler_enabled" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="enabler" type="int" enum="VisibilityEnabler.Enabler"> + </argument> + <description> + </description> + </method> + <method name="set_enabler"> + <return type="void"> + </return> + <argument index="0" name="enabler" type="int" enum="VisibilityEnabler.Enabler"> + </argument> + <argument index="1" name="enabled" type="bool"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="freeze_bodies" type="bool" setter="set_enabler" getter="is_enabler_enabled" default="true"> diff --git a/doc/classes/VisibilityEnabler2D.xml b/doc/classes/VisibilityEnabler2D.xml index dbea3f5de8..0f25c00489 100644 --- a/doc/classes/VisibilityEnabler2D.xml +++ b/doc/classes/VisibilityEnabler2D.xml @@ -9,6 +9,24 @@ <tutorials> </tutorials> <methods> + <method name="is_enabler_enabled" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="enabler" type="int" enum="VisibilityEnabler2D.Enabler"> + </argument> + <description> + </description> + </method> + <method name="set_enabler"> + <return type="void"> + </return> + <argument index="0" name="enabler" type="int" enum="VisibilityEnabler2D.Enabler"> + </argument> + <argument index="1" name="enabled" type="bool"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="freeze_bodies" type="bool" setter="set_enabler" getter="is_enabler_enabled" default="true"> diff --git a/doc/classes/VisualShaderNodeCompare.xml b/doc/classes/VisualShaderNodeCompare.xml new file mode 100644 index 0000000000..7edad5294d --- /dev/null +++ b/doc/classes/VisualShaderNodeCompare.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="VisualShaderNodeCompare" inherits="VisualShaderNode" category="Core" version="3.2"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="condition" type="int" setter="set_condition" getter="get_condition" enum="VisualShaderNodeCompare.Condition" default="0"> + </member> + <member name="function" type="int" setter="set_function" getter="get_function" enum="VisualShaderNodeCompare.Function" default="0"> + </member> + <member name="type" type="int" setter="set_comparsion_type" getter="get_comparsion_type" enum="VisualShaderNodeCompare.ComparsionType" default="0"> + </member> + </members> + <constants> + <constant name="CTYPE_SCALAR" value="0" enum="ComparsionType"> + </constant> + <constant name="CTYPE_VECTOR" value="1" enum="ComparsionType"> + </constant> + <constant name="CTYPE_BOOLEAN" value="2" enum="ComparsionType"> + </constant> + <constant name="CTYPE_TRANSFORM" value="3" enum="ComparsionType"> + </constant> + <constant name="FUNC_EQUAL" value="0" enum="Function"> + </constant> + <constant name="FUNC_NOT_EQUAL" value="1" enum="Function"> + </constant> + <constant name="FUNC_GREATER_THAN" value="2" enum="Function"> + </constant> + <constant name="FUNC_GREATER_THAN_EQUAL" value="3" enum="Function"> + </constant> + <constant name="FUNC_LESS_THAN" value="4" enum="Function"> + </constant> + <constant name="FUNC_LESS_THAN_EQUAL" value="5" enum="Function"> + </constant> + <constant name="COND_ALL" value="0" enum="Condition"> + </constant> + <constant name="COND_ANY" value="1" enum="Condition"> + </constant> + </constants> +</class> diff --git a/doc/classes/VisualShaderNodeCubeMap.xml b/doc/classes/VisualShaderNodeCubeMap.xml index 9a4cb5b17c..b695297f07 100644 --- a/doc/classes/VisualShaderNodeCubeMap.xml +++ b/doc/classes/VisualShaderNodeCubeMap.xml @@ -9,7 +9,7 @@ <methods> </methods> <members> - <member name="cube_map" type="CubeMap" setter="set_cube_map" getter="get_cube_map" default="null"> + <member name="cube_map" type="CubeMap" setter="set_cube_map" getter="get_cube_map"> </member> <member name="texture_type" type="int" setter="set_texture_type" getter="get_texture_type" enum="VisualShaderNodeCubeMap.TextureType" default="0"> </member> diff --git a/doc/classes/VisualShaderNodeIs.xml b/doc/classes/VisualShaderNodeIs.xml new file mode 100644 index 0000000000..8db64b7cde --- /dev/null +++ b/doc/classes/VisualShaderNodeIs.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="VisualShaderNodeIs" inherits="VisualShaderNode" category="Core" version="3.2"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="function" type="int" setter="set_function" getter="get_function" enum="VisualShaderNodeIs.Function" default="0"> + </member> + </members> + <constants> + <constant name="FUNC_IS_INF" value="0" enum="Function"> + </constant> + <constant name="FUNC_IS_NAN" value="1" enum="Function"> + </constant> + </constants> +</class> diff --git a/doc/classes/VisualShaderNodeTexture.xml b/doc/classes/VisualShaderNodeTexture.xml index b3b89eb29b..f3bade9303 100644 --- a/doc/classes/VisualShaderNodeTexture.xml +++ b/doc/classes/VisualShaderNodeTexture.xml @@ -11,7 +11,7 @@ <members> <member name="source" type="int" setter="set_source" getter="get_source" enum="VisualShaderNodeTexture.Source" default="0"> </member> - <member name="texture" type="Texture" setter="set_texture" getter="get_texture" default="null"> + <member name="texture" type="Texture" setter="set_texture" getter="get_texture"> </member> <member name="texture_type" type="int" setter="set_texture_type" getter="get_texture_type" enum="VisualShaderNodeTexture.TextureType" default="0"> </member> diff --git a/doc/classes/VisualShaderNodeTextureUniformTriplanar.xml b/doc/classes/VisualShaderNodeTextureUniformTriplanar.xml new file mode 100644 index 0000000000..d4e142651e --- /dev/null +++ b/doc/classes/VisualShaderNodeTextureUniformTriplanar.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="VisualShaderNodeTextureUniformTriplanar" inherits="VisualShaderNodeTextureUniform" category="Core" version="3.2"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <constants> + </constants> +</class> diff --git a/doc/classes/World.xml b/doc/classes/World.xml index adb3286c51..c8e6944b83 100644 --- a/doc/classes/World.xml +++ b/doc/classes/World.xml @@ -15,10 +15,10 @@ <member name="direct_space_state" type="PhysicsDirectSpaceState" setter="" getter="get_direct_space_state"> The World's physics direct space state, used for making various queries. Might be used only during [code]_physics_process[/code]. </member> - <member name="environment" type="Environment" setter="set_environment" getter="get_environment" default="null"> + <member name="environment" type="Environment" setter="set_environment" getter="get_environment"> The World's [Environment]. </member> - <member name="fallback_environment" type="Environment" setter="set_fallback_environment" getter="get_fallback_environment" default="null"> + <member name="fallback_environment" type="Environment" setter="set_fallback_environment" getter="get_fallback_environment"> The World's fallback_environment will be used if the World's [Environment] fails or is missing. </member> <member name="scenario" type="RID" setter="" getter="get_scenario"> diff --git a/doc/classes/WorldEnvironment.xml b/doc/classes/WorldEnvironment.xml index a2a454d1b3..b4524bfea0 100644 --- a/doc/classes/WorldEnvironment.xml +++ b/doc/classes/WorldEnvironment.xml @@ -14,7 +14,7 @@ <methods> </methods> <members> - <member name="environment" type="Environment" setter="set_environment" getter="get_environment" default="null"> + <member name="environment" type="Environment" setter="set_environment" getter="get_environment"> The [Environment] resource used by this [WorldEnvironment], defining the default properties. </member> </members> diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py index 763c29ab4e..b42ae3ce01 100755 --- a/doc/tools/makerst.py +++ b/doc/tools/makerst.py @@ -347,6 +347,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S f = open(os.path.join(output_dir, "class_" + class_name.lower() + '.rst'), 'w', encoding='utf-8') # Warn contributors not to edit this file directly + f.write(":github_url: hide\n\n") f.write(".. Generated automatically by doc/tools/makerst.py in Godot's source tree.\n") f.write(".. DO NOT EDIT THIS FILE, but the " + class_name + ".xml source instead.\n") f.write(".. The source is found in doc/classes or modules/<name>/doc_classes.\n\n") diff --git a/drivers/gles2/rasterizer_canvas_gles2.cpp b/drivers/gles2/rasterizer_canvas_gles2.cpp index b82186162d..8a177e32b0 100644 --- a/drivers/gles2/rasterizer_canvas_gles2.cpp +++ b/drivers/gles2/rasterizer_canvas_gles2.cpp @@ -498,7 +498,16 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur Vector2(line->to.x, line->to.y) }; +#ifdef GLES_OVER_GL + if (line->antialiased) + glEnable(GL_LINE_SMOOTH); +#endif _draw_gui_primitive(2, verts, NULL, NULL); + +#ifdef GLES_OVER_GL + if (line->antialiased) + glDisable(GL_LINE_SMOOTH); +#endif } else { Vector2 t = (line->from - line->to).normalized().tangent() * line->width * 0.5; @@ -510,6 +519,19 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur }; _draw_gui_primitive(4, verts, NULL, NULL); +#ifdef GLES_OVER_GL + if (line->antialiased) { + glEnable(GL_LINE_SMOOTH); + for (int j = 0; j < 4; j++) { + Vector2 vertsl[2] = { + verts[j], + verts[(j + 1) % 4], + }; + _draw_gui_primitive(2, vertsl, NULL, NULL); + } + glDisable(GL_LINE_SMOOTH); + } +#endif } } break; @@ -919,6 +941,13 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur } _draw_polygon(polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1, polygon->weights.ptr(), polygon->bones.ptr()); +#ifdef GLES_OVER_GL + if (polygon->antialiased) { + glEnable(GL_LINE_SMOOTH); + _draw_generic(GL_LINE_LOOP, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1); + glDisable(GL_LINE_SMOOTH); + } +#endif } break; case Item::Command::TYPE_MESH: { @@ -1120,7 +1149,22 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur if (pline->triangles.size()) { _draw_generic(GL_TRIANGLE_STRIP, pline->triangles.size(), pline->triangles.ptr(), NULL, pline->triangle_colors.ptr(), pline->triangle_colors.size() == 1); +#ifdef GLES_OVER_GL + glEnable(GL_LINE_SMOOTH); + if (pline->multiline) { + //needs to be different + } else { + _draw_generic(GL_LINE_LOOP, pline->lines.size(), pline->lines.ptr(), NULL, pline->line_colors.ptr(), pline->line_colors.size() == 1); + } + glDisable(GL_LINE_SMOOTH); +#endif } else { + +#ifdef GLES_OVER_GL + if (pline->antialiased) + glEnable(GL_LINE_SMOOTH); +#endif + if (pline->multiline) { int todo = pline->lines.size() / 2; int max_per_call = data.polygon_buffer_size / (sizeof(real_t) * 4); @@ -1135,6 +1179,11 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur } else { _draw_generic(GL_LINES, pline->lines.size(), pline->lines.ptr(), NULL, pline->line_colors.ptr(), pline->line_colors.size() == 1); } + +#ifdef GLES_OVER_GL + if (pline->antialiased) + glDisable(GL_LINE_SMOOTH); +#endif } } break; diff --git a/drivers/gles2/rasterizer_scene_gles2.cpp b/drivers/gles2/rasterizer_scene_gles2.cpp index ea29af7d9e..23b01b4e09 100644 --- a/drivers/gles2/rasterizer_scene_gles2.cpp +++ b/drivers/gles2/rasterizer_scene_gles2.cpp @@ -880,7 +880,11 @@ RID RasterizerSceneGLES2::light_instance_create(RID p_light) { light_instance->light_index = 0xFFFF; - ERR_FAIL_COND_V(!light_instance->light_ptr, RID()); + if (!light_instance->light_ptr) { + memdelete(light_instance); + ERR_EXPLAIN("Condition ' !light_instance->light_ptr ' is true."); + ERR_FAIL_V(RID()); + } light_instance->self = light_instance_owner.make_rid(light_instance); @@ -1133,8 +1137,8 @@ void RasterizerSceneGLES2::_add_geometry_with_material(RasterizerStorageGLES2::G LightInstance *li = light_instance_owner.getornull(e->instance->light_instances[i]); - if (li->light_index >= render_light_instance_count) { - continue; // too many + if (li->light_index >= render_light_instance_count || render_light_instances[li->light_index] != li) { + continue; // too many or light_index did not correspond to the light instances to be rendered } if (copy) { @@ -1963,9 +1967,7 @@ void RasterizerSceneGLES2::_setup_light(LightInstance *light, ShadowAtlas *shado width /= 2; height /= 2; - if (k == 0) { - - } else if (k == 1) { + if (k == 1) { x += width; } else if (k == 2) { y += height; @@ -1978,9 +1980,7 @@ void RasterizerSceneGLES2::_setup_light(LightInstance *light, ShadowAtlas *shado height /= 2; - if (k == 0) { - - } else { + if (k != 0) { y += height; } } @@ -2287,19 +2287,6 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements, prev_unshaded = unshaded; } - bool depth_prepass = false; - - if (!p_alpha_pass && material->shader->spatial.depth_draw_mode == RasterizerStorageGLES2::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) { - depth_prepass = true; - } - - if (depth_prepass != prev_depth_prepass) { - - state.scene_shader.set_conditional(SceneShaderGLES2::USE_DEPTH_PREPASS, depth_prepass); - prev_depth_prepass = depth_prepass; - rebind = true; - } - bool base_pass = !accum_pass && !unshaded; //conditions for a base pass if (base_pass != prev_base_pass) { @@ -2434,6 +2421,19 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements, } } + bool depth_prepass = false; + + if (!p_alpha_pass && material->shader->spatial.depth_draw_mode == RasterizerStorageGLES2::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) { + depth_prepass = true; + } + + if (depth_prepass != prev_depth_prepass) { + + state.scene_shader.set_conditional(SceneShaderGLES2::USE_DEPTH_PREPASS, depth_prepass); + prev_depth_prepass = depth_prepass; + rebind = true; + } + bool instancing = e->instance->base_type == VS::INSTANCE_MULTIMESH; if (instancing != prev_instancing) { @@ -3171,9 +3171,7 @@ void RasterizerSceneGLES2::render_shadow(RID p_light, RID p_shadow_atlas, int p_ width /= 2; height /= 2; - if (p_pass == 0) { - - } else if (p_pass == 1) { + if (p_pass == 1) { x += width; } else if (p_pass == 2) { y += height; diff --git a/drivers/gles2/rasterizer_storage_gles2.cpp b/drivers/gles2/rasterizer_storage_gles2.cpp index c591db4f3d..a0188da4f6 100644 --- a/drivers/gles2/rasterizer_storage_gles2.cpp +++ b/drivers/gles2/rasterizer_storage_gles2.cpp @@ -3976,20 +3976,19 @@ AABB RasterizerStorageGLES2::light_get_aabb(RID p_light) const { float len = light->param[VS::LIGHT_PARAM_RANGE]; float size = Math::tan(Math::deg2rad(light->param[VS::LIGHT_PARAM_SPOT_ANGLE])) * len; return AABB(Vector3(-size, -size, -len), Vector3(size * 2, size * 2, len)); - } break; + }; case VS::LIGHT_OMNI: { float r = light->param[VS::LIGHT_PARAM_RANGE]; return AABB(-Vector3(r, r, r), Vector3(r, r, r) * 2); - } break; + }; case VS::LIGHT_DIRECTIONAL: { return AABB(); - } break; + }; } ERR_FAIL_V(AABB()); - return AABB(); } /* PROBE API */ diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp index ee34a478b1..25bab0e97a 100644 --- a/drivers/gles2/shader_compiler_gles2.cpp +++ b/drivers/gles2/shader_compiler_gles2.cpp @@ -510,7 +510,97 @@ String ShaderCompilerGLES2::_dump_node_code(SL::Node *p_node, int p_level, Gener } } } break; + case SL::Node::TYPE_ARRAY_DECLARATION: { + SL::ArrayDeclarationNode *var_dec_node = (SL::ArrayDeclarationNode *)p_node; + + StringBuffer<> declaration; + + declaration += _prestr(var_dec_node->precision); + declaration += _typestr(var_dec_node->datatype); + + for (int i = 0; i < var_dec_node->declarations.size(); i++) { + + if (i > 0) { + declaration += ","; + } + + declaration += " "; + + declaration += _mkid(var_dec_node->declarations[i].name); + declaration += "["; + declaration += itos(var_dec_node->declarations[i].size); + declaration += "]"; + int sz = var_dec_node->declarations[i].initializer.size(); + if (sz > 0) { + declaration += "="; + declaration += _typestr(var_dec_node->datatype); + declaration += "["; + declaration += itos(sz); + declaration += "]"; + declaration += "("; + for (int j = 0; j < sz; j++) { + declaration += _dump_node_code(var_dec_node->declarations[i].initializer[j], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + if (j != sz - 1) { + declaration += ", "; + } + } + declaration += ")"; + } + } + + code += declaration.as_string(); + } break; + case SL::Node::TYPE_ARRAY: { + SL::ArrayNode *var_node = (SL::ArrayNode *)p_node; + + if (p_assigning && p_actions.write_flag_pointers.has(var_node->name)) { + *p_actions.write_flag_pointers[var_node->name] = true; + } + + if (p_default_actions.usage_defines.has(var_node->name) && !used_name_defines.has(var_node->name)) { + String define = p_default_actions.usage_defines[var_node->name]; + + if (define.begins_with("@")) { + define = p_default_actions.usage_defines[define.substr(1, define.length())]; + } + + r_gen_code.custom_defines.push_back(define.utf8()); + used_name_defines.insert(var_node->name); + } + + if (p_actions.usage_flag_pointers.has(var_node->name) && !used_flag_pointers.has(var_node->name)) { + *p_actions.usage_flag_pointers[var_node->name] = true; + used_flag_pointers.insert(var_node->name); + } + + if (p_default_actions.renames.has(var_node->name)) { + code += p_default_actions.renames[var_node->name]; + } else { + code += _mkid(var_node->name); + } + + if (var_node->call_expression != NULL) { + code += "."; + code += _dump_node_code(var_node->call_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + } + + if (var_node->index_expression != NULL) { + code += "["; + code += _dump_node_code(var_node->index_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + code += "]"; + } + + if (var_node->name == time_name) { + if (current_func_name == vertex_name) { + r_gen_code.uses_vertex_time = true; + } + if (current_func_name == fragment_name || current_func_name == light_name) { + r_gen_code.uses_fragment_time = true; + } + } + + } break; case SL::Node::TYPE_CONSTANT: { SL::ConstantNode *const_node = (SL::ConstantNode *)p_node; @@ -643,6 +733,17 @@ String ShaderCompilerGLES2::_dump_node_code(SL::Node *p_node, int p_level, Gener code += ")"; + if (p_default_actions.usage_defines.has(var_node->name) && !used_name_defines.has(var_node->name)) { + String define = p_default_actions.usage_defines[var_node->name]; + + if (define.begins_with("@")) { + define = p_default_actions.usage_defines[define.substr(1, define.length())]; + } + + r_gen_code.custom_defines.push_back(define.utf8()); + used_name_defines.insert(var_node->name); + } + } break; case SL::OP_INDEX: { @@ -829,6 +930,23 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() { actions[VS::SHADER_CANVAS_ITEM].usage_defines["LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n"; actions[VS::SHADER_CANVAS_ITEM].render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n"; + // Ported from GLES3 + + actions[VS::SHADER_CANVAS_ITEM].usage_defines["sinh"] = "#define SINH_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["cosh"] = "#define COSH_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["tanh"] = "#define TANH_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["asinh"] = "#define ASINH_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["acosh"] = "#define ACOSH_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["atanh"] = "#define ATANH_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["determinant"] = "#define DETERMINANT_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["transpose"] = "#define TRANSPOSE_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["outerProduct"] = "#define OUTER_PRODUCT_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["round"] = "#define ROUND_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["roundEven"] = "#define ROUND_EVEN_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["isinf"] = "#define IS_INF_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["isnan"] = "#define IS_NAN_USED\n"; + actions[VS::SHADER_CANVAS_ITEM].usage_defines["trunc"] = "#define TRUNC_USED\n"; + /** SPATIAL SHADER **/ actions[VS::SHADER_SPATIAL].renames["WORLD_MATRIX"] = "world_transform"; @@ -921,6 +1039,23 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() { actions[VS::SHADER_SPATIAL].usage_defines["DIFFUSE_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n"; actions[VS::SHADER_SPATIAL].usage_defines["SPECULAR_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n"; + // Ported from GLES3 + + actions[VS::SHADER_SPATIAL].usage_defines["sinh"] = "#define SINH_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["cosh"] = "#define COSH_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["tanh"] = "#define TANH_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["asinh"] = "#define ASINH_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["acosh"] = "#define ACOSH_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["atanh"] = "#define ATANH_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["determinant"] = "#define DETERMINANT_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["transpose"] = "#define TRANSPOSE_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["outerProduct"] = "#define OUTER_PRODUCT_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["round"] = "#define ROUND_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["roundEven"] = "#define ROUND_EVEN_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["isinf"] = "#define IS_INF_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["isnan"] = "#define IS_NAN_USED\n"; + actions[VS::SHADER_SPATIAL].usage_defines["trunc"] = "#define TRUNC_USED\n"; + actions[VS::SHADER_SPATIAL].render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n"; actions[VS::SHADER_SPATIAL].render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n"; diff --git a/drivers/gles2/shaders/canvas.glsl b/drivers/gles2/shaders/canvas.glsl index 0818942b0a..fa0b315e29 100644 --- a/drivers/gles2/shaders/canvas.glsl +++ b/drivers/gles2/shaders/canvas.glsl @@ -258,6 +258,8 @@ precision mediump int; #endif #endif +#include "stdlib.glsl" + uniform sampler2D color_texture; // texunit:-1 /* clang-format on */ uniform highp vec2 color_texpixel_size; @@ -489,8 +491,7 @@ FRAGMENT_SHADER_CODE highp float shadow_attenuation = 0.0; #ifdef USE_RGBA_SHADOWS - -#define SHADOW_DEPTH(m_tex, m_uv) dot(texture2D((m_tex), (m_uv)), vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0)) +#define SHADOW_DEPTH(m_tex, m_uv) dot(texture2D((m_tex), (m_uv)), vec4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0)) #else diff --git a/drivers/gles2/shaders/canvas_shadow.glsl b/drivers/gles2/shaders/canvas_shadow.glsl index 01b2c59325..dcb43d523f 100644 --- a/drivers/gles2/shaders/canvas_shadow.glsl +++ b/drivers/gles2/shaders/canvas_shadow.glsl @@ -47,8 +47,8 @@ void main() { #ifdef USE_RGBA_SHADOWS - highp vec4 comp = fract(depth * vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0)); - comp -= comp.xxyz * vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0); + highp vec4 comp = fract(depth * vec4(255.0 * 255.0 * 255.0, 255.0 * 255.0, 255.0, 1.0)); + comp -= comp.xxyz * vec4(0.0, 1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0); gl_FragColor = comp; #else diff --git a/drivers/gles2/shaders/scene.glsl b/drivers/gles2/shaders/scene.glsl index ca222362e7..8a9387f0b3 100644 --- a/drivers/gles2/shaders/scene.glsl +++ b/drivers/gles2/shaders/scene.glsl @@ -10,7 +10,9 @@ precision highp float; precision highp int; #endif +/* clang-format on */ #include "stdlib.glsl" +/* clang-format off */ #define SHADER_IS_SRGB true @@ -1365,7 +1367,7 @@ LIGHT_SHADER_CODE #ifdef USE_RGBA_SHADOWS -#define SHADOW_DEPTH(m_val) dot(m_val, vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0)) +#define SHADOW_DEPTH(m_val) dot(m_val, vec4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0)) #else @@ -1549,7 +1551,7 @@ FRAGMENT_SHADER_CODE #endif // ALPHA_SCISSOR_USED #ifdef USE_DEPTH_PREPASS - if (alpha < 0.99) { + if (alpha < 0.1) { discard; } #endif // USE_DEPTH_PREPASS @@ -2112,7 +2114,7 @@ FRAGMENT_SHADER_CODE #endif // ALPHA_SCISSOR_USED #ifdef USE_DEPTH_PREPASS - if (alpha < 0.99) { + if (alpha < 0.1) { discard; } #endif // USE_DEPTH_PREPASS @@ -2207,8 +2209,8 @@ FRAGMENT_SHADER_CODE #ifdef USE_RGBA_SHADOWS highp float depth = ((position_interp.z / position_interp.w) + 1.0) * 0.5 + 0.0; // bias - highp vec4 comp = fract(depth * vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0)); - comp -= comp.xxyz * vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0); + highp vec4 comp = fract(depth * vec4(255.0 * 255.0 * 255.0, 255.0 * 255.0, 255.0, 1.0)); + comp -= comp.xxyz * vec4(0.0, 1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0); gl_FragColor = comp; #endif diff --git a/drivers/gles2/shaders/stdlib.glsl b/drivers/gles2/shaders/stdlib.glsl index 3674d70c9f..96421fcb4a 100644 --- a/drivers/gles2/shaders/stdlib.glsl +++ b/drivers/gles2/shaders/stdlib.glsl @@ -36,12 +36,310 @@ highp vec4 texel2DFetch(highp sampler2D tex, ivec2 size, ivec2 coord) { return texture2DLod(tex, vec2(x_coord, y_coord), 0.0); } +#if defined(SINH_USED) + +highp float sinh(highp float x) { + return 0.5 * (exp(x) - exp(-x)); +} + +highp vec2 sinh(highp vec2 x) { + return 0.5 * vec2(exp(x.x) - exp(-x.x), exp(x.y) - exp(-x.y)); +} + +highp vec3 sinh(highp vec3 x) { + return 0.5 * vec3(exp(x.x) - exp(-x.x), exp(x.y) - exp(-x.y), exp(x.z) - exp(-x.z)); +} + +highp vec4 sinh(highp vec4 x) { + return 0.5 * vec4(exp(x.x) - exp(-x.x), exp(x.y) - exp(-x.y), exp(x.z) - exp(-x.z), exp(x.w) - exp(-x.w)); +} + +#endif + +#if defined(COSH_USED) + +highp float cosh(highp float x) { + return 0.5 * (exp(x) + exp(-x)); +} + +highp vec2 cosh(highp vec2 x) { + return 0.5 * vec2(exp(x.x) + exp(-x.x), exp(x.y) + exp(-x.y)); +} + +highp vec3 cosh(highp vec3 x) { + return 0.5 * vec3(exp(x.x) + exp(-x.x), exp(x.y) + exp(-x.y), exp(x.z) + exp(-x.z)); +} + +highp vec4 cosh(highp vec4 x) { + return 0.5 * vec4(exp(x.x) + exp(-x.x), exp(x.y) + exp(-x.y), exp(x.z) + exp(-x.z), exp(x.w) + exp(-x.w)); +} + +#endif + +#if defined(TANH_USED) + +highp float tanh(highp float x) { + highp float exp2x = exp(2.0 * x); + return (exp2x - 1.0) / (exp2x + 1.0); +} + +highp vec2 tanh(highp vec2 x) { + highp float exp2x = exp(2.0 * x.x); + highp float exp2y = exp(2.0 * x.y); + return vec2((exp2x - 1.0) / (exp2x + 1.0), (exp2y - 1.0) / (exp2y + 1.0)); +} + +highp vec3 tanh(highp vec3 x) { + highp float exp2x = exp(2.0 * x.x); + highp float exp2y = exp(2.0 * x.y); + highp float exp2z = exp(2.0 * x.z); + return vec3((exp2x - 1.0) / (exp2x + 1.0), (exp2y - 1.0) / (exp2y + 1.0), (exp2z - 1.0) / (exp2z + 1.0)); +} + +highp vec4 tanh(highp vec4 x) { + highp float exp2x = exp(2.0 * x.x); + highp float exp2y = exp(2.0 * x.y); + highp float exp2z = exp(2.0 * x.z); + highp float exp2w = exp(2.0 * x.w); + return vec4((exp2x - 1.0) / (exp2x + 1.0), (exp2y - 1.0) / (exp2y + 1.0), (exp2z - 1.0) / (exp2z + 1.0), (exp2w - 1.0) / (exp2w + 1.0)); +} + +#endif + +#if defined(ASINH_USED) + +highp float asinh(highp float x) { + return sign(x) * log(abs(x) + sqrt(1.0 + x * x)); +} + +highp vec2 asinh(highp vec2 x) { + return vec2(sign(x.x) * log(abs(x.x) + sqrt(1.0 + x.x * x.x)), sign(x.y) * log(abs(x.y) + sqrt(1.0 + x.y * x.y))); +} + +highp vec3 asinh(highp vec3 x) { + return vec3(sign(x.x) * log(abs(x.x) + sqrt(1.0 + x.x * x.x)), sign(x.y) * log(abs(x.y) + sqrt(1.0 + x.y * x.y)), sign(x.z) * log(abs(x.z) + sqrt(1.0 + x.z * x.z))); +} + +highp vec4 asinh(highp vec4 x) { + return vec4(sign(x.x) * log(abs(x.x) + sqrt(1.0 + x.x * x.x)), sign(x.y) * log(abs(x.y) + sqrt(1.0 + x.y * x.y)), sign(x.z) * log(abs(x.z) + sqrt(1.0 + x.z * x.z)), sign(x.w) * log(abs(x.w) + sqrt(1.0 + x.w * x.w))); +} + +#endif + +#if defined(ACOSH_USED) + +highp float acosh(highp float x) { + return log(x + sqrt(x * x - 1.0)); +} + +highp vec2 acosh(highp vec2 x) { + return vec2(log(x.x + sqrt(x.x * x.x - 1.0)), log(x.y + sqrt(x.y * x.y - 1.0))); +} + +highp vec3 acosh(highp vec3 x) { + return vec3(log(x.x + sqrt(x.x * x.x - 1.0)), log(x.y + sqrt(x.y * x.y - 1.0)), log(x.z + sqrt(x.z * x.z - 1.0))); +} + +highp vec4 acosh(highp vec4 x) { + return vec4(log(x.x + sqrt(x.x * x.x - 1.0)), log(x.y + sqrt(x.y * x.y - 1.0)), log(x.z + sqrt(x.z * x.z - 1.0)), log(x.w + sqrt(x.w * x.w - 1.0))); +} + +#endif + +#if defined(ATANH_USED) + +highp float atanh(highp float x) { + return 0.5 * log((1.0 + x) / (1.0 - x)); +} + +highp vec2 atanh(highp vec2 x) { + return 0.5 * vec2(log((1.0 + x.x) / (1.0 - x.x)), log((1.0 + x.y) / (1.0 - x.y))); +} + +highp vec3 atanh(highp vec3 x) { + return 0.5 * vec3(log((1.0 + x.x) / (1.0 - x.x)), log((1.0 + x.y) / (1.0 - x.y)), log((1.0 + x.z) / (1.0 - x.z))); +} + +highp vec4 atanh(highp vec4 x) { + return 0.5 * vec4(log((1.0 + x.x) / (1.0 - x.x)), log((1.0 + x.y) / (1.0 - x.y)), log((1.0 + x.z) / (1.0 - x.z)), log((1.0 + x.w) / (1.0 - x.w))); +} + +#endif + +#if defined(ROUND_USED) + +highp float round(highp float x) { + return floor(x + 0.5); +} + +highp vec2 round(highp vec2 x) { + return floor(x + vec2(0.5)); +} + +highp vec3 round(highp vec3 x) { + return floor(x + vec3(0.5)); +} + +highp vec4 round(highp vec4 x) { + return floor(x + vec4(0.5)); +} + +#endif + +#if defined(ROUND_EVEN_USED) + +highp float roundEven(highp float x) { + highp float t = x + 0.5; + highp float f = floor(t); + highp float r; + if (t == f) { + if (x > 0) + r = f - mod(f, 2); + else + r = f + mod(f, 2); + } else + r = f; + return r; +} + +highp vec2 roundEven(highp vec2 x) { + return vec2(roundEven(x.x), roundEven(x.y)); +} + +highp vec3 roundEven(highp vec3 x) { + return vec3(roundEven(x.x), roundEven(x.y), roundEven(x.z)); +} + +highp vec4 roundEven(highp vec4 x) { + return vec4(roundEven(x.x), roundEven(x.y), roundEven(x.z), roundEven(x.w)); +} + +#endif + +#if defined(IS_INF_USED) + +bool isinf(highp float x) { + return (2 * x == x) && (x != 0); +} + +bvec2 isinf(highp vec2 x) { + return bvec2((2 * x.x == x.x) && (x.x != 0), (2 * x.y == x.y) && (x.y != 0)); +} + +bvec3 isinf(highp vec3 x) { + return bvec3((2 * x.x == x.x) && (x.x != 0), (2 * x.y == x.y) && (x.y != 0), (2 * x.z == x.z) && (x.z != 0)); +} + +bvec4 isinf(highp vec4 x) { + return bvec4((2 * x.x == x.x) && (x.x != 0), (2 * x.y == x.y) && (x.y != 0), (2 * x.z == x.z) && (x.z != 0), (2 * x.w == x.w) && (x.w != 0)); +} + +#endif + +#if defined(IS_NAN_USED) + +bool isnan(highp float x) { + return x != x; +} + +bvec2 isnan(highp vec2 x) { + return bvec2(x.x != x.x, x.y != x.y); +} + +bvec3 isnan(highp vec3 x) { + return bvec3(x.x != x.x, x.y != x.y, x.z != x.z); +} + +bvec4 isnan(highp vec4 x) { + return bvec4(x.x != x.x, x.y != x.y, x.z != x.z, x.w != x.w); +} + +#endif + +#if defined(TRUNC_USED) + +highp float trunc(highp float x) { + return x < 0 ? -floor(-x) : floor(x); +} + +highp vec2 trunc(highp vec2 x) { + return vec2(x.x < 0 ? -floor(-x.x) : floor(x.x), x.y < 0 ? -floor(-x.y) : floor(x.y)); +} + +highp vec3 trunc(highp vec3 x) { + return vec3(x.x < 0 ? -floor(-x.x) : floor(x.x), x.y < 0 ? -floor(-x.y) : floor(x.y), x.z < 0 ? -floor(-x.z) : floor(x.z)); +} + +highp vec4 trunc(highp vec4 x) { + return vec4(x.x < 0 ? -floor(-x.x) : floor(x.x), x.y < 0 ? -floor(-x.y) : floor(x.y), x.z < 0 ? -floor(-x.z) : floor(x.z), x.w < 0 ? -floor(-x.w) : floor(x.w)); +} + +#endif + +#if defined(DETERMINANT_USED) + +highp float determinant(highp mat2 m) { + return m[0].x * m[1].y - m[1].x * m[0].y; +} + +highp float determinant(highp mat3 m) { + return m[0].x * (m[1].y * m[2].z - m[2].y * m[1].z) - m[1].x * (m[0].y * m[2].z - m[2].y * m[0].z) + m[2].x * (m[0].y * m[1].z - m[1].y * m[0].z); +} + +highp float determinant(highp mat4 m) { + highp float s00 = m[2].z * m[3].w - m[3].z * m[2].w; + highp float s01 = m[2].y * m[3].w - m[3].y * m[2].w; + highp float s02 = m[2].y * m[3].z - m[3].y * m[2].z; + highp float s03 = m[2].x * m[3].w - m[3].x * m[2].w; + highp float s04 = m[2].x * m[3].z - m[3].x * m[2].z; + highp float s05 = m[2].x * m[3].y - m[3].x * m[2].y; + highp vec4 c = vec4((m[1].y * s00 - m[1].z * s01 + m[1].w * s02), -(m[1].x * s00 - m[1].z * s03 + m[1].w * s04), (m[1].x * s01 - m[1].y * s03 + m[1].w * s05), -(m[1].x * s02 - m[1].y * s04 + m[1].z * s05)); + return m[0].x * c.x + m[0].y * c.y + m[0].z * c.z + m[0].w * c.w; +} + +#endif + #ifndef USE_GLES_OVER_GL -highp mat4 transpose(highp mat4 src) { + +#if defined(TRANSPOSE_USED) + +highp mat2 transpose(highp mat2 m) { + return mat2( + vec2(m[0].x, m[1].x), + vec2(m[0].y, m[1].y)); +} + +highp mat3 transpose(highp mat3 m) { + return mat3( + vec3(m[0].x, m[1].x, m[2].x), + vec3(m[0].y, m[1].y, m[2].y), + vec3(m[0].z, m[1].z, m[2].z)); +} + +#endif + +highp mat4 transpose(highp mat4 m) { return mat4( - vec4(src[0].x, src[1].x, src[2].x, src[3].x), - vec4(src[0].y, src[1].y, src[2].y, src[3].y), - vec4(src[0].z, src[1].z, src[2].z, src[3].z), - vec4(src[0].w, src[1].w, src[2].w, src[3].w)); + vec4(m[0].x, m[1].x, m[2].x, m[3].x), + vec4(m[0].y, m[1].y, m[2].y, m[3].y), + vec4(m[0].z, m[1].z, m[2].z, m[3].z), + vec4(m[0].w, m[1].w, m[2].w, m[3].w)); +} + +#if defined(OUTER_PRODUCT_USED) + +highp mat2 outerProduct(highp vec2 c, highp vec2 r) { + return mat2(c * r.x, c * r.y); } + +highp mat3 outerProduct(highp vec3 c, highp vec3 r) { + return mat3(c * r.x, c * r.y, c * r.z); +} + +highp mat4 outerProduct(highp vec4 c, highp vec4 r) { + return mat4(c * r.x, c * r.y, c * r.z, c * r.w); +} + +#endif + #endif diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index eb5ab53421..f4faed8736 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -1585,6 +1585,11 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE, state.canvas_item_modulate); state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform); state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, Transform2D()); + if (storage->frame.current_rt) { + state.canvas_shader.set_uniform(CanvasShaderGLES3::SCREEN_PIXEL_SIZE, Vector2(1.0 / storage->frame.current_rt->width, 1.0 / storage->frame.current_rt->height)); + } else { + state.canvas_shader.set_uniform(CanvasShaderGLES3::SCREEN_PIXEL_SIZE, Vector2(1.0, 1.0)); + } } glBindBufferBase(GL_UNIFORM_BUFFER, 1, static_cast<LightInternal *>(light->light_internal.get_data())->ubo); diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index fb3d154a7a..30ca07aa28 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1008,7 +1008,8 @@ RID RasterizerSceneGLES3::light_instance_create(RID p_light) { if (!light_instance->light_ptr) { memdelete(light_instance); - ERR_FAIL_COND_V(!light_instance->light_ptr, RID()); + ERR_EXPLAIN("Condition ' !light_instance->light_ptr ' is true."); + ERR_FAIL_V(RID()); } light_instance->self = light_instance_owner.make_rid(light_instance); @@ -2364,7 +2365,7 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G if (p_depth_pass) { - if (has_blend_alpha || p_material->shader->spatial.uses_depth_texture || (has_base_alpha && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) || p_material->shader->spatial.depth_draw_mode == RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_NEVER || p_material->shader->spatial.no_depth_test) + if (has_blend_alpha || p_material->shader->spatial.uses_depth_texture || (has_base_alpha && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) || p_material->shader->spatial.depth_draw_mode == RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_NEVER || p_material->shader->spatial.no_depth_test || p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_OFF) return; //bye if (!p_material->shader->spatial.uses_alpha_scissor && !p_material->shader->spatial.writes_modelview_or_projection && !p_material->shader->spatial.uses_vertex && !p_material->shader->spatial.uses_discard && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) { @@ -2763,9 +2764,7 @@ void RasterizerSceneGLES3::_setup_directional_light(int p_index, const Transform width /= 2; height /= 2; - if (j == 0) { - - } else if (j == 1) { + if (j == 1) { x += width; } else if (j == 2) { y += height; @@ -2778,9 +2777,7 @@ void RasterizerSceneGLES3::_setup_directional_light(int p_index, const Transform height /= 2; - if (j == 0) { - - } else { + if (j != 0) { y += height; } } @@ -2827,7 +2824,7 @@ void RasterizerSceneGLES3::_setup_lights(RID *p_light_cull_result, int p_light_c for (int i = 0; i < p_light_cull_count; i++) { - ERR_BREAK(i >= RenderList::MAX_LIGHTS); + ERR_BREAK(i >= render_list.max_lights); LightInstance *li = light_instance_owner.getptr(p_light_cull_result[i]); @@ -4192,7 +4189,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const for (int i = 0; i < p_light_cull_count; i++) { - ERR_BREAK(i >= RenderList::MAX_LIGHTS); + ERR_BREAK(i >= render_list.max_lights); LightInstance *li = light_instance_owner.getptr(p_light_cull_result[i]); if (li->light_ptr->param[VS::LIGHT_PARAM_CONTACT_SHADOW_SIZE] > CMP_EPSILON) { @@ -4741,9 +4738,7 @@ void RasterizerSceneGLES3::render_shadow(RID p_light, RID p_shadow_atlas, int p_ width /= 2; height /= 2; - if (p_pass == 0) { - - } else if (p_pass == 1) { + if (p_pass == 1) { x += width; } else if (p_pass == 2) { y += height; @@ -5069,6 +5064,10 @@ void RasterizerSceneGLES3::initialize() { render_list.max_elements = GLOBAL_DEF_RST("rendering/limits/rendering/max_renderable_elements", (int)RenderList::DEFAULT_MAX_ELEMENTS); ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/rendering/max_renderable_elements", PropertyInfo(Variant::INT, "rendering/limits/rendering/max_renderable_elements", PROPERTY_HINT_RANGE, "1024,1000000,1")); + render_list.max_lights = GLOBAL_DEF("rendering/limits/rendering/max_renderable_lights", (int)RenderList::DEFAULT_MAX_LIGHTS); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/rendering/max_renderable_lights", PropertyInfo(Variant::INT, "rendering/limits/rendering/max_renderable_lights", PROPERTY_HINT_RANGE, "16,4096,1")); + render_list.max_reflections = GLOBAL_DEF("rendering/limits/rendering/max_renderable_reflections", (int)RenderList::DEFAULT_MAX_REFLECTIONS); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/rendering/max_renderable_reflections", PropertyInfo(Variant::INT, "rendering/limits/rendering/max_renderable_reflections", PROPERTY_HINT_RANGE, "8,1024,1")); { //quad buffers @@ -5163,7 +5162,7 @@ void RasterizerSceneGLES3::initialize() { glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &max_ubo_size); const int ubo_light_size = 160; state.ubo_light_size = ubo_light_size; - state.max_ubo_lights = MIN(RenderList::MAX_LIGHTS, max_ubo_size / ubo_light_size); + state.max_ubo_lights = MIN(render_list.max_lights, max_ubo_size / ubo_light_size); state.spot_array_tmp = (uint8_t *)memalloc(ubo_light_size * state.max_ubo_lights); state.omni_array_tmp = (uint8_t *)memalloc(ubo_light_size * state.max_ubo_lights); @@ -5188,7 +5187,7 @@ void RasterizerSceneGLES3::initialize() { state.scene_shader.add_custom_define("#define MAX_LIGHT_DATA_STRUCTS " + itos(state.max_ubo_lights) + "\n"); state.scene_shader.add_custom_define("#define MAX_FORWARD_LIGHTS " + itos(state.max_forward_lights_per_object) + "\n"); - state.max_ubo_reflections = MIN((int)RenderList::MAX_REFLECTIONS, max_ubo_size / sizeof(ReflectionProbeDataUBO)); + state.max_ubo_reflections = MIN(render_list.max_reflections, max_ubo_size / (int)sizeof(ReflectionProbeDataUBO)); state.reflection_array_tmp = (uint8_t *)memalloc(sizeof(ReflectionProbeDataUBO) * state.max_ubo_reflections); @@ -5301,7 +5300,7 @@ void RasterizerSceneGLES3::initialize() { GLOBAL_DEF("rendering/quality/subsurface_scattering/follow_surface", false); GLOBAL_DEF("rendering/quality/subsurface_scattering/weight_samples", true); - GLOBAL_DEF("rendering/quality/voxel_cone_tracing/high_quality", true); + GLOBAL_DEF("rendering/quality/voxel_cone_tracing/high_quality", false); } exposure_shrink_size = 243; diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 910f90edc2..b5e64b6162 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -669,8 +669,8 @@ public: SORT_FLAG_SKELETON = 1, SORT_FLAG_INSTANCING = 2, MAX_DIRECTIONAL_LIGHTS = 16, - MAX_LIGHTS = 4096, - MAX_REFLECTIONS = 1024, + DEFAULT_MAX_LIGHTS = 4096, + DEFAULT_MAX_REFLECTIONS = 1024, SORT_KEY_PRIORITY_SHIFT = 56, SORT_KEY_PRIORITY_MASK = 0xFF, @@ -701,6 +701,8 @@ public: }; int max_elements; + int max_lights; + int max_reflections; struct Element { @@ -813,6 +815,8 @@ public: RenderList() { max_elements = DEFAULT_MAX_ELEMENTS; + max_lights = DEFAULT_MAX_LIGHTS; + max_reflections = DEFAULT_MAX_REFLECTIONS; } ~RenderList() { diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index c4cfd1e765..e0ca388da9 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -1144,8 +1144,12 @@ Ref<Image> RasterizerStorageGLES3::texture_get_data(RID p_texture, int p_layer) shaders.copy.set_conditional(CopyShaderGLES3::USE_TEXTURE2DARRAY, texture->type == VS::TEXTURE_TYPE_2D_ARRAY); shaders.copy.bind(); - // calculate the normalized z coordinate for the layer - float layer = (float)p_layer / (float)texture->alloc_depth; + float layer; + if (texture->type == VS::TEXTURE_TYPE_2D_ARRAY) + layer = (float)p_layer; + else + // calculate the normalized z coordinate for the layer + layer = (float)p_layer / (float)texture->alloc_depth; shaders.copy.set_uniform(CopyShaderGLES3::LAYER, layer); @@ -5467,22 +5471,19 @@ AABB RasterizerStorageGLES3::light_get_aabb(RID p_light) const { float len = light->param[VS::LIGHT_PARAM_RANGE]; float size = Math::tan(Math::deg2rad(light->param[VS::LIGHT_PARAM_SPOT_ANGLE])) * len; return AABB(Vector3(-size, -size, -len), Vector3(size * 2, size * 2, len)); - } break; + }; case VS::LIGHT_OMNI: { float r = light->param[VS::LIGHT_PARAM_RANGE]; return AABB(-Vector3(r, r, r), Vector3(r, r, r) * 2); - } break; + }; case VS::LIGHT_DIRECTIONAL: { return AABB(); - } break; - default: { - } + }; } ERR_FAIL_V(AABB()); - return AABB(); } /* PROBE API */ @@ -8092,7 +8093,7 @@ void RasterizerStorageGLES3::initialize() { glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &config.max_texture_image_units); glGetIntegerv(GL_MAX_TEXTURE_SIZE, &config.max_texture_size); - config.use_rgba_2d_shadows = config.framebuffer_float_supported; + config.use_rgba_2d_shadows = !config.framebuffer_float_supported; //generic quadie for copying diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp index b0f0a71d56..f826bdf5a2 100644 --- a/drivers/gles3/shader_compiler_gles3.cpp +++ b/drivers/gles3/shader_compiler_gles3.cpp @@ -607,6 +607,88 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener } } break; + case SL::Node::TYPE_ARRAY_DECLARATION: { + + SL::ArrayDeclarationNode *vdnode = (SL::ArrayDeclarationNode *)p_node; + + String declaration = _prestr(vdnode->precision) + _typestr(vdnode->datatype); + for (int i = 0; i < vdnode->declarations.size(); i++) { + if (i > 0) { + declaration += ","; + } else { + declaration += " "; + } + declaration += _mkid(vdnode->declarations[i].name); + declaration += "["; + declaration += itos(vdnode->declarations[i].size); + declaration += "]"; + int sz = vdnode->declarations[i].initializer.size(); + if (sz > 0) { + declaration += "="; + declaration += _typestr(vdnode->datatype); + declaration += "["; + declaration += itos(sz); + declaration += "]"; + declaration += "("; + for (int j = 0; j < sz; j++) { + declaration += _dump_node_code(vdnode->declarations[i].initializer[j], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + if (j != sz - 1) { + declaration += ", "; + } + } + declaration += ")"; + } + } + + code += declaration; + } break; + case SL::Node::TYPE_ARRAY: { + SL::ArrayNode *vnode = (SL::ArrayNode *)p_node; + + if (p_assigning && p_actions.write_flag_pointers.has(vnode->name)) { + *p_actions.write_flag_pointers[vnode->name] = true; + } + + if (p_default_actions.usage_defines.has(vnode->name) && !used_name_defines.has(vnode->name)) { + String define = p_default_actions.usage_defines[vnode->name]; + if (define.begins_with("@")) { + define = p_default_actions.usage_defines[define.substr(1, define.length())]; + } + r_gen_code.defines.push_back(define.utf8()); + used_name_defines.insert(vnode->name); + } + + if (p_actions.usage_flag_pointers.has(vnode->name) && !used_flag_pointers.has(vnode->name)) { + *p_actions.usage_flag_pointers[vnode->name] = true; + used_flag_pointers.insert(vnode->name); + } + + if (p_default_actions.renames.has(vnode->name)) + code = p_default_actions.renames[vnode->name]; + else + code = _mkid(vnode->name); + + if (vnode->call_expression != NULL) { + code += "."; + code += _dump_node_code(vnode->call_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + } + + if (vnode->index_expression != NULL) { + code += "["; + code += _dump_node_code(vnode->index_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + code += "]"; + } + + if (vnode->name == time_name) { + if (current_func_name == vertex_name) { + r_gen_code.uses_vertex_time = true; + } + if (current_func_name == fragment_name || current_func_name == light_name) { + r_gen_code.uses_fragment_time = true; + } + } + + } break; case SL::Node::TYPE_CONSTANT: { SL::ConstantNode *cnode = (SL::ConstantNode *)p_node; return get_constant_text(cnode->datatype, cnode->values); diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl index a46b31c92e..10c8764b8e 100644 --- a/drivers/gles3/shaders/canvas.glsl +++ b/drivers/gles3/shaders/canvas.glsl @@ -597,7 +597,7 @@ FRAGMENT_SHADER_CODE #ifdef USE_RGBA_SHADOWS -#define SHADOW_DEPTH(m_tex, m_uv) dot(texture((m_tex), (m_uv)), vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0)) +#define SHADOW_DEPTH(m_tex, m_uv) dot(texture((m_tex), (m_uv)), vec4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0)) #else diff --git a/drivers/gles3/shaders/canvas_shadow.glsl b/drivers/gles3/shaders/canvas_shadow.glsl index 13fff7f4d1..4f706c5505 100644 --- a/drivers/gles3/shaders/canvas_shadow.glsl +++ b/drivers/gles3/shaders/canvas_shadow.glsl @@ -35,8 +35,8 @@ void main() { #ifdef USE_RGBA_SHADOWS - highp vec4 comp = fract(depth * vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0)); - comp -= comp.xxyz * vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0); + highp vec4 comp = fract(depth * vec4(255.0 * 255.0 * 255.0, 255.0 * 255.0, 255.0, 1.0)); + comp -= comp.xxyz * vec4(0.0, 1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0); distance_buf = comp; #else diff --git a/drivers/png/resource_saver_png.cpp b/drivers/png/resource_saver_png.cpp index 89e8ee32cc..43a30f055b 100644 --- a/drivers/png/resource_saver_png.cpp +++ b/drivers/png/resource_saver_png.cpp @@ -79,7 +79,7 @@ bool ResourceSaverPNG::recognize(const RES &p_resource) const { void ResourceSaverPNG::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const { - if (Object::cast_to<Texture>(*p_resource)) { + if (Object::cast_to<ImageTexture>(*p_resource)) { p_extensions->push_back("png"); } } diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 251bab5783..6817137a94 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -126,37 +126,32 @@ String DirAccessUnix::get_next() { if (!dir_stream) return ""; - dirent *entry; - entry = readdir(dir_stream); + dirent *entry = readdir(dir_stream); if (entry == NULL) { - list_dir_end(); return ""; } - //typedef struct stat Stat; - struct stat flags; - String fname = fix_unicode_name(entry->d_name); - String f = current_dir.plus_file(fname); - - if (stat(f.utf8().get_data(), &flags) == 0) { - - if (S_ISDIR(flags.st_mode)) { - - _cisdir = true; - + // Look at d_type to determine if the entry is a directory, unless + // its type is unknown (the file system does not support it) or if + // the type is a link, in that case we want to resolve the link to + // known if it points to a directory. stat() will resolve the link + // for us. + if (entry->d_type == DT_UNKNOWN || entry->d_type == DT_LNK) { + String f = current_dir.plus_file(fname); + + struct stat flags; + if (stat(f.utf8().get_data(), &flags) == 0) { + _cisdir = S_ISDIR(flags.st_mode); } else { - _cisdir = false; } - } else { - - _cisdir = false; + _cisdir = (entry->d_type == DT_DIR); } _cishidden = (fname != "." && fname != ".." && fname.begins_with(".")); diff --git a/drivers/unix/net_socket_posix.cpp b/drivers/unix/net_socket_posix.cpp index f8e771aea0..6a57a2e562 100644 --- a/drivers/unix/net_socket_posix.cpp +++ b/drivers/unix/net_socket_posix.cpp @@ -212,7 +212,7 @@ NetSocketPosix::NetError NetSocketPosix::_get_socket_error() { #pragma GCC diagnostic pop #endif -bool NetSocketPosix::_can_use_ip(const IP_Address p_ip, const bool p_for_bind) const { +bool NetSocketPosix::_can_use_ip(const IP_Address &p_ip, const bool p_for_bind) const { if (p_for_bind && !(p_ip.is_valid() || p_ip.is_wildcard())) { return false; diff --git a/drivers/unix/net_socket_posix.h b/drivers/unix/net_socket_posix.h index ce6dc00d42..40406b241a 100644 --- a/drivers/unix/net_socket_posix.h +++ b/drivers/unix/net_socket_posix.h @@ -65,7 +65,7 @@ private: protected: static NetSocket *_create_func(); - bool _can_use_ip(const IP_Address p_ip, const bool p_for_bind) const; + bool _can_use_ip(const IP_Address &p_ip, const bool p_for_bind) const; public: static void make_default(); diff --git a/editor/SCsub b/editor/SCsub index 7d48e47c9f..2b560f68e8 100644 --- a/editor/SCsub +++ b/editor/SCsub @@ -31,7 +31,7 @@ if env['tools']: reg_exporters_inc = '#include "register_exporters.h"\n' reg_exporters = 'void register_exporters() {\n' for e in env.platform_exporters: - env.editor_sources.append("#platform/" + e + "/export/export.cpp") + env.add_source_files(env.editor_sources, "#platform/" + e + "/export/export.cpp") reg_exporters += '\tregister_' + e + '_exporter();\n' reg_exporters_inc += '#include "platform/' + e + '/export/export.h"\n' reg_exporters += '}\n' diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index f5b5cfa848..9b376ae090 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -82,22 +82,23 @@ public: } void _update_obj(const Ref<Animation> &p_anim) { - if (setting) - return; - if (!(animation == p_anim)) + + if (setting || animation != p_anim) return; notify_change(); } void _key_ofs_changed(const Ref<Animation> &p_anim, float from, float to) { - if (!(animation == p_anim)) - return; - if (from != key_ofs) + + if (animation != p_anim || from != key_ofs) return; + key_ofs = to; + if (setting) return; + notify_change(); } @@ -118,6 +119,7 @@ public: } new_time /= fps; } + if (new_time == key_ofs) return true; @@ -141,12 +143,13 @@ public: trans = animation->track_get_key_transition(track, existing); undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, new_time, v, trans); } - undo_redo->commit_action(); - setting = false; + setting = false; return true; - } else if (name == "easing") { + } + + if (name == "easing") { float val = p_value; float prev_val = animation->track_get_key_transition(track, key); @@ -157,6 +160,7 @@ public: undo_redo->add_do_method(this, "_update_obj", animation); undo_redo->add_undo_method(this, "_update_obj", animation); undo_redo->commit_action(); + setting = false; return true; } @@ -166,7 +170,7 @@ public: case Animation::TYPE_TRANSFORM: { Dictionary d_old = animation->track_get_key_value(track, key); - Dictionary d_new = d_old; + Dictionary d_new = d_old.duplicate(); d_new[p_name] = p_value; setting = true; undo_redo->create_action(TTR("Anim Change Transform")); @@ -178,7 +182,6 @@ public: setting = false; return true; - } break; case Animation::TYPE_VALUE: { @@ -187,7 +190,6 @@ public: Variant value = p_value; if (value.get_type() == Variant::NODE_PATH) { - _fix_node_path(value); } @@ -203,12 +205,11 @@ public: setting = false; return true; } - } break; case Animation::TYPE_METHOD: { Dictionary d_old = animation->track_get_key_value(track, key); - Dictionary d_new = d_old; + Dictionary d_new = d_old.duplicate(); bool change_notify_deserved = false; bool mergeable = false; @@ -216,17 +217,13 @@ public: if (name == "name") { d_new["method"] = p_value; - } - - if (name == "arg_count") { + } else if (name == "arg_count") { Vector<Variant> args = d_old["args"]; args.resize(p_value); d_new["args"] = args; change_notify_deserved = true; - } - - if (name.begins_with("args/")) { + } else if (name.begins_with("args/")) { Vector<Variant> args = d_old["args"]; int idx = name.get_slice("/", 1).to_int(); @@ -249,8 +246,7 @@ public: change_notify_deserved = true; d_new["args"] = args; } - } - if (what == "value") { + } else if (what == "value") { Variant value = p_value; if (value.get_type() == Variant::NODE_PATH) { @@ -300,6 +296,7 @@ public: setting = false; return true; } + if (name == "in_handle") { const Variant &value = p_value; @@ -316,6 +313,7 @@ public: setting = false; return true; } + if (name == "out_handle") { const Variant &value = p_value; @@ -332,7 +330,6 @@ public: setting = false; return true; } - } break; case Animation::TYPE_AUDIO: { @@ -352,6 +349,7 @@ public: setting = false; return true; } + if (name == "start_offset") { float value = p_value; @@ -368,6 +366,7 @@ public: setting = false; return true; } + if (name == "end_offset") { float value = p_value; @@ -384,7 +383,6 @@ public: setting = false; return true; } - } break; case Animation::TYPE_ANIMATION: { @@ -400,10 +398,10 @@ public: undo_redo->add_do_method(this, "_update_obj", animation); undo_redo->add_undo_method(this, "_update_obj", animation); undo_redo->commit_action(); + setting = false; return true; } - } break; } @@ -419,20 +417,24 @@ public: if (name == "time") { r_ret = key_ofs; return true; - } else if (name == "frame") { + } + + if (name == "frame") { + float fps = animation->get_step(); if (fps > 0) { fps = 1.0 / fps; } r_ret = key_ofs * fps; return true; - } else if (name == "easing") { + } + + if (name == "easing") { r_ret = animation->track_get_key_transition(track, key); return true; } switch (animation->track_get_type(track)) { - case Animation::TYPE_TRANSFORM: { Dictionary d = animation->track_get_key_value(track, key); @@ -465,7 +467,6 @@ public: Vector<Variant> args = d["args"]; if (name == "arg_count") { - r_ret = args.size(); return true; } @@ -480,6 +481,7 @@ public: r_ret = args[idx].get_type(); return true; } + if (what == "value") { r_ret = args[idx]; return true; @@ -493,10 +495,12 @@ public: r_ret = animation->bezier_track_get_key_value(track, key); return true; } + if (name == "in_handle") { r_ret = animation->bezier_track_get_key_in_handle(track, key); return true; } + if (name == "out_handle") { r_ret = animation->bezier_track_get_key_out_handle(track, key); return true; @@ -509,10 +513,12 @@ public: r_ret = animation->audio_track_get_key_stream(track, key); return true; } + if (name == "start_offset") { r_ret = animation->audio_track_get_key_start_offset(track, key); return true; } + if (name == "end_offset") { r_ret = animation->audio_track_get_key_end_offset(track, key); return true; @@ -691,6 +697,702 @@ public: } }; +class AnimationMultiTrackKeyEdit : public Object { + + GDCLASS(AnimationMultiTrackKeyEdit, Object); + +public: + bool setting; + + bool _hide_script_from_inspector() { + return true; + } + + bool _dont_undo_redo() { + return true; + } + + static void _bind_methods() { + + ClassDB::bind_method("_update_obj", &AnimationMultiTrackKeyEdit::_update_obj); + ClassDB::bind_method("_key_ofs_changed", &AnimationMultiTrackKeyEdit::_key_ofs_changed); + ClassDB::bind_method("_hide_script_from_inspector", &AnimationMultiTrackKeyEdit::_hide_script_from_inspector); + ClassDB::bind_method("get_root_path", &AnimationMultiTrackKeyEdit::get_root_path); + ClassDB::bind_method("_dont_undo_redo", &AnimationMultiTrackKeyEdit::_dont_undo_redo); + } + + void _fix_node_path(Variant &value, NodePath &base) { + + NodePath np = value; + + if (np == NodePath()) + return; + + Node *root = EditorNode::get_singleton()->get_tree()->get_root(); + + Node *np_node = root->get_node(np); + ERR_FAIL_COND(!np_node); + + Node *edited_node = root->get_node(base); + ERR_FAIL_COND(!edited_node); + + value = edited_node->get_path_to(np_node); + } + + void _update_obj(const Ref<Animation> &p_anim) { + + if (setting || animation != p_anim) + return; + + notify_change(); + } + + void _key_ofs_changed(const Ref<Animation> &p_anim, float from, float to) { + + if (animation != p_anim) + return; + + for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) { + + for (List<float>::Element *F = E->value().front(); F; F = F->next()) { + + float key_ofs = F->get(); + if (from != key_ofs) + continue; + + int track = E->key(); + key_ofs_map[track][key_ofs] = to; + + if (setting) + return; + + notify_change(); + + return; + } + } + } + + bool _set(const StringName &p_name, const Variant &p_value) { + + bool update_obj = false; + bool change_notify_deserved = false; + for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) { + + int track = E->key(); + for (List<float>::Element *F = E->value().front(); F; F = F->next()) { + + float key_ofs = F->get(); + int key = animation->track_find_key(track, key_ofs, true); + ERR_FAIL_COND_V(key == -1, false); + + String name = p_name; + if (name == "time" || name == "frame") { + + float new_time = p_value; + + if (name == "frame") { + float fps = animation->get_step(); + if (fps > 0) { + fps = 1.0 / fps; + } + new_time /= fps; + } + + int existing = animation->track_find_key(track, new_time, true); + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Time"), UndoRedo::MERGE_ENDS); + } + + Variant val = animation->track_get_key_value(track, key); + float trans = animation->track_get_key_transition(track, key); + + undo_redo->add_do_method(animation.ptr(), "track_remove_key", track, key); + undo_redo->add_do_method(animation.ptr(), "track_insert_key", track, new_time, val, trans); + undo_redo->add_do_method(this, "_key_ofs_changed", animation, key_ofs, new_time); + undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_position", track, new_time); + undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, key_ofs, val, trans); + undo_redo->add_undo_method(this, "_key_ofs_changed", animation, new_time, key_ofs); + + if (existing != -1) { + Variant v = animation->track_get_key_value(track, existing); + trans = animation->track_get_key_transition(track, existing); + undo_redo->add_undo_method(animation.ptr(), "track_insert_key", track, new_time, v, trans); + } + } else if (name == "easing") { + + float val = p_value; + float prev_val = animation->track_get_key_transition(track, key); + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Transition"), UndoRedo::MERGE_ENDS); + } + undo_redo->add_do_method(animation.ptr(), "track_set_key_transition", track, key, val); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_transition", track, key, prev_val); + update_obj = true; + } + + switch (animation->track_get_type(track)) { + + case Animation::TYPE_TRANSFORM: { + + Dictionary d_old = animation->track_get_key_value(track, key); + Dictionary d_new = d_old.duplicate(); + d_new[p_name] = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Transform")); + } + undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, d_new); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, d_old); + update_obj = true; + } break; + case Animation::TYPE_VALUE: { + + if (name == "value") { + + Variant value = p_value; + + if (value.get_type() == Variant::NODE_PATH) { + _fix_node_path(value, base_map[track]); + } + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + Variant prev = animation->track_get_key_value(track, key); + undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, prev); + update_obj = true; + } + } break; + case Animation::TYPE_METHOD: { + + Dictionary d_old = animation->track_get_key_value(track, key); + Dictionary d_new = d_old.duplicate(); + + bool mergeable = false; + + if (name == "name") { + + d_new["method"] = p_value; + } else if (name == "arg_count") { + + Vector<Variant> args = d_old["args"]; + args.resize(p_value); + d_new["args"] = args; + change_notify_deserved = true; + } else if (name.begins_with("args/")) { + + Vector<Variant> args = d_old["args"]; + int idx = name.get_slice("/", 1).to_int(); + ERR_FAIL_INDEX_V(idx, args.size(), false); + + String what = name.get_slice("/", 2); + if (what == "type") { + Variant::Type t = Variant::Type(int(p_value)); + + if (t != args[idx].get_type()) { + Variant::CallError err; + if (Variant::can_convert(args[idx].get_type(), t)) { + Variant old = args[idx]; + Variant *ptrs[1] = { &old }; + args.write[idx] = Variant::construct(t, (const Variant **)ptrs, 1, err); + } else { + + args.write[idx] = Variant::construct(t, NULL, 0, err); + } + change_notify_deserved = true; + d_new["args"] = args; + } + } else if (what == "value") { + + Variant value = p_value; + if (value.get_type() == Variant::NODE_PATH) { + + _fix_node_path(value, base_map[track]); + } + + args.write[idx] = value; + d_new["args"] = args; + mergeable = true; + } + } + + Variant prev = animation->track_get_key_value(track, key); + + if (!setting) { + if (mergeable) + undo_redo->create_action(TTR("Anim Multi Change Call"), UndoRedo::MERGE_ENDS); + else + undo_redo->create_action(TTR("Anim Multi Change Call")); + + setting = true; + } + + undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, d_new); + undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, d_old); + update_obj = true; + } break; + case Animation::TYPE_BEZIER: { + + if (name == "value") { + + const Variant &value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + float prev = animation->bezier_track_get_key_value(track, key); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_value", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_value", track, key, prev); + update_obj = true; + } else if (name == "in_handle") { + + const Variant &value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + Vector2 prev = animation->bezier_track_get_key_in_handle(track, key); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", track, key, prev); + update_obj = true; + } else if (name == "out_handle") { + + const Variant &value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + Vector2 prev = animation->bezier_track_get_key_out_handle(track, key); + undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_out_handle", track, key, prev); + update_obj = true; + } + } break; + case Animation::TYPE_AUDIO: { + + if (name == "stream") { + + Ref<AudioStream> stream = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + RES prev = animation->audio_track_get_key_stream(track, key); + undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_stream", track, key, stream); + undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_stream", track, key, prev); + update_obj = true; + } else if (name == "start_offset") { + + float value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + float prev = animation->audio_track_get_key_start_offset(track, key); + undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_start_offset", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_start_offset", track, key, prev); + update_obj = true; + } else if (name == "end_offset") { + + float value = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + float prev = animation->audio_track_get_key_end_offset(track, key); + undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_end_offset", track, key, value); + undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_end_offset", track, key, prev); + update_obj = true; + } + } break; + case Animation::TYPE_ANIMATION: { + + if (name == "animation") { + + StringName anim_name = p_value; + + if (!setting) { + setting = true; + undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + } + StringName prev = animation->animation_track_get_key_animation(track, key); + undo_redo->add_do_method(animation.ptr(), "animation_track_set_key_animation", track, key, anim_name); + undo_redo->add_undo_method(animation.ptr(), "animation_track_set_key_animation", track, key, prev); + update_obj = true; + } + } break; + } + } + } + + if (setting) { + + if (update_obj) { + undo_redo->add_do_method(this, "_update_obj", animation); + undo_redo->add_undo_method(this, "_update_obj", animation); + } + + undo_redo->commit_action(); + setting = false; + + if (change_notify_deserved) + notify_change(); + + return true; + } + + return false; + } + + bool _get(const StringName &p_name, Variant &r_ret) const { + + for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) { + + int track = E->key(); + for (List<float>::Element *F = E->value().front(); F; F = F->next()) { + + float key_ofs = F->get(); + int key = animation->track_find_key(track, key_ofs, true); + ERR_CONTINUE(key == -1); + + String name = p_name; + if (name == "time") { + r_ret = key_ofs; + return true; + } + + if (name == "frame") { + + float fps = animation->get_step(); + if (fps > 0) { + fps = 1.0 / fps; + } + r_ret = key_ofs * fps; + return true; + } + + if (name == "easing") { + r_ret = animation->track_get_key_transition(track, key); + return true; + } + + switch (animation->track_get_type(track)) { + + case Animation::TYPE_TRANSFORM: { + + Dictionary d = animation->track_get_key_value(track, key); + ERR_FAIL_COND_V(!d.has(name), false); + r_ret = d[p_name]; + return true; + + } break; + case Animation::TYPE_VALUE: { + + if (name == "value") { + r_ret = animation->track_get_key_value(track, key); + return true; + } + + } break; + case Animation::TYPE_METHOD: { + + Dictionary d = animation->track_get_key_value(track, key); + + if (name == "name") { + + ERR_FAIL_COND_V(!d.has("method"), false); + r_ret = d["method"]; + return true; + } + + ERR_FAIL_COND_V(!d.has("args"), false); + + Vector<Variant> args = d["args"]; + + if (name == "arg_count") { + + r_ret = args.size(); + return true; + } + + if (name.begins_with("args/")) { + + int idx = name.get_slice("/", 1).to_int(); + ERR_FAIL_INDEX_V(idx, args.size(), false); + + String what = name.get_slice("/", 2); + if (what == "type") { + r_ret = args[idx].get_type(); + return true; + } + + if (what == "value") { + r_ret = args[idx]; + return true; + } + } + + } break; + case Animation::TYPE_BEZIER: { + + if (name == "value") { + r_ret = animation->bezier_track_get_key_value(track, key); + return true; + } + + if (name == "in_handle") { + r_ret = animation->bezier_track_get_key_in_handle(track, key); + return true; + } + + if (name == "out_handle") { + r_ret = animation->bezier_track_get_key_out_handle(track, key); + return true; + } + + } break; + case Animation::TYPE_AUDIO: { + + if (name == "stream") { + r_ret = animation->audio_track_get_key_stream(track, key); + return true; + } + + if (name == "start_offset") { + r_ret = animation->audio_track_get_key_start_offset(track, key); + return true; + } + + if (name == "end_offset") { + r_ret = animation->audio_track_get_key_end_offset(track, key); + return true; + } + + } break; + case Animation::TYPE_ANIMATION: { + + if (name == "animation") { + r_ret = animation->animation_track_get_key_animation(track, key); + return true; + } + + } break; + } + } + } + + return false; + } + void _get_property_list(List<PropertyInfo> *p_list) const { + + if (animation.is_null()) + return; + + int first_track = -1; + float first_key = -1.0; + + bool show_time = true; + bool same_track_type = true; + bool same_key_type = true; + for (Map<int, List<float> >::Element *E = key_ofs_map.front(); E; E = E->next()) { + + int track = E->key(); + ERR_FAIL_INDEX(track, animation->get_track_count()); + + if (first_track < 0) + first_track = track; + + if (show_time && E->value().size() > 1) + show_time = false; + + if (same_track_type) { + + if (animation->track_get_type(first_track) != animation->track_get_type(track)) { + same_track_type = false; + same_key_type = false; + } + + for (List<float>::Element *F = E->value().front(); F; F = F->next()) { + + int key = animation->track_find_key(track, F->get(), true); + ERR_FAIL_COND(key == -1); + if (first_key < 0) + first_key = key; + + if (animation->track_get_key_value(first_track, first_key).get_type() != animation->track_get_key_value(track, key).get_type()) + same_key_type = false; + } + } + } + + if (show_time) { + + if (use_fps && animation->get_step() > 0) { + float max_frame = animation->get_length() / animation->get_step(); + p_list->push_back(PropertyInfo(Variant::REAL, "frame", PROPERTY_HINT_RANGE, "0," + rtos(max_frame) + ",1")); + } else { + p_list->push_back(PropertyInfo(Variant::REAL, "time", PROPERTY_HINT_RANGE, "0," + rtos(animation->get_length()) + ",0.01")); + } + } + + if (same_track_type) { + switch (animation->track_get_type(first_track)) { + + case Animation::TYPE_TRANSFORM: { + + p_list->push_back(PropertyInfo(Variant::VECTOR3, "location")); + p_list->push_back(PropertyInfo(Variant::QUAT, "rotation")); + p_list->push_back(PropertyInfo(Variant::VECTOR3, "scale")); + } break; + case Animation::TYPE_VALUE: { + + if (!same_key_type) + break; + + Variant v = animation->track_get_key_value(first_track, first_key); + + if (hint.type != Variant::NIL) { + + PropertyInfo pi = hint; + pi.name = "value"; + p_list->push_back(pi); + } else { + + PropertyHint hint = PROPERTY_HINT_NONE; + String hint_string; + + if (v.get_type() == Variant::OBJECT) { + //could actually check the object property if exists..? yes i will! + Ref<Resource> res = v; + if (res.is_valid()) { + + hint = PROPERTY_HINT_RESOURCE_TYPE; + hint_string = res->get_class(); + } + } + + if (v.get_type() != Variant::NIL) + p_list->push_back(PropertyInfo(v.get_type(), "value", hint, hint_string)); + } + + p_list->push_back(PropertyInfo(Variant::REAL, "easing", PROPERTY_HINT_EXP_EASING)); + } break; + case Animation::TYPE_METHOD: { + + p_list->push_back(PropertyInfo(Variant::STRING, "name")); + p_list->push_back(PropertyInfo(Variant::INT, "arg_count", PROPERTY_HINT_RANGE, "0,5,1")); + + Dictionary d = animation->track_get_key_value(first_track, first_key); + ERR_FAIL_COND(!d.has("args")); + Vector<Variant> args = d["args"]; + String vtypes; + for (int i = 0; i < Variant::VARIANT_MAX; i++) { + + if (i > 0) + vtypes += ","; + vtypes += Variant::get_type_name(Variant::Type(i)); + } + + for (int i = 0; i < args.size(); i++) { + + p_list->push_back(PropertyInfo(Variant::INT, "args/" + itos(i) + "/type", PROPERTY_HINT_ENUM, vtypes)); + if (args[i].get_type() != Variant::NIL) + p_list->push_back(PropertyInfo(args[i].get_type(), "args/" + itos(i) + "/value")); + } + } break; + case Animation::TYPE_BEZIER: { + + p_list->push_back(PropertyInfo(Variant::REAL, "value")); + p_list->push_back(PropertyInfo(Variant::VECTOR2, "in_handle")); + p_list->push_back(PropertyInfo(Variant::VECTOR2, "out_handle")); + } break; + case Animation::TYPE_AUDIO: { + + p_list->push_back(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream")); + p_list->push_back(PropertyInfo(Variant::REAL, "start_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater")); + p_list->push_back(PropertyInfo(Variant::REAL, "end_offset", PROPERTY_HINT_RANGE, "0,3600,0.01,or_greater")); + } break; + case Animation::TYPE_ANIMATION: { + + if (key_ofs_map.size() > 1) + break; + + String animations; + + if (root_path && root_path->has_node(animation->track_get_path(first_track))) { + + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(root_path->get_node(animation->track_get_path(first_track))); + if (ap) { + List<StringName> anims; + ap->get_animation_list(&anims); + for (List<StringName>::Element *G = anims.front(); G; G = G->next()) { + if (animations != String()) { + animations += ","; + } + + animations += String(G->get()); + } + } + } + + if (animations != String()) { + animations += ","; + } + animations += "[stop]"; + + p_list->push_back(PropertyInfo(Variant::STRING, "animation", PROPERTY_HINT_ENUM, animations)); + } break; + } + } + } + + Ref<Animation> animation; + + Map<int, List<float> > key_ofs_map; + Map<int, NodePath> base_map; + PropertyInfo hint; + + Node *root_path; + + bool use_fps; + + UndoRedo *undo_redo; + + void notify_change() { + + _change_notify(); + } + + Node *get_root_path() { + return root_path; + } + + void set_use_fps(bool p_enable) { + use_fps = p_enable; + _change_notify(); + } + + AnimationMultiTrackKeyEdit() { + use_fps = false; + setting = false; + root_path = NULL; + } +}; + void AnimationTimelineEdit::_zoom_changed(double) { update(); @@ -1274,12 +1976,7 @@ void AnimationTrackEdit::_notification(int p_what) { } text_color.a *= 0.7; } else if (node) { - Ref<Texture> icon; - if (has_icon(node->get_class(), "EditorIcons")) { - icon = get_icon(node->get_class(), "EditorIcons"); - } else { - icon = get_icon("Node", "EditorIcons"); - } + Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(node, "Node"); draw_texture(icon, Point2(ofs, int(get_size().height - icon->get_height()) / 2)); icon_cache = icon; @@ -3500,9 +4197,7 @@ void AnimationTrackEditor::_update_tracks() { if (root && root->has_node(base_path)) { Node *n = root->get_node(base_path); if (n) { - if (has_icon(n->get_class(), "EditorIcons")) { - icon = get_icon(n->get_class(), "EditorIcons"); - } + icon = EditorNode::get_singleton()->get_object_icon(n, "Node"); name = n->get_name(); tooltip = root->get_path_to(n); } @@ -4140,12 +4835,19 @@ void AnimationTrackEditor::_clear_key_edit() { } #else //if key edit is the object being inspected, remove it first - if (EditorNode::get_singleton()->get_inspector()->get_edited_object() == key_edit) { + if (EditorNode::get_singleton()->get_inspector()->get_edited_object() == key_edit || + EditorNode::get_singleton()->get_inspector()->get_edited_object() == multi_key_edit) { EditorNode::get_singleton()->push_item(NULL); } + //then actually delete it - memdelete(key_edit); - key_edit = NULL; + if (key_edit) { + memdelete(key_edit); + key_edit = NULL; + } else if (multi_key_edit) { + memdelete(multi_key_edit); + multi_key_edit = NULL; + } #endif } } @@ -4163,38 +4865,70 @@ void AnimationTrackEditor::_update_key_edit() { _clear_key_edit(); if (!animation.is_valid()) return; - if (selection.size() != 1) { - return; - } - key_edit = memnew(AnimationTrackKeyEdit); - key_edit->animation = animation; - key_edit->track = selection.front()->key().track; - key_edit->use_fps = timeline->is_using_fps(); + if (selection.size() == 1) { + + key_edit = memnew(AnimationTrackKeyEdit); + key_edit->animation = animation; + key_edit->track = selection.front()->key().track; + key_edit->use_fps = timeline->is_using_fps(); + + float ofs = animation->track_get_key_time(key_edit->track, selection.front()->key().key); + key_edit->key_ofs = ofs; + key_edit->root_path = root; + + NodePath np; + key_edit->hint = _find_hint_for_track(key_edit->track, np); + key_edit->undo_redo = undo_redo; + key_edit->base = np; - float ofs = animation->track_get_key_time(key_edit->track, selection.front()->key().key); - key_edit->key_ofs = ofs; - key_edit->root_path = root; + EditorNode::get_singleton()->push_item(key_edit); + } else if (selection.size() > 1) { - NodePath np; - key_edit->hint = _find_hint_for_track(key_edit->track, np); - key_edit->undo_redo = undo_redo; - key_edit->base = np; + multi_key_edit = memnew(AnimationMultiTrackKeyEdit); + multi_key_edit->animation = animation; - EditorNode::get_singleton()->push_item(key_edit); + Map<int, List<float> > key_ofs_map; + Map<int, NodePath> base_map; + int first_track = -1; + for (Map<SelectedKey, KeyInfo>::Element *E = selection.front(); E; E = E->next()) { + + int track = E->key().track; + if (first_track < 0) + first_track = track; + + if (!key_ofs_map.has(track)) { + key_ofs_map[track] = List<float>(); + base_map[track] = *memnew(NodePath); + } + + key_ofs_map[track].push_back(animation->track_get_key_time(track, E->key().key)); + } + multi_key_edit->key_ofs_map = key_ofs_map; + multi_key_edit->base_map = base_map; + multi_key_edit->hint = _find_hint_for_track(first_track, base_map[first_track]); + + multi_key_edit->use_fps = timeline->is_using_fps(); + + multi_key_edit->root_path = root; + + multi_key_edit->undo_redo = undo_redo; + + EditorNode::get_singleton()->push_item(multi_key_edit); + } } void AnimationTrackEditor::_clear_selection_for_anim(const Ref<Animation> &p_anim) { - if (!(animation == p_anim)) + if (animation != p_anim) return; - //selection.clear(); + _clear_selection(); } void AnimationTrackEditor::_select_at_anim(const Ref<Animation> &p_anim, int p_track, float p_pos) { - if (!(animation == p_anim)) + if (animation != p_anim) return; int idx = animation->track_find_key(p_track, p_pos, true); @@ -4216,12 +4950,12 @@ void AnimationTrackEditor::_move_selection_commit() { List<_AnimMoveRestore> to_restore; float motion = moving_selection_offset; - // 1-remove the keys + // 1 - remove the keys for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->key().track, E->key().key); } - // 2- remove overlapped keys + // 2 - remove overlapped keys for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { float newtime = snap_time(E->get().pos + motion); @@ -4245,35 +4979,27 @@ void AnimationTrackEditor::_move_selection_commit() { to_restore.push_back(amr); } - // 3-move the keys (re insert them) + // 3 - move the keys (re insert them) for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { float newpos = snap_time(E->get().pos + motion); - /* - if (newpos<0) - continue; //no add at the beginning - */ undo_redo->add_do_method(animation.ptr(), "track_insert_key", E->key().track, newpos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key)); } - // 4-(undo) remove inserted keys + // 4 - (undo) remove inserted keys for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { float newpos = snap_time(E->get().pos + motion); - /* - if (newpos<0) - continue; //no remove what no inserted - */ undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_position", E->key().track, newpos); } - // 5-(undo) reinsert keys + // 5 - (undo) reinsert keys for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { undo_redo->add_undo_method(animation.ptr(), "track_insert_key", E->key().track, E->get().pos, animation->track_get_key_value(E->key().track, E->key().key), animation->track_get_key_transition(E->key().track, E->key().key)); } - // 6-(undo) reinsert overlapped keys + // 6 - (undo) reinsert overlapped keys for (List<_AnimMoveRestore>::Element *E = to_restore.front(); E; E = E->next()) { _AnimMoveRestore &amr = E->get(); @@ -4283,12 +5009,12 @@ void AnimationTrackEditor::_move_selection_commit() { undo_redo->add_do_method(this, "_clear_selection_for_anim", animation); undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - // 7-reselect + // 7 - reselect for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { float oldpos = E->get().pos; float newpos = snap_time(oldpos + motion); - //if (newpos>=0) + undo_redo->add_do_method(this, "_select_at_anim", animation, E->key().track, newpos); undo_redo->add_undo_method(this, "_select_at_anim", animation, E->key().track, oldpos); } diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 8dc2304a95..9e16f2faf7 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -246,6 +246,7 @@ public: }; class AnimationTrackKeyEdit; +class AnimationMultiTrackKeyEdit; class AnimationBezierTrackEdit; class AnimationTrackEditGroup : public Control { @@ -415,6 +416,7 @@ class AnimationTrackEditor : public VBoxContainer { void _move_selection_cancel(); AnimationTrackKeyEdit *key_edit; + AnimationMultiTrackKeyEdit *multi_key_edit; void _update_key_edit(); void _clear_key_edit(); diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 7c396e1da3..89a88dc6e7 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -152,6 +152,7 @@ bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col) text_edit->cursor_set_line(line, false); text_edit->cursor_set_column(col + text.length(), false); text_edit->center_viewport_to_cursor(); + text_edit->select(line, col, line, col + text.length()); } text_edit->set_search_text(text); @@ -161,7 +162,8 @@ bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col) result_line = line; result_col = col; - set_error(""); + _update_results_count(); + set_error(vformat(TTR("Found %d match(es)."), results_count)); } else { result_line = -1; result_col = -1; @@ -184,6 +186,8 @@ void FindReplaceBar::_replace() { text_edit->insert_text_at_cursor(get_replace_text()); text_edit->end_complex_operation(); + + results_count = -1; } search_current(); @@ -271,6 +275,7 @@ void FindReplaceBar::_replace_all() { set_error(vformat(TTR("Replaced %d occurrence(s)."), rc)); text_edit->call_deferred("connect", "text_changed", this, "_editor_text_changed"); + results_count = -1; } void FindReplaceBar::_get_search_from(int &r_line, int &r_col) { @@ -297,6 +302,36 @@ void FindReplaceBar::_get_search_from(int &r_line, int &r_col) { } } +void FindReplaceBar::_update_results_count() { + if (results_count != -1) + return; + + results_count = 0; + + String searched = get_search_text(); + if (searched.empty()) return; + + String full_text = text_edit->get_text(); + + int from_pos = 0; + + while (true) { + int pos = is_case_sensitive() ? full_text.find(searched, from_pos) : full_text.findn(searched, from_pos); + if (pos == -1) break; + + if (is_whole_words()) { + from_pos++; // Making sure we won't hit the same match next time, if we get out via a continue. + if (pos > 0 && !is_symbol(full_text[pos - 1])) + continue; + if (pos + searched.length() < full_text.length() && !is_symbol(full_text[pos + searched.length()])) + continue; + } + + results_count++; + from_pos = pos + searched.length(); + } +} + bool FindReplaceBar::search_current() { uint32_t flags = 0; @@ -420,11 +455,13 @@ void FindReplaceBar::popup_replace() { void FindReplaceBar::_search_options_changed(bool p_pressed) { + results_count = -1; search_current(); } void FindReplaceBar::_editor_text_changed() { + results_count = -1; if (is_visible_in_tree()) { preserve_cursor = true; search_current(); @@ -434,6 +471,7 @@ void FindReplaceBar::_editor_text_changed() { void FindReplaceBar::_search_text_changed(const String &p_text) { + results_count = -1; search_current(); } @@ -486,6 +524,7 @@ void FindReplaceBar::set_error(const String &p_label) { void FindReplaceBar::set_text_edit(TextEdit *p_text_edit) { + results_count = -1; text_edit = p_text_edit; text_edit->connect("text_changed", this, "_editor_text_changed"); } @@ -512,6 +551,7 @@ void FindReplaceBar::_bind_methods() { FindReplaceBar::FindReplaceBar() { + results_count = -1; replace_all_mode = false; preserve_cursor = false; @@ -1387,17 +1427,17 @@ void CodeTextEditor::_on_settings_change() { // AUTO BRACE COMPLETION text_editor->set_auto_brace_completion( - EDITOR_DEF("text_editor/completion/auto_brace_complete", true)); + EDITOR_GET("text_editor/completion/auto_brace_complete")); code_complete_timer->set_wait_time( - EDITOR_DEF("text_editor/completion/code_complete_delay", .3f)); + EDITOR_GET("text_editor/completion/code_complete_delay")); // call hint settings text_editor->set_callhint_settings( - EDITOR_DEF("text_editor/completion/put_callhint_tooltip_below_current_line", true), - EDITOR_DEF("text_editor/completion/callhint_tooltip_offset", Vector2())); + EDITOR_GET("text_editor/completion/put_callhint_tooltip_below_current_line"), + EDITOR_GET("text_editor/completion/callhint_tooltip_offset")); - idle->set_wait_time(EDITOR_DEF("text_editor/completion/idle_parse_delay", 2.0)); + idle->set_wait_time(EDITOR_GET("text_editor/completion/idle_parse_delay")); } void CodeTextEditor::_text_changed_idle_timeout() { @@ -1583,12 +1623,12 @@ CodeTextEditor::CodeTextEditor() { idle = memnew(Timer); add_child(idle); idle->set_one_shot(true); - idle->set_wait_time(EDITOR_DEF("text_editor/completion/idle_parse_delay", 2.0)); + idle->set_wait_time(EDITOR_GET("text_editor/completion/idle_parse_delay")); code_complete_timer = memnew(Timer); add_child(code_complete_timer); code_complete_timer->set_one_shot(true); - code_complete_timer->set_wait_time(EDITOR_DEF("text_editor/completion/code_complete_delay", .3f)); + code_complete_timer->set_wait_time(EDITOR_GET("text_editor/completion/code_complete_delay")); error_line = 0; error_column = 0; diff --git a/editor/code_editor.h b/editor/code_editor.h index 5af1f531a9..700e72627c 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -83,11 +83,13 @@ class FindReplaceBar : public HBoxContainer { int result_line; int result_col; + int results_count; bool replace_all_mode; bool preserve_cursor; void _get_search_from(int &r_line, int &r_col); + void _update_results_count(); void _show_search(); void _hide_bar(); diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp index 6ee07d3661..5b8c8fffb8 100644 --- a/editor/doc/doc_data.cpp +++ b/editor/doc/doc_data.cpp @@ -266,8 +266,8 @@ void DocData::generate(bool p_basic_types) { } } - if (default_value_valid) { - prop.default_value = default_value.get_construct_string(); + if (default_value_valid && default_value.get_type() != Variant::OBJECT) { + prop.default_value = default_value.get_construct_string().replace("\n", ""); } bool found_type = false; @@ -323,8 +323,14 @@ void DocData::generate(bool p_basic_types) { if (E->get().name == "" || (E->get().name[0] == '_' && !(E->get().flags & METHOD_FLAG_VIRTUAL))) continue; //hidden, don't count - if (skip_setter_getter_methods && setters_getters.has(E->get().name) && E->get().name.find("/") == -1) - continue; + if (skip_setter_getter_methods && setters_getters.has(E->get().name)) { + // Don't skip parametric setters and getters, i.e. method which require + // one or more parameters to define what property should be set or retrieved. + // E.g. CPUParticles::set_param(Parameter param, float value). + if (E->get().arguments.size() == 0 /* getter */ || (E->get().arguments.size() == 1 && E->get().return_val.type == Variant::NIL /* setter */)) { + continue; + } + } MethodDoc method; @@ -366,21 +372,6 @@ void DocData::generate(bool p_basic_types) { method.arguments.push_back(argument); } - - /* - String hint; - switch(arginfo.hint) { - case PROPERTY_HINT_DIR: hint="A directory."; break; - case PROPERTY_HINT_RANGE: hint="Range - min: "+arginfo.hint_string.get_slice(",",0)+" max: "+arginfo.hint_string.get_slice(",",1)+" step: "+arginfo.hint_string.get_slice(",",2); break; - case PROPERTY_HINT_ENUM: hint="Values: "; for(int j=0;j<arginfo.hint_string.get_slice_count(",");j++) { if (j>0) hint+=", "; hint+=arginfo.hint_string.get_slice(",",j)+"="+itos(j); } break; - case PROPERTY_HINT_LENGTH: hint="Length: "+arginfo.hint_string; break; - case PROPERTY_HINT_FLAGS: hint="Values: "; for(int j=0;j<arginfo.hint_string.get_slice_count(",");j++) { if (j>0) hint+=", "; hint+=arginfo.hint_string.get_slice(",",j)+"="+itos(1<<j); } break; - case PROPERTY_HINT_FILE: hint="A file:"; break; - //case PROPERTY_HINT_RESOURCE_TYPE: hint="Type: "+arginfo.hint_string; break; - }; - if (hint!="") - _write_string(f,4,hint); -*/ } c.methods.push_back(method); @@ -750,10 +741,9 @@ Error DocData::load_classes(const String &p_dir) { da->list_dir_begin(); String path; - bool isdir; - path = da->get_next(&isdir); + path = da->get_next(); while (path != String()) { - if (!isdir && path.ends_with("xml")) { + if (!da->current_is_dir() && path.ends_with("xml")) { Ref<XMLParser> parser = memnew(XMLParser); Error err2 = parser->open(p_dir.plus_file(path)); if (err2) @@ -761,7 +751,7 @@ Error DocData::load_classes(const String &p_dir) { _load(parser); } - path = da->get_next(&isdir); + path = da->get_next(); } da->list_dir_end(); @@ -780,13 +770,12 @@ Error DocData::erase_classes(const String &p_dir) { da->list_dir_begin(); String path; - bool isdir; - path = da->get_next(&isdir); + path = da->get_next(); while (path != String()) { - if (!isdir && path.ends_with("xml")) { + if (!da->current_is_dir() && path.ends_with("xml")) { to_erase.push_back(path); } - path = da->get_next(&isdir); + path = da->get_next(); } da->list_dir_end(); diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp index 12df91a501..b706f2cae6 100644 --- a/editor/editor_asset_installer.cpp +++ b/editor/editor_asset_installer.cpp @@ -111,18 +111,14 @@ void EditorAssetInstaller::open(const String &p_path, int p_depth) { Map<String, Ref<Texture> > extension_guess; { - extension_guess["png"] = get_icon("Texture", "EditorIcons"); - extension_guess["jpg"] = get_icon("Texture", "EditorIcons"); - extension_guess["tex"] = get_icon("Texture", "EditorIcons"); - extension_guess["atlastex"] = get_icon("Texture", "EditorIcons"); - extension_guess["dds"] = get_icon("Texture", "EditorIcons"); + extension_guess["png"] = get_icon("ImageTexture", "EditorIcons"); + extension_guess["jpg"] = get_icon("ImageTexture", "EditorIcons"); + extension_guess["atlastex"] = get_icon("AtlasTexture", "EditorIcons"); extension_guess["scn"] = get_icon("PackedScene", "EditorIcons"); extension_guess["tscn"] = get_icon("PackedScene", "EditorIcons"); - extension_guess["xml"] = get_icon("PackedScene", "EditorIcons"); - extension_guess["xscn"] = get_icon("PackedScene", "EditorIcons"); - extension_guess["material"] = get_icon("Material", "EditorIcons"); - extension_guess["shd"] = get_icon("Shader", "EditorIcons"); + extension_guess["shader"] = get_icon("Shader", "EditorIcons"); extension_guess["gd"] = get_icon("GDScript", "EditorIcons"); + extension_guess["vs"] = get_icon("VisualScript", "EditorIcons"); } Ref<Texture> generic_extension = get_icon("Object", "EditorIcons"); diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index b9fb532c4a..2180742bbb 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -76,9 +76,9 @@ void EditorAudioBus::_notification(int p_what) { disabled_vu = get_icon("BusVuFrozen", "EditorIcons"); - Color solo_color = Color::html(EditorSettings::get_singleton()->is_dark_theme() ? "#ffe337" : "#ffeb70"); - Color mute_color = Color::html(EditorSettings::get_singleton()->is_dark_theme() ? "#ff2929" : "#ff7070"); - Color bypass_color = Color::html(EditorSettings::get_singleton()->is_dark_theme() ? "#22ccff" : "#70deff"); + Color solo_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1.0, 0.89, 0.22) : Color(1.0, 0.92, 0.44); + Color mute_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1.0, 0.16, 0.16) : Color(1.0, 0.44, 0.44); + Color bypass_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(0.13, 0.8, 1.0) : Color(0.44, 0.87, 1.0); solo->set_icon(get_icon("AudioBusSolo", "EditorIcons")); solo->add_color_override("icon_color_pressed", solo_color); diff --git a/editor/editor_autoload_settings.h b/editor/editor_autoload_settings.h index 76ce020d8a..1ea2950df4 100644 --- a/editor/editor_autoload_settings.h +++ b/editor/editor_autoload_settings.h @@ -56,7 +56,7 @@ class EditorAutoloadSettings : public VBoxContainer { int order; Node *node; - bool operator==(const AutoLoadInfo &p_info) { + bool operator==(const AutoLoadInfo &p_info) const { return order == p_info.order; } diff --git a/editor/editor_builders.py b/editor/editor_builders.py index 19c5e0b924..910c53e2ff 100644 --- a/editor/editor_builders.py +++ b/editor/editor_builders.py @@ -63,8 +63,8 @@ def make_fonts_header(target, source, env): g.write("static const int _font_" + name + "_size = " + str(len(buf)) + ";\n") g.write("static const unsigned char _font_" + name + "[] = {\n") - for i in range(len(buf)): - g.write("\t" + byte_to_str(buf[i]) + ",\n") + for j in range(len(buf)): + g.write("\t" + byte_to_str(buf[j]) + ",\n") g.write("};\n") @@ -97,8 +97,8 @@ def make_translations_header(target, source, env): name = os.path.splitext(os.path.basename(sorted_paths[i]))[0] g.write("static const unsigned char _translation_" + name + "_compressed[] = {\n") - for i in range(len(buf)): - g.write("\t" + byte_to_str(buf[i]) + ",\n") + for j in range(len(buf)): + g.write("\t" + byte_to_str(buf[j]) + ",\n") g.write("};\n") diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 38f30df169..f5846c10f6 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -499,7 +499,6 @@ Object *EditorData::instance_custom_type(const String &p_type, const String &p_i for (int i = 0; i < get_custom_types()[p_inherits].size(); i++) { if (get_custom_types()[p_inherits][i].name == p_type) { - Ref<Texture> icon = get_custom_types()[p_inherits][i].icon; Ref<Script> script = get_custom_types()[p_inherits][i].script; Object *ob = ClassDB::instance(p_inherits); @@ -508,8 +507,6 @@ Object *EditorData::instance_custom_type(const String &p_type, const String &p_i ob->call("set_name", p_type); } ob->set_script(script.get_ref_ptr()); - if (icon.is_valid()) - ob->set_meta("_editor_icon", icon); return ob; } } diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 24c5a788b6..1f43740858 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "editor_file_dialog.h" + #include "core/os/file_access.h" #include "core/os/keyboard.h" #include "core/os/os.h" @@ -679,7 +680,12 @@ void EditorFileDialog::update_file_name() { String filter_str = filters[idx]; String file_str = file->get_text(); String base_name = file_str.get_basename(); - file_str = base_name + "." + filter_str.split(";")[1].strip_edges().to_lower(); + Vector<String> filter_substr = filter_str.split(";"); + if (filter_substr.size() >= 2) { + file_str = base_name + "." + filter_substr[1].strip_edges().to_lower(); + } else { + file_str = base_name + "." + filter_str.get_extension().strip_edges().to_lower(); + } file->set_text(file_str); } } @@ -731,19 +737,15 @@ void EditorFileDialog::update_file_list() { List<String> files; List<String> dirs; - bool is_dir; - bool is_hidden; String item; - while ((item = dir_access->get_next(&is_dir)) != "") { + while ((item = dir_access->get_next()) != "") { if (item == "." || item == "..") continue; - is_hidden = dir_access->current_is_hidden(); - - if (show_hidden_files || !is_hidden) { - if (!is_dir) + if (show_hidden_files || !dir_access->current_is_hidden()) { + if (!dir_access->current_is_dir()) files.push_back(item); else dirs.push_back(item); @@ -1507,9 +1509,9 @@ EditorFileDialog::EditorFileDialog() { HBoxContainer *pathhb = memnew(HBoxContainer); dir_prev = memnew(ToolButton); - dir_prev->set_tooltip(TTR("Previous Folder")); + dir_prev->set_tooltip(TTR("Go to previous folder.")); dir_next = memnew(ToolButton); - dir_next->set_tooltip(TTR("Next Folder")); + dir_next->set_tooltip(TTR("Go to next folder.")); dir_up = memnew(ToolButton); dir_up->set_tooltip(TTR("Go to parent folder.")); @@ -1528,7 +1530,7 @@ EditorFileDialog::EditorFileDialog() { dir->set_h_size_flags(SIZE_EXPAND_FILL); refresh = memnew(ToolButton); - refresh->set_tooltip(TTR("Refresh")); + refresh->set_tooltip(TTR("Refresh files.")); refresh->connect("pressed", this, "_update_file_list"); pathhb->add_child(refresh); @@ -1541,7 +1543,7 @@ EditorFileDialog::EditorFileDialog() { show_hidden = memnew(ToolButton); show_hidden->set_toggle_mode(true); show_hidden->set_pressed(is_showing_hidden_files()); - show_hidden->set_tooltip(TTR("Toggle visibility of hidden files.")); + show_hidden->set_tooltip(TTR("Toggle the visibility of hidden files.")); show_hidden->connect("toggled", this, "set_show_hidden_files"); pathhb->add_child(show_hidden); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 87a37acac6..be3df2815e 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -673,12 +673,11 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess da->list_dir_begin(); while (true) { - bool isdir; - String f = da->get_next(&isdir); + String f = da->get_next(); if (f == "") break; - if (isdir) { + if (da->current_is_dir()) { if (f.begins_with(".")) //ignore hidden and . / .. continue; @@ -870,12 +869,11 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const da->list_dir_begin(); while (true) { - bool isdir; - String f = da->get_next(&isdir); + String f = da->get_next(); if (f == "") break; - if (isdir) { + if (da->current_is_dir()) { if (f.begins_with(".")) //ignore hidden and . / .. continue; diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index 40ecffbb3b..73438ffc0c 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -93,8 +93,8 @@ void editor_register_fonts(Ref<Theme> p_theme) { /* Custom font */ - bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/main_font_antialiased"); - DynamicFontData::Hinting font_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/main_font_hinting"); + bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/font_antialiased"); + DynamicFontData::Hinting font_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/font_hinting"); String custom_font_path = EditorSettings::get_singleton()->get("interface/editor/main_font"); Ref<DynamicFontData> CustomFont; @@ -125,13 +125,11 @@ void editor_register_fonts(Ref<Theme> p_theme) { /* Custom source code font */ String custom_font_path_source = EditorSettings::get_singleton()->get("interface/editor/code_font"); - bool font_source_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/code_font_antialiased"); - DynamicFontData::Hinting font_source_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/code_font_hinting"); Ref<DynamicFontData> CustomFontSource; if (custom_font_path_source.length() > 0 && dir->file_exists(custom_font_path_source)) { CustomFontSource.instance(); - CustomFontSource->set_antialiased(font_source_antialiased); - CustomFontSource->set_hinting(font_source_hinting); + CustomFontSource->set_antialiased(font_antialiased); + CustomFontSource->set_hinting(font_hinting); CustomFontSource->set_font_path(custom_font_path_source); } else { EditorSettings::get_singleton()->set_manually("interface/editor/code_font", ""); @@ -201,8 +199,8 @@ void editor_register_fonts(Ref<Theme> p_theme) { Ref<DynamicFontData> dfmono; dfmono.instance(); - dfmono->set_antialiased(font_source_antialiased); - dfmono->set_hinting(font_source_hinting); + dfmono->set_antialiased(font_antialiased); + dfmono->set_hinting(font_hinting); dfmono->set_font_ptr(_font_Hack_Regular, _font_Hack_Regular_size); int default_font_size = int(EDITOR_GET("interface/editor/main_font_size")) * EDSCALE; diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index d1f765a312..d81a1dbd77 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -444,6 +444,7 @@ void EditorHelp::_update_doc() { class_desc->pop(); class_desc->add_newline(); + class_desc->push_font(doc_code_font); class_desc->push_indent(1); class_desc->push_table(2); class_desc->set_table_column_expand(1, 1); @@ -509,6 +510,7 @@ void EditorHelp::_update_doc() { class_desc->pop(); //table class_desc->pop(); + class_desc->pop(); // font class_desc->add_newline(); class_desc->add_newline(); } @@ -1348,39 +1350,39 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { if (col.begins_with("#")) color = Color::html(col); else if (col == "aqua") - color = Color::html("#00FFFF"); + color = Color(0, 1, 1); else if (col == "black") - color = Color::html("#000000"); + color = Color(0, 0, 0); else if (col == "blue") - color = Color::html("#0000FF"); + color = Color(0, 0, 1); else if (col == "fuchsia") - color = Color::html("#FF00FF"); + color = Color(1, 0, 1); else if (col == "gray" || col == "grey") - color = Color::html("#808080"); + color = Color(0.5, 0.5, 0.5); else if (col == "green") - color = Color::html("#008000"); + color = Color(0, 0.5, 0); else if (col == "lime") - color = Color::html("#00FF00"); + color = Color(0, 1, 0); else if (col == "maroon") - color = Color::html("#800000"); + color = Color(0.5, 0, 0); else if (col == "navy") - color = Color::html("#000080"); + color = Color(0, 0, 0.5); else if (col == "olive") - color = Color::html("#808000"); + color = Color(0.5, 0.5, 0); else if (col == "purple") - color = Color::html("#800080"); + color = Color(0.5, 0, 0.5); else if (col == "red") - color = Color::html("#FF0000"); + color = Color(1, 0, 0); else if (col == "silver") - color = Color::html("#C0C0C0"); + color = Color(0.75, 0.75, 0.75); else if (col == "teal") - color = Color::html("#008008"); + color = Color(0, 0.5, 0.5); else if (col == "white") - color = Color::html("#FFFFFF"); + color = Color(1, 1, 1); else if (col == "yellow") - color = Color::html("#FFFF00"); + color = Color(1, 1, 0); else - color = Color(0, 0, 0, 1); //base_color; + color = Color(0, 0, 0); //base_color; p_rt->push_color(color); pos = brk_end + 1; diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index e4ddf44bc4..70bbd0fd6c 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -504,7 +504,7 @@ bool EditorProperty::use_keying_next() const { PropertyInfo &p = I->get(); if (p.name == property) { - return p.hint == PROPERTY_HINT_SPRITE_FRAME; + return (p.usage & PROPERTY_USAGE_KEYING_INCREMENTS); } } diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 1e9cb2f88d..faa936bd64 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -238,185 +238,185 @@ void EditorNode::_unhandled_input(const Ref<InputEvent> &p_event) { void EditorNode::_notification(int p_what) { - if (p_what == NOTIFICATION_EXIT_TREE) { - - editor_data.save_editor_external_data(); - FileAccess::set_file_close_fail_notify_callback(NULL); - log->deinit(); // do not get messages anymore - } - if (p_what == NOTIFICATION_PROCESS) { - - if (opening_prev && !confirmation->is_visible()) - opening_prev = false; + switch (p_what) { + case NOTIFICATION_PROCESS: { + if (opening_prev && !confirmation->is_visible()) + opening_prev = false; - if (unsaved_cache != (saved_version != editor_data.get_undo_redo().get_version())) { + if (unsaved_cache != (saved_version != editor_data.get_undo_redo().get_version())) { - unsaved_cache = (saved_version != editor_data.get_undo_redo().get_version()); - _update_title(); - } + unsaved_cache = (saved_version != editor_data.get_undo_redo().get_version()); + _update_title(); + } - if (last_checked_version != editor_data.get_undo_redo().get_version()) { - _update_scene_tabs(); - last_checked_version = editor_data.get_undo_redo().get_version(); - } + if (last_checked_version != editor_data.get_undo_redo().get_version()) { + _update_scene_tabs(); + last_checked_version = editor_data.get_undo_redo().get_version(); + } - // update the animation frame of the update spinner - uint64_t frame = Engine::get_singleton()->get_frames_drawn(); - uint32_t tick = OS::get_singleton()->get_ticks_msec(); + // update the animation frame of the update spinner + uint64_t frame = Engine::get_singleton()->get_frames_drawn(); + uint32_t tick = OS::get_singleton()->get_ticks_msec(); - if (frame != update_spinner_step_frame && (tick - update_spinner_step_msec) > (1000 / 8)) { + if (frame != update_spinner_step_frame && (tick - update_spinner_step_msec) > (1000 / 8)) { - update_spinner_step++; - if (update_spinner_step >= 8) - update_spinner_step = 0; + update_spinner_step++; + if (update_spinner_step >= 8) + update_spinner_step = 0; - update_spinner_step_msec = tick; - update_spinner_step_frame = frame + 1; + update_spinner_step_msec = tick; + update_spinner_step_frame = frame + 1; - // update the icon itself only when the spinner is visible - if (EditorSettings::get_singleton()->get("interface/editor/show_update_spinner")) { - update_spinner->set_icon(gui_base->get_icon("Progress" + itos(update_spinner_step + 1), "EditorIcons")); + // update the icon itself only when the spinner is visible + if (EditorSettings::get_singleton()->get("interface/editor/show_update_spinner")) { + update_spinner->set_icon(gui_base->get_icon("Progress" + itos(update_spinner_step + 1), "EditorIcons")); + } } - } - editor_selection->update(); + editor_selection->update(); - scene_root->set_size_override(true, Size2(ProjectSettings::get_singleton()->get("display/window/size/width"), ProjectSettings::get_singleton()->get("display/window/size/height"))); + scene_root->set_size_override(true, Size2(ProjectSettings::get_singleton()->get("display/window/size/width"), ProjectSettings::get_singleton()->get("display/window/size/height"))); - ResourceImporterTexture::get_singleton()->update_imports(); - } - if (p_what == NOTIFICATION_ENTER_TREE) { + ResourceImporterTexture::get_singleton()->update_imports(); + } break; - Engine::get_singleton()->set_editor_hint(true); + case NOTIFICATION_ENTER_TREE: { + Engine::get_singleton()->set_editor_hint(true); - OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec"))); - get_tree()->get_root()->set_usage(Viewport::USAGE_2D_NO_SAMPLING); //reduce memory usage - get_tree()->get_root()->set_disable_3d(true); - get_tree()->get_root()->set_as_audio_listener(false); - get_tree()->get_root()->set_as_audio_listener_2d(false); - get_tree()->set_auto_accept_quit(false); - get_tree()->connect("files_dropped", this, "_dropped_files"); + OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec"))); + get_tree()->get_root()->set_usage(Viewport::USAGE_2D_NO_SAMPLING); //reduce memory usage + get_tree()->get_root()->set_disable_3d(true); + get_tree()->get_root()->set_as_audio_listener(false); + get_tree()->get_root()->set_as_audio_listener_2d(false); + get_tree()->set_auto_accept_quit(false); + get_tree()->connect("files_dropped", this, "_dropped_files"); - /* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ - } + /* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ + } break; - if (p_what == NOTIFICATION_EXIT_TREE) { + case NOTIFICATION_EXIT_TREE: { + editor_data.save_editor_external_data(); + FileAccess::set_file_close_fail_notify_callback(NULL); + log->deinit(); // do not get messages anymore + editor_data.clear_edited_scenes(); + } break; - editor_data.clear_edited_scenes(); - } - if (p_what == NOTIFICATION_READY) { + case NOTIFICATION_READY: { - VisualServer::get_singleton()->viewport_set_hide_scenario(get_scene_root()->get_viewport_rid(), true); - VisualServer::get_singleton()->viewport_set_hide_canvas(get_scene_root()->get_viewport_rid(), true); - VisualServer::get_singleton()->viewport_set_disable_environment(get_viewport()->get_viewport_rid(), true); + VisualServer::get_singleton()->viewport_set_hide_scenario(get_scene_root()->get_viewport_rid(), true); + VisualServer::get_singleton()->viewport_set_hide_canvas(get_scene_root()->get_viewport_rid(), true); + VisualServer::get_singleton()->viewport_set_disable_environment(get_viewport()->get_viewport_rid(), true); - feature_profile_manager->notify_changed(); + feature_profile_manager->notify_changed(); - if (!main_editor_buttons[EDITOR_3D]->is_visible()) { //may be hidden due to feature profile - _editor_select(EDITOR_2D); - } else { - _editor_select(EDITOR_3D); - } + if (!main_editor_buttons[EDITOR_3D]->is_visible()) { //may be hidden due to feature profile + _editor_select(EDITOR_2D); + } else { + _editor_select(EDITOR_3D); + } - _update_debug_options(); + _update_debug_options(); - /* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ - } + /* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ + } break; - if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_IN) { + case MainLoop::NOTIFICATION_WM_FOCUS_IN: { - // Restore the original FPS cap after focusing back on the editor - OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec"))); + // Restore the original FPS cap after focusing back on the editor + OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec"))); - EditorFileSystem::get_singleton()->scan_changes(); - } + EditorFileSystem::get_singleton()->scan_changes(); + } break; - if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_OUT) { + case MainLoop::NOTIFICATION_WM_FOCUS_OUT: { - // Set a low FPS cap to decrease CPU/GPU usage while the editor is unfocused - OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/unfocused_low_processor_mode_sleep_usec"))); - } + // Set a low FPS cap to decrease CPU/GPU usage while the editor is unfocused + OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/unfocused_low_processor_mode_sleep_usec"))); + } break; - if (p_what == MainLoop::NOTIFICATION_WM_QUIT_REQUEST) { + case MainLoop::NOTIFICATION_WM_QUIT_REQUEST: { - _menu_option_confirm(FILE_QUIT, false); - } + _menu_option_confirm(FILE_QUIT, false); + } break; - if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - scene_tabs->set_tab_close_display_policy((bool(EDITOR_GET("interface/scene_tabs/always_show_close_button")) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY)); - Ref<Theme> theme = create_editor_theme(theme_base->get_theme()); + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + scene_tabs->set_tab_close_display_policy((bool(EDITOR_GET("interface/scene_tabs/always_show_close_button")) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY)); + Ref<Theme> theme = create_editor_theme(theme_base->get_theme()); - theme_base->set_theme(theme); - gui_base->set_theme(theme); + theme_base->set_theme(theme); + gui_base->set_theme(theme); - gui_base->add_style_override("panel", gui_base->get_stylebox("Background", "EditorStyles")); - scene_root_parent->add_style_override("panel", gui_base->get_stylebox("Content", "EditorStyles")); - bottom_panel->add_style_override("panel", gui_base->get_stylebox("panel", "TabContainer")); - scene_tabs->add_style_override("tab_fg", gui_base->get_stylebox("SceneTabFG", "EditorStyles")); - scene_tabs->add_style_override("tab_bg", gui_base->get_stylebox("SceneTabBG", "EditorStyles")); + gui_base->add_style_override("panel", gui_base->get_stylebox("Background", "EditorStyles")); + scene_root_parent->add_style_override("panel", gui_base->get_stylebox("Content", "EditorStyles")); + bottom_panel->add_style_override("panel", gui_base->get_stylebox("panel", "TabContainer")); + scene_tabs->add_style_override("tab_fg", gui_base->get_stylebox("SceneTabFG", "EditorStyles")); + scene_tabs->add_style_override("tab_bg", gui_base->get_stylebox("SceneTabBG", "EditorStyles")); - file_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); - project_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); - debug_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); - settings_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); - help_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); + file_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); + project_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); + debug_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); + settings_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); + help_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); - if (EDITOR_GET("interface/scene_tabs/resize_if_many_tabs")) { - scene_tabs->set_min_width(int(EDITOR_GET("interface/scene_tabs/minimum_width")) * EDSCALE); - } else { - scene_tabs->set_min_width(0); - } - _update_scene_tabs(); + if (EDITOR_GET("interface/scene_tabs/resize_if_many_tabs")) { + scene_tabs->set_min_width(int(EDITOR_GET("interface/scene_tabs/minimum_width")) * EDSCALE); + } else { + scene_tabs->set_min_width(0); + } + _update_scene_tabs(); - recent_scenes->set_as_minsize(); + recent_scenes->set_as_minsize(); - // debugger area - if (ScriptEditor::get_singleton()->get_debugger()->is_visible()) - bottom_panel->add_style_override("panel", gui_base->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")); + // debugger area + if (ScriptEditor::get_singleton()->get_debugger()->is_visible()) + bottom_panel->add_style_override("panel", gui_base->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")); - // update_icons - for (int i = 0; i < singleton->main_editor_buttons.size(); i++) { + // update_icons + for (int i = 0; i < singleton->main_editor_buttons.size(); i++) { - ToolButton *tb = singleton->main_editor_buttons[i]; - EditorPlugin *p_editor = singleton->editor_table[i]; - Ref<Texture> icon = p_editor->get_icon(); + ToolButton *tb = singleton->main_editor_buttons[i]; + EditorPlugin *p_editor = singleton->editor_table[i]; + Ref<Texture> icon = p_editor->get_icon(); - if (icon.is_valid()) { - tb->set_icon(icon); - } else if (singleton->gui_base->has_icon(p_editor->get_name(), "EditorIcons")) { - tb->set_icon(singleton->gui_base->get_icon(p_editor->get_name(), "EditorIcons")); + if (icon.is_valid()) { + tb->set_icon(icon); + } else if (singleton->gui_base->has_icon(p_editor->get_name(), "EditorIcons")) { + tb->set_icon(singleton->gui_base->get_icon(p_editor->get_name(), "EditorIcons")); + } } - } - _build_icon_type_cache(); + _build_icon_type_cache(); - play_button->set_icon(gui_base->get_icon("MainPlay", "EditorIcons")); - play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons")); - play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom", "EditorIcons")); - pause_button->set_icon(gui_base->get_icon("Pause", "EditorIcons")); - stop_button->set_icon(gui_base->get_icon("Stop", "EditorIcons")); + play_button->set_icon(gui_base->get_icon("MainPlay", "EditorIcons")); + play_scene_button->set_icon(gui_base->get_icon("PlayScene", "EditorIcons")); + play_custom_scene_button->set_icon(gui_base->get_icon("PlayCustom", "EditorIcons")); + pause_button->set_icon(gui_base->get_icon("Pause", "EditorIcons")); + stop_button->set_icon(gui_base->get_icon("Stop", "EditorIcons")); - prev_scene->set_icon(gui_base->get_icon("PrevScene", "EditorIcons")); - distraction_free->set_icon(gui_base->get_icon("DistractionFree", "EditorIcons")); - scene_tab_add->set_icon(gui_base->get_icon("Add", "EditorIcons")); + prev_scene->set_icon(gui_base->get_icon("PrevScene", "EditorIcons")); + distraction_free->set_icon(gui_base->get_icon("DistractionFree", "EditorIcons")); + scene_tab_add->set_icon(gui_base->get_icon("Add", "EditorIcons")); - // clear_button->set_icon(gui_base->get_icon("Close", "EditorIcons")); don't have access to that node. needs to become a class property - dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons")); - dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons")); + bottom_panel_raise->set_icon(gui_base->get_icon("ExpandBottomDock", "EditorIcons")); - PopupMenu *p = help_menu->get_popup(); - p->set_item_icon(p->get_item_index(HELP_SEARCH), gui_base->get_icon("HelpSearch", "EditorIcons")); - p->set_item_icon(p->get_item_index(HELP_DOCS), gui_base->get_icon("Instance", "EditorIcons")); - p->set_item_icon(p->get_item_index(HELP_QA), gui_base->get_icon("Instance", "EditorIcons")); - p->set_item_icon(p->get_item_index(HELP_ISSUES), gui_base->get_icon("Instance", "EditorIcons")); - p->set_item_icon(p->get_item_index(HELP_COMMUNITY), gui_base->get_icon("Instance", "EditorIcons")); - p->set_item_icon(p->get_item_index(HELP_ABOUT), gui_base->get_icon("Godot", "EditorIcons")); + // clear_button->set_icon(gui_base->get_icon("Close", "EditorIcons")); don't have access to that node. needs to become a class property + dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons")); + dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons")); - _update_update_spinner(); - } + PopupMenu *p = help_menu->get_popup(); + p->set_item_icon(p->get_item_index(HELP_SEARCH), gui_base->get_icon("HelpSearch", "EditorIcons")); + p->set_item_icon(p->get_item_index(HELP_DOCS), gui_base->get_icon("Instance", "EditorIcons")); + p->set_item_icon(p->get_item_index(HELP_QA), gui_base->get_icon("Instance", "EditorIcons")); + p->set_item_icon(p->get_item_index(HELP_ISSUES), gui_base->get_icon("Instance", "EditorIcons")); + p->set_item_icon(p->get_item_index(HELP_COMMUNITY), gui_base->get_icon("Instance", "EditorIcons")); + p->set_item_icon(p->get_item_index(HELP_ABOUT), gui_base->get_icon("Godot", "EditorIcons")); - if (p_what == Control::NOTIFICATION_RESIZED) { - _update_scene_tabs(); + _update_update_spinner(); + } break; + + case Control::NOTIFICATION_RESIZED: { + _update_scene_tabs(); + } break; } } @@ -834,7 +834,7 @@ void EditorNode::_get_scene_metadata(const String &p_file) { for (List<String>::Element *E = esl.front(); E; E = E->next()) { Variant st = cf->get_value("editor_states", E->get()); - if (st.get_type()) { + if (st.get_type() != Variant::NIL) { md[E->get()] = st; } } @@ -1965,6 +1965,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { break; opening_prev = true; open_request(previous_scenes.back()->get()); + previous_scenes.pop_back(); } break; case FILE_CLOSE_OTHERS: @@ -2490,12 +2491,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { screenshot_timer->start(); } break; - case EDITOR_OPEN_SCREENSHOT: { - - bool is_checked = settings_menu->get_popup()->is_item_checked(settings_menu->get_popup()->get_item_index(EDITOR_OPEN_SCREENSHOT)); - settings_menu->get_popup()->set_item_checked(settings_menu->get_popup()->get_item_index(EDITOR_OPEN_SCREENSHOT), !is_checked); - EditorSettings::get_singleton()->set_project_metadata("screenshot_options", "open_screenshot", !is_checked); - } break; case SETTINGS_PICK_MAIN_SCENE: { file->set_mode(EditorFileDialog::MODE_OPEN_FILE); @@ -2543,8 +2538,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { restart_editor(); } break; default: { - if (p_option >= IMPORT_PLUGIN_BASE) { - } } } } @@ -2557,7 +2550,7 @@ void EditorNode::_screenshot(bool p_use_utc) { String name = "editor_screenshot_" + OS::get_singleton()->get_iso_date_time(p_use_utc).replace(":", "") + ".png"; NodePath path = String("user://") + name; _save_screenshot(path); - if (EditorSettings::get_singleton()->get_project_metadata("screenshot_options", "open_screenshot", true)) { + if (EditorSettings::get_singleton()->get("interface/editor/automatically_open_screenshots")) { OS::get_singleton()->shell_open(String("file://") + ProjectSettings::get_singleton()->globalize_path(path)); } } @@ -2625,7 +2618,7 @@ void EditorNode::_exit_editor() { // Dim the editor window while it's quitting to make it clearer that it's busy. // No transition is applied, as the effect needs to be visible immediately - float c = 1.0f - float(EDITOR_GET("interface/editor/dim_amount")); + float c = 0.4f; Color dim_color = Color(c, c, c); gui_base->set_modulate(dim_color); @@ -2644,6 +2637,14 @@ void EditorNode::_discard_changes(const String &p_str) { case FILE_CLOSE_ALL: case SCENE_TAB_CLOSE: { + Node *scene = editor_data.get_edited_scene_root(tab_closing); + if (scene != NULL) { + String scene_filename = scene->get_filename(); + if (scene_filename != "") { + previous_scenes.push_back(scene_filename); + } + } + _remove_scene(tab_closing); _update_scene_tabs(); @@ -2709,6 +2710,21 @@ void EditorNode::_update_debug_options() { if (check_reload_scripts) _menu_option_confirm(RUN_RELOAD_SCRIPTS, true); } +void EditorNode::_update_file_menu_opened() { + + Ref<ShortCut> close_scene_sc = ED_GET_SHORTCUT("editor/close_scene"); + close_scene_sc->set_name(TTR("Close Scene")); + Ref<ShortCut> reopen_closed_scene_sc = ED_GET_SHORTCUT("editor/reopen_closed_scene"); + reopen_closed_scene_sc->set_name(TTR("Reopen Closed Scene")); + PopupMenu *pop = file_menu->get_popup(); + pop->set_item_disabled(pop->get_item_index(FILE_OPEN_PREV), previous_scenes.empty()); +} + +void EditorNode::_update_file_menu_closed() { + PopupMenu *pop = file_menu->get_popup(); + pop->set_item_disabled(pop->get_item_index(FILE_OPEN_PREV), false); +} + Control *EditorNode::get_viewport() { return viewport; @@ -3281,6 +3297,13 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b void EditorNode::open_request(const String &p_path) { + if (!opening_prev) { + List<String>::Element *prev_scene = previous_scenes.find(p_path); + if (prev_scene != NULL) { + prev_scene->erase(); + } + } + load_scene(p_path); // as it will be opened in separate tab } @@ -3490,6 +3513,69 @@ void EditorNode::stop_child_process() { _menu_option_confirm(RUN_STOP, false); } +Ref<Script> EditorNode::get_object_custom_type_base(const Object *p_object) const { + ERR_FAIL_COND_V(!p_object, NULL); + + Ref<Script> script = p_object->get_script(); + + if (script.is_valid()) { + // Uncommenting would break things! Consider adding a parameter if you need it. + // StringName name = EditorNode::get_editor_data().script_class_get_name(base_script->get_path()); + // if (name != StringName()) + // return name; + + // should probably be deprecated in 4.x + StringName base = script->get_instance_base_type(); + if (base != StringName() && EditorNode::get_editor_data().get_custom_types().has(base)) { + const Vector<EditorData::CustomType> &types = EditorNode::get_editor_data().get_custom_types()[base]; + + Ref<Script> base_script = script; + while (base_script.is_valid()) { + for (int i = 0; i < types.size(); ++i) { + if (types[i].script == base_script) { + return types[i].script; + } + } + base_script = base_script->get_base_script(); + } + } + } + + return NULL; +} + +StringName EditorNode::get_object_custom_type_name(const Object *p_object) const { + ERR_FAIL_COND_V(!p_object, StringName()); + + Ref<Script> script = p_object->get_script(); + if (script.is_null() && p_object->is_class("Script")) { + script = p_object; + } + + if (script.is_valid()) { + Ref<Script> base_script = script; + while (base_script.is_valid()) { + StringName name = EditorNode::get_editor_data().script_class_get_name(base_script->get_path()); + if (name != StringName()) + return name; + + // should probably be deprecated in 4.x + StringName base = base_script->get_instance_base_type(); + if (base != StringName() && EditorNode::get_editor_data().get_custom_types().has(base)) { + const Vector<EditorData::CustomType> &types = EditorNode::get_editor_data().get_custom_types()[base]; + for (int i = 0; i < types.size(); ++i) { + if (types[i].script == base_script) { + return types[i].name; + } + } + } + base_script = base_script->get_base_script(); + } + } + + return StringName(); +} + Ref<Texture> EditorNode::get_object_icon(const Object *p_object, const String &p_fallback) const { ERR_FAIL_COND_V(!p_object || !gui_base, NULL); @@ -3499,23 +3585,24 @@ Ref<Texture> EditorNode::get_object_icon(const Object *p_object, const String &p } if (script.is_valid()) { - StringName name = EditorNode::get_editor_data().script_class_get_name(script->get_path()); - String icon_path = EditorNode::get_editor_data().script_class_get_icon_path(name); - if (icon_path.length()) - return ResourceLoader::load(icon_path); - - // should probably be deprecated in 4.x - StringName base = script->get_instance_base_type(); - if (base != StringName()) { - const Map<String, Vector<EditorData::CustomType> > &p_map = EditorNode::get_editor_data().get_custom_types(); - for (const Map<String, Vector<EditorData::CustomType> >::Element *E = p_map.front(); E; E = E->next()) { - const Vector<EditorData::CustomType> &ct = E->value(); - for (int i = 0; i < ct.size(); ++i) { - if (ct[i].name == base && ct[i].icon.is_valid()) { - return ct[i].icon; + Ref<Script> base_script = script; + while (base_script.is_valid()) { + StringName name = EditorNode::get_editor_data().script_class_get_name(base_script->get_path()); + String icon_path = EditorNode::get_editor_data().script_class_get_icon_path(name); + if (icon_path.length()) + return ResourceLoader::load(icon_path); + + // should probably be deprecated in 4.x + StringName base = base_script->get_instance_base_type(); + if (base != StringName() && EditorNode::get_editor_data().get_custom_types().has(base)) { + const Vector<EditorData::CustomType> &types = EditorNode::get_editor_data().get_custom_types()[base]; + for (int i = 0; i < types.size(); ++i) { + if (types[i].script == base_script && types[i].icon.is_valid()) { + return types[i].icon; } } } + base_script = base_script->get_base_script(); } } @@ -3713,6 +3800,11 @@ void EditorNode::show_warning(const String &p_text, const String &p_title) { warning->popup_centered_minsize(); } +void EditorNode::_copy_warning(const String &p_str) { + + OS::get_singleton()->set_clipboard(warning->get_text()); +} + void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouse> me = p_input; @@ -4412,8 +4504,17 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) { scene_tabs_context_menu->add_separator(); scene_tabs_context_menu->add_item(TTR("Show in FileSystem"), FILE_SHOW_IN_FILESYSTEM); scene_tabs_context_menu->add_item(TTR("Play This Scene"), RUN_PLAY_SCENE); + scene_tabs_context_menu->add_separator(); - scene_tabs_context_menu->add_item(TTR("Close Tab"), FILE_CLOSE); + Ref<ShortCut> close_tab_sc = ED_GET_SHORTCUT("editor/close_scene"); + close_tab_sc->set_name(TTR("Close Tab")); + scene_tabs_context_menu->add_shortcut(close_tab_sc, FILE_CLOSE); + Ref<ShortCut> undo_close_tab_sc = ED_GET_SHORTCUT("editor/reopen_closed_scene"); + undo_close_tab_sc->set_name(TTR("Undo Close Tab")); + scene_tabs_context_menu->add_shortcut(undo_close_tab_sc, FILE_OPEN_PREV); + if (previous_scenes.empty()) { + scene_tabs_context_menu->set_item_disabled(scene_tabs_context_menu->get_item_index(FILE_OPEN_PREV), true); + } scene_tabs_context_menu->add_item(TTR("Close Other Tabs"), FILE_CLOSE_OTHERS); scene_tabs_context_menu->add_item(TTR("Close Tabs to the Right"), FILE_CLOSE_RIGHT); scene_tabs_context_menu->add_item(TTR("Close All Tabs"), FILE_CLOSE_ALL); @@ -4992,9 +5093,8 @@ void EditorNode::_start_dimming(bool p_dimming) { void EditorNode::_dim_timeout() { _dim_time += _dim_timer->get_wait_time(); - float wait_time = EditorSettings::get_singleton()->get("interface/editor/dim_transition_time"); - - float c = 1.0f - (float)EditorSettings::get_singleton()->get("interface/editor/dim_amount"); + float wait_time = 0.08f; + float c = 0.4f; Color base = _dimming ? Color(1, 1, 1) : Color(c, c, c); Color final = _dimming ? Color(c, c, c) : Color(1, 1, 1); @@ -5035,18 +5135,12 @@ Vector<Ref<EditorResourceConversionPlugin> > EditorNode::find_resource_conversio void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) { - if (p_pressed) { - top_split->hide(); - bottom_panel_raise->set_icon(gui_base->get_icon("ShrinkBottomDock", "EditorIcons")); - } else { - top_split->show(); - bottom_panel_raise->set_icon(gui_base->get_icon("ExpandBottomDock", "EditorIcons")); - } + top_split->set_visible(!p_pressed); } void EditorNode::_update_video_driver_color() { - //todo probably should de-harcode this and add to editor settings + // TODO: Probably should de-hardcode this and add to editor settings. if (video_driver->get_text() == "GLES2") { video_driver->add_color_override("font_color", Color::hex(0x5586a4ff)); } else if (video_driver->get_text() == "GLES3") { @@ -5131,6 +5225,8 @@ void EditorNode::_bind_methods() { ClassDB::bind_method("_node_renamed", &EditorNode::_node_renamed); ClassDB::bind_method("edit_node", &EditorNode::edit_node); ClassDB::bind_method("_unhandled_input", &EditorNode::_unhandled_input); + ClassDB::bind_method("_update_file_menu_opened", &EditorNode::_update_file_menu_opened); + ClassDB::bind_method("_update_file_menu_closed", &EditorNode::_update_file_menu_closed); ClassDB::bind_method(D_METHOD("push_item", "object", "property", "inspector_only"), &EditorNode::push_item, DEFVAL(""), DEFVAL(false)); @@ -5192,6 +5288,8 @@ void EditorNode::_bind_methods() { ClassDB::bind_method(D_METHOD("_inherit_imported"), &EditorNode::_inherit_imported); ClassDB::bind_method(D_METHOD("_dim_timeout"), &EditorNode::_dim_timeout); + ClassDB::bind_method("_copy_warning", &EditorNode::_copy_warning); + ClassDB::bind_method(D_METHOD("_resources_reimported"), &EditorNode::_resources_reimported); ClassDB::bind_method(D_METHOD("_bottom_panel_raise_toggled"), &EditorNode::_bottom_panel_raise_toggled); @@ -5496,6 +5594,8 @@ EditorNode::EditorNode() { EDITOR_DEF_RST("interface/scene_tabs/restore_scenes_on_load", false); EDITOR_DEF_RST("interface/scene_tabs/show_thumbnail_on_hover", true); EDITOR_DEF_RST("interface/inspector/capitalize_properties", true); + EDITOR_DEF_RST("interface/inspector/default_float_step", 0.001); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::REAL, "interface/inspector/default_float_step", PROPERTY_HINT_EXP_RANGE, "0,1,0")); EDITOR_DEF_RST("interface/inspector/disable_folding", false); EDITOR_DEF_RST("interface/inspector/auto_unfold_foreign_scenes", true); EDITOR_DEF("interface/inspector/horizontal_vector2_editing", false); @@ -5793,7 +5893,9 @@ EditorNode::EditorNode() { feature_profile_manager->connect("current_feature_profile_changed", this, "_feature_profile_changed"); warning = memnew(AcceptDialog); + warning->add_button(TTR("Copy Text"), true, "copy"); gui_base->add_child(warning); + warning->connect("custom_action", this, "_copy_warning"); ED_SHORTCUT("editor/next_tab", TTR("Next tab"), KEY_MASK_CMD + KEY_TAB); ED_SHORTCUT("editor/prev_tab", TTR("Previous tab"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_TAB); @@ -5801,6 +5903,7 @@ EditorNode::EditorNode() { PopupMenu *p; file_menu->set_tooltip(TTR("Operations with scene files.")); + p = file_menu->get_popup(); p->set_hide_on_window_lose_focus(true); p->add_shortcut(ED_SHORTCUT("editor/new_scene", TTR("New Scene")), FILE_NEW_SCENE); @@ -5814,6 +5917,7 @@ EditorNode::EditorNode() { p->add_shortcut(ED_SHORTCUT("editor/close_scene", TTR("Close Scene"), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_W), FILE_CLOSE); p->add_separator(); p->add_submenu_item(TTR("Open Recent"), "RecentScenes", FILE_OPEN_RECENT); + p->add_shortcut(ED_SHORTCUT("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_T), FILE_OPEN_PREV); p->add_separator(); p->add_shortcut(ED_SHORTCUT("editor/quick_open", TTR("Quick Open..."), KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN); p->add_shortcut(ED_SHORTCUT("editor/quick_open_scene", TTR("Quick Open Scene..."), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_O), FILE_QUICK_OPEN_SCENE); @@ -5931,16 +6035,13 @@ EditorNode::EditorNode() { p->add_child(editor_layouts); editor_layouts->connect("id_pressed", this, "_layout_menu_option"); p->add_submenu_item(TTR("Editor Layout"), "Layouts"); + p->add_separator(); #ifdef OSX_ENABLED p->add_shortcut(ED_SHORTCUT("editor/take_screenshot", TTR("Take Screenshot"), KEY_MASK_CMD | KEY_F12), EDITOR_SCREENSHOT); #else p->add_shortcut(ED_SHORTCUT("editor/take_screenshot", TTR("Take Screenshot"), KEY_MASK_CTRL | KEY_F12), EDITOR_SCREENSHOT); #endif p->set_item_tooltip(p->get_item_count() - 1, TTR("Screenshots are stored in the Editor Data/Settings Folder.")); - p->add_check_shortcut(ED_SHORTCUT("editor/open_screenshot", TTR("Automatically Open Screenshots")), EDITOR_OPEN_SCREENSHOT); - bool is_open_screenshot = EditorSettings::get_singleton()->get_project_metadata("screenshot_options", "open_screenshot", true); - p->set_item_checked(p->get_item_count() - 1, is_open_screenshot); - p->set_item_tooltip(p->get_item_count() - 1, TTR("Open in an external image editor.")); #ifdef OSX_ENABLED p->add_shortcut(ED_SHORTCUT("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KEY_MASK_CMD | KEY_MASK_CTRL | KEY_F), SETTINGS_TOGGLE_FULLSCREEN); #else @@ -6193,6 +6294,13 @@ EditorNode::EditorNode() { bottom_panel_hb_editors = memnew(HBoxContainer); bottom_panel_hb_editors->set_h_size_flags(Control::SIZE_EXPAND_FILL); bottom_panel_hb->add_child(bottom_panel_hb_editors); + + version_label = memnew(Label); + version_label->set_text(VERSION_FULL_CONFIG); + // Fade out the version label to be less prominent, but still readable + version_label->set_self_modulate(Color(1, 1, 1, 0.6)); + bottom_panel_hb->add_child(version_label); + bottom_panel_raise = memnew(ToolButton); bottom_panel_raise->set_icon(gui_base->get_icon("ExpandBottomDock", "EditorIcons")); @@ -6289,6 +6397,8 @@ EditorNode::EditorNode() { file_script->connect("file_selected", this, "_dialog_action"); file_menu->get_popup()->connect("id_pressed", this, "_menu_option"); + file_menu->connect("about_to_show", this, "_update_file_menu_opened"); + file_menu->get_popup()->connect("popup_hide", this, "_update_file_menu_closed"); settings_menu->get_popup()->connect("id_pressed", this, "_menu_option"); diff --git a/editor/editor_node.h b/editor/editor_node.h index 733f29c8ff..75827cc65f 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -431,6 +431,7 @@ private: HBoxContainer *bottom_panel_hb; HBoxContainer *bottom_panel_hb_editors; VBoxContainer *bottom_panel_vb; + Label *version_label; ToolButton *bottom_panel_raise; void _bottom_panel_raise_toggled(bool); @@ -460,6 +461,8 @@ private: void _tool_menu_option(int p_idx); void _update_debug_options(); + void _update_file_menu_opened(); + void _update_file_menu_closed(); void _on_plugin_ready(Object *p_script, const String &p_activate_name); @@ -776,12 +779,16 @@ public: void stop_child_process(); Ref<Theme> get_editor_theme() const { return theme; } + Ref<Script> get_object_custom_type_base(const Object *p_object) const; + StringName get_object_custom_type_name(const Object *p_object) const; Ref<Texture> get_object_icon(const Object *p_object, const String &p_fallback = "Object") const; Ref<Texture> get_class_icon(const String &p_class, const String &p_fallback = "Object") const; void show_accept(const String &p_text, const String &p_title); void show_warning(const String &p_text, const String &p_title = "Warning!"); + void _copy_warning(const String &p_str); + Error export_preset(const String &p_preset, const String &p_path, bool p_debug, const String &p_password, bool p_quit_after = false); static void register_editor_types(); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index a8ef563368..3300228921 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -112,12 +112,13 @@ void EditorPropertyMultilineText::_open_big_text() { big_text->set_wrap_enabled(true); big_text_dialog = memnew(AcceptDialog); big_text_dialog->add_child(big_text); - big_text_dialog->set_title("Edit Text:"); + big_text_dialog->set_title(TTR("Edit Text:")); add_child(big_text_dialog); } big_text_dialog->popup_centered_ratio(); big_text->set_text(text->get_text()); + big_text->grab_focus(); } void EditorPropertyMultilineText::update_property() { @@ -389,7 +390,7 @@ void EditorPropertyMember::_property_select() { type = Variant::Type(i); } } - if (type) + if (type != Variant::NIL) selector->select_method_from_basic_type(type, current); } else if (hint == MEMBER_METHOD_OF_BASE_TYPE) { @@ -2412,7 +2413,6 @@ void EditorPropertyResource::_update_menu_items() { menu->add_separator(); menu->add_item(TTR("Show in FileSystem"), OBJ_MENU_SHOW_IN_FILE_SYSTEM); } - } else { } RES cb = EditorSettings::get_singleton()->get_resource_clipboard(); @@ -2904,6 +2904,8 @@ void EditorInspectorDefaultPlugin::parse_begin(Object *p_object) { bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { + float default_float_step = EDITOR_GET("interface/inspector/default_float_step"); + switch (p_type) { // atomic types @@ -3010,7 +3012,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } else { EditorPropertyFloat *editor = memnew(EditorPropertyFloat); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; bool exp_range = false; bool greater = true, lesser = true; @@ -3107,7 +3109,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ case Variant::VECTOR2: { EditorPropertyVector2 *editor = memnew(EditorPropertyVector2); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3125,7 +3127,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; // 5 case Variant::RECT2: { EditorPropertyRect2 *editor = memnew(EditorPropertyRect2); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3142,7 +3144,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::VECTOR3: { EditorPropertyVector3 *editor = memnew(EditorPropertyVector3); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3160,7 +3162,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::TRANSFORM2D: { EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3178,7 +3180,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::PLANE: { EditorPropertyPlane *editor = memnew(EditorPropertyPlane); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3195,7 +3197,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::QUAT: { EditorPropertyQuat *editor = memnew(EditorPropertyQuat); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3212,7 +3214,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; // 10 case Variant::AABB: { EditorPropertyAABB *editor = memnew(EditorPropertyAABB); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3229,7 +3231,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::BASIS: { EditorPropertyBasis *editor = memnew(EditorPropertyBasis); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { @@ -3246,7 +3248,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::TRANSFORM: { EditorPropertyTransform *editor = memnew(EditorPropertyTransform); - double min = -65535, max = 65535, step = 0.001; + double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index 347699c632..203136a3f8 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -414,8 +414,6 @@ void EditorPropertyArray::_remove_pressed(int p_index) { } void EditorPropertyArray::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - } } void EditorPropertyArray::_edit_pressed() { @@ -968,9 +966,6 @@ void EditorPropertyDictionary::_object_id_selected(const String &p_property, Obj } void EditorPropertyDictionary::_notification(int p_what) { - - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - } } void EditorPropertyDictionary::_edit_pressed() { diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp index f2e4d1086b..327e61cea3 100644 --- a/editor/editor_resource_preview.cpp +++ b/editor/editor_resource_preview.cpp @@ -50,7 +50,7 @@ bool EditorResourcePreviewGenerator::handles(const String &p_type) const { ERR_FAIL_V(false); } -Ref<Texture> EditorResourcePreviewGenerator::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorResourcePreviewGenerator::generate(const RES &p_from, const Size2 &p_size) const { if (get_script_instance() && get_script_instance()->has_method("generate")) { return get_script_instance()->call("generate", p_from, p_size); @@ -59,7 +59,7 @@ Ref<Texture> EditorResourcePreviewGenerator::generate(const RES &p_from, const S ERR_FAIL_V(Ref<Texture>()); } -Ref<Texture> EditorResourcePreviewGenerator::generate_from_path(const String &p_path, const Size2 p_size) const { +Ref<Texture> EditorResourcePreviewGenerator::generate_from_path(const String &p_path, const Size2 &p_size) const { if (get_script_instance() && get_script_instance()->has_method("generate_from_path")) { return get_script_instance()->call("generate_from_path", p_path, p_size); diff --git a/editor/editor_resource_preview.h b/editor/editor_resource_preview.h index e0fd54c924..ad4136e9ab 100644 --- a/editor/editor_resource_preview.h +++ b/editor/editor_resource_preview.h @@ -45,8 +45,8 @@ protected: public: virtual bool handles(const String &p_type) const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; - virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; + virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 &p_size) const; virtual bool generate_small_preview_automatically() const; virtual bool can_generate_small_preview() const; diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp index 4bd68a593f..e4e32b2ce0 100644 --- a/editor/editor_run.cpp +++ b/editor/editor_run.cpp @@ -37,7 +37,7 @@ EditorRun::Status EditorRun::get_status() const { return status; } -Error EditorRun::run(const String &p_scene, const String p_custom_args, const List<String> &p_breakpoints) { +Error EditorRun::run(const String &p_scene, const String &p_custom_args, const List<String> &p_breakpoints) { List<String> args; diff --git a/editor/editor_run.h b/editor/editor_run.h index c27c8a05c8..9127c62030 100644 --- a/editor/editor_run.h +++ b/editor/editor_run.h @@ -51,7 +51,7 @@ private: public: Status get_status() const; - Error run(const String &p_scene, const String p_custom_args, const List<String> &p_breakpoints); + Error run(const String &p_scene, const String &p_custom_args, const List<String> &p_breakpoints); void run_native_notify() { status = STATUS_PLAY; } void stop(); diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp index e7019e4ef6..ad6b280b6d 100644 --- a/editor/editor_sectioned_inspector.cpp +++ b/editor/editor_sectioned_inspector.cpp @@ -144,8 +144,9 @@ void SectionedInspector::_section_selected() { if (!sections->get_selected()) return; - filter->set_section(sections->get_selected()->get_metadata(0), sections->get_selected()->get_children() == NULL); - inspector->set_property_prefix(String(sections->get_selected()->get_metadata(0)) + "/"); + selected_category = sections->get_selected()->get_metadata(0); + filter->set_section(selected_category, sections->get_selected()->get_children() == NULL); + inspector->set_property_prefix(selected_category + "/"); } void SectionedInspector::set_current_section(const String &p_section) { @@ -197,8 +198,13 @@ void SectionedInspector::edit(Object *p_object) { filter->set_edited(p_object); inspector->edit(filter); - if (sections->get_root()->get_children()) { - sections->get_root()->get_children()->select(0); + TreeItem *first_item = sections->get_root(); + if (first_item) { + while (first_item->get_children()) + first_item = first_item->get_children(); + + first_item->select(0); + selected_category = first_item->get_metadata(0); } } else { @@ -208,7 +214,6 @@ void SectionedInspector::edit(Object *p_object) { void SectionedInspector::update_category_list() { - String selected_category = get_current_section(); sections->clear(); Object *o = ObjectDB::get_instance(obj); @@ -224,6 +229,10 @@ void SectionedInspector::update_category_list() { TreeItem *root = sections->create_item(); section_map[""] = root; + String filter; + if (search_box) + filter = search_box->get_text(); + for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) { PropertyInfo pi = E->get(); @@ -236,9 +245,6 @@ void SectionedInspector::update_category_list() { if (pi.name.find(":") != -1 || pi.name == "script" || pi.name == "resource_name" || pi.name == "resource_path" || pi.name == "resource_local_to_scene" || pi.name.begins_with("_global_script")) continue; - if (search_box && search_box->get_text() != String() && pi.name.findn(search_box->get_text()) == -1) - continue; - int sp = pi.name.find("/"); if (sp == -1) pi.name = "global/" + pi.name; @@ -246,6 +252,9 @@ void SectionedInspector::update_category_list() { Vector<String> sectionarr = pi.name.split("/"); String metasection; + if (!filter.empty() && !filter.is_subsequence_ofi(sectionarr[sectionarr.size() - 1].capitalize())) + continue; + int sc = MIN(2, sectionarr.size() - 1); for (int i = 0; i < sc; i++) { diff --git a/editor/editor_sectioned_inspector.h b/editor/editor_sectioned_inspector.h index c32f23890f..4395e9bb27 100644 --- a/editor/editor_sectioned_inspector.h +++ b/editor/editor_sectioned_inspector.h @@ -50,6 +50,8 @@ class SectionedInspector : public HSplitContainer { EditorInspector *inspector; LineEdit *search_box; + String selected_category; + static void _bind_methods(); void _section_selected(); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 8e8c12ba44..45000517cb 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -321,30 +321,24 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["interface/editor/custom_display_scale"] = PropertyInfo(Variant::REAL, "interface/editor/custom_display_scale", PROPERTY_HINT_RANGE, "0.5,3,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); _initial_set("interface/editor/main_font_size", 14); hints["interface/editor/main_font_size"] = PropertyInfo(Variant::INT, "interface/editor/main_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); - _initial_set("interface/editor/main_font_antialiased", true); - _initial_set("interface/editor/main_font_hinting", 2); - hints["interface/editor/main_font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/main_font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT); + _initial_set("interface/editor/code_font_size", 14); + hints["interface/editor/code_font_size"] = PropertyInfo(Variant::INT, "interface/editor/code_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT); + _initial_set("interface/editor/font_antialiased", true); + _initial_set("interface/editor/font_hinting", 2); + hints["interface/editor/font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/main_font", ""); hints["interface/editor/main_font"] = PropertyInfo(Variant::STRING, "interface/editor/main_font", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/main_font_bold", ""); hints["interface/editor/main_font_bold"] = PropertyInfo(Variant::STRING, "interface/editor/main_font_bold", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT); - _initial_set("interface/editor/code_font_size", 14); - hints["interface/editor/code_font_size"] = PropertyInfo(Variant::INT, "interface/editor/code_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT); - _initial_set("interface/editor/code_font_antialiased", true); - _initial_set("interface/editor/code_font_hinting", 2); - hints["interface/editor/code_font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/code_font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/code_font", ""); hints["interface/editor/code_font"] = PropertyInfo(Variant::STRING, "interface/editor/code_font", PROPERTY_HINT_GLOBAL_FILE, "*.ttf,*.otf", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/dim_editor_on_dialog_popup", true); - _initial_set("interface/editor/dim_amount", 0.6f); - hints["interface/editor/dim_amount"] = PropertyInfo(Variant::REAL, "interface/editor/dim_amount", PROPERTY_HINT_RANGE, "0,1,0.01", PROPERTY_USAGE_DEFAULT); - _initial_set("interface/editor/dim_transition_time", 0.08f); - hints["interface/editor/dim_transition_time"] = PropertyInfo(Variant::REAL, "interface/editor/dim_transition_time", PROPERTY_HINT_RANGE, "0,1,0.001", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/low_processor_mode_sleep_usec", 6900); // ~144 FPS hints["interface/editor/low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/unfocused_low_processor_mode_sleep_usec", 50000); // 20 FPS hints["interface/editor/unfocused_low_processor_mode_sleep_usec"] = PropertyInfo(Variant::REAL, "interface/editor/unfocused_low_processor_mode_sleep_usec", PROPERTY_HINT_RANGE, "1,100000,1", PROPERTY_USAGE_DEFAULT); _initial_set("interface/editor/separate_distraction_mode", false); + _initial_set("interface/editor/automatically_open_screenshots", true); _initial_set("interface/editor/hide_console_window", false); _initial_set("interface/editor/save_each_scene_on_quit", true); // Regression _initial_set("interface/editor/quit_confirmation", true); @@ -354,9 +348,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["interface/theme/preset"] = PropertyInfo(Variant::STRING, "interface/theme/preset", PROPERTY_HINT_ENUM, "Default,Alien,Arc,Godot 2,Grey,Light,Solarized (Dark),Solarized (Light),Custom", PROPERTY_USAGE_DEFAULT); _initial_set("interface/theme/icon_and_font_color", 0); hints["interface/theme/icon_and_font_color"] = PropertyInfo(Variant::INT, "interface/theme/icon_and_font_color", PROPERTY_HINT_ENUM, "Auto,Dark,Light", PROPERTY_USAGE_DEFAULT); - _initial_set("interface/theme/base_color", Color::html("#323b4f")); + _initial_set("interface/theme/base_color", Color(0.2, 0.23, 0.31)); hints["interface/theme/base_color"] = PropertyInfo(Variant::COLOR, "interface/theme/base_color", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT); - _initial_set("interface/theme/accent_color", Color::html("#699ce8")); + _initial_set("interface/theme/accent_color", Color(0.41, 0.61, 0.91)); hints["interface/theme/accent_color"] = PropertyInfo(Variant::COLOR, "interface/theme/accent_color", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT); _initial_set("interface/theme/contrast", 0.25); hints["interface/theme/contrast"] = PropertyInfo(Variant::REAL, "interface/theme/contrast", PROPERTY_HINT_RANGE, "0.01, 1, 0.01"); @@ -483,7 +477,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // Completion _initial_set("text_editor/completion/idle_parse_delay", 2.0); hints["text_editor/completion/idle_parse_delay"] = PropertyInfo(Variant::REAL, "text_editor/completion/idle_parse_delay", PROPERTY_HINT_RANGE, "0.1, 10, 0.01"); - _initial_set("text_editor/completion/auto_brace_complete", false); + _initial_set("text_editor/completion/auto_brace_complete", true); + _initial_set("text_editor/completion/code_complete_delay", 0.3); + hints["text_editor/completion/code_complete_delay"] = PropertyInfo(Variant::REAL, "text_editor/completion/code_complete_delay", PROPERTY_HINT_RANGE, "0.01, 5, 0.01"); _initial_set("text_editor/completion/put_callhint_tooltip_below_current_line", true); _initial_set("text_editor/completion/callhint_tooltip_offset", Vector2()); _initial_set("text_editor/completion/complete_file_paths", true); @@ -505,10 +501,10 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("editors/grid_map/pick_distance", 5000.0); // 3D - _initial_set("editors/3d/primary_grid_color", Color::html("909090")); + _initial_set("editors/3d/primary_grid_color", Color(0.56, 0.56, 0.56)); hints["editors/3d/primary_grid_color"] = PropertyInfo(Variant::COLOR, "editors/3d/primary_grid_color", PROPERTY_HINT_COLOR_NO_ALPHA, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); - _initial_set("editors/3d/secondary_grid_color", Color::html("606060")); + _initial_set("editors/3d/secondary_grid_color", Color(0.38, 0.38, 0.38)); hints["editors/3d/secondary_grid_color"] = PropertyInfo(Variant::COLOR, "editors/3d/secondary_grid_color", PROPERTY_HINT_COLOR_NO_ALPHA, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); _initial_set("editors/3d/grid_size", 50); @@ -615,7 +611,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { /* Extra config */ _initial_set("project_manager/sorting_order", 0); - hints["project_manager/sorting_order"] = PropertyInfo(Variant::INT, "project_manager/sorting_order", PROPERTY_HINT_ENUM, "Name,Last Modified"); + hints["project_manager/sorting_order"] = PropertyInfo(Variant::INT, "project_manager/sorting_order", PROPERTY_HINT_ENUM, "Name,Path,Last Modified"); if (p_extra_config.is_valid()) { @@ -648,32 +644,32 @@ void EditorSettings::_load_default_text_editor_theme() { bool dark_theme = is_dark_theme(); - _initial_set("text_editor/highlighting/symbol_color", Color::html("badfff")); - _initial_set("text_editor/highlighting/keyword_color", Color::html("ffffb3")); - _initial_set("text_editor/highlighting/base_type_color", Color::html("a4ffd4")); - _initial_set("text_editor/highlighting/engine_type_color", Color::html("83d3ff")); - _initial_set("text_editor/highlighting/comment_color", Color::html("676767")); - _initial_set("text_editor/highlighting/string_color", Color::html("ef6ebe")); - _initial_set("text_editor/highlighting/background_color", dark_theme ? Color::html("3b000000") : Color::html("#323b4f")); - _initial_set("text_editor/highlighting/completion_background_color", Color::html("2C2A32")); - _initial_set("text_editor/highlighting/completion_selected_color", Color::html("434244")); - _initial_set("text_editor/highlighting/completion_existing_color", Color::html("21dfdfdf")); - _initial_set("text_editor/highlighting/completion_scroll_color", Color::html("ffffff")); - _initial_set("text_editor/highlighting/completion_font_color", Color::html("aaaaaa")); - _initial_set("text_editor/highlighting/text_color", Color::html("aaaaaa")); - _initial_set("text_editor/highlighting/line_number_color", Color::html("66aaaaaa")); - _initial_set("text_editor/highlighting/safe_line_number_color", Color::html("99aac8aa")); - _initial_set("text_editor/highlighting/caret_color", Color::html("aaaaaa")); - _initial_set("text_editor/highlighting/caret_background_color", Color::html("000000")); - _initial_set("text_editor/highlighting/text_selected_color", Color::html("000000")); - _initial_set("text_editor/highlighting/selection_color", Color::html("5a699ce8")); + _initial_set("text_editor/highlighting/symbol_color", Color(0.73, 0.87, 1.0)); + _initial_set("text_editor/highlighting/keyword_color", Color(1.0, 1.0, 0.7)); + _initial_set("text_editor/highlighting/base_type_color", Color(0.64, 1.0, 0.83)); + _initial_set("text_editor/highlighting/engine_type_color", Color(0.51, 0.83, 1.0)); + _initial_set("text_editor/highlighting/comment_color", Color(0.4, 0.4, 0.4)); + _initial_set("text_editor/highlighting/string_color", Color(0.94, 0.43, 0.75)); + _initial_set("text_editor/highlighting/background_color", dark_theme ? Color(0.0, 0.0, 0.0, 0.23) : Color(0.2, 0.23, 0.31)); + _initial_set("text_editor/highlighting/completion_background_color", Color(0.17, 0.16, 0.2)); + _initial_set("text_editor/highlighting/completion_selected_color", Color(0.26, 0.26, 0.27)); + _initial_set("text_editor/highlighting/completion_existing_color", Color(0.13, 0.87, 0.87, 0.87)); + _initial_set("text_editor/highlighting/completion_scroll_color", Color(1, 1, 1)); + _initial_set("text_editor/highlighting/completion_font_color", Color(0.67, 0.67, 0.67)); + _initial_set("text_editor/highlighting/text_color", Color(0.67, 0.67, 0.67)); + _initial_set("text_editor/highlighting/line_number_color", Color(0.67, 0.67, 0.67, 0.4)); + _initial_set("text_editor/highlighting/safe_line_number_color", Color(0.67, 0.78, 0.67, 0.6)); + _initial_set("text_editor/highlighting/caret_color", Color(0.67, 0.67, 0.67)); + _initial_set("text_editor/highlighting/caret_background_color", Color(0, 0, 0)); + _initial_set("text_editor/highlighting/text_selected_color", Color(0, 0, 0)); + _initial_set("text_editor/highlighting/selection_color", Color(0.41, 0.61, 0.91, 0.35)); _initial_set("text_editor/highlighting/brace_mismatch_color", Color(1, 0.2, 0.2)); _initial_set("text_editor/highlighting/current_line_color", Color(0.3, 0.5, 0.8, 0.15)); _initial_set("text_editor/highlighting/line_length_guideline_color", Color(0.3, 0.5, 0.8, 0.1)); _initial_set("text_editor/highlighting/word_highlighted_color", Color(0.8, 0.9, 0.9, 0.15)); - _initial_set("text_editor/highlighting/number_color", Color::html("EB9532")); - _initial_set("text_editor/highlighting/function_color", Color::html("66a2ce")); - _initial_set("text_editor/highlighting/member_variable_color", Color::html("e64e59")); + _initial_set("text_editor/highlighting/number_color", Color(0.92, 0.58, 0.2)); + _initial_set("text_editor/highlighting/function_color", Color(0.4, 0.64, 0.81)); + _initial_set("text_editor/highlighting/member_variable_color", Color(0.9, 0.31, 0.35)); _initial_set("text_editor/highlighting/mark_color", Color(1.0, 0.4, 0.4, 0.4)); _initial_set("text_editor/highlighting/bookmark_color", Color(0.08, 0.49, 0.98)); _initial_set("text_editor/highlighting/breakpoint_color", Color(0.8, 0.8, 0.4, 0.2)); diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index dcb106899e..9966394025 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -38,9 +38,9 @@ String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const { } String EditorSpinSlider::get_text_value() const { - int zeros = Math::step_decimals(get_step()); - return String::num(get_value(), zeros); + return String::num(get_value(), Math::range_step_decimals(get_step())); } + void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { if (read_only) diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index ff38b4b650..4eceb09792 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -257,44 +257,44 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Please, use alphabet order if you've added new theme here(After "Default" and "Custom") if (preset == "Default") { - preset_accent_color = Color::html("#699ce8"); - preset_base_color = Color::html("#323b4f"); + preset_accent_color = Color(0.41, 0.61, 0.91); + preset_base_color = Color(0.2, 0.23, 0.31); preset_contrast = default_contrast; } else if (preset == "Custom") { accent_color = EDITOR_GET("interface/theme/accent_color"); base_color = EDITOR_GET("interface/theme/base_color"); contrast = EDITOR_GET("interface/theme/contrast"); } else if (preset == "Alien") { - preset_accent_color = Color::html("#1bfe99"); - preset_base_color = Color::html("#2f373f"); + preset_accent_color = Color(0.11, 1.0, 0.6); + preset_base_color = Color(0.18, 0.22, 0.25); preset_contrast = 0.25; } else if (preset == "Arc") { - preset_accent_color = Color::html("#5294e2"); - preset_base_color = Color::html("#383c4a"); + preset_accent_color = Color(0.32, 0.58, 0.89); + preset_base_color = Color(0.22, 0.24, 0.29); preset_contrast = 0.25; } else if (preset == "Godot 2") { - preset_accent_color = Color::html("#86ace2"); - preset_base_color = Color::html("#3C3A44"); + preset_accent_color = Color(0.53, 0.67, 0.89); + preset_base_color = Color(0.24, 0.23, 0.27); preset_contrast = 0.25; } else if (preset == "Grey") { - preset_accent_color = Color::html("#b8e4ff"); - preset_base_color = Color::html("#3d3d3d"); + preset_accent_color = Color(0.72, 0.89, 1.0); + preset_base_color = Color(0.24, 0.24, 0.24); preset_contrast = 0.2; } else if (preset == "Light") { - preset_accent_color = Color::html("#2070ff"); - preset_base_color = Color::html("#ffffff"); + preset_accent_color = Color(0.13, 0.44, 1.0); + preset_base_color = Color(1, 1, 1); preset_contrast = 0.08; } else if (preset == "Solarized (Dark)") { - preset_accent_color = Color::html("#268bd2"); - preset_base_color = Color::html("#073642"); + preset_accent_color = Color(0.15, 0.55, 0.82); + preset_base_color = Color(0.03, 0.21, 0.26); preset_contrast = 0.23; } else if (preset == "Solarized (Light)") { - preset_accent_color = Color::html("#268bd2"); - preset_base_color = Color::html("#fdf6e3"); + preset_accent_color = Color(0.15, 0.55, 0.82); + preset_base_color = Color(0.99, 0.96, 0.89); preset_contrast = 0.06; } else { // Default - preset_accent_color = Color::html("#699ce8"); - preset_base_color = Color::html("#323b4f"); + preset_accent_color = Color(0.41, 0.61, 0.91); + preset_base_color = Color(0.2, 0.23, 0.31); preset_contrast = default_contrast; } @@ -1088,14 +1088,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color alpha3 = Color(mono_value, mono_value, mono_value, 0.7); // editor main color - const Color main_color = Color::html(dark_theme ? "#57b3ff" : "#0480ff"); + const Color main_color = dark_theme ? Color(0.34, 0.7, 1.0) : Color(0.02, 0.5, 1.0); - const Color symbol_color = Color::html("#5792ff").linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3); - const Color keyword_color = Color::html("#ff7185"); - const Color basetype_color = Color::html(dark_theme ? "#42ffc2" : "#00c161"); + const Color symbol_color = Color(0.34, 0.57, 1.0).linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3); + const Color keyword_color = Color(1.0, 0.44, 0.52); + const Color basetype_color = dark_theme ? Color(0.26, 1.0, 0.76) : Color(0.0, 0.76, 0.38); const Color type_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.7 : 0.5); const Color comment_color = dim_color; - const Color string_color = Color::html(dark_theme ? "#ffd942" : "#ffd118").linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3); + const Color string_color = (dark_theme ? Color(1.0, 0.85, 0.26) : Color(1.0, 0.82, 0.09)).linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3); const Color te_background_color = dark_theme ? background_color : base_color; const Color completion_background_color = dark_theme ? base_color : background_color; diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index bd61e6182c..ecfad4d146 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -52,18 +52,16 @@ void ExportTemplateManager::_update_template_list() { DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); Error err = d->change_dir(EditorSettings::get_singleton()->get_templates_dir()); - d->list_dir_begin(); Set<String> templates; - + d->list_dir_begin(); if (err == OK) { - bool isdir; - String c = d->get_next(&isdir); + String c = d->get_next(); while (c != String()) { - if (isdir && !c.begins_with(".")) { + if (d->current_is_dir() && !c.begins_with(".")) { templates.insert(c); } - c = d->get_next(&isdir); + c = d->get_next(); } } d->list_dir_end(); @@ -154,18 +152,14 @@ void ExportTemplateManager::_uninstall_template_confirm() { ERR_FAIL_COND(err != OK); Vector<String> files; - d->list_dir_begin(); - - bool isdir; - String c = d->get_next(&isdir); + String c = d->get_next(); while (c != String()) { - if (!isdir) { + if (!d->current_is_dir()) { files.push_back(c); } - c = d->get_next(&isdir); + c = d->get_next(); } - d->list_dir_end(); for (int i = 0; i < files.size(); i++) { diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index b74350c98b..8e332ad20e 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -163,7 +163,7 @@ Vector<String> FileSystemDock::_compute_uncollapsed_paths() { return uncollapsed_paths; } -void FileSystemDock::_update_tree(const Vector<String> p_uncollapsed_paths, bool p_uncollapse_root, bool p_select_in_favorites) { +void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, bool p_uncollapse_root, bool p_select_in_favorites) { // Recreate the tree tree->clear(); @@ -812,7 +812,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { } } -void FileSystemDock::_select_file(const String p_path, bool p_select_in_favorites) { +void FileSystemDock::_select_file(const String &p_path, bool p_select_in_favorites) { String fpath = p_path; if (fpath.ends_with("/")) { if (fpath != "res://") { @@ -1298,7 +1298,7 @@ void FileSystemDock::_rename_operation_confirm() { _try_move_item(to_rename, new_path, file_renames, folder_renames); int current_tab = editor->get_current_tab(); - + _save_scenes_after_move(file_renames); // save scenes before updating _update_dependencies_after_move(file_renames); _update_resource_paths_after_move(file_renames); _update_project_settings_after_move(file_renames); @@ -1407,7 +1407,7 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool overw if (is_moved) { int current_tab = editor->get_current_tab(); - + _save_scenes_after_move(file_renames); //save scenes before updating _update_dependencies_after_move(file_renames); _update_resource_paths_after_move(file_renames); _update_project_settings_after_move(file_renames); @@ -1502,7 +1502,7 @@ void FileSystemDock::_file_list_rmb_option(int p_option) { _file_option(p_option, selected); } -void FileSystemDock::_file_option(int p_option, const Vector<String> p_selected) { +void FileSystemDock::_file_option(int p_option, const Vector<String> &p_selected) { // The first one should be the active item switch (p_option) { diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 76f92665db..6de370ad29 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -175,7 +175,7 @@ private: Ref<Texture> _get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx); bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites); Vector<String> _compute_uncollapsed_paths(); - void _update_tree(const Vector<String> p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false); + void _update_tree(const Vector<String> &p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false); void _navigate_to_path(const String &p_path, bool p_select_in_favorites = false); void _file_list_gui_input(Ref<InputEvent> p_event); @@ -188,7 +188,7 @@ private: void _tree_toggle_collapsed(); - void _select_file(const String p_path, bool p_select_in_favorites = false); + void _select_file(const String &p_path, bool p_select_in_favorites = false); void _tree_activate_file(); void _file_list_activate_file(int p_idx); void _file_multi_selected(int p_index, bool p_selected); @@ -221,7 +221,7 @@ private: void _tree_rmb_option(int p_option); void _file_list_rmb_option(int p_option); - void _file_option(int p_option, const Vector<String> p_selected); + void _file_option(int p_option, const Vector<String> &p_selected); void _fw_history(); void _bw_history(); diff --git a/editor/icons/icon_point_mesh.svg b/editor/icons/icon_point_mesh.svg new file mode 100644 index 0000000000..8da7759daf --- /dev/null +++ b/editor/icons/icon_point_mesh.svg @@ -0,0 +1,7 @@ +<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"> +<g fill="#ffd684" stroke="#000" stroke-dasharray="null" stroke-linecap="null" stroke-linejoin="null" stroke-opacity="0" stroke-width="0"> +<ellipse cx="3.7237" cy="3.0268" rx="2.0114" ry="1.9956"/> +<ellipse cx="11.717" cy="6.1734" rx="2.0114" ry="1.9956"/> +<ellipse cx="6.5219" cy="12.477" rx="2.0114" ry="1.9956"/> +</g> +</svg> diff --git a/editor/icons/icon_reparent_to_new_node.svg b/editor/icons/icon_reparent_to_new_node.svg new file mode 100644 index 0000000000..29db56279c --- /dev/null +++ b/editor/icons/icon_reparent_to_new_node.svg @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + version="1.1" + viewBox="0 0 16 16" + id="svg8" + sodipodi:docname="icon_reparent_to_new_node.svg" + inkscape:version="0.92.1 r15371"> + <metadata + id="metadata14"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs12" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1023" + id="namedview10" + showgrid="false" + inkscape:zoom="29.5" + inkscape:cx="2.2588225" + inkscape:cy="3.6882199" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="g6" /> + <g + transform="translate(0 -1036.4)" + id="g6"> + <path + transform="translate(0,1036.4)" + d="m 1.4915254,13 c 0,1.104569 0.8954305,2 2,2 0.7139771,-5.54e-4 1.3735116,-0.381677 1.7305,-1 H 11.2715 c 0.356631,0.617705 1.015238,0.998733 1.7285,1 1.104569,0 2,-0.895431 2,-2 0,-1.104569 -0.895431,-2 -2,-2 -0.713977,5.54e-4 -1.373512,0.381677 -1.7305,1 H 5.2200254 c -0.1747809,-0.30301 -0.8483719,-1 -1.7285,-1 -0.9027301,0 -2,0.891221 -2,2 z" + id="path2" + inkscape:connector-curvature="0" + style="fill:#e0e0e0" + sodipodi:nodetypes="cccccsccccc" /> + <path + d="m 10.421845,1038.2814 -2.7947264,2.096 2.7947264,2.0961 v -1.3974 c 2.716918,0 2.180792,1.4469 2.180792,3.9265 V 1046.4 H 14 v -1.3974 c 0,-3.863 0.13086,-5.3239 -3.578155,-5.3239 z" + id="path4" + inkscape:connector-curvature="0" + style="fill:#84ffb1;stroke-width:0.69868171" + sodipodi:nodetypes="cccccccccc" /> + <g + transform="translate(-8.5,-8)" + id="g6-7"> + <path + style="fill:#84ffb1" + inkscape:connector-curvature="0" + transform="translate(0,1036.4)" + d="m 11,9 v 2 H 9 v 2 h 2 v 2 h 2 v -2 h 2 V 11 H 13 V 9 Z" + id="path4-5" /> + </g> + <path + d="m 4.5,1047.7968 v -3.1171 H 2.4999995 v 3.1171 z" + id="path2-3" + inkscape:connector-curvature="0" + style="fill:#e0e0e0;stroke-width:0.7178387" + sodipodi:nodetypes="ccccc" /> + </g> +</svg> diff --git a/editor/icons/icon_shrink_bottom_dock.svg b/editor/icons/icon_shrink_bottom_dock.svg deleted file mode 100644 index c1e8c1bfdb..0000000000 --- a/editor/icons/icon_shrink_bottom_dock.svg +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="16" - height="16" - version="1.1" - viewBox="0 0 16 16" - id="svg6" - sodipodi:docname="icon_shrink_bottom_dock.svg" - inkscape:version="0.92.3 (2405546, 2018-03-11)"> - <metadata - id="metadata12"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs10" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1853" - inkscape:window-height="1016" - id="namedview8" - showgrid="false" - inkscape:zoom="20.85965" - inkscape:cx="9.4509357" - inkscape:cy="6.016355" - inkscape:window-x="67" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg6" /> - <path - style="fill:#e0e0e0" - d="M 11.907447,9.9752038 15.442981,6.4396699 H 12.907296 V 1.4659528 h -1.999839 l 0,4.9737171 -2.5356852,0 3.5355342,3.5355339 z" - id="path829" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccc" /> - <path - inkscape:connector-curvature="0" - id="path831" - d="M 4.2131662,9.8793249 7.7487004,6.343791 H 5.2130152 V 1.3700738 H 3.2131762 V 6.343791 h -2.535685 l 3.535534,3.5355339 z" - style="fill:#e0e0e0" - sodipodi:nodetypes="ccccccccc" /> - <rect - style="fill:#e0e0e0;fill-opacity:1" - id="rect855" - width="14" - height="1.8305085" - x="-14.832336" - y="-13.121187" - transform="scale(-1)" /> -</svg> diff --git a/editor/icons/icon_vulkan.svg b/editor/icons/icon_vulkan.svg deleted file mode 100644 index 1d5fed0305..0000000000 --- a/editor/icons/icon_vulkan.svg +++ /dev/null @@ -1,127 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - id="svg2" - width="48" - height="16" - viewBox="0 0 47.999999 16" - sodipodi:docname="icon_vulkan.svg" - inkscape:version="0.92.3 (2405546, 2018-03-11)"> - <metadata - id="metadata8"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs6" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1853" - inkscape:window-height="1016" - id="namedview4" - showgrid="false" - inkscape:zoom="10.24" - inkscape:cx="9.4970674" - inkscape:cy="11.192118" - inkscape:window-x="67" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="g8" /> - <path - style="fill:#000000;stroke-width:1.06666672" - d="" - id="path819" - inkscape:connector-curvature="0" /> - <path - style="fill:#000000;stroke-width:1.06666672" - d="" - id="path817" - inkscape:connector-curvature="0" /> - <g - transform="matrix(0.04333868,0,0,0.04333868,-4.0493236,-3.7704963)" - id="g8"> - <path - inkscape:connector-curvature="0" - d="m 724.1,432.41989 h -40.6 c 0,0 0,-99 0,-129.7 13,7.2 30.1,20.5 40.6,33.3 z" - id="path10" - style="fill:#e6555a;fill-opacity:1" /> - <g - id="g12" - style="fill:#e6555a;fill-opacity:1" - transform="translate(0,47.319882)"> - <path - inkscape:connector-curvature="0" - d="m 381.8,385.1 h -50.6 l -66,-204 h 46 l 45.4,143.5 h 0.6 l 46,-143.5 h 46.3 z" - id="path14" - style="fill:#e6555a;fill-opacity:1" /> - <path - inkscape:connector-curvature="0" - d="M 585.5,385.1 H 546.9 V 364.5 H 546 c -5.1,8.6 -11.8,14.8 -20,18.6 -8.2,3.8 -16.6,5.7 -25.1,5.7 -10.9,0 -19.8,-1.4 -26.7,-4.3 -7,-2.9 -12.4,-6.9 -16.4,-12.1 -4,-5.2 -6.8,-11.6 -8.4,-19.1 -1.6,-7.5 -2.4,-15.9 -2.4,-25 v -90.9 h 40.6 v 83.4 c 0,12.2 1.9,21.3 5.7,27.3 3.8,6 10.6,9 20.3,9 11,0 19.1,-3.3 24,-9.9 5,-6.6 7.4,-17.4 7.4,-32.4 v -77.4 h 40.6 v 147.7 z" - id="path16" - style="fill:#e6555a;fill-opacity:1" /> - </g> - <polygon - points="730.8,296.2 730.7,290.5 781.9,237.3 829.9,237.3 774.2,291.6 836.2,385.1 787,385.1 " - id="polygon18" - style="fill:#e6555a;fill-opacity:1" - transform="translate(0,47.319882)" /> - <path - inkscape:connector-curvature="0" - d="m 843.6,330.11989 c 0.6,-9.5 3,-17.4 7.2,-23.7 4.2,-6.3 9.5,-11.3 16,-15.1 6.5,-3.8 13.8,-6.5 21.9,-8.1 8.1,-1.6 16.2,-2.4 24.4,-2.4 7.4,0 15,0.5 22.6,1.6 7.6,1.1 14.6,3.1 20.9,6.1 6.3,3.1 11.4,7.3 15.4,12.7 4,5.4 6,12.6 6,21.6 v 76.9 c 0,6.7 0.4,13.1 1.1,19.1 0.8,6.1 2.1,10.7 4,13.7 h -41.2 c -0.8,-2.3 -1.4,-4.6 -1.9,-7 -0.5,-2.4 -0.8,-4.8 -1,-7.3 -6.5,6.7 -14.1,11.3 -22.9,14 -8.8,2.7 -17.7,4 -26.9,4 -7,0 -13.6,-0.9 -19.7,-2.6 -6.1,-1.7 -11.4,-4.4 -16,-8 -4.6,-3.6 -8.2,-8.2 -10.7,-13.7 -2.6,-5.5 -3.9,-12.1 -3.9,-19.7 0,-8.4 1.5,-15.3 4.4,-20.7 3,-5.4 6.8,-9.8 11.4,-13 4.7,-3.2 10,-5.7 16,-7.3 6,-1.6 12,-2.9 18.1,-3.9 6.1,-0.9 12.1,-1.7 18,-2.3 5.9,-0.6 11.1,-1.4 15.7,-2.6 4.6,-1.1 8.2,-2.8 10.9,-5 2.7,-2.2 3.9,-5.4 3.7,-9.6 0,-4.4 -0.7,-7.9 -2.2,-10.4 -1.4,-2.6 -3.3,-4.6 -5.7,-6 -2.4,-1.4 -5.1,-2.4 -8.3,-2.9 -3.1,-0.5 -6.5,-0.7 -10.1,-0.7 -8,0 -14.3,1.7 -18.9,5.1 -4.6,3.4 -7.2,9.1 -8,17.1 h -40.3 z m 93.8,30 c -1.7,1.5 -3.9,2.7 -6.4,3.6 -2.6,0.9 -5.3,1.6 -8.3,2.2 -2.9,0.6 -6,1 -9.3,1.4 -3.2,0.4 -6.5,0.9 -9.7,1.4 -3,0.6 -6,1.3 -9,2.3 -3,1 -5.5,2.2 -7.7,3.9 -2.2,1.6 -4,3.7 -5.3,6.1 -1.3,2.5 -2,5.6 -2,9.4 0,3.6 0.7,6.7 2,9.1 1.3,2.5 3.1,4.4 5.4,5.9 2.3,1.4 5,2.4 8,3 3.1,0.6 6.2,0.9 9.4,0.9 8,0 14.2,-1.3 18.6,-4 4.4,-2.7 7.6,-5.9 9.7,-9.6 2.1,-3.7 3.4,-7.5 3.9,-11.3 0.5,-3.8 0.7,-6.9 0.7,-9.1 z" - id="path20" - style="fill:#e6555a;fill-opacity:1" /> - <path - inkscape:connector-curvature="0" - d="m 1004.2,284.61989 h 38.6 v 20.6 h 0.9 c 5.1,-8.6 11.8,-14.8 20,-18.7 8.2,-3.9 16.6,-5.9 25.1,-5.9 10.9,0 19.8,1.5 26.7,4.4 7,3 12.4,7.1 16.4,12.3 4,5.2 6.8,11.6 8.4,19.1 1.6,7.5 2.4,15.9 2.4,25 v 90.9 h -40.6 v -83.4 c 0,-12.2 -1.9,-21.3 -5.7,-27.3 -3.8,-6 -10.6,-9 -20.3,-9 -11,0 -19,3.3 -24,9.9 -5,6.6 -7.4,17.4 -7.4,32.4 v 77.4 h -40.6 v -147.7 z" - id="path22" - style="fill:#e6555a;fill-opacity:1" /> - <g - id="g24" - style="fill:#e6555a;fill-opacity:1" - transform="translate(0,47.319882)"> - <path - inkscape:connector-curvature="0" - d="M 612.4,211.8 V 385 H 653 V 234.2 c -13.1,-8 -26.6,-15.5 -40.6,-22.4 z" - id="path26" - style="fill:#e6555a;fill-opacity:1" /> - </g> - <path - inkscape:connector-curvature="0" - d="m 198.4,266.51989 c 23.5,-68.9 164.2,-94.2 314.1,-56.4 90,22.6 163.5,66.5 211.5,109.9 -21.7,-57.6 -127.3,-139.6 -272.8,-167.7 -164.5,-31.8 -326.7,-3.9 -346.8,69.1 -14.5,52.7 49.2,114.5 147.7,156.7 -44.3,-35.8 -65.8,-76 -53.7,-111.6 z" - id="path28" - style="fill:#e6555a;fill-opacity:1" /> - <g - id="g30" - style="fill:#e6555a;fill-opacity:1" - transform="translate(0,47.319882)"> - <path - inkscape:connector-curvature="0" - d="M 724.2,247.6 V 181 h -40.6 v 20.2 c 17.3,15.5 31,31.2 40.6,46.4 z" - id="path32" - style="fill:#e6555a;fill-opacity:1" /> - </g> - </g> -</svg> diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp index e152827c63..1c4a8c43a9 100644 --- a/editor/import/editor_import_collada.cpp +++ b/editor/import/editor_import_collada.cpp @@ -1175,35 +1175,33 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres morph = &collada.state.morph_controller_data_map[ngsource]; meshid = morph->mesh; - Vector<String> targets; - - morph->targets.has("MORPH_TARGET"); - String target = morph->targets["MORPH_TARGET"]; - bool valid = false; - if (morph->sources.has(target)) { - valid = true; - Vector<String> names = morph->sources[target].sarray; - for (int i = 0; i < names.size(); i++) { - - String meshid2 = names[i]; - if (collada.state.mesh_data_map.has(meshid2)) { - Ref<ArrayMesh> mesh = Ref<ArrayMesh>(memnew(ArrayMesh)); - const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid2]; - mesh->set_name(meshdata.name); - Error err = _create_mesh_surfaces(false, mesh, ng2->material_map, meshdata, apply_xform, bone_remap, skin, NULL, Vector<Ref<ArrayMesh> >(), false); - ERR_FAIL_COND_V(err, err); - - morphs.push_back(mesh); - } else { - valid = false; + if (morph->targets.has("MORPH_TARGET")) { + String target = morph->targets["MORPH_TARGET"]; + bool valid = false; + if (morph->sources.has(target)) { + valid = true; + Vector<String> names = morph->sources[target].sarray; + for (int i = 0; i < names.size(); i++) { + + String meshid2 = names[i]; + if (collada.state.mesh_data_map.has(meshid2)) { + Ref<ArrayMesh> mesh = Ref<ArrayMesh>(memnew(ArrayMesh)); + const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid2]; + mesh->set_name(meshdata.name); + Error err = _create_mesh_surfaces(false, mesh, ng2->material_map, meshdata, apply_xform, bone_remap, skin, NULL, Vector<Ref<ArrayMesh> >(), false); + ERR_FAIL_COND_V(err, err); + + morphs.push_back(mesh); + } else { + valid = false; + } } } - } - - if (!valid) - morphs.clear(); - ngsource = ""; + if (!valid) + morphs.clear(); + ngsource = ""; + } } if (ngsource != "") { diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp index bc507e91b2..c9c5b3818f 100644 --- a/editor/import/editor_scene_importer_gltf.cpp +++ b/editor/import/editor_scene_importer_gltf.cpp @@ -986,7 +986,7 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) { Ref<SurfaceTool> st; st.instance(); st->create_from_triangle_arrays(array); - if (p.has("targets")) { + if (!p.has("targets")) { //morph targets should not be reindexed, as array size might differ //removing indices is the best bet here st->deindex(); @@ -1327,7 +1327,9 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) { if (bct.has("index")) { Ref<Texture> t = _get_texture(state, bct["index"]); material->set_texture(SpatialMaterial::TEXTURE_METALLIC, t); + material->set_metallic_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_BLUE); material->set_texture(SpatialMaterial::TEXTURE_ROUGHNESS, t); + material->set_roughness_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_GREEN); if (!mr.has("metallicFactor")) { material->set_metallic(1); } @@ -1352,6 +1354,7 @@ Error EditorSceneImporterGLTF::_parse_materials(GLTFState &state) { Dictionary bct = d["occlusionTexture"]; if (bct.has("index")) { material->set_texture(SpatialMaterial::TEXTURE_AMBIENT_OCCLUSION, _get_texture(state, bct["index"])); + material->set_ao_texture_channel(SpatialMaterial::TEXTURE_CHANNEL_RED); material->set_feature(SpatialMaterial::FEATURE_AMBIENT_OCCLUSION, true); } } diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index a8197ec2a2..8e6a56a929 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -435,6 +435,7 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> Object::cast_to<Spatial>(sb)->set_transform(Object::cast_to<Spatial>(p_node)->get_transform()); p_node->replace_by(sb); memdelete(p_node); + p_node = NULL; CollisionShape *colshape = memnew(CollisionShape); if (empty_draw_type == "CUBE") { BoxShape *boxShape = memnew(BoxShape); @@ -893,7 +894,6 @@ void ResourceImporterScene::_filter_tracks(Node *scene, const String &p_text) { keep.insert(F->get()); } _filter_anim_tracks(anim->get_animation(name), keep); - } else { } } } diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp index e728dbac31..d267b29224 100644 --- a/editor/import/resource_importer_wav.cpp +++ b/editor/import/resource_importer_wav.cpp @@ -206,6 +206,11 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s frames = chunksize; + if (format_channels == 0) { + file->close(); + memdelete(file); + ERR_FAIL_COND_V(format_channels == 0, ERR_INVALID_DATA); + } frames /= format_channels; frames /= (format_bits >> 3); diff --git a/editor/multi_node_edit.cpp b/editor/multi_node_edit.cpp index 6af7e4bd00..85e47594a8 100644 --- a/editor/multi_node_edit.cpp +++ b/editor/multi_node_edit.cpp @@ -152,7 +152,9 @@ void MultiNodeEdit::_get_property_list(List<PropertyInfo> *p_list) const { datas.push_back(usage.getptr(F->get().name)); } - usage[F->get().name].uses++; + // Make sure only properties with the same exact PropertyInfo data will appear + if (usage[F->get().name].info == F->get()) + usage[F->get().name].uses++; } nc++; diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index 2931678c80..574b47d770 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -349,7 +349,6 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) Vector<Vector2> vertices2 = _get_polygon(insert.polygon); pre_move_edit = vertices2; - printf("setting pre_move_edit\n"); edited_point = PosVertex(insert.polygon, insert.vertex + 1, xform.affine_inverse().xform(insert.pos)); vertices2.insert(edited_point.vertex, edited_point.pos); selected_point = edited_point; @@ -367,7 +366,6 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) if (closest.valid()) { - printf("setting pre_move_edit\n"); pre_move_edit = _get_polygon(closest.polygon); edited_point = PosVertex(closest, xform.affine_inverse().xform(closest.pos)); selected_point = closest; @@ -612,7 +610,7 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl Vector2 point = xform.xform(p); Vector2 next_point = xform.xform(p2); - p_overlay->draw_line(point, next_point, col, 2 * EDSCALE); + p_overlay->draw_line(point, next_point, col, Math::round(2 * EDSCALE), true); } } @@ -636,7 +634,7 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl p2 = points[(i + 1) % n_points] + offset; const Vector2 next_point = xform.xform(p2); - p_overlay->draw_line(point, next_point, col, 2 * EDSCALE); + p_overlay->draw_line(point, next_point, col, Math::round(2 * EDSCALE), true); } } diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index 65282ccfc2..574f906cfa 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -878,9 +878,7 @@ void AnimationNodeBlendTreeEditor::edit(const Ref<AnimationNode> &p_node) { blend_tree->disconnect("removed_from_graph", this, "_removed_from_graph"); } - if (p_node.is_valid()) { - blend_tree = p_node; - } + blend_tree = p_node; if (blend_tree.is_null()) { hide(); diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp index 2c1da3c10b..28dc5bf5c8 100644 --- a/editor/plugins/animation_tree_editor_plugin.cpp +++ b/editor/plugins/animation_tree_editor_plugin.cpp @@ -115,6 +115,8 @@ void AnimationTreeEditor::edit_path(const Vector<String> &p_path) { button_path.push_back(p_path[i]); } + edited_path = button_path; + for (int i = 0; i < editors.size(); i++) { if (editors[i]->can_edit(node)) { editors[i]->edit(node); @@ -126,10 +128,9 @@ void AnimationTreeEditor::edit_path(const Vector<String> &p_path) { } } else { current_root = 0; + edited_path = button_path; } - edited_path = button_path; - _update_path(); } diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 1503258ff5..31b11d8bea 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -177,6 +177,8 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const tex->create_from_image(thumbnail); preview_images[i].button->set_icon(tex); + // Make it clearer that clicking it will open an external link + preview_images[i].button->set_default_cursor_shape(CURSOR_POINTING_HAND); } else { preview_images[i].button->set_icon(p_image); } @@ -403,54 +405,60 @@ void EditorAssetLibraryItemDownload::configure(const String &p_title, int p_asse void EditorAssetLibraryItemDownload::_notification(int p_what) { - if (p_what == NOTIFICATION_PROCESS) { + switch (p_what) { - // Make the progress bar visible again when retrying the download - progress->set_modulate(Color(1, 1, 1, 1)); + case NOTIFICATION_READY: { - if (download->get_downloaded_bytes() > 0) { - progress->set_max(download->get_body_size()); - progress->set_value(download->get_downloaded_bytes()); - } + add_style_override("panel", get_stylebox("panel", "TabContainer")); + } break; + case NOTIFICATION_PROCESS: { - int cstatus = download->get_http_client_status(); + // Make the progress bar visible again when retrying the download. + progress->set_modulate(Color(1, 1, 1, 1)); - if (cstatus == HTTPClient::STATUS_BODY) { - if (download->get_body_size() > 0) { - status->set_text( - vformat( - TTR("Downloading (%s / %s)..."), - String::humanize_size(download->get_downloaded_bytes()), - String::humanize_size(download->get_body_size()))); - } else { - // Total file size is unknown, so it cannot be displayed - status->set_text(TTR("Downloading...")); + if (download->get_downloaded_bytes() > 0) { + progress->set_max(download->get_body_size()); + progress->set_value(download->get_downloaded_bytes()); } - } - if (cstatus != prev_status) { - switch (cstatus) { + int cstatus = download->get_http_client_status(); + + if (cstatus == HTTPClient::STATUS_BODY) { + if (download->get_body_size() > 0) { + status->set_text(vformat( + TTR("Downloading (%s / %s)..."), + String::humanize_size(download->get_downloaded_bytes()), + String::humanize_size(download->get_body_size()))); + } else { + // Total file size is unknown, so it cannot be displayed. + status->set_text(TTR("Downloading...")); + } + } - case HTTPClient::STATUS_RESOLVING: { - status->set_text(TTR("Resolving...")); - progress->set_max(1); - progress->set_value(0); - } break; - case HTTPClient::STATUS_CONNECTING: { - status->set_text(TTR("Connecting...")); - progress->set_max(1); - progress->set_value(0); - } break; - case HTTPClient::STATUS_REQUESTING: { - status->set_text(TTR("Requesting...")); - progress->set_max(1); - progress->set_value(0); - } break; - default: { + if (cstatus != prev_status) { + switch (cstatus) { + + case HTTPClient::STATUS_RESOLVING: { + status->set_text(TTR("Resolving...")); + progress->set_max(1); + progress->set_value(0); + } break; + case HTTPClient::STATUS_CONNECTING: { + status->set_text(TTR("Connecting...")); + progress->set_max(1); + progress->set_value(0); + } break; + case HTTPClient::STATUS_REQUESTING: { + status->set_text(TTR("Requesting...")); + progress->set_max(1); + progress->set_value(0); + } break; + default: { + } } + prev_status = cstatus; } - prev_status = cstatus; - } + } break; } } void EditorAssetLibraryItemDownload::_close() { @@ -531,7 +539,7 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() { hb2->add_spacer(); install = memnew(Button); - install->set_text(TTR("Install")); + install->set_text(TTR("Install...")); install->set_disabled(true); install->connect("pressed", this, "_install"); @@ -564,6 +572,7 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() { void EditorAssetLibrary::_notification(int p_what) { switch (p_what) { + case NOTIFICATION_READY: { error_tr->set_texture(get_icon("Error", "EditorIcons")); @@ -573,14 +582,12 @@ void EditorAssetLibrary::_notification(int p_what) { error_label->raise(); } break; - case NOTIFICATION_VISIBILITY_CHANGED: { if (is_visible()) { - _repository_changed(0); // Update when shown for the first time + _repository_changed(0); // Update when shown for the first time. } } break; - case NOTIFICATION_PROCESS: { HTTPClient::Status s = request->get_http_client_status(); @@ -619,6 +626,7 @@ void EditorAssetLibrary::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { library_scroll_bg->add_style_override("panel", get_stylebox("bg", "Tree")); + downloads_scroll->add_style_override("bg", get_stylebox("bg", "Tree")); error_tr->set_texture(get_icon("Error", "EditorIcons")); reverse->set_icon(get_icon("Sort", "EditorIcons")); filter->set_right_icon(get_icon("Search", "EditorIcons")); @@ -749,7 +757,7 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt float scale_ratio = max_height / (image->get_height() * EDSCALE); if (scale_ratio < 1) { - image->resize(image->get_width() * EDSCALE * scale_ratio, image->get_height() * EDSCALE * scale_ratio, Image::INTERPOLATE_CUBIC); + image->resize(image->get_width() * EDSCALE * scale_ratio, image->get_height() * EDSCALE * scale_ratio, Image::INTERPOLATE_LANCZOS); } } break; case IMAGE_QUEUE_SCREENSHOT: { @@ -757,7 +765,7 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PoolByt float scale_ratio = max_height / (image->get_height() * EDSCALE); if (scale_ratio < 1) { - image->resize(image->get_width() * EDSCALE * scale_ratio, image->get_height() * EDSCALE * scale_ratio, Image::INTERPOLATE_CUBIC); + image->resize(image->get_width() * EDSCALE * scale_ratio, image->get_height() * EDSCALE * scale_ratio, Image::INTERPOLATE_LANCZOS); } } break; } @@ -1238,9 +1246,6 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const description->connect("confirmed", this, "_install_asset"); description->configure(r["title"], r["asset_id"], category_map[r["category_id"]], r["category_id"], r["author"], r["author_id"], r["cost"], r["version"], r["version_string"], r["description"], r["download_url"], r["browse_url"], r["download_hash"]); - /*item->connect("asset_selected",this,"_select_asset"); - item->connect("author_selected",this,"_select_author"); - item->connect("category_selected",this,"_category_selected");*/ if (r.has("icon_url") && r["icon_url"] != "") { _request_image(description->get_instance_id(), r["icon_url"], IMAGE_QUEUE_ICON, 0); @@ -1267,9 +1272,8 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const if (p.has("thumbnail")) { _request_image(description->get_instance_id(), p["thumbnail"], IMAGE_QUEUE_THUMBNAIL, i); } - if (is_video) { - //_request_image(description->get_instance_id(),p["link"],IMAGE_QUEUE_SCREENSHOT,i); - } else { + + if (!is_video) { _request_image(description->get_instance_id(), p["link"], IMAGE_QUEUE_SCREENSHOT, i); } } @@ -1390,19 +1394,16 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { reverse = memnew(ToolButton); reverse->set_toggle_mode(true); reverse->connect("toggled", this, "_rerun_search"); - //reverse->set_text(TTR("Reverse")); + reverse->set_tooltip(TTR("Reverse sorting.")); search_hb2->add_child(reverse); search_hb2->add_child(memnew(VSeparator)); - //search_hb2->add_spacer(); - search_hb2->add_child(memnew(Label(TTR("Category:") + " "))); categories = memnew(OptionButton); categories->add_item(TTR("All")); search_hb2->add_child(categories); categories->set_h_size_flags(SIZE_EXPAND_FILL); - //search_hb2->add_spacer(); categories->connect("item_selected", this, "_rerun_search"); search_hb2->add_child(memnew(VSeparator)); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index e0e9d4af52..ff134ff2d1 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -860,20 +860,47 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve Ref<InputEventMouseButton> b = p_event; Ref<InputEventMouseMotion> m = p_event; - // Start dragging a guide if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed()) { - if (show_guides && show_rulers && EditorNode::get_singleton()->get_edited_scene()) { - Transform2D xform = viewport_scrollable->get_transform() * transform; - // Retrieve the guide lists - Array vguides; - if (EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_vertical_guides_")) { - vguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_vertical_guides_"); + if (show_guides && show_rulers && EditorNode::get_singleton()->get_edited_scene()) { + Transform2D xform = viewport_scrollable->get_transform() * transform; + // Retrieve the guide lists + Array vguides; + if (EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_vertical_guides_")) { + vguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_vertical_guides_"); + } + Array hguides; + if (EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_horizontal_guides_")) { + hguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_horizontal_guides_"); + } + + // Hover over guides + float minimum = 1e20; + is_hovering_h_guide = false; + is_hovering_v_guide = false; + + if (m.is_valid() && m->get_position().x < RULER_WIDTH) { + // Check if we are hovering an existing horizontal guide + for (int i = 0; i < hguides.size(); i++) { + if (ABS(xform.xform(Point2(0, hguides[i])).y - m->get_position().y) < MIN(minimum, 8)) { + is_hovering_h_guide = true; + is_hovering_v_guide = false; + break; + } } - Array hguides; - if (EditorNode::get_singleton()->get_edited_scene()->has_meta("_edit_horizontal_guides_")) { - hguides = EditorNode::get_singleton()->get_edited_scene()->get_meta("_edit_horizontal_guides_"); + + } else if (m.is_valid() && m->get_position().y < RULER_WIDTH) { + // Check if we are hovering an existing vertical guide + for (int i = 0; i < vguides.size(); i++) { + if (ABS(xform.xform(Point2(vguides[i], 0)).x - m->get_position().x) < MIN(minimum, 8)) { + is_hovering_v_guide = true; + is_hovering_h_guide = false; + break; + } } + } + + // Start dragging a guide + if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed()) { // Press button if (b->get_position().x < RULER_WIDTH && b->get_position().y < RULER_WIDTH) { @@ -883,7 +910,6 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve return true; } else if (b->get_position().x < RULER_WIDTH) { // Check if we drag an existing horizontal guide - float minimum = 1e20; dragged_guide_index = -1; for (int i = 0; i < hguides.size(); i++) { if (ABS(xform.xform(Point2(0, hguides[i])).y - b->get_position().y) < MIN(minimum, 8)) { @@ -901,7 +927,6 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve return true; } else if (b->get_position().y < RULER_WIDTH) { // Check if we drag an existing vertical guide - float minimum = 1e20; dragged_guide_index = -1; for (int i = 0; i < vguides.size(); i++) { if (ABS(xform.xform(Point2(vguides[i], 0)).x - b->get_position().x) < MIN(minimum, 8)) { @@ -956,14 +981,14 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve // Adds a new vertical guide if (dragged_guide_index >= 0) { vguides[dragged_guide_index] = edited.x; - undo_redo->create_action(TTR("Move vertical guide")); + undo_redo->create_action(TTR("Move Vertical Guide")); undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", vguides); undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", prev_vguides); undo_redo->add_undo_method(viewport, "update"); undo_redo->commit_action(); } else { vguides.push_back(edited.x); - undo_redo->create_action(TTR("Create new vertical guide")); + undo_redo->create_action(TTR("Create Vertical Guide")); undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", vguides); undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", prev_vguides); undo_redo->add_undo_method(viewport, "update"); @@ -972,7 +997,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } else { if (dragged_guide_index >= 0) { vguides.remove(dragged_guide_index); - undo_redo->create_action(TTR("Remove vertical guide")); + undo_redo->create_action(TTR("Remove Vertical Guide")); undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", vguides); undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", prev_vguides); undo_redo->add_undo_method(viewport, "update"); @@ -985,14 +1010,14 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve // Adds a new horizontal guide if (dragged_guide_index >= 0) { hguides[dragged_guide_index] = edited.y; - undo_redo->create_action(TTR("Move horizontal guide")); + undo_redo->create_action(TTR("Move Horizontal Guide")); undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", hguides); undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", prev_hguides); undo_redo->add_undo_method(viewport, "update"); undo_redo->commit_action(); } else { hguides.push_back(edited.y); - undo_redo->create_action(TTR("Create new horizontal guide")); + undo_redo->create_action(TTR("Create Horizontal Guide")); undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", hguides); undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", prev_hguides); undo_redo->add_undo_method(viewport, "update"); @@ -1001,7 +1026,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } else { if (dragged_guide_index >= 0) { hguides.remove(dragged_guide_index); - undo_redo->create_action(TTR("Remove horizontal guide")); + undo_redo->create_action(TTR("Remove Horizontal Guide")); undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", hguides); undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", prev_hguides); undo_redo->add_undo_method(viewport, "update"); @@ -1015,7 +1040,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve // Adds a new horizontal guide a new vertical guide vguides.push_back(edited.x); hguides.push_back(edited.y); - undo_redo->create_action(TTR("Create new horizontal and vertical guides")); + undo_redo->create_action(TTR("Create Horizontal and Vertical Guides")); undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", vguides); undo_redo->add_do_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_horizontal_guides_", hguides); undo_redo->add_undo_method(EditorNode::get_singleton()->get_edited_scene(), "set_meta", "_edit_vertical_guides_", prev_vguides); @@ -1033,12 +1058,14 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve return false; } -bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event) { +bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted) { Ref<InputEventMouseButton> b = p_event; - if (b.is_valid()) { + if (b.is_valid() && !p_already_accepted) { + bool pan_on_scroll = bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan")) && !b->get_control(); + if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_DOWN) { // Scroll or pan down - if (bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan"))) { + if (pan_on_scroll) { view_offset.y += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); } else { @@ -1049,7 +1076,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event) { if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_UP) { // Scroll or pan up - if (bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan"))) { + if (pan_on_scroll) { view_offset.y -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); } else { @@ -1060,7 +1087,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event) { if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_LEFT) { // Pan left - if (bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan"))) { + if (pan_on_scroll) { view_offset.x -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); return true; @@ -1069,7 +1096,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event) { if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_RIGHT) { // Pan right - if (bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan"))) { + if (pan_on_scroll) { view_offset.x += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); return true; @@ -1079,6 +1106,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event) { if (!panning) { if (b->is_pressed() && (b->get_button_index() == BUTTON_MIDDLE || + b->get_button_index() == BUTTON_RIGHT || (b->get_button_index() == BUTTON_LEFT && tool == TOOL_PAN) || (b->get_button_index() == BUTTON_LEFT && !EditorSettings::get_singleton()->get("editors/2d/simple_panning") && pan_pressed))) { // Pan the viewport @@ -1134,14 +1162,14 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event) { } Ref<InputEventMagnifyGesture> magnify_gesture = p_event; - if (magnify_gesture.is_valid()) { + if (magnify_gesture.is_valid() && !p_already_accepted) { // Zoom gesture _zoom_on_position(zoom * magnify_gesture->get_factor(), magnify_gesture->get_position()); return true; } Ref<InputEventPanGesture> pan_gesture = p_event; - if (pan_gesture.is_valid()) { + if (pan_gesture.is_valid() && !p_already_accepted) { // Pan gesture const Vector2 delta = (int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom) * pan_gesture->get_delta(); view_offset.x += delta.x; @@ -1406,7 +1434,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { for (int i = 0; i < 4; i++) { anchor_pos[i] = (transform * control->get_global_transform_with_canvas()).xform(_anchor_to_position(control, anchor_pos[i])); anchor_rects[i] = Rect2(anchor_pos[i], anchor_handle->get_size()); - anchor_rects[i].position -= anchor_handle->get_size() * Vector2(i == 0 || i == 3, i <= 1); + anchor_rects[i].position -= anchor_handle->get_size() * Vector2(float(i == 0 || i == 3), float(i <= 1)); } DragType dragger[] = { @@ -2221,8 +2249,6 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { //printf("Plugin\n"); } else if ((accepted = _gui_input_open_scene_on_double_click(p_event))) { //printf("Open scene on double click\n"); - } else if ((accepted = _gui_input_anchors(p_event))) { - //printf("Anchors\n"); } else if ((accepted = _gui_input_scale(p_event))) { //printf("Set scale\n"); } else if ((accepted = _gui_input_pivot(p_event))) { @@ -2233,6 +2259,8 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { //printf("Rotate\n"); } else if ((accepted = _gui_input_move(p_event))) { //printf("Move\n"); + } else if ((accepted = _gui_input_anchors(p_event))) { + //printf("Anchors\n"); } else if ((accepted = _gui_input_select(p_event))) { //printf("Selection\n"); } else { @@ -2240,7 +2268,7 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { } } - accepted = (_gui_input_zoom_or_pan(p_event) || accepted); + accepted = (_gui_input_zoom_or_pan(p_event, accepted) || accepted); if (accepted) accept_event(); @@ -2268,14 +2296,17 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { break; case DRAG_LEFT: case DRAG_RIGHT: + case DRAG_V_GUIDE: c = CURSOR_HSIZE; break; case DRAG_TOP: case DRAG_BOTTOM: + case DRAG_H_GUIDE: c = CURSOR_VSIZE; break; case DRAG_TOP_LEFT: case DRAG_BOTTOM_RIGHT: + case DRAG_DOUBLE_GUIDE: c = CURSOR_FDIAGSIZE; break; case DRAG_TOP_RIGHT: @@ -2288,6 +2319,12 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { default: break; } + + if (is_hovering_h_guide) + c = CURSOR_VSIZE; + else if (is_hovering_v_guide) + c = CURSOR_HSIZE; + viewport->set_default_cursor_shape(c); // Grab focus @@ -2351,7 +2388,7 @@ void CanvasItemEditor::_draw_guides() { if (drag_type == DRAG_V_GUIDE && i == dragged_guide_index) continue; float x = xform.xform(Point2(vguides[i], 0)).x; - viewport->draw_line(Point2(x, 0), Point2(x, viewport->get_size().y), guide_color); + viewport->draw_line(Point2(x, 0), Point2(x, viewport->get_size().y), guide_color, Math::round(EDSCALE)); } } @@ -2361,7 +2398,7 @@ void CanvasItemEditor::_draw_guides() { if (drag_type == DRAG_H_GUIDE && i == dragged_guide_index) continue; float y = xform.xform(Point2(0, hguides[i])).y; - viewport->draw_line(Point2(0, y), Point2(viewport->get_size().x, y), guide_color); + viewport->draw_line(Point2(0, y), Point2(viewport->get_size().x, y), guide_color, Math::round(EDSCALE)); } } @@ -2373,14 +2410,14 @@ void CanvasItemEditor::_draw_guides() { Ref<Font> font = get_font("font", "Label"); Size2 text_size = font->get_string_size(str); viewport->draw_string(font, Point2(dragged_guide_pos.x + 10, RULER_WIDTH + text_size.y / 2 + 10), str, text_color); - viewport->draw_line(Point2(dragged_guide_pos.x, 0), Point2(dragged_guide_pos.x, viewport->get_size().y), guide_color); + viewport->draw_line(Point2(dragged_guide_pos.x, 0), Point2(dragged_guide_pos.x, viewport->get_size().y), guide_color, Math::round(EDSCALE)); } if (drag_type == DRAG_DOUBLE_GUIDE || drag_type == DRAG_H_GUIDE) { String str = vformat("%d px", xform.affine_inverse().xform(dragged_guide_pos).y); Ref<Font> font = get_font("font", "Label"); Size2 text_size = font->get_string_size(str); viewport->draw_string(font, Point2(RULER_WIDTH + 10, dragged_guide_pos.y + text_size.y / 2 + 10), str, text_color); - viewport->draw_line(Point2(0, dragged_guide_pos.y), Point2(viewport->get_size().x, dragged_guide_pos.y), guide_color); + viewport->draw_line(Point2(0, dragged_guide_pos.y), Point2(viewport->get_size().x, dragged_guide_pos.y), guide_color, Math::round(EDSCALE)); } } @@ -2435,14 +2472,14 @@ void CanvasItemEditor::_draw_rulers() { for (int i = Math::ceil(first.x); i < last.x; i++) { Point2 position = (transform * ruler_transform * major_subdivide * minor_subdivide).xform(Point2(i, 0)); if (i % (major_subdivision * minor_subdivision) == 0) { - viewport->draw_line(Point2(position.x, 0), Point2(position.x, RULER_WIDTH), graduation_color); + viewport->draw_line(Point2(position.x, 0), Point2(position.x, RULER_WIDTH), graduation_color, Math::round(EDSCALE)); float val = (ruler_transform * major_subdivide * minor_subdivide).xform(Point2(i, 0)).x; viewport->draw_string(font, Point2(position.x + 2, font->get_height()), vformat(((int)val == val) ? "%d" : "%.1f", val), font_color); } else { if (i % minor_subdivision == 0) { - viewport->draw_line(Point2(position.x, RULER_WIDTH * 0.33), Point2(position.x, RULER_WIDTH), graduation_color); + viewport->draw_line(Point2(position.x, RULER_WIDTH * 0.33), Point2(position.x, RULER_WIDTH), graduation_color, Math::round(EDSCALE)); } else { - viewport->draw_line(Point2(position.x, RULER_WIDTH * 0.75), Point2(position.x, RULER_WIDTH), graduation_color); + viewport->draw_line(Point2(position.x, RULER_WIDTH * 0.75), Point2(position.x, RULER_WIDTH), graduation_color, Math::round(EDSCALE)); } } } @@ -2452,7 +2489,7 @@ void CanvasItemEditor::_draw_rulers() { for (int i = Math::ceil(first.y); i < last.y; i++) { Point2 position = (transform * ruler_transform * major_subdivide * minor_subdivide).xform(Point2(0, i)); if (i % (major_subdivision * minor_subdivision) == 0) { - viewport->draw_line(Point2(0, position.y), Point2(RULER_WIDTH, position.y), graduation_color); + viewport->draw_line(Point2(0, position.y), Point2(RULER_WIDTH, position.y), graduation_color, Math::round(EDSCALE)); float val = (ruler_transform * major_subdivide * minor_subdivide).xform(Point2(0, i)).y; Transform2D text_xform = Transform2D(-Math_PI / 2.0, Point2(font->get_height(), position.y - 2)); @@ -2462,9 +2499,9 @@ void CanvasItemEditor::_draw_rulers() { } else { if (i % minor_subdivision == 0) { - viewport->draw_line(Point2(RULER_WIDTH * 0.33, position.y), Point2(RULER_WIDTH, position.y), graduation_color); + viewport->draw_line(Point2(RULER_WIDTH * 0.33, position.y), Point2(RULER_WIDTH, position.y), graduation_color, Math::round(EDSCALE)); } else { - viewport->draw_line(Point2(RULER_WIDTH * 0.75, position.y), Point2(RULER_WIDTH, position.y), graduation_color); + viewport->draw_line(Point2(RULER_WIDTH * 0.75, position.y), Point2(RULER_WIDTH, position.y), graduation_color, Math::round(EDSCALE)); } } } @@ -2495,7 +2532,7 @@ void CanvasItemEditor::_draw_grid() { if (i == 0) last_cell = cell; if (last_cell != cell) - viewport->draw_line(Point2(i, 0), Point2(i, s.height), grid_color); + viewport->draw_line(Point2(i, 0), Point2(i, s.height), grid_color, Math::round(EDSCALE)); last_cell = cell; } } @@ -2506,7 +2543,7 @@ void CanvasItemEditor::_draw_grid() { if (i == 0) last_cell = cell; if (last_cell != cell) - viewport->draw_line(Point2(0, i), Point2(s.width, i), grid_color); + viewport->draw_line(Point2(0, i), Point2(s.width, i), grid_color, Math::round(EDSCALE)); last_cell = cell; } } @@ -2601,7 +2638,13 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) { line_starts[i] = Vector2::linear_interpolate(corners_pos[i], corners_pos[(i + 1) % 4], anchor_val); line_ends[i] = Vector2::linear_interpolate(corners_pos[(i + 3) % 4], corners_pos[(i + 2) % 4], anchor_val); snapped = anchors_values[i] == 0.0 || anchors_values[i] == 0.5 || anchors_values[i] == 1.0; - viewport->draw_line(line_starts[i], line_ends[i], snapped ? color_snapped : color_base, (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) ? 2 : 1); + int line_width; + if (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) { + line_width = 2; + } else { + line_width = 1; + } + viewport->draw_line(line_starts[i], line_ends[i], snapped ? color_snapped : color_base, Math::round(line_width * EDSCALE)); } // Display the percentages next to the lines @@ -2646,7 +2689,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) { start = Vector2(node_pos_in_parent[0], Math::lerp(node_pos_in_parent[1], node_pos_in_parent[3], ratio)); end = start - Vector2(control->get_margin(MARGIN_LEFT), 0); _draw_margin_at_position(control->get_margin(MARGIN_LEFT), parent_transform.xform((start + end) / 2), MARGIN_TOP); - viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1); + viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, Math::round(EDSCALE)); break; default: break; @@ -2661,7 +2704,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) { start = Vector2(node_pos_in_parent[2], Math::lerp(node_pos_in_parent[3], node_pos_in_parent[1], ratio)); end = start - Vector2(control->get_margin(MARGIN_RIGHT), 0); _draw_margin_at_position(control->get_margin(MARGIN_RIGHT), parent_transform.xform((start + end) / 2), MARGIN_BOTTOM); - viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1); + viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, Math::round(EDSCALE)); break; default: break; @@ -2676,7 +2719,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) { start = Vector2(Math::lerp(node_pos_in_parent[0], node_pos_in_parent[2], ratio), node_pos_in_parent[1]); end = start - Vector2(0, control->get_margin(MARGIN_TOP)); _draw_margin_at_position(control->get_margin(MARGIN_TOP), parent_transform.xform((start + end) / 2), MARGIN_LEFT); - viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1); + viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, Math::round(EDSCALE)); break; default: break; @@ -2691,7 +2734,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) { start = Vector2(Math::lerp(node_pos_in_parent[2], node_pos_in_parent[0], ratio), node_pos_in_parent[3]); end = start - Vector2(0, control->get_margin(MARGIN_BOTTOM)); _draw_margin_at_position(control->get_margin(MARGIN_BOTTOM), parent_transform.xform((start + end) / 2), MARGIN_RIGHT); - viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, 1); + viewport->draw_line(parent_transform.xform(start), parent_transform.xform(end), color_base, Math::round(EDSCALE)); break; default: break; @@ -2710,7 +2753,7 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) { case DRAG_MOVE: if (control->get_rotation() != 0.0 || control->get_scale() != Vector2(1, 1)) { Rect2 rect = Rect2(Vector2(node_pos_in_parent[0], node_pos_in_parent[1]), control->get_size()); - viewport->draw_rect(parent_transform.xform(rect), color_base, false); + viewport->draw_rect(parent_transform.xform(rect), color_base, false, Math::round(EDSCALE)); } break; default: @@ -2751,7 +2794,7 @@ void CanvasItemEditor::_draw_selection() { }; for (int i = 0; i < 4; i++) { - viewport->draw_line(pre_drag_endpoints[i], pre_drag_endpoints[(i + 1) % 4], pre_drag_color, 2); + viewport->draw_line(pre_drag_endpoints[i], pre_drag_endpoints[(i + 1) % 4], pre_drag_color, Math::round(2 * EDSCALE), true); } } else { viewport->draw_texture(previous_position_icon, (pre_drag_xform.xform(Point2()) - (previous_position_icon->get_size() / 2)).floor()); @@ -2773,7 +2816,7 @@ void CanvasItemEditor::_draw_selection() { Color c = Color(1, 0.6, 0.4, 0.7); for (int i = 0; i < 4; i++) { - viewport->draw_line(endpoints[i], endpoints[(i + 1) % 4], c, 2); + viewport->draw_line(endpoints[i], endpoints[(i + 1) % 4], c, Math::round(2 * EDSCALE), true); } } else { @@ -2853,18 +2896,16 @@ void CanvasItemEditor::_draw_selection() { } } - //scale_factor *= zoom; - viewport->draw_set_transform_matrix(simple_xform); Rect2 x_handle_rect = Rect2(scale_factor.x * EDSCALE, -5 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE); Color x_axis_color(1.0, 0.4, 0.4, 0.6); viewport->draw_rect(x_handle_rect, x_axis_color); - viewport->draw_line(Point2(), Point2(scale_factor.x * EDSCALE, 0), x_axis_color); + viewport->draw_line(Point2(), Point2(scale_factor.x * EDSCALE, 0), x_axis_color, Math::round(EDSCALE), true); Rect2 y_handle_rect = Rect2(-5 * EDSCALE, -(scale_factor.y + 10) * EDSCALE, 10 * EDSCALE, 10 * EDSCALE); Color y_axis_color(0.4, 1.0, 0.4, 0.6); viewport->draw_rect(y_handle_rect, y_axis_color); - viewport->draw_line(Point2(), Point2(0, -scale_factor.y * EDSCALE), y_axis_color); + viewport->draw_line(Point2(), Point2(0, -scale_factor.y * EDSCALE), y_axis_color, Math::round(EDSCALE), true); viewport->draw_set_transform_matrix(viewport->get_transform()); } @@ -3801,7 +3842,7 @@ void CanvasItemEditor::_zoom_on_position(float p_zoom, Point2 p_position) { } void CanvasItemEditor::_button_zoom_minus() { - _zoom_on_position(zoom / 1.5, viewport_scrollable->get_size() / 2.0); + _zoom_on_position(zoom / Math_SQRT2, viewport_scrollable->get_size() / 2.0); } void CanvasItemEditor::_button_zoom_reset() { @@ -3809,7 +3850,7 @@ void CanvasItemEditor::_button_zoom_reset() { } void CanvasItemEditor::_button_zoom_plus() { - _zoom_on_position(zoom * 1.5, viewport_scrollable->get_size() / 2.0); + _zoom_on_position(zoom * Math_SQRT2, viewport_scrollable->get_size() / 2.0); } void CanvasItemEditor::_button_toggle_snap(bool p_status) { diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index a46682d494..553ded6b14 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -371,6 +371,8 @@ private: List<CanvasItem *> drag_selection; int dragged_guide_index; Point2 dragged_guide_pos; + bool is_hovering_h_guide; + bool is_hovering_v_guide; bool updating_value_dialog; @@ -464,7 +466,7 @@ private: bool _gui_input_resize(const Ref<InputEvent> &p_event); bool _gui_input_rotate(const Ref<InputEvent> &p_event); bool _gui_input_select(const Ref<InputEvent> &p_event); - bool _gui_input_zoom_or_pan(const Ref<InputEvent> &p_event); + bool _gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted); bool _gui_input_rulers_and_guides(const Ref<InputEvent> &p_event); bool _gui_input_hover(const Ref<InputEvent> &p_event); diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index d2d2b8f130..5d3cef4c34 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -715,7 +715,7 @@ void CurveEditor::_draw() { if (_hover_point != -1) { const Color hover_color = line_color; Vector2 pos = curve.get_point_position(_hover_point); - stroke_rect(Rect2(get_view_pos(pos), Vector2(1, 1)).grow(_hover_radius), hover_color); + draw_rect(Rect2(get_view_pos(pos), Vector2(1, 1)).grow(_hover_radius), hover_color, false, Math::round(EDSCALE)); } // Help text @@ -726,23 +726,6 @@ void CurveEditor::_draw() { } } -// TODO That should be part of the drawing API... -void CurveEditor::stroke_rect(Rect2 rect, Color color) { - - // a---b - // | | - // c---d - Vector2 a(rect.position); - Vector2 b(rect.position.x + rect.size.x, rect.position.y); - Vector2 c(rect.position.x, rect.position.y + rect.size.y); - Vector2 d(rect.position + rect.size); - - draw_line(a, b, color, Math::round(EDSCALE)); - draw_line(b, d, color, Math::round(EDSCALE)); - draw_line(d, c, color, Math::round(EDSCALE)); - draw_line(c, a, color, Math::round(EDSCALE)); -} - void CurveEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_gui_input"), &CurveEditor::on_gui_input); ClassDB::bind_method(D_METHOD("_on_preset_item_selected"), &CurveEditor::on_preset_item_selected); @@ -783,7 +766,7 @@ bool CurvePreviewGenerator::handles(const String &p_type) const { return p_type == "Curve"; } -Ref<Texture> CurvePreviewGenerator::generate(const Ref<Resource> &p_from, const Size2 p_size) const { +Ref<Texture> CurvePreviewGenerator::generate(const Ref<Resource> &p_from, const Size2 &p_size) const { Ref<Curve> curve_ref = p_from; ERR_FAIL_COND_V(curve_ref.is_null(), Ref<Texture>()); diff --git a/editor/plugins/curve_editor_plugin.h b/editor/plugins/curve_editor_plugin.h index be774a9696..9071146863 100644 --- a/editor/plugins/curve_editor_plugin.h +++ b/editor/plugins/curve_editor_plugin.h @@ -97,8 +97,6 @@ private: void _draw(); - void stroke_rect(Rect2 rect, Color color); - private: Transform2D _world_to_view; @@ -142,7 +140,7 @@ class CurvePreviewGenerator : public EditorResourcePreviewGenerator { public: virtual bool handles(const String &p_type) const; - virtual Ref<Texture> generate(const Ref<Resource> &p_from, const Size2 p_size) const; + virtual Ref<Texture> generate(const Ref<Resource> &p_from, const Size2 &p_size) const; }; #endif // CURVE_EDITOR_PLUGIN_H diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index d260b171a8..c8ffc2744a 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -82,7 +82,7 @@ bool EditorTexturePreviewPlugin::generate_small_preview_automatically() const { return true; } -Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { Ref<Image> img; Ref<AtlasTexture> atex = p_from; @@ -148,7 +148,7 @@ bool EditorImagePreviewPlugin::handles(const String &p_type) const { return p_type == "Image"; } -Ref<Texture> EditorImagePreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorImagePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { Ref<Image> img = p_from; @@ -196,7 +196,7 @@ bool EditorBitmapPreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "BitMap"); } -Ref<Texture> EditorBitmapPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorBitmapPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { Ref<BitMap> bm = p_from; @@ -263,12 +263,12 @@ bool EditorPackedScenePreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "PackedScene"); } -Ref<Texture> EditorPackedScenePreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorPackedScenePreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { return generate_from_path(p_from->get_path(), p_size); } -Ref<Texture> EditorPackedScenePreviewPlugin::generate_from_path(const String &p_path, const Size2 p_size) const { +Ref<Texture> EditorPackedScenePreviewPlugin::generate_from_path(const String &p_path, const Size2 &p_size) const { String temp_path = EditorSettings::get_singleton()->get_cache_dir(); String cache_base = ProjectSettings::get_singleton()->globalize_path(p_path).md5_text(); @@ -321,7 +321,7 @@ bool EditorMaterialPreviewPlugin::generate_small_preview_automatically() const { return true; } -Ref<Texture> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { Ref<Material> material = p_from; ERR_FAIL_COND_V(material.is_null(), Ref<Texture>()); @@ -487,7 +487,7 @@ bool EditorScriptPreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "Script"); } -Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { Ref<Script> scr = p_from; if (scr.is_null()) @@ -609,7 +609,7 @@ bool EditorAudioStreamPreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "AudioStream"); } -Ref<Texture> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorAudioStreamPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { Ref<AudioStream> stream = p_from; ERR_FAIL_COND_V(stream.is_null(), Ref<Texture>()); @@ -706,7 +706,7 @@ bool EditorMeshPreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "Mesh"); //any Mesh } -Ref<Texture> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { Ref<Mesh> mesh = p_from; ERR_FAIL_COND_V(mesh.is_null(), Ref<Texture>()); @@ -827,7 +827,7 @@ bool EditorFontPreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "DynamicFontData"); } -Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path, const Size2 p_size) const { +Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path, const Size2 &p_size) const { Ref<DynamicFontData> SampledFont; SampledFont.instance(); @@ -882,7 +882,7 @@ Ref<Texture> EditorFontPreviewPlugin::generate_from_path(const String &p_path, c return ptex; } -Ref<Texture> EditorFontPreviewPlugin::generate(const RES &p_from, const Size2 p_size) const { +Ref<Texture> EditorFontPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { String path = p_from->get_path(); if (!FileAccess::exists(path)) { diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h index 12d693b10a..71a6c0fc08 100644 --- a/editor/plugins/editor_preview_plugins.h +++ b/editor/plugins/editor_preview_plugins.h @@ -41,7 +41,7 @@ class EditorTexturePreviewPlugin : public EditorResourcePreviewGenerator { public: virtual bool handles(const String &p_type) const; virtual bool generate_small_preview_automatically() const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; EditorTexturePreviewPlugin(); }; @@ -52,7 +52,7 @@ class EditorImagePreviewPlugin : public EditorResourcePreviewGenerator { public: virtual bool handles(const String &p_type) const; virtual bool generate_small_preview_automatically() const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; EditorImagePreviewPlugin(); }; @@ -63,7 +63,7 @@ class EditorBitmapPreviewPlugin : public EditorResourcePreviewGenerator { public: virtual bool handles(const String &p_type) const; virtual bool generate_small_preview_automatically() const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; EditorBitmapPreviewPlugin(); }; @@ -72,8 +72,8 @@ class EditorPackedScenePreviewPlugin : public EditorResourcePreviewGenerator { public: virtual bool handles(const String &p_type) const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; - virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; + virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 &p_size) const; EditorPackedScenePreviewPlugin(); }; @@ -102,7 +102,7 @@ protected: public: virtual bool handles(const String &p_type) const; virtual bool generate_small_preview_automatically() const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; EditorMaterialPreviewPlugin(); ~EditorMaterialPreviewPlugin(); @@ -111,7 +111,7 @@ public: class EditorScriptPreviewPlugin : public EditorResourcePreviewGenerator { public: virtual bool handles(const String &p_type) const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; EditorScriptPreviewPlugin(); }; @@ -119,7 +119,7 @@ public: class EditorAudioStreamPreviewPlugin : public EditorResourcePreviewGenerator { public: virtual bool handles(const String &p_type) const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; EditorAudioStreamPreviewPlugin(); }; @@ -146,7 +146,7 @@ protected: public: virtual bool handles(const String &p_type) const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; EditorMeshPreviewPlugin(); ~EditorMeshPreviewPlugin(); @@ -169,8 +169,8 @@ protected: public: virtual bool handles(const String &p_type) const; - virtual Ref<Texture> generate(const RES &p_from, const Size2 p_size) const; - virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 p_size) const; + virtual Ref<Texture> generate(const RES &p_from, const Size2 &p_size) const; + virtual Ref<Texture> generate_from_path(const String &p_path, const Size2 &p_size) const; EditorFontPreviewPlugin(); ~EditorFontPreviewPlugin(); diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp index ebacccb03c..e125c18ef1 100644 --- a/editor/plugins/material_editor_plugin.cpp +++ b/editor/plugins/material_editor_plugin.cpp @@ -34,9 +34,6 @@ void MaterialEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_PHYSICS_PROCESS) { - } - if (p_what == NOTIFICATION_READY) { //get_scene()->connect("node_removed",this,"_node_removed"); diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp index 6203035e25..442110cc84 100644 --- a/editor/plugins/mesh_editor_plugin.cpp +++ b/editor/plugins/mesh_editor_plugin.cpp @@ -48,9 +48,6 @@ void MeshEditor::_gui_input(Ref<InputEvent> p_event) { void MeshEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_PHYSICS_PROCESS) { - } - if (p_what == NOTIFICATION_READY) { //get_scene()->connect("node_removed",this,"_node_removed"); diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp index e582f6ded2..1fc6dae978 100644 --- a/editor/plugins/mesh_library_editor_plugin.cpp +++ b/editor/plugins/mesh_library_editor_plugin.cpp @@ -201,6 +201,8 @@ void MeshLibraryEditor::_import_scene_cbk(const String &p_str) { ERR_FAIL_COND(ps.is_null()); Node *scene = ps->instance(); + ERR_FAIL_COND(!scene); + _import_scene(scene, mesh_library, option == MENU_OPTION_UPDATE_FROM_SCENE); memdelete(scene); diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 712b1a0ae4..59004a08c0 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -1001,7 +1001,7 @@ void Polygon2DEditor::_uv_draw() { if (i == 0) last_cell = cell; if (last_cell != cell) - uv_edit_draw->draw_line(Point2(i, 0), Point2(i, s.height), grid_color); + uv_edit_draw->draw_line(Point2(i, 0), Point2(i, s.height), grid_color, Math::round(EDSCALE)); last_cell = cell; } } @@ -1012,7 +1012,7 @@ void Polygon2DEditor::_uv_draw() { if (i == 0) last_cell = cell; if (last_cell != cell) - uv_edit_draw->draw_line(Point2(0, i), Point2(s.width, i), grid_color); + uv_edit_draw->draw_line(Point2(0, i), Point2(s.width, i), grid_color, Math::round(EDSCALE)); last_cell = cell; } } @@ -1074,7 +1074,7 @@ void Polygon2DEditor::_uv_draw() { int next = uv_draw_max > 0 ? (i + 1) % uv_draw_max : 0; if (i < uv_draw_max && uv_drag && uv_move_current == UV_MODE_EDIT_POINT && EDITOR_DEF("editors/poly_editor/show_previous_outline", true)) { - uv_edit_draw->draw_line(mtx.xform(points_prev[i]), mtx.xform(points_prev[next]), prev_color, 2 * EDSCALE); + uv_edit_draw->draw_line(mtx.xform(points_prev[i]), mtx.xform(points_prev[next]), prev_color, Math::round(EDSCALE), true); } Vector2 next_point = uvs[next]; @@ -1082,7 +1082,7 @@ void Polygon2DEditor::_uv_draw() { next_point = uv_create_to; } if (i < uv_draw_max /*&& polygons.size() == 0 && polygon_create.size() == 0*/) { //if using or creating polygons, do not show outline (will show polygons instead) - uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), poly_line_color, 2 * EDSCALE); + uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), poly_line_color, Math::round(EDSCALE), true); } rect.expand_to(mtx.basis_xform(uvs[i])); @@ -1103,7 +1103,7 @@ void Polygon2DEditor::_uv_draw() { if (idx_next < 0 || idx_next >= uvs.size()) continue; - uv_edit_draw->draw_line(mtx.xform(uvs[idx]), mtx.xform(uvs[idx_next]), polygon_line_color, 2 * EDSCALE); + uv_edit_draw->draw_line(mtx.xform(uvs[idx]), mtx.xform(uvs[idx_next]), polygon_line_color, Math::round(EDSCALE), true); } if (points.size() >= 3) { uv_edit_draw->draw_polygon(polypoints, polygon_fill_color); @@ -1115,7 +1115,7 @@ void Polygon2DEditor::_uv_draw() { if (weight_r.ptr()) { Vector2 draw_pos = mtx.xform(uvs[i]); float weight = weight_r[i]; - uv_edit_draw->draw_rect(Rect2(draw_pos - Vector2(2, 2) * EDSCALE, Vector2(5, 5) * EDSCALE), Color(weight, weight, weight, 1.0)); + uv_edit_draw->draw_rect(Rect2(draw_pos - Vector2(2, 2) * EDSCALE, Vector2(5, 5) * EDSCALE), Color(weight, weight, weight, 1.0), Math::round(EDSCALE)); } else { if (i < uv_draw_max) { uv_edit_draw->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5); @@ -1129,21 +1129,10 @@ void Polygon2DEditor::_uv_draw() { for (int i = 0; i < polygon_create.size(); i++) { Vector2 from = uvs[polygon_create[i]]; Vector2 to = (i + 1) < polygon_create.size() ? uvs[polygon_create[i + 1]] : uv_create_to; - uv_edit_draw->draw_line(mtx.xform(from), mtx.xform(to), polygon_line_color, 2); + uv_edit_draw->draw_line(mtx.xform(from), mtx.xform(to), polygon_line_color, Math::round(EDSCALE), true); } } -#if 0 - PoolVector<int> splits = node->get_splits(); - - for (int i = 0; i < splits.size(); i += 2) { - int idx_from = splits[i]; - int idx_to = splits[i + 1]; - if (idx_from < 0 || idx_to >= uvs.size()) - continue; - uv_edit_draw->draw_line(mtx.xform(uvs[idx_from]), mtx.xform(uvs[idx_to]), poly_line_color, 2); - } -#endif if (uv_mode == UV_MODE_PAINT_WEIGHT || uv_mode == UV_MODE_CLEAR_WEIGHT) { NodePath bone_path; @@ -1182,8 +1171,8 @@ void Polygon2DEditor::_uv_draw() { Transform2D endpoint_xform = bone_xform * n->get_transform(); Color color = current ? Color(1, 1, 1) : Color(0.5, 0.5, 0.5); - uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), Color(0, 0, 0), current ? 5 : 4); - uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), color, current ? 3 : 2); + uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), Color(0, 0, 0), Math::round((current ? 5 : 4) * EDSCALE)); + uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), color, Math::round((current ? 3 : 2) * EDSCALE)); } if (!found_child) { @@ -1192,8 +1181,8 @@ void Polygon2DEditor::_uv_draw() { Transform2D endpoint_xform = bone_xform * Transform2D(0, Vector2(bone->get_default_length(), 0)); Color color = current ? Color(1, 1, 1) : Color(0.5, 0.5, 0.5); - uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), Color(0, 0, 0), current ? 5 : 4); - uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), color, current ? 3 : 2); + uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), Color(0, 0, 0), Math::round((current ? 5 : 4) * EDSCALE)); + uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), color, Math::round((current ? 3 : 2) * EDSCALE)); } } } diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp index b8d95efd49..620bf28415 100644 --- a/editor/plugins/resource_preloader_editor_plugin.cpp +++ b/editor/plugins/resource_preloader_editor_plugin.cpp @@ -39,9 +39,6 @@ void ResourcePreloaderEditor::_gui_input(Ref<InputEvent> p_event) { void ResourcePreloaderEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_PHYSICS_PROCESS) { - } - if (p_what == NOTIFICATION_ENTER_TREE) { load->set_icon(get_icon("Folder", "EditorIcons")); } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index d999f3189e..9418349d71 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -485,7 +485,7 @@ void ScriptEditor::_update_recent_scripts() { Array rc = EditorSettings::get_singleton()->get_project_metadata("recent_files", "scripts", Array()); recent_scripts->clear(); - recent_scripts->add_shortcut(ED_SHORTCUT("script_editor/open_recent", TTR("Open Recent"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_T)); + recent_scripts->add_shortcut(ED_SHORTCUT("script_editor/open_recent", TTR("Open Recent"))); recent_scripts->add_separator(); String path; @@ -579,6 +579,7 @@ void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) { Ref<Script> script = current->get_edited_resource(); if (script != NULL) { + previous_scripts.push_back(script->get_path()); notify_script_close(script); } } @@ -907,7 +908,7 @@ void ScriptEditor::_file_dialog_action(String p_file) { if (extensions.find(p_file.get_extension())) { Ref<Script> scr = ResourceLoader::load(p_file); if (!scr.is_valid()) { - editor->show_warning(TTR("Error: could not load file."), TTR("Error!")); + editor->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!")); file_dialog_option = -1; return; } @@ -920,7 +921,7 @@ void ScriptEditor::_file_dialog_action(String p_file) { Error error; Ref<TextFile> text_file = _load_text_file(p_file, &error); if (error != OK) { - editor->show_warning(TTR("Error could not load file."), TTR("Error!")); + editor->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!")); } if (text_file.is_valid()) { @@ -1012,6 +1013,52 @@ void ScriptEditor::_menu_option(int p_option) { file_dialog->set_title(TTR("Open File")); return; } break; + case FILE_REOPEN_CLOSED: { + + if (previous_scripts.empty()) + return; + + String path = previous_scripts.back()->get(); + previous_scripts.pop_back(); + + List<String> extensions; + ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); + bool built_in = !path.is_resource_file(); + + if (extensions.find(path.get_extension()) || built_in) { + if (built_in) { + String scene_path = path.get_slice("::", 0); + if (!EditorNode::get_singleton()->is_scene_open(scene_path)) { + EditorNode::get_singleton()->load_scene(scene_path); + script_editor->call_deferred("_menu_option", p_option); + previous_scripts.push_back(path); //repeat the operation + return; + } + } + + Ref<Script> scr = ResourceLoader::load(path); + if (!scr.is_valid()) { + editor->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!")); + file_dialog_option = -1; + return; + } + + edit(scr); + file_dialog_option = -1; + return; + } else { + Error error; + Ref<TextFile> text_file = _load_text_file(path, &error); + if (error != OK) + editor->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!")); + + if (text_file.is_valid()) { + edit(text_file); + file_dialog_option = -1; + return; + } + } + } break; case FILE_SAVE_ALL: { if (_test_script_times_on_disk()) @@ -1894,6 +1941,8 @@ void ScriptEditor::_update_script_names() { _update_members_overview_visibility(); _update_help_overview_visibility(); _update_script_colors(); + + file_menu->get_popup()->set_item_disabled(file_menu->get_popup()->get_item_index(FILE_REOPEN_CLOSED), previous_scripts.empty()); } void ScriptEditor::_update_script_connections() { @@ -2088,16 +2137,18 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra } ERR_FAIL_COND_V(!se, false); - bool highlighter_set = false; - for (int i = 0; i < syntax_highlighters_func_count; i++) { - SyntaxHighlighter *highlighter = syntax_highlighters_funcs[i](); - se->add_syntax_highlighter(highlighter); - - if (script != NULL && !highlighter_set) { - List<String> languages = highlighter->get_supported_languages(); - if (languages.find(script->get_language()->get_name())) { - se->set_syntax_highlighter(highlighter); - highlighter_set = true; + if (p_resource->get_class_name() != StringName("VisualScript")) { + bool highlighter_set = false; + for (int i = 0; i < syntax_highlighters_func_count; i++) { + SyntaxHighlighter *highlighter = syntax_highlighters_funcs[i](); + se->add_syntax_highlighter(highlighter); + + if (script != NULL && !highlighter_set) { + List<String> languages = highlighter->get_supported_languages(); + if (languages.find(script->get_language()->get_name())) { + se->set_syntax_highlighter(highlighter); + highlighter_set = true; + } } } } @@ -3170,6 +3221,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script...")), FILE_NEW); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New TextFile...")), FILE_NEW_TEXTFILE); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open...")), FILE_OPEN); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_T), FILE_REOPEN_CLOSED); file_menu->get_popup()->add_submenu_item(TTR("Open Recent"), "RecentScripts", FILE_OPEN_RECENT); recent_scripts = memnew(PopupMenu); @@ -3498,7 +3550,8 @@ ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) { EDITOR_DEF("text_editor/external/exec_flags", "{file}"); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "text_editor/external/exec_flags", PROPERTY_HINT_PLACEHOLDER_TEXT, "Call flags with placeholders: {project}, {file}, {col}, {line}.")); - ED_SHORTCUT("script_editor/open_recent", TTR("Open Recent"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_T); + ED_SHORTCUT("script_editor/reopen_closed_script", TTR("Reopen Closed Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_T); + ED_SHORTCUT("script_editor/open_recent", TTR("Open Recent")); ED_SHORTCUT("script_editor/clear_recent", TTR("Clear Recent Files")); } diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 4ad2156779..0c876108a5 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -139,6 +139,7 @@ class ScriptEditor : public PanelContainer { FILE_NEW, FILE_NEW_TEXTFILE, FILE_OPEN, + FILE_REOPEN_CLOSED, FILE_OPEN_RECENT, FILE_SAVE, FILE_SAVE_AS, @@ -265,7 +266,7 @@ class ScriptEditor : public PanelContainer { Vector<ScriptHistory> history; int history_pos; - Vector<String> previous_scripts; + List<String> previous_scripts; void _tab_changed(int p_which); void _menu_option(int p_option); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 438621115b..07303da2ff 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -1819,6 +1819,15 @@ ScriptTextEditor::ScriptTextEditor() { code_editor->get_text_edit()->set_drag_forwarding(this); } +ScriptTextEditor::~ScriptTextEditor() { + for (const Map<String, SyntaxHighlighter *>::Element *E = highlighters.front(); E; E = E->next()) { + if (E->get() != NULL) { + memdelete(E->get()); + } + } + highlighters.clear(); +} + static ScriptEditorBase *create_editor(const RES &p_resource) { if (Object::cast_to<Script>(*p_resource)) { diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index 9a2a514a6e..4dbade472c 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -231,6 +231,7 @@ public: virtual void validate(); ScriptTextEditor(); + ~ScriptTextEditor(); }; #endif // SCRIPT_TEXT_EDITOR_H diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 994c542187..37460c58ff 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -342,6 +342,9 @@ void ShaderEditor::_menu_option(int p_option) { shader_editor->remove_all_bookmarks(); } break; + case HELP_DOCS: { + OS::get_singleton()->shell_open("https://docs.godotengine.org/en/stable/tutorials/shading/shading_reference/index.html"); + } break; } if (p_option != SEARCH_FIND && p_option != SEARCH_REPLACE && p_option != SEARCH_GOTO_LINE) { shader_editor->get_text_edit()->call_deferred("grab_focus"); @@ -657,11 +660,18 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { bookmarks_menu->connect("about_to_show", this, "_update_bookmark_list"); bookmarks_menu->get_popup()->connect("index_pressed", this, "_bookmark_item_pressed"); + help_menu = memnew(MenuButton); + help_menu->set_text(TTR("Help")); + help_menu->set_switch_on_hover(true); + help_menu->get_popup()->add_icon_item(p_node->get_gui_base()->get_icon("Instance", "EditorIcons"), TTR("Online Docs"), HELP_DOCS); + help_menu->get_popup()->connect("id_pressed", this, "_menu_option"); + add_child(main_container); main_container->add_child(hbc); hbc->add_child(search_menu); hbc->add_child(edit_menu); hbc->add_child(bookmarks_menu); + hbc->add_child(help_menu); hbc->add_style_override("panel", p_node->get_gui_base()->get_stylebox("ScriptEditorPanel", "EditorStyles")); main_container->add_child(shader_editor); diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index 8e55a1ad70..5d03c37dc4 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -94,13 +94,13 @@ class ShaderEditor : public PanelContainer { BOOKMARK_GOTO_NEXT, BOOKMARK_GOTO_PREV, BOOKMARK_REMOVE_ALL, - + HELP_DOCS, }; MenuButton *edit_menu; MenuButton *search_menu; MenuButton *bookmarks_menu; - MenuButton *settings_menu; + MenuButton *help_menu; PopupMenu *context_menu; uint64_t idle; diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index fc72f25b04..6af6d48618 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -69,7 +69,7 @@ #define FREELOOK_SPEED_MULTIPLIER 1.08 #define MIN_Z 0.01 -#define MAX_Z 10000 +#define MAX_Z 1000000.0 #define MIN_FOV 0.01 #define MAX_FOV 179 @@ -250,15 +250,7 @@ Vector3 SpatialEditorViewport::_get_ray(const Vector2 &p_pos) const { return camera->project_ray_normal(p_pos / viewport_container->get_stretch_shrink()); } -/* -void SpatialEditorViewport::_clear_id(Spatial *p_node) { - - editor_selection->remove_node(p_node); - - -} -*/ void SpatialEditorViewport::_clear_selected() { editor_selection->clear(); @@ -283,7 +275,8 @@ void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single) { node = node->get_parent(); } - _select(selected, clicked_wants_append, true); + if (!_is_node_locked(selected)) + _select(selected, clicked_wants_append, true); } void SpatialEditorViewport::_select(Node *p_node, bool p_append, bool p_single) { @@ -513,7 +506,7 @@ void SpatialEditorViewport::_select_region() { for (int i = 0; i < instances.size(); i++) { Spatial *sp = Object::cast_to<Spatial>(ObjectDB::get_instance(instances[i])); - if (!sp) + if (!sp || _is_node_locked(sp)) continue; Node *item = Object::cast_to<Node>(sp); @@ -536,6 +529,8 @@ void SpatialEditorViewport::_select_region() { if (selected.find(item) != -1) continue; + if (_is_node_locked(Object::cast_to<Spatial>(item))) continue; + Ref<EditorSpatialGizmo> seg = sp->get_gizmo(); if (!seg.is_valid()) @@ -642,7 +637,7 @@ bool SpatialEditorViewport::_gizmo_select(const Vector2 &p_screenpos, bool p_hig Vector3 r; - if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * 10000.0, grabber_pos, grabber_radius, &r)) { + if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * MAX_Z, grabber_pos, grabber_radius, &r)) { float d = r.distance_to(ray_pos); if (d < col_d) { col_d = d; @@ -750,7 +745,7 @@ bool SpatialEditorViewport::_gizmo_select(const Vector2 &p_screenpos, bool p_hig Vector3 r; - if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * 10000.0, grabber_pos, grabber_radius, &r)) { + if (Geometry::segment_intersects_sphere(ray_pos, ray_pos + ray * MAX_Z, grabber_pos, grabber_radius, &r)) { float d = r.distance_to(ray_pos); if (d < col_d) { col_d = d; @@ -833,7 +828,9 @@ void SpatialEditorViewport::_surface_focus_exit() { view_menu->set_disable_shortcuts(true); } - +bool SpatialEditorViewport ::_is_node_locked(const Node *p_node) { + return p_node->has_meta("_edit_lock_") && p_node->get_meta("_edit_lock_"); +} void SpatialEditorViewport::_list_select(Ref<InputEventMouseButton> b) { _find_items_at_pos(b->get_position(), clicked_includes_current, selection_results, b->get_shift()); @@ -1286,6 +1283,8 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { Vector3 ray_pos = _get_ray_pos(m->get_position()); Vector3 ray = _get_ray(m->get_position()); + float snap = EDITOR_GET("interface/inspector/default_float_step"); + int snap_step_decimals = Math::range_step_decimals(snap); switch (_edit.mode) { @@ -1367,18 +1366,14 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { // Disable local transformation for TRANSFORM_VIEW bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); - float snap = 0; if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_scale_snap() / 100; - - Vector3 motion_snapped = motion; - motion_snapped.snap(Vector3(snap, snap, snap)); - set_message(TTR("Scaling: ") + motion_snapped); - - } else { - set_message(TTR("Scaling: ") + motion); } + Vector3 motion_snapped = motion; + motion_snapped.snap(Vector3(snap, snap, snap)); + // This might not be necessary anymore after issue #288 is solved (in 4.0?). + set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { @@ -1497,17 +1492,13 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { // Disable local transformation for TRANSFORM_VIEW bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); - float snap = 0; if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_translate_snap(); - - Vector3 motion_snapped = motion; - motion_snapped.snap(Vector3(snap, snap, snap)); - set_message(TTR("Translating: ") + motion_snapped); - } else { - set_message(TTR("Translating: ") + motion); } + Vector3 motion_snapped = motion; + motion_snapped.snap(Vector3(snap, snap, snap)); + set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { @@ -1596,20 +1587,12 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { float angle = Math::atan2(x_axis.dot(intersection - _edit.center), y_axis.dot(intersection - _edit.center)); if (_edit.snap || spatial_editor->is_snap_enabled()) { - - float snap = spatial_editor->get_rotate_snap(); - - if (snap) { - angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180 - angle -= Math::fmod(angle, snap); - set_message(vformat(TTR("Rotating %s degrees."), rtos(angle))); - angle = Math::deg2rad(angle); - } else - set_message(vformat(TTR("Rotating %s degrees."), rtos(Math::rad2deg(angle)))); - - } else { - set_message(vformat(TTR("Rotating %s degrees."), rtos(Math::rad2deg(angle)))); + snap = spatial_editor->get_rotate_snap(); } + angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180 + angle -= Math::fmod(angle, snap); + set_message(vformat(TTR("Rotating %s degrees."), String::num(angle, snap_step_decimals))); + angle = Math::deg2rad(angle); List<Node *> &selection = editor_selection->get_selected_node_list(); @@ -1830,8 +1813,11 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { _menu_option(orthogonal ? VIEW_PERSPECTIVE : VIEW_ORTHOGONAL); _update_name(); } - if (ED_IS_SHORTCUT("spatial_editor/align_selection_with_view", p_event)) { - _menu_option(VIEW_ALIGN_SELECTION_WITH_VIEW); + if (ED_IS_SHORTCUT("spatial_editor/align_transform_with_view", p_event)) { + _menu_option(VIEW_ALIGN_TRANSFORM_WITH_VIEW); + } + if (ED_IS_SHORTCUT("spatial_editor/align_rotation_with_view", p_event)) { + _menu_option(VIEW_ALIGN_ROTATION_WITH_VIEW); } if (ED_IS_SHORTCUT("spatial_editor/insert_anim_key", p_event)) { if (!get_selected_count() || _edit.mode != TRANSFORM_NONE) @@ -2348,23 +2334,6 @@ void SpatialEditorViewport::_notification(int p_what) { } } -// TODO That should be part of the drawing API... -static void stroke_rect(CanvasItem &ci, Rect2 rect, Color color, real_t width = 1.0) { - - // a---b - // | | - // c---d - Vector2 a(rect.position); - Vector2 b(rect.position.x + rect.size.x, rect.position.y); - Vector2 c(rect.position.x, rect.position.y + rect.size.y); - Vector2 d(rect.position + rect.size); - - ci.draw_line(a, b, color, width); - ci.draw_line(b, d, color, width); - ci.draw_line(d, c, color, width); - ci.draw_line(c, a, color, width); -} - static void draw_indicator_bar(Control &surface, real_t fill, Ref<Texture> icon) { // Adjust bar size from control height @@ -2379,7 +2348,7 @@ static void draw_indicator_bar(Control &surface, real_t fill, Ref<Texture> icon) // Draw both neutral dark and bright colors to account this surface.draw_rect(r, Color(1, 1, 1, 0.2)); surface.draw_rect(Rect2(r.position.x, r.position.y + r.size.y - sy, r.size.x, sy), Color(1, 1, 1, 0.6)); - stroke_rect(surface, r.grow(1), Color(0, 0, 0, 0.7)); + surface.draw_rect(r.grow(1), Color(0, 0, 0, 0.7), false, Math::round(EDSCALE)); Vector2 icon_size = icon->get_size(); Vector2 icon_pos = Vector2(r.position.x - (icon_size.x - r.size.x) / 2, r.position.y + r.size.y + 2); @@ -2460,7 +2429,7 @@ void SpatialEditorViewport::_draw() { draw_rect = Rect2(Vector2(), s).clip(draw_rect); - stroke_rect(*surface, draw_rect, Color(0.6, 0.6, 0.1, 0.5), 2.0); + surface->draw_rect(draw_rect, Color(0.6, 0.6, 0.1, 0.5), false, Math::round(2 * EDSCALE)); } else { @@ -2574,7 +2543,7 @@ void SpatialEditorViewport::_menu_option(int p_option) { focus_selection(); } break; - case VIEW_ALIGN_SELECTION_WITH_VIEW: { + case VIEW_ALIGN_TRANSFORM_WITH_VIEW: { if (!get_selected_count()) break; @@ -2583,7 +2552,8 @@ void SpatialEditorViewport::_menu_option(int p_option) { List<Node *> &selection = editor_selection->get_selected_node_list(); - undo_redo->create_action(TTR("Align with View")); + undo_redo->create_action(TTR("Align Transform with View")); + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { Spatial *sp = Object::cast_to<Spatial>(E->get()); @@ -2607,6 +2577,34 @@ void SpatialEditorViewport::_menu_option(int p_option) { undo_redo->add_undo_method(sp, "set_global_transform", sp->get_global_gizmo_transform()); } undo_redo->commit_action(); + focus_selection(); + + } break; + case VIEW_ALIGN_ROTATION_WITH_VIEW: { + + if (!get_selected_count()) + break; + + Transform camera_transform = camera->get_global_transform(); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + + undo_redo->create_action(TTR("Align Rotation with View")); + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + + Spatial *sp = Object::cast_to<Spatial>(E->get()); + if (!sp) + continue; + + SpatialEditorSelectedItem *se = editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp); + if (!se) + continue; + + undo_redo->add_do_method(sp, "set_rotation", camera_transform.basis.get_rotation()); + undo_redo->add_undo_method(sp, "set_rotation", sp->get_rotation()); + } + undo_redo->commit_action(); + } break; case VIEW_ENVIRONMENT: { @@ -3207,7 +3205,7 @@ Vector3 SpatialEditorViewport::_get_instance_position(const Point2 &p_pos) const return point + offset; } -AABB SpatialEditorViewport::_calculate_spatial_bounds(const Spatial *p_parent, const AABB p_bounds) { +AABB SpatialEditorViewport::_calculate_spatial_bounds(const Spatial *p_parent, const AABB &p_bounds) { AABB bounds = p_bounds; for (int i = 0; i < p_parent->get_child_count(); i++) { Spatial *child = Object::cast_to<Spatial>(p_parent->get_child(i)); @@ -3556,7 +3554,8 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed view_menu->get_popup()->add_separator(); view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_origin"), VIEW_CENTER_TO_ORIGIN); view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_selection"), VIEW_CENTER_TO_SELECTION); - view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_selection_with_view"), VIEW_ALIGN_SELECTION_WITH_VIEW); + view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_transform_with_view"), VIEW_ALIGN_TRANSFORM_WITH_VIEW); + view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_rotation_with_view"), VIEW_ALIGN_ROTATION_WITH_VIEW); view_menu->get_popup()->connect("id_pressed", this, "_menu_option"); view_menu->set_disable_shortcuts(true); @@ -3994,11 +3993,11 @@ void SpatialEditor::select_gizmo_highlight_axis(int p_axis) { for (int i = 0; i < 3; i++) { - move_gizmo[i]->surface_set_material(0, i == p_axis ? gizmo_hl : gizmo_color[i]); - move_plane_gizmo[i]->surface_set_material(0, (i + 6) == p_axis ? gizmo_hl : plane_gizmo_color[i]); - rotate_gizmo[i]->surface_set_material(0, (i + 3) == p_axis ? gizmo_hl : gizmo_color[i]); - scale_gizmo[i]->surface_set_material(0, (i + 9) == p_axis ? gizmo_hl : gizmo_color[i]); - scale_plane_gizmo[i]->surface_set_material(0, (i + 12) == p_axis ? gizmo_hl : plane_gizmo_color[i]); + move_gizmo[i]->surface_set_material(0, i == p_axis ? gizmo_color_hl[i] : gizmo_color[i]); + move_plane_gizmo[i]->surface_set_material(0, (i + 6) == p_axis ? plane_gizmo_color_hl[i] : plane_gizmo_color[i]); + rotate_gizmo[i]->surface_set_material(0, (i + 3) == p_axis ? gizmo_color_hl[i] : gizmo_color[i]); + scale_gizmo[i]->surface_set_material(0, (i + 9) == p_axis ? gizmo_color_hl[i] : gizmo_color[i]); + scale_plane_gizmo[i]->surface_set_material(0, (i + 12) == p_axis ? plane_gizmo_color_hl[i] : plane_gizmo_color[i]); } } @@ -4077,6 +4076,23 @@ Object *SpatialEditor::_get_editor_data(Object *p_what) { return si; } +Color SpatialEditor::_get_axis_color(int axis) { + + switch (axis) { + case 0: + // X axis + return Color(0.96, 0.20, 0.32); + case 1: + // Y axis + return Color(0.53, 0.84, 0.01); + case 2: + // Z axis + return Color(0.16, 0.55, 0.96); + default: + return Color(0, 0, 0); + } +} + void SpatialEditor::_generate_selection_box() { AABB aabb(Vector3(), Vector3(1, 1, 1)); @@ -4090,11 +4106,6 @@ void SpatialEditor::_generate_selection_box() { Vector3 a, b; aabb.get_edge(i, a, b); - /*Vector<Vector3> points; - Vector<Color> colors; - points.push_back(a); - points.push_back(b);*/ - st->add_color(Color(1.0, 1.0, 0.8, 0.8)); st->add_vertex(a); st->add_color(Color(1.0, 1.0, 0.8, 0.4)); @@ -4633,12 +4644,13 @@ void SpatialEditor::_init_indicators() { for (int i = 0; i < 3; i++) { Vector3 axis; axis[i] = 1; + Color origin_color = _get_axis_color(i); grid_enable[i] = false; grid_visible[i] = false; - origin_colors.push_back(Color(axis.x, axis.y, axis.z)); - origin_colors.push_back(Color(axis.x, axis.y, axis.z)); + origin_colors.push_back(origin_color); + origin_colors.push_back(origin_color); origin_points.push_back(axis * 4096); origin_points.push_back(axis * -4096); } @@ -4667,17 +4679,11 @@ void SpatialEditor::_init_indicators() { //move gizmo - float gizmo_alph = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_opacity"); - - gizmo_hl = Ref<SpatialMaterial>(memnew(SpatialMaterial)); - gizmo_hl->set_flag(SpatialMaterial::FLAG_UNSHADED, true); - gizmo_hl->set_on_top_of_alpha(); - gizmo_hl->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true); - gizmo_hl->set_albedo(Color(1, 1, 1, gizmo_alph + 0.2f)); - gizmo_hl->set_cull_mode(SpatialMaterial::CULL_DISABLED); - for (int i = 0; i < 3; i++) { + Color col = _get_axis_color(i); + col.a = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_opacity"); + move_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); move_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); rotate_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); @@ -4688,13 +4694,13 @@ void SpatialEditor::_init_indicators() { mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true); mat->set_on_top_of_alpha(); mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true); - Color col; - col[i] = 1.0; - col.a = gizmo_alph; mat->set_albedo(col); - gizmo_color[i] = mat; + Ref<SpatialMaterial> mat_hl = mat->duplicate(); + mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0)); + gizmo_color_hl[i] = mat_hl; + Vector3 ivec; ivec[i] = 1; Vector3 nivec; @@ -4784,13 +4790,14 @@ void SpatialEditor::_init_indicators() { plane_mat->set_on_top_of_alpha(); plane_mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true); plane_mat->set_cull_mode(SpatialMaterial::CULL_DISABLED); - Color col2; - col2[i] = 1.0; - col2.a = gizmo_alph; - plane_mat->set_albedo(col2); + plane_mat->set_albedo(col); plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides surftool->set_material(plane_mat); surftool->commit(move_plane_gizmo[i]); + + Ref<SpatialMaterial> plane_mat_hl = plane_mat->duplicate(); + plane_mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0)); + plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides } // Rotate @@ -4913,13 +4920,14 @@ void SpatialEditor::_init_indicators() { plane_mat->set_on_top_of_alpha(); plane_mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true); plane_mat->set_cull_mode(SpatialMaterial::CULL_DISABLED); - Color col2; - col2[i] = 1.0; - col2.a = gizmo_alph; - plane_mat->set_albedo(col2); + plane_mat->set_albedo(col); plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides surftool->set_material(plane_mat); surftool->commit(scale_plane_gizmo[i]); + + Ref<SpatialMaterial> plane_mat_hl = plane_mat->duplicate(); + plane_mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0)); + plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides } } } @@ -5613,7 +5621,8 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { ED_SHORTCUT("spatial_editor/insert_anim_key", TTR("Insert Animation Key"), KEY_K); ED_SHORTCUT("spatial_editor/focus_origin", TTR("Focus Origin"), KEY_O); ED_SHORTCUT("spatial_editor/focus_selection", TTR("Focus Selection"), KEY_F); - ED_SHORTCUT("spatial_editor/align_selection_with_view", TTR("Align Selection With View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F); + ED_SHORTCUT("spatial_editor/align_transform_with_view", TTR("Align Transform with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_M); + ED_SHORTCUT("spatial_editor/align_rotation_with_view", TTR("Align Rotation with View"), KEY_MASK_ALT + KEY_MASK_CMD + KEY_F); ED_SHORTCUT("spatial_editor/tool_select", TTR("Tool Select"), KEY_Q); ED_SHORTCUT("spatial_editor/tool_move", TTR("Tool Move"), KEY_W); @@ -5816,7 +5825,8 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { EDITOR_DEF("editors/3d/manipulator_gizmo_size", 80); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "editors/3d/manipulator_gizmo_size", PROPERTY_HINT_RANGE, "16,1024,1")); - EDITOR_DEF("editors/3d/manipulator_gizmo_opacity", 0.2); + EDITOR_DEF("editors/3d/manipulator_gizmo_opacity", 0.4); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::REAL, "editors/3d/manipulator_gizmo_opacity", PROPERTY_HINT_RANGE, "0,1,0.01")); over_gizmo_handle = -1; } diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 0404115269..523573333b 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -153,7 +153,8 @@ class SpatialEditorViewport : public Control { VIEW_REAR, VIEW_CENTER_TO_ORIGIN, VIEW_CENTER_TO_SELECTION, - VIEW_ALIGN_SELECTION_WITH_VIEW, + VIEW_ALIGN_TRANSFORM_WITH_VIEW, + VIEW_ALIGN_ROTATION_WITH_VIEW, VIEW_PERSPECTIVE, VIEW_ENVIRONMENT, VIEW_ORTHOGONAL, @@ -364,7 +365,7 @@ private: Camera *preview; bool previewing_cinema; - + bool _is_node_locked(const Node *p_node); void _preview_exited_scene(); void _toggle_camera_preview(bool); void _toggle_cinema_preview(bool); @@ -376,7 +377,7 @@ private: Point2i _get_warped_mouse_motion(const Ref<InputEventMouseMotion> &p_ev_mouse_motion) const; Vector3 _get_instance_position(const Point2 &p_pos) const; - static AABB _calculate_spatial_bounds(const Spatial *p_parent, const AABB p_bounds); + static AABB _calculate_spatial_bounds(const Spatial *p_parent, const AABB &p_bounds); void _create_preview(const Vector<String> &files) const; void _remove_preview(); bool _cyclical_dependency_exists(const String &p_target_scene_path, Node *p_desired_node); @@ -527,7 +528,8 @@ private: Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[3], scale_gizmo[3], scale_plane_gizmo[3]; Ref<SpatialMaterial> gizmo_color[3]; Ref<SpatialMaterial> plane_gizmo_color[3]; - Ref<SpatialMaterial> gizmo_hl; + Ref<SpatialMaterial> gizmo_color_hl[3]; + Ref<SpatialMaterial> plane_gizmo_color_hl[3]; int over_gizmo_handle; @@ -634,6 +636,7 @@ private: Node *custom_camera; Object *_get_editor_data(Object *p_what); + Color _get_axis_color(int axis); Ref<Environment> viewport_environment; diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index fae88f4eb7..34d8e6aff5 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -695,5 +695,14 @@ TextEditor::TextEditor() { code_editor->get_text_edit()->set_drag_forwarding(this); } +TextEditor::~TextEditor() { + for (const Map<String, SyntaxHighlighter *>::Element *E = highlighters.front(); E; E = E->next()) { + if (E->get() != NULL) { + memdelete(E->get()); + } + } + highlighters.clear(); +} + void TextEditor::validate() { } diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index ae0c0bcf93..3a330576ae 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -154,6 +154,7 @@ public: static void register_editor(); TextEditor(); + ~TextEditor(); }; #endif // TEXT_EDITOR_H diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp index 0aa4a7662c..6d71c56ead 100644 --- a/editor/plugins/texture_editor_plugin.cpp +++ b/editor/plugins/texture_editor_plugin.cpp @@ -39,9 +39,6 @@ void TextureEditor::_gui_input(Ref<InputEvent> p_event) { void TextureEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_PHYSICS_PROCESS) { - } - if (p_what == NOTIFICATION_READY) { //get_scene()->connect("node_removed",this,"_node_removed"); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 8f58fbd6ab..4d349f06b7 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -193,7 +193,7 @@ void TextureRegionEditor::_region_draw() { updating_scroll = false; if (node_ninepatch || obj_styleBox.is_valid()) { - float margins[4]; + float margins[4] = { 0 }; if (node_ninepatch) { margins[0] = node_ninepatch->get_patch_margin(MARGIN_TOP); margins[1] = node_ninepatch->get_patch_margin(MARGIN_BOTTOM); @@ -204,12 +204,8 @@ void TextureRegionEditor::_region_draw() { margins[1] = obj_styleBox->get_margin_size(MARGIN_BOTTOM); margins[2] = obj_styleBox->get_margin_size(MARGIN_LEFT); margins[3] = obj_styleBox->get_margin_size(MARGIN_RIGHT); - } else { - margins[0] = 0; - margins[1] = 0; - margins[2] = 0; - margins[3] = 0; } + Vector2 pos[4] = { mtx.basis_xform(Vector2(0, margins[0])) + Vector2(0, endpoints[0].y - draw_ofs.y * draw_zoom), -mtx.basis_xform(Vector2(0, margins[1])) + Vector2(0, endpoints[2].y - draw_ofs.y * draw_zoom), @@ -248,7 +244,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { if (mb->is_pressed()) { if (node_ninepatch || obj_styleBox.is_valid()) { edited_margin = -1; - float margins[4]; + float margins[4] = { 0 }; if (node_ninepatch) { margins[0] = node_ninepatch->get_patch_margin(MARGIN_TOP); margins[1] = node_ninepatch->get_patch_margin(MARGIN_BOTTOM); @@ -260,6 +256,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { margins[2] = obj_styleBox->get_margin_size(MARGIN_LEFT); margins[3] = obj_styleBox->get_margin_size(MARGIN_RIGHT); } + Vector2 pos[4] = { mtx.basis_xform(rect.position + Vector2(0, margins[0])) - draw_ofs * draw_zoom, mtx.basis_xform(rect.position + rect.size - Vector2(0, margins[1])) - draw_ofs * draw_zoom, @@ -1021,15 +1018,21 @@ bool TextureRegionEditorPlugin::handles(Object *p_object) const { return p_object->is_class("Sprite") || p_object->is_class("Sprite3D") || p_object->is_class("NinePatchRect") || p_object->is_class("StyleBoxTexture") || p_object->is_class("AtlasTexture"); } +void TextureRegionEditorPlugin::_editor_visiblity_changed() { + manually_hidden = !region_editor->is_visible_in_tree(); +} + void TextureRegionEditorPlugin::make_visible(bool p_visible) { if (p_visible) { texture_region_button->show(); - if (region_editor->is_stylebox() || region_editor->is_atlas_texture() || region_editor->is_ninepatch() || (region_editor->get_sprite() && region_editor->get_sprite()->is_region()) || (region_editor->get_sprite_3d() && region_editor->get_sprite_3d()->is_region()) || texture_region_button->is_pressed()) { + bool is_node_configured = region_editor->is_stylebox() || region_editor->is_atlas_texture() || region_editor->is_ninepatch() || (region_editor->get_sprite() && region_editor->get_sprite()->is_region()) || (region_editor->get_sprite_3d() && region_editor->get_sprite_3d()->is_region()); + if ((is_node_configured && !manually_hidden) || texture_region_button->is_pressed()) { editor->make_bottom_panel_item_visible(region_editor); } } else { if (region_editor->is_visible_in_tree()) { editor->hide_bottom_panel(); + manually_hidden = false; } texture_region_button->hide(); region_editor->edit(NULL); @@ -1076,12 +1079,18 @@ void TextureRegionEditorPlugin::set_state(const Dictionary &p_state) { } } +void TextureRegionEditorPlugin::_bind_methods() { + ClassDB::bind_method(D_METHOD("_editor_visiblity_changed"), &TextureRegionEditorPlugin::_editor_visiblity_changed); +} + TextureRegionEditorPlugin::TextureRegionEditorPlugin(EditorNode *p_node) { + manually_hidden = false; editor = p_node; - region_editor = memnew(TextureRegionEditor(p_node)); + region_editor = memnew(TextureRegionEditor(p_node)); region_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE); region_editor->hide(); + region_editor->connect("visibility_changed", this, "_editor_visiblity_changed"); texture_region_button = p_node->add_bottom_panel_item(TTR("TextureRegion"), region_editor); texture_region_button->hide(); diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h index a49e0fb96c..4eb84ae176 100644 --- a/editor/plugins/texture_region_editor_plugin.h +++ b/editor/plugins/texture_region_editor_plugin.h @@ -145,10 +145,16 @@ public: class TextureRegionEditorPlugin : public EditorPlugin { GDCLASS(TextureRegionEditorPlugin, EditorPlugin); + bool manually_hidden; Button *texture_region_button; TextureRegionEditor *region_editor; EditorNode *editor; +protected: + static void _bind_methods(); + + void _editor_visiblity_changed(); + public: virtual String get_name() const { return "TextureRegion"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 3735cceb15..766890242f 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -281,7 +281,7 @@ void TileMapEditor::_finish_undo() { undo_redo->commit_action(); } -void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord) { +void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord) { ERR_FAIL_COND(!node); @@ -693,7 +693,7 @@ PoolVector<Vector2> TileMapEditor::_bucket_fill(const Point2i &p_start, bool era return preview ? bucket_cache : points; } -void TileMapEditor::_fill_points(const PoolVector<Vector2> p_points, const Dictionary &p_op) { +void TileMapEditor::_fill_points(const PoolVector<Vector2> &p_points, const Dictionary &p_op) { int len = p_points.size(); PoolVector<Vector2>::Read pr = p_points.read(); @@ -711,7 +711,7 @@ void TileMapEditor::_fill_points(const PoolVector<Vector2> p_points, const Dicti node->update_dirty_bitmask(); } -void TileMapEditor::_erase_points(const PoolVector<Vector2> p_points) { +void TileMapEditor::_erase_points(const PoolVector<Vector2> &p_points) { int len = p_points.size(); PoolVector<Vector2>::Read pr = p_points.read(); @@ -754,7 +754,7 @@ void TileMapEditor::_erase_selection() { } } -void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord, const Transform2D &p_xform) { +void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform) { Ref<Texture> t = node->get_tileset()->tile_get_texture(p_cell); @@ -875,7 +875,7 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p } } -void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord, const Transform2D &p_xform) { +void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform) { PoolVector<Vector2> points = _bucket_fill(p_point, false, true); PoolVector<Vector2>::Read pr = points.read(); @@ -1467,15 +1467,28 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return true; } - if (ED_IS_SHORTCUT("tile_map_editor/mirror_x", p_event)) { - flip_h = !flip_h; - _update_palette(); + if (ED_IS_SHORTCUT("tile_map_editor/rotate_left", p_event)) { + _rotate(-1); CanvasItemEditor::get_singleton()->update_viewport(); return true; } - if (ED_IS_SHORTCUT("tile_map_editor/mirror_y", p_event)) { - flip_v = !flip_v; - _update_palette(); + if (ED_IS_SHORTCUT("tile_map_editor/rotate_right", p_event)) { + _rotate(1); + CanvasItemEditor::get_singleton()->update_viewport(); + return true; + } + if (ED_IS_SHORTCUT("tile_map_editor/flip_horizontal", p_event)) { + _flip_horizontal(); + CanvasItemEditor::get_singleton()->update_viewport(); + return true; + } + if (ED_IS_SHORTCUT("tile_map_editor/flip_vertical", p_event)) { + _flip_vertical(); + CanvasItemEditor::get_singleton()->update_viewport(); + return true; + } + if (ED_IS_SHORTCUT("tile_map_editor/clear_transform", p_event)) { + _clear_transform(); CanvasItemEditor::get_singleton()->update_viewport(); return true; } @@ -1917,8 +1930,6 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) { ED_SHORTCUT("tile_map_editor/erase_selection", TTR("Erase Selection"), KEY_DELETE); ED_SHORTCUT("tile_map_editor/find_tile", TTR("Find Tile"), KEY_MASK_CMD + KEY_F); ED_SHORTCUT("tile_map_editor/transpose", TTR("Transpose"), KEY_T); - ED_SHORTCUT("tile_map_editor/mirror_x", TTR("Mirror X"), KEY_A); - ED_SHORTCUT("tile_map_editor/mirror_y", TTR("Mirror Y"), KEY_S); HBoxContainer *tool_hb = memnew(HBoxContainer); add_child(tool_hb); @@ -2044,30 +2055,35 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) { rotate_left_button->set_tooltip(TTR("Rotate Left")); rotate_left_button->set_focus_mode(FOCUS_NONE); rotate_left_button->connect("pressed", this, "_rotate", varray(-1)); + rotate_left_button->set_shortcut(ED_SHORTCUT("tile_map_editor/rotate_left", TTR("Rotate Left"), KEY_A)); tool_hb->add_child(rotate_left_button); rotate_right_button = memnew(ToolButton); rotate_right_button->set_tooltip(TTR("Rotate Right")); rotate_right_button->set_focus_mode(FOCUS_NONE); rotate_right_button->connect("pressed", this, "_rotate", varray(1)); + rotate_right_button->set_shortcut(ED_SHORTCUT("tile_map_editor/rotate_right", TTR("Rotate Right"), KEY_S)); tool_hb->add_child(rotate_right_button); flip_horizontal_button = memnew(ToolButton); flip_horizontal_button->set_tooltip(TTR("Flip Horizontally")); flip_horizontal_button->set_focus_mode(FOCUS_NONE); flip_horizontal_button->connect("pressed", this, "_flip_horizontal"); + flip_horizontal_button->set_shortcut(ED_SHORTCUT("tile_map_editor/flip_horizontal", TTR("Flip Horizontally"), KEY_X)); tool_hb->add_child(flip_horizontal_button); flip_vertical_button = memnew(ToolButton); flip_vertical_button->set_tooltip(TTR("Flip Vertically")); flip_vertical_button->set_focus_mode(FOCUS_NONE); flip_vertical_button->connect("pressed", this, "_flip_vertical"); + flip_vertical_button->set_shortcut(ED_SHORTCUT("tile_map_editor/flip_vertical", TTR("Flip Vertically"), KEY_Z)); tool_hb->add_child(flip_vertical_button); clear_transform_button = memnew(ToolButton); clear_transform_button->set_tooltip(TTR("Clear Transform")); clear_transform_button->set_focus_mode(FOCUS_NONE); clear_transform_button->connect("pressed", this, "_clear_transform"); + clear_transform_button->set_shortcut(ED_SHORTCUT("tile_map_editor/clear_transform", TTR("Clear Transform"), KEY_W)); tool_hb->add_child(clear_transform_button); clear_transform_button->set_disabled(true); diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h index 3f0abd1e6e..3331fb971f 100644 --- a/editor/plugins/tile_map_editor_plugin.h +++ b/editor/plugins/tile_map_editor_plugin.h @@ -169,14 +169,14 @@ class TileMapEditor : public VBoxContainer { PoolVector<Vector2> _bucket_fill(const Point2i &p_start, bool erase = false, bool preview = false); - void _fill_points(const PoolVector<Vector2> p_points, const Dictionary &p_op); - void _erase_points(const PoolVector<Vector2> p_points); + void _fill_points(const PoolVector<Vector2> &p_points, const Dictionary &p_op); + void _erase_points(const PoolVector<Vector2> &p_points); void _select(const Point2i &p_from, const Point2i &p_to); void _erase_selection(); - void _draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord, const Transform2D &p_xform); - void _draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord, const Transform2D &p_xform); + void _draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform); + void _draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform); void _clear_bucket_cache(); void _update_copydata(); @@ -200,7 +200,7 @@ class TileMapEditor : public VBoxContainer { void _start_undo(const String &p_action); void _finish_undo(); void _create_set_cell_undo_redo(const Vector2 &p_vec, const CellOp &p_cell_old, const CellOp &p_cell_new); - void _set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false, const Point2i p_autotile_coord = Point2()); + void _set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false, const Point2i &p_autotile_coord = Point2()); void _canvas_mouse_enter(); void _canvas_mouse_exit(); diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index 2b59787f17..f135becf5f 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -1833,7 +1833,7 @@ Vector<Vector2> TileSetEditor::_get_edited_shape_points() { return _get_collision_shape_points(edited_collision_shape); } -void TileSetEditor::_set_edited_shape_points(const Vector<Vector2> points) { +void TileSetEditor::_set_edited_shape_points(const Vector<Vector2> &points) { Ref<ConvexPolygonShape2D> convex = edited_collision_shape; Ref<ConcavePolygonShape2D> concave = edited_collision_shape; if (convex.is_valid()) { diff --git a/editor/plugins/tile_set_editor_plugin.h b/editor/plugins/tile_set_editor_plugin.h index 04e8d65155..69ad8205a4 100644 --- a/editor/plugins/tile_set_editor_plugin.h +++ b/editor/plugins/tile_set_editor_plugin.h @@ -201,7 +201,7 @@ private: void _on_grid_snap_toggled(bool p_val); Vector<Vector2> _get_collision_shape_points(const Ref<Shape2D> &p_shape); Vector<Vector2> _get_edited_shape_points(); - void _set_edited_shape_points(const Vector<Vector2> points); + void _set_edited_shape_points(const Vector<Vector2> &points); void _update_tile_data(); void _update_toggle_shape_button(); void _select_next_tile(); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 7b4ae0f2e9..4f7b9f9815 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -184,6 +184,11 @@ void VisualShaderEditor::_update_options_menu() { int item_count2 = 0; bool is_first_item = true; + Color unsupported_color = get_color("error_color", "Editor"); + Color supported_color = get_color("warning_color", "Editor"); + + static bool low_driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name") == "GLES2"; + int current_func = -1; if (!visual_shader.is_null()) { @@ -239,6 +244,10 @@ void VisualShaderEditor::_update_options_menu() { if ((add_options[i].func == current_func || add_options[i].func == -1) && _is_available(add_options[i].mode)) { ++item_count2; TreeItem *item = members->create_item(sub_category); + if (add_options[i].highend && low_driver) + item->set_custom_color(0, unsupported_color); + else if (add_options[i].highend) + item->set_custom_color(0, supported_color); item->set_text(0, add_options[i].name); if (is_first_item) { item->select(0); @@ -271,6 +280,10 @@ void VisualShaderEditor::_update_options_menu() { if ((add_options[i].func == current_func || add_options[i].func == -1) && _is_available(add_options[i].mode)) { ++item_count; TreeItem *item = members->create_item(category); + if (add_options[i].highend && low_driver) + item->set_custom_color(0, unsupported_color); + else if (add_options[i].highend) + item->set_custom_color(0, supported_color); item->set_text(0, add_options[i].name); switch (add_options[i].return_type) { case VisualShaderNode::PORT_TYPE_SCALAR: @@ -365,10 +378,10 @@ void VisualShaderEditor::_update_graph() { } static const Color type_color[4] = { - Color::html("#61daf4"), // scalar - Color::html("#d67dee"), // vector - Color::html("#8da6f0"), // boolean - Color::html("#f6a86e") // transform + Color(0.38, 0.85, 0.96), // scalar + Color(0.84, 0.49, 0.93), // vector + Color(0.55, 0.65, 0.94), // boolean + Color(0.96, 0.66, 0.43) // transform }; List<VisualShader::Connection> connections; @@ -425,7 +438,7 @@ void VisualShaderEditor::_update_graph() { int port_offset = 0; if (is_group) { - port_offset++; + port_offset += 2; } Ref<VisualShaderNodeUniform> uniform = vsnode; @@ -464,6 +477,11 @@ void VisualShaderEditor::_update_graph() { } if (is_group) { + + offset = memnew(Control); + offset->set_custom_minimum_size(Size2(0, 6 * EDSCALE)); + node->add_child(offset); + HBoxContainer *hb2 = memnew(HBoxContainer); Button *add_input_btn = memnew(Button); @@ -511,6 +529,7 @@ void VisualShaderEditor::_update_graph() { } HBoxContainer *hb = memnew(HBoxContainer); + hb->add_constant_override("separation", 7 * EDSCALE); Variant default_value; @@ -529,6 +548,9 @@ void VisualShaderEditor::_update_graph() { button->set_custom_minimum_size(Size2(30, 0) * EDSCALE); button->connect("draw", this, "_draw_color_over_button", varray(button, default_value)); } break; + case Variant::BOOL: { + button->set_text(((bool)default_value) ? "true" : "false"); + } break; case Variant::INT: case Variant::REAL: { button->set_text(String::num(default_value, 4)); @@ -543,7 +565,6 @@ void VisualShaderEditor::_update_graph() { } if (i == 0 && custom_editor) { - hb->add_child(custom_editor); custom_editor->set_h_size_flags(SIZE_EXPAND_FILL); } else { @@ -551,7 +572,6 @@ void VisualShaderEditor::_update_graph() { if (valid_left) { if (is_group) { - OptionButton *type_box = memnew(OptionButton); hb->add_child(type_box); type_box->add_item(TTR("Scalar")); @@ -564,9 +584,9 @@ void VisualShaderEditor::_update_graph() { LineEdit *name_box = memnew(LineEdit); hb->add_child(name_box); - name_box->set_custom_minimum_size(Size2(60 * EDSCALE, 0)); + name_box->set_custom_minimum_size(Size2(65 * EDSCALE, 0)); + name_box->set_h_size_flags(SIZE_EXPAND_FILL); name_box->set_text(name_left); - name_box->set_expand_to_text_length(true); name_box->connect("text_entered", this, "_change_input_port_name", varray(name_box, nodes[n_i], i)); name_box->connect("focus_exited", this, "_port_name_focus_out", varray(name_box, nodes[n_i], i, false)); @@ -584,7 +604,9 @@ void VisualShaderEditor::_update_graph() { } } - hb->add_spacer(); + if (!is_group) { + hb->add_spacer(); + } if (valid_right) { if (is_group) { @@ -596,9 +618,9 @@ void VisualShaderEditor::_update_graph() { LineEdit *name_box = memnew(LineEdit); hb->add_child(name_box); - name_box->set_custom_minimum_size(Size2(60 * EDSCALE, 0)); + name_box->set_custom_minimum_size(Size2(65 * EDSCALE, 0)); + name_box->set_h_size_flags(SIZE_EXPAND_FILL); name_box->set_text(name_right); - name_box->set_expand_to_text_length(true); name_box->connect("text_entered", this, "_change_output_port_name", varray(name_box, nodes[n_i], i)); name_box->connect("focus_exited", this, "_port_name_focus_out", varray(name_box, nodes[n_i], i, true)); @@ -659,7 +681,7 @@ void VisualShaderEditor::_update_graph() { } offset = memnew(Control); - offset->set_custom_minimum_size(Size2(0, 5 * EDSCALE)); + offset->set_custom_minimum_size(Size2(0, 4 * EDSCALE)); node->add_child(offset); String error = vsnode->get_warning(visual_shader->get_mode(), type); @@ -676,12 +698,14 @@ void VisualShaderEditor::_update_graph() { expression_node->set_control(expression_box, 0); node->add_child(expression_box); + Color background_color = EDITOR_GET("text_editor/highlighting/background_color"); Color text_color = EDITOR_GET("text_editor/highlighting/text_color"); Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color"); Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color"); Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color"); expression_box->set_syntax_coloring(true); + expression_box->add_color_override("background_color", background_color); for (List<String>::Element *E = keyword_list.front(); E; E = E->next()) { @@ -994,7 +1018,7 @@ void VisualShaderEditor::_node_resized(const Vector2 &p_new_size, int p_type, in } undo_redo->create_action(TTR("Resize VisualShader node"), UndoRedo::MERGE_ENDS); - undo_redo->add_do_method(this, "_set_node_size", p_type, p_node, p_new_size / EDSCALE); + undo_redo->add_do_method(this, "_set_node_size", p_type, p_node, p_new_size); undo_redo->add_undo_method(this, "_set_node_size", p_type, p_node, node->get_size()); undo_redo->commit_action(); } @@ -1150,6 +1174,18 @@ void VisualShaderEditor::_add_node(int p_idx, int p_op_idx) { input->set_input_name(add_options[p_idx].sub_func_str); } + VisualShaderNodeIs *is = Object::cast_to<VisualShaderNodeIs>(vsn); + + if (is) { + is->set_function((VisualShaderNodeIs::Function)p_op_idx); + } + + VisualShaderNodeCompare *cmp = Object::cast_to<VisualShaderNodeCompare>(vsn); + + if (cmp) { + cmp->set_function((VisualShaderNodeCompare::Function)p_op_idx); + } + VisualShaderNodeColorOp *colorOp = Object::cast_to<VisualShaderNodeColorOp>(vsn); if (colorOp) { @@ -1351,6 +1387,9 @@ void VisualShaderEditor::_delete_request(int which) { undo_redo->add_do_method(visual_shader.ptr(), "remove_node", type, which); undo_redo->add_undo_method(visual_shader.ptr(), "add_node", type, node, visual_shader->get_node_position(type, which), which); + undo_redo->add_do_method(this, "_clear_buffer"); + undo_redo->add_undo_method(this, "_clear_buffer"); + // restore size, inputs and outputs if node is group VisualShaderNodeGroupBase *group = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr()); if (group) { @@ -1395,7 +1434,7 @@ void VisualShaderEditor::_node_selected(Object *p_node) { //EditorNode::get_singleton()->push_item(vsnode.ptr(), "", true); } -void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> p_event) { +void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; @@ -1485,7 +1524,6 @@ void VisualShaderEditor::_notification(int p_what) { if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree()) _update_graph(); - } else if (p_what == NOTIFICATION_PROCESS) { } } @@ -1506,12 +1544,32 @@ void VisualShaderEditor::_node_changed(int p_id) { } } -void VisualShaderEditor::_duplicate_nodes() { +void VisualShaderEditor::_dup_update_excluded(int p_type, Set<int> &r_excluded) { + r_excluded.clear(); + VisualShader::Type type = (VisualShader::Type)p_type; - VisualShader::Type type = VisualShader::Type(edit_type->get_selected()); + for (int i = 0; i < graph->get_child_count(); i++) { - List<int> nodes; - Set<int> excluded; + GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i)); + if (gn) { + int id = String(gn->get_name()).to_int(); + Ref<VisualShaderNode> node = visual_shader->get_node(type, id); + Ref<VisualShaderNodeOutput> output = node; + if (output.is_valid()) { + r_excluded.insert(id); + continue; + } + r_excluded.insert(id); + } + } +} + +void VisualShaderEditor::_dup_copy_nodes(int p_type, List<int> &r_nodes, Set<int> &r_excluded) { + + VisualShader::Type type = (VisualShader::Type)p_type; + + selection_center.x = 0.0f; + selection_center.y = 0.0f; for (int i = 0; i < graph->get_child_count(); i++) { @@ -1521,33 +1579,37 @@ void VisualShaderEditor::_duplicate_nodes() { Ref<VisualShaderNode> node = visual_shader->get_node(type, id); Ref<VisualShaderNodeOutput> output = node; if (output.is_valid()) { // can't duplicate output - excluded.insert(id); + r_excluded.insert(id); continue; } if (node.is_valid() && gn->is_selected()) { - nodes.push_back(id); + Vector2 pos = visual_shader->get_node_position(type, id); + selection_center += pos; + r_nodes.push_back(id); } - excluded.insert(id); + r_excluded.insert(id); } } - if (nodes.empty()) - return; + selection_center /= (float)r_nodes.size(); +} - undo_redo->create_action(TTR("Duplicate Nodes")); +void VisualShaderEditor::_dup_paste_nodes(int p_type, List<int> &r_nodes, Set<int> &r_excluded, const Vector2 &p_offset, bool p_select) { + + VisualShader::Type type = (VisualShader::Type)p_type; int base_id = visual_shader->get_valid_node_id(type); int id_from = base_id; Map<int, int> connection_remap; - for (List<int>::Element *E = nodes.front(); E; E = E->next()) { + for (List<int>::Element *E = r_nodes.front(); E; E = E->next()) { connection_remap[E->get()] = id_from; Ref<VisualShaderNode> node = visual_shader->get_node(type, E->get()); Ref<VisualShaderNode> dupli = node->duplicate(); - undo_redo->add_do_method(visual_shader.ptr(), "add_node", type, dupli, visual_shader->get_node_position(type, E->get()) + Vector2(10, 10) * EDSCALE, id_from); + undo_redo->add_do_method(visual_shader.ptr(), "add_node", type, dupli, visual_shader->get_node_position(type, E->get()) + p_offset, id_from); undo_redo->add_undo_method(visual_shader.ptr(), "remove_node", type, id_from); // duplicate size, inputs and outputs if node is group @@ -1579,21 +1641,71 @@ void VisualShaderEditor::_duplicate_nodes() { undo_redo->add_undo_method(this, "_update_graph"); undo_redo->commit_action(); - // reselect duplicated nodes by excluding the other ones - for (int i = 0; i < graph->get_child_count(); i++) { - - GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i)); - if (gn) { - int id = String(gn->get_name()).to_int(); - if (!excluded.has(id)) { - gn->set_selected(true); - } else { - gn->set_selected(false); + if (p_select) { + // reselect duplicated nodes by excluding the other ones + for (int i = 0; i < graph->get_child_count(); i++) { + + GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i)); + if (gn) { + int id = String(gn->get_name()).to_int(); + if (!r_excluded.has(id)) { + gn->set_selected(true); + } else { + gn->set_selected(false); + } } } } } +void VisualShaderEditor::_clear_buffer() { + + copy_nodes_buffer.clear(); + copy_nodes_excluded_buffer.clear(); +} + +void VisualShaderEditor::_duplicate_nodes() { + + int type = edit_type->get_selected(); + + List<int> nodes; + Set<int> excluded; + + _dup_copy_nodes(type, nodes, excluded); + + if (nodes.empty()) + return; + + undo_redo->create_action(TTR("Duplicate Nodes")); + + _dup_paste_nodes(type, nodes, excluded, Vector2(10, 10) * EDSCALE, true); +} + +void VisualShaderEditor::_copy_nodes() { + + copy_type = edit_type->get_selected(); + + _clear_buffer(); + + _dup_copy_nodes(copy_type, copy_nodes_buffer, copy_nodes_excluded_buffer); +} + +void VisualShaderEditor::_paste_nodes() { + + if (copy_nodes_buffer.empty()) + return; + + int type = edit_type->get_selected(); + + undo_redo->create_action(TTR("Paste Nodes")); + + float scale = graph->get_zoom(); + + _dup_paste_nodes(type, copy_nodes_buffer, copy_nodes_excluded_buffer, (graph->get_scroll_ofs() / scale + graph->get_local_mouse_position() / scale - selection_center), false); + + _dup_update_excluded(type, copy_nodes_excluded_buffer); // to prevent selection of previous copies at new paste +} + void VisualShaderEditor::_on_nodes_delete() { VisualShader::Type type = VisualShader::Type(edit_type->get_selected()); @@ -1620,6 +1732,9 @@ void VisualShaderEditor::_on_nodes_delete() { undo_redo->add_do_method(visual_shader.ptr(), "remove_node", type, F->get()); undo_redo->add_undo_method(visual_shader.ptr(), "add_node", type, node, visual_shader->get_node_position(type, F->get()), F->get()); + undo_redo->add_do_method(this, "_clear_buffer"); + undo_redo->add_undo_method(this, "_clear_buffer"); + // restore size, inputs and outputs if node is group VisualShaderNodeGroupBase *group = Object::cast_to<VisualShaderNodeGroupBase>(node.ptr()); if (group) { @@ -1664,6 +1779,10 @@ void VisualShaderEditor::_on_nodes_delete() { } void VisualShaderEditor::_mode_selected(int p_id) { + + copy_nodes_buffer.clear(); + copy_nodes_excluded_buffer.clear(); + _update_options_menu(); _update_graph(); } @@ -1711,7 +1830,11 @@ void VisualShaderEditor::_member_selected() { if (item != NULL && item->has_meta("id")) { members_dialog->get_ok()->set_disabled(false); - node_desc->set_text(add_options[item->get_meta("id")].description); + if (add_options[item->get_meta("id")].highend) { + node_desc->set_text(TTR("(GLES3 only)") + " " + add_options[item->get_meta("id")].description); // TODO: change it to (Vulkan Only) when its ready + } else { + node_desc->set_text(add_options[item->get_meta("id")].description); + } } else { members_dialog->get_ok()->set_disabled(true); node_desc->set_text(""); @@ -1853,6 +1976,8 @@ void VisualShaderEditor::_bind_methods() { ClassDB::bind_method("_line_edit_changed", &VisualShaderEditor::_line_edit_changed); ClassDB::bind_method("_port_name_focus_out", &VisualShaderEditor::_port_name_focus_out); ClassDB::bind_method("_duplicate_nodes", &VisualShaderEditor::_duplicate_nodes); + ClassDB::bind_method("_copy_nodes", &VisualShaderEditor::_copy_nodes); + ClassDB::bind_method("_paste_nodes", &VisualShaderEditor::_paste_nodes); ClassDB::bind_method("_mode_selected", &VisualShaderEditor::_mode_selected); ClassDB::bind_method("_input_select_item", &VisualShaderEditor::_input_select_item); ClassDB::bind_method("_preview_select_port", &VisualShaderEditor::_preview_select_port); @@ -1867,6 +1992,7 @@ void VisualShaderEditor::_bind_methods() { ClassDB::bind_method("_remove_output_port", &VisualShaderEditor::_remove_output_port); ClassDB::bind_method("_node_resized", &VisualShaderEditor::_node_resized); ClassDB::bind_method("_set_node_size", &VisualShaderEditor::_set_node_size); + ClassDB::bind_method("_clear_buffer", &VisualShaderEditor::_clear_buffer); ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &VisualShaderEditor::get_drag_data_fw); ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &VisualShaderEditor::can_drop_data_fw); @@ -1912,6 +2038,8 @@ VisualShaderEditor::VisualShaderEditor() { graph->connect("node_selected", this, "_node_selected"); graph->connect("scroll_offset_changed", this, "_scroll_changed"); graph->connect("duplicate_nodes_request", this, "_duplicate_nodes"); + graph->connect("copy_nodes_request", this, "_copy_nodes"); + graph->connect("paste_nodes_request", this, "_paste_nodes"); graph->connect("delete_nodes_request", this, "_on_nodes_delete"); graph->connect("gui_input", this, "_graph_gui_input"); graph->connect("connection_to_empty", this, "_connection_to_empty"); @@ -2039,10 +2167,24 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("ColorConstant", "Color", "Variables", "VisualShaderNodeColorConstant", TTR("Color constant."), -1, VisualShaderNode::PORT_TYPE_COLOR)); add_options.push_back(AddOption("ColorUniform", "Color", "Variables", "VisualShaderNodeColorUniform", TTR("Color uniform."), -1, VisualShaderNode::PORT_TYPE_COLOR)); - // BOOLEAN + // CONDITIONAL + + const String &compare_func_desc = TTR("Returns the boolean result of the %s comparison between two parameters."); + add_options.push_back(AddOption("Equal", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Equal (==)")), VisualShaderNodeCompare::FUNC_EQUAL, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("GreaterThan", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Greater Than (>)")), VisualShaderNodeCompare::FUNC_GREATER_THAN, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("GreaterThanEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Greater Than or Equal (>=)")), VisualShaderNodeCompare::FUNC_GREATER_THAN_EQUAL, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("If", "Conditional", "Functions", "VisualShaderNodeIf", TTR("Returns an associated vector if the provided scalars are equal, greater or less."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("IsInf", "Conditional", "Functions", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between INF and a scalar parameter."), VisualShaderNodeIs::FUNC_IS_INF, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("IsNaN", "Conditional", "Functions", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between NaN and a scalar parameter."), VisualShaderNodeIs::FUNC_IS_NAN, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("LessThan", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Less Than (<)")), VisualShaderNodeCompare::FUNC_LESS_THAN, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("LessThanEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Less Than or Equal (<=)")), VisualShaderNodeCompare::FUNC_LESS_THAN_EQUAL, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("NotEqual", "Conditional", "Functions", "VisualShaderNodeCompare", vformat(compare_func_desc, TTR("Not Equal (!=)")), VisualShaderNodeCompare::FUNC_NOT_EQUAL, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("Switch", "Conditional", "Functions", "VisualShaderNodeSwitch", TTR("Returns an associated vector if the provided boolean value is true or false."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); + + add_options.push_back(AddOption("Compare", "Conditional", "Common", "VisualShaderNodeCompare", TTR("Returns the boolean result of the comparison between two parameters."), -1, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("Is", "Conditional", "Common", "VisualShaderNodeIs", TTR("Returns the boolean result of the comparison between INF (or NaN) and a scalar parameter."), -1, VisualShaderNode::PORT_TYPE_BOOLEAN)); + add_options.push_back(AddOption("BooleanConstant", "Conditional", "Variables", "VisualShaderNodeBooleanConstant", TTR("Boolean constant."), -1, VisualShaderNode::PORT_TYPE_BOOLEAN)); add_options.push_back(AddOption("BooleanUniform", "Conditional", "Variables", "VisualShaderNodeBooleanUniform", TTR("Boolean uniform."), -1, VisualShaderNode::PORT_TYPE_BOOLEAN)); @@ -2176,16 +2318,16 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Abs", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the absolute value of the parameter."), VisualShaderNodeScalarFunc::FUNC_ABS, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("ACos", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the arc-cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ACOS, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ACosH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Returns the inverse hyperbolic cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ACOSH, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ACosH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ACOSH, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("ASin", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the arc-sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ASIN, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ASinH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Returns the inverse hyperbolic sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ASINH, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ASinH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_ASINH, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("ATan", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the arc-tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_ATAN, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("ATan2", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the arc-tangent of the parameters."), VisualShaderNodeScalarOp::OP_ATAN2, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ATanH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Returns the inverse hyperbolic tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_ATANH, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("ATanH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_ATANH, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Ceil", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), VisualShaderNodeScalarFunc::FUNC_CEIL, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Clamp", "Scalar", "Functions", "VisualShaderNodeScalarClamp", TTR("Constrains a value to lie between two further values."), -1, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Cos", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_COS, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("CosH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Returns the hyperbolic cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_COSH, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("CosH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the hyperbolic cosine of the parameter."), VisualShaderNodeScalarFunc::FUNC_COSH, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Degrees", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Converts a quantity in radians to degrees."), VisualShaderNodeScalarFunc::FUNC_DEGREES, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Exp", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Base-e Exponential."), VisualShaderNodeScalarFunc::FUNC_EXP, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Exp2", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Base-2 Exponential."), VisualShaderNodeScalarFunc::FUNC_EXP2, VisualShaderNode::PORT_TYPE_SCALAR)); @@ -2202,18 +2344,18 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Pow", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Returns the value of the first parameter raised to the power of the second."), VisualShaderNodeScalarOp::OP_POW, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Radians", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Converts a quantity in degrees to radians."), VisualShaderNodeScalarFunc::FUNC_RADIANS, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Reciprocal", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("1.0 / scalar"), VisualShaderNodeScalarFunc::FUNC_RECIPROCAL, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Round", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Finds the nearest integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("RoundEven", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Finds the nearest even integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUNDEVEN, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Round", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("RoundEven", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the nearest even integer to the parameter."), VisualShaderNodeScalarFunc::FUNC_ROUNDEVEN, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Saturate", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Clamps the value between 0.0 and 1.0."), VisualShaderNodeScalarFunc::FUNC_SATURATE, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Sign", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Extracts the sign of the parameter."), VisualShaderNodeScalarFunc::FUNC_SIGN, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Sin", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_SIN, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("SinH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Returns the hyperbolic sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_SINH, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("SinH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the hyperbolic sine of the parameter."), VisualShaderNodeScalarFunc::FUNC_SINH, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Sqrt", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the square root of the parameter."), VisualShaderNodeScalarFunc::FUNC_SQRT, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("SmoothStep", "Scalar", "Functions", "VisualShaderNodeScalarSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if x is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Step", "Scalar", "Functions", "VisualShaderNodeScalarOp", TTR("Step function( scalar(edge), scalar(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."), VisualShaderNodeScalarOp::OP_STEP, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Tan", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_TAN, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("TanH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Returns the hyperbolic tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_TANH, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Trunc", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("(GLES3 only) Finds the truncated value of the parameter."), VisualShaderNodeScalarFunc::FUNC_TRUNC, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("TanH", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Returns the hyperbolic tangent of the parameter."), VisualShaderNodeScalarFunc::FUNC_TANH, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Trunc", "Scalar", "Functions", "VisualShaderNodeScalarFunc", TTR("Finds the truncated value of the parameter."), VisualShaderNodeScalarFunc::FUNC_TRUNC, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Add", "Scalar", "Operators", "VisualShaderNodeScalarOp", TTR("Adds scalar to scalar."), VisualShaderNodeScalarOp::OP_ADD, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Divide", "Scalar", "Operators", "VisualShaderNodeScalarOp", TTR("Divides scalar by scalar."), VisualShaderNodeScalarOp::OP_DIV, VisualShaderNode::PORT_TYPE_SCALAR)); @@ -2229,20 +2371,21 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("CubeMap", "Textures", "Functions", "VisualShaderNodeCubeMap", TTR("Perform the cubic texture lookup."), -1, VisualShaderNode::PORT_TYPE_COLOR)); add_options.push_back(AddOption("Texture", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the texture lookup."), -1, VisualShaderNode::PORT_TYPE_COLOR)); - add_options.push_back(AddOption("CubeMapUniform", "Textures", "Variables", "VisualShaderNodeCubeMapUniform", TTR("Cubic texture uniform."), -1, VisualShaderNode::PORT_TYPE_COLOR)); - add_options.push_back(AddOption("TextureUniform", "Textures", "Variables", "VisualShaderNodeTextureUniform", TTR("2D texture uniform."), -1, VisualShaderNode::PORT_TYPE_COLOR)); + add_options.push_back(AddOption("CubeMapUniform", "Textures", "Variables", "VisualShaderNodeCubeMapUniform", TTR("Cubic texture uniform lookup."), -1, VisualShaderNode::PORT_TYPE_COLOR)); + add_options.push_back(AddOption("TextureUniform", "Textures", "Variables", "VisualShaderNodeTextureUniform", TTR("2D texture uniform lookup."), -1, VisualShaderNode::PORT_TYPE_COLOR)); + add_options.push_back(AddOption("TextureUniformTriplanar", "Textures", "Variables", "VisualShaderNodeTextureUniformTriplanar", TTR("2D texture uniform lookup with triplanar."), -1, VisualShaderNode::PORT_TYPE_COLOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL)); // TRANSFORM add_options.push_back(AddOption("TransformFunc", "Transform", "Common", "VisualShaderNodeTransformFunc", TTR("Transform function."), -1, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("OuterProduct", "Transform", "Composition", "VisualShaderNodeOuterProduct", TTR("(GLES3 only) Calculate the outer product of a pair of vectors.\n\nOuterProduct treats the first parameter 'c' as a column vector (matrix with one column) and the second parameter 'r' as a row vector (matrix with one row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix whose number of rows is the number of components in 'c' and whose number of columns is the number of components in 'r'."), -1, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("OuterProduct", "Transform", "Composition", "VisualShaderNodeOuterProduct", TTR("Calculate the outer product of a pair of vectors.\n\nOuterProduct treats the first parameter 'c' as a column vector (matrix with one column) and the second parameter 'r' as a row vector (matrix with one row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix whose number of rows is the number of components in 'c' and whose number of columns is the number of components in 'r'."), -1, VisualShaderNode::PORT_TYPE_TRANSFORM)); add_options.push_back(AddOption("TransformCompose", "Transform", "Composition", "VisualShaderNodeTransformCompose", TTR("Composes transform from four vectors."), -1, VisualShaderNode::PORT_TYPE_TRANSFORM)); add_options.push_back(AddOption("TransformDecompose", "Transform", "Composition", "VisualShaderNodeTransformDecompose", TTR("Decomposes transform to four vectors."))); - add_options.push_back(AddOption("Determinant", "Transform", "Functions", "VisualShaderNodeDeterminant", TTR("(GLES3 only) Calculates the determinant of a transform."), -1, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("Inverse", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("(GLES3 only) Calculates the inverse of a transform."), VisualShaderNodeTransformFunc::FUNC_INVERSE, VisualShaderNode::PORT_TYPE_TRANSFORM)); - add_options.push_back(AddOption("Transpose", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("(GLES3 only) Calculates the transpose of a transform."), VisualShaderNodeTransformFunc::FUNC_TRANSPOSE, VisualShaderNode::PORT_TYPE_TRANSFORM)); + add_options.push_back(AddOption("Determinant", "Transform", "Functions", "VisualShaderNodeDeterminant", TTR("Calculates the determinant of a transform."), -1, VisualShaderNode::PORT_TYPE_SCALAR)); + add_options.push_back(AddOption("Inverse", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the inverse of a transform."), VisualShaderNodeTransformFunc::FUNC_INVERSE, VisualShaderNode::PORT_TYPE_TRANSFORM, -1, -1, -1, true)); + add_options.push_back(AddOption("Transpose", "Transform", "Functions", "VisualShaderNodeTransformFunc", TTR("Calculates the transpose of a transform."), VisualShaderNodeTransformFunc::FUNC_TRANSPOSE, VisualShaderNode::PORT_TYPE_TRANSFORM)); add_options.push_back(AddOption("TransformMult", "Transform", "Operators", "VisualShaderNodeTransformMult", TTR("Multiplies transform by transform."), -1, VisualShaderNode::PORT_TYPE_TRANSFORM)); add_options.push_back(AddOption("TransformVectorMult", "Transform", "Operators", "VisualShaderNodeTransformVecMult", TTR("Multiplies vector by transform."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); @@ -2260,23 +2403,23 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Abs", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the absolute value of the parameter."), VisualShaderNodeVectorFunc::FUNC_ABS, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("ACos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-cosine of the parameter."), VisualShaderNodeVectorFunc::FUNC_ACOS, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ACosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Returns the inverse hyperbolic cosine of the parameter."), VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("ACosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic cosine of the parameter."), VisualShaderNodeVectorFunc::FUNC_ACOSH, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("ASin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-sine of the parameter."), VisualShaderNodeVectorFunc::FUNC_ASIN, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ASinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Returns the inverse hyperbolic sine of the parameter."), VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("ASinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic sine of the parameter."), VisualShaderNodeVectorFunc::FUNC_ASINH, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("ATan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the arc-tangent of the parameter."), VisualShaderNodeVectorFunc::FUNC_ATAN, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("ATan2", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the arc-tangent of the parameters."), VisualShaderNodeVectorOp::OP_ATAN2, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("ATanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Returns the inverse hyperbolic tangent of the parameter."), VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("ATanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse hyperbolic tangent of the parameter."), VisualShaderNodeVectorFunc::FUNC_ATANH, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Ceil", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer that is greater than or equal to the parameter."), VisualShaderNodeVectorFunc::FUNC_CEIL, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Clamp", "Vector", "Functions", "VisualShaderNodeVectorClamp", TTR("Constrains a value to lie between two further values."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Cos", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the cosine of the parameter."), VisualShaderNodeVectorFunc::FUNC_COS, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("CosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Returns the hyperbolic cosine of the parameter."), VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("CosH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic cosine of the parameter."), VisualShaderNodeVectorFunc::FUNC_COSH, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Cross", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Calculates the cross product of two vectors."), VisualShaderNodeVectorOp::OP_CROSS, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Degrees", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in radians to degrees."), VisualShaderNodeVectorFunc::FUNC_DEGREES, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Distance", "Vector", "Functions", "VisualShaderNodeVectorDistance", TTR("Returns the distance between two points."), -1, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Dot", "Vector", "Functions", "VisualShaderNodeDotProduct", TTR("Calculates the dot product of two vectors."), -1, VisualShaderNode::PORT_TYPE_SCALAR)); add_options.push_back(AddOption("Exp", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-e Exponential."), VisualShaderNodeVectorFunc::FUNC_EXP, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Exp2", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Base-2 Exponential."), VisualShaderNodeVectorFunc::FUNC_EXP2, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("FaceForward", "Vector", "Functions", "VisualShaderNodeFaceForward", TTR("Returns a vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("FaceForward", "Vector", "Functions", "VisualShaderNodeFaceForward", TTR("Returns the vector that points in the same direction as a reference vector. The function has three vector parameters : N, the vector to orient, I, the incident vector, and Nref, the reference vector. If the dot product of I and Nref is smaller than zero the return value is N. Otherwise -N is returned."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Floor", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer less than or equal to the parameter."), VisualShaderNodeVectorFunc::FUNC_FLOOR, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Fract", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Computes the fractional part of the argument."), VisualShaderNodeVectorFunc::FUNC_FRAC, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("InverseSqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the inverse of the square root of the parameter."), VisualShaderNodeVectorFunc::FUNC_INVERSE_SQRT, VisualShaderNode::PORT_TYPE_VECTOR)); @@ -2292,22 +2435,22 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Pow", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the value of the first parameter raised to the power of the second."), VisualShaderNodeVectorOp::OP_POW, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Radians", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Converts a quantity in degrees to radians."), VisualShaderNodeVectorFunc::FUNC_RADIANS, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Reciprocal", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("1.0 / vector"), VisualShaderNodeVectorFunc::FUNC_RECIPROCAL, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Reflect", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns a vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Refract", "Vector", "Functions", "VisualShaderNodeVectorRefract", TTR("Returns a vector that points in the direction of refraction."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Finds the nearest integer to the parameter."), VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Finds the nearest even integer to the parameter."), VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("Reflect", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Returns the vector that points in the direction of reflection ( a : incident vector, b : normal vector )."), VisualShaderNodeVectorOp::OP_REFLECT, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("Refract", "Vector", "Functions", "VisualShaderNodeVectorRefract", TTR("Returns the vector that points in the direction of refraction."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("Round", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest integer to the parameter."), VisualShaderNodeVectorFunc::FUNC_ROUND, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("RoundEven", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the nearest even integer to the parameter."), VisualShaderNodeVectorFunc::FUNC_ROUNDEVEN, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Saturate", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Clamps the value between 0.0 and 1.0."), VisualShaderNodeVectorFunc::FUNC_SATURATE, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Sign", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Extracts the sign of the parameter."), VisualShaderNodeVectorFunc::FUNC_SIGN, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Sin", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the sine of the parameter."), VisualShaderNodeVectorFunc::FUNC_SIN, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Returns the hyperbolic sine of the parameter."), VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("SinH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic sine of the parameter."), VisualShaderNodeVectorFunc::FUNC_SINH, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Sqrt", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the square root of the parameter."), VisualShaderNodeVectorFunc::FUNC_SQRT, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("SmoothStep", "Vector", "Functions", "VisualShaderNodeVectorSmoothStep", TTR("SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("SmoothStepS", "Vector", "Functions", "VisualShaderNodeVectorScalarSmoothStep", TTR("SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge0' and 1.0 if 'x' is larger than 'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 using Hermite polynomials."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Step", "Vector", "Functions", "VisualShaderNodeVectorOp", TTR("Step function( vector(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."), VisualShaderNodeVectorOp::OP_STEP, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("StepS", "Vector", "Functions", "VisualShaderNodeVectorScalarStep", TTR("Step function( scalar(edge), vector(x) ).\n\nReturns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0."), -1, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Tan", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the tangent of the parameter."), VisualShaderNodeVectorFunc::FUNC_TAN, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Returns the hyperbolic tangent of the parameter."), VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNode::PORT_TYPE_VECTOR)); - add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("(GLES3 only) Finds the truncated value of the parameter."), VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("TanH", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Returns the hyperbolic tangent of the parameter."), VisualShaderNodeVectorFunc::FUNC_TANH, VisualShaderNode::PORT_TYPE_VECTOR)); + add_options.push_back(AddOption("Trunc", "Vector", "Functions", "VisualShaderNodeVectorFunc", TTR("Finds the truncated value of the parameter."), VisualShaderNodeVectorFunc::FUNC_TRUNC, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Add", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Adds vector to vector."), VisualShaderNodeVectorOp::OP_ADD, VisualShaderNode::PORT_TYPE_VECTOR)); add_options.push_back(AddOption("Divide", "Vector", "Operators", "VisualShaderNodeVectorOp", TTR("Divides vector by vector."), VisualShaderNodeVectorOp::OP_DIV, VisualShaderNode::PORT_TYPE_VECTOR)); @@ -2323,15 +2466,15 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Expression", "Special", "", "VisualShaderNodeExpression", TTR("Custom Godot Shader Language expression, with custom amount of input and output ports. This is a direct injection of code into the vertex/fragment/light function, do not use it to write the function declarations inside."))); add_options.push_back(AddOption("Fresnel", "Special", "", "VisualShaderNodeFresnel", TTR("Returns falloff based on the dot product of surface normal and view direction of camera (pass associated inputs to it)."), -1, VisualShaderNode::PORT_TYPE_SCALAR)); - add_options.push_back(AddOption("ScalarDerivativeFunc", "Special", "Common", "VisualShaderNodeScalarDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) Scalar derivative function."), -1, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT)); - add_options.push_back(AddOption("VectorDerivativeFunc", "Special", "Common", "VisualShaderNodeVectorDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) Vector derivative function."), -1, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT)); + add_options.push_back(AddOption("ScalarDerivativeFunc", "Special", "Common", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) Scalar derivative function."), -1, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true)); + add_options.push_back(AddOption("VectorDerivativeFunc", "Special", "Common", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) Vector derivative function."), -1, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true)); - add_options.push_back(AddOption("DdX", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), VisualShaderNodeVectorDerivativeFunc::FUNC_X, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT)); - add_options.push_back(AddOption("DdXS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."), VisualShaderNodeScalarDerivativeFunc::FUNC_X, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT)); - add_options.push_back(AddOption("DdY", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), VisualShaderNodeVectorDerivativeFunc::FUNC_Y, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT)); - add_options.push_back(AddOption("DdYS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."), VisualShaderNodeScalarDerivativeFunc::FUNC_Y, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT)); - add_options.push_back(AddOption("Sum", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), VisualShaderNodeVectorDerivativeFunc::FUNC_SUM, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT)); - add_options.push_back(AddOption("SumS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."), VisualShaderNodeScalarDerivativeFunc::FUNC_SUM, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT)); + add_options.push_back(AddOption("DdX", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'x' using local differencing."), VisualShaderNodeVectorDerivativeFunc::FUNC_X, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true)); + add_options.push_back(AddOption("DdXS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'x' using local differencing."), VisualShaderNodeScalarDerivativeFunc::FUNC_X, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true)); + add_options.push_back(AddOption("DdY", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Derivative in 'y' using local differencing."), VisualShaderNodeVectorDerivativeFunc::FUNC_Y, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true)); + add_options.push_back(AddOption("DdYS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Derivative in 'y' using local differencing."), VisualShaderNodeScalarDerivativeFunc::FUNC_Y, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true)); + add_options.push_back(AddOption("Sum", "Special", "Derivative", "VisualShaderNodeVectorDerivativeFunc", TTR("(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and 'y'."), VisualShaderNodeVectorDerivativeFunc::FUNC_SUM, VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true)); + add_options.push_back(AddOption("SumS", "Special", "Derivative", "VisualShaderNodeScalarDerivativeFunc", TTR("(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and 'y'."), VisualShaderNodeScalarDerivativeFunc::FUNC_SUM, VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, -1, -1, true)); ///////////////////////////////////////////////////////////////////// diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index fa72b5ec29..d396243bf3 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -103,8 +103,9 @@ class VisualShaderEditor : public VBoxContainer { int return_type; int func; float value; + bool highend; - AddOption(const String &p_name = String(), const String &p_category = String(), const String &p_sub_category = String(), const String &p_type = String(), const String &p_description = String(), int p_sub_func = -1, int p_return_type = -1, int p_mode = -1, int p_func = -1, float p_value = -1) { + AddOption(const String &p_name = String(), const String &p_category = String(), const String &p_sub_category = String(), const String &p_type = String(), const String &p_description = String(), int p_sub_func = -1, int p_return_type = -1, int p_mode = -1, int p_func = -1, float p_value = -1, bool p_highend = false) { name = p_name; type = p_type; category = p_category; @@ -115,9 +116,10 @@ class VisualShaderEditor : public VBoxContainer { mode = p_mode; func = p_func; value = p_value; + highend = p_highend; } - AddOption(const String &p_name, const String &p_category, const String &p_sub_category, const String &p_type, const String &p_description, const String &p_sub_func, int p_return_type = -1, int p_mode = -1, int p_func = -1, float p_value = -1) { + AddOption(const String &p_name, const String &p_category, const String &p_sub_category, const String &p_type, const String &p_description, const String &p_sub_func, int p_return_type = -1, int p_mode = -1, int p_func = -1, float p_value = -1, bool p_highend = false) { name = p_name; type = p_type; category = p_category; @@ -128,6 +130,7 @@ class VisualShaderEditor : public VBoxContainer { mode = p_mode; func = p_func; value = p_value; + highend = p_highend; } }; @@ -173,8 +176,21 @@ class VisualShaderEditor : public VBoxContainer { void _port_name_focus_out(Object *line_edit, int p_node_id, int p_port_id, bool p_output); + void _dup_copy_nodes(int p_type, List<int> &r_nodes, Set<int> &r_excluded); + void _dup_update_excluded(int p_type, Set<int> &r_excluded); + void _dup_paste_nodes(int p_type, List<int> &r_nodes, Set<int> &r_excluded, const Vector2 &p_offset, bool p_select); + void _duplicate_nodes(); + Vector2 selection_center; + int copy_type; // shader type + List<int> copy_nodes_buffer; + Set<int> copy_nodes_excluded_buffer; + + void _clear_buffer(); + void _copy_nodes(); + void _paste_nodes(); + Vector<Ref<VisualShaderNodePlugin> > plugins; void _mode_selected(int p_id); @@ -198,7 +214,7 @@ class VisualShaderEditor : public VBoxContainer { void _node_resized(const Vector2 &p_new_size, int p_type, int p_node); void _preview_select_port(int p_node, int p_port); - void _graph_gui_input(const Ref<InputEvent> p_event); + void _graph_gui_input(const Ref<InputEvent> &p_event); void _member_filter_changed(const String &p_text); void _sbox_input(const Ref<InputEvent> &p_ie); diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 4b3d468a61..feb2cdd071 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -52,6 +52,10 @@ #include "scene/gui/texture_rect.h" #include "scene/gui/tool_button.h" +static inline String get_project_key_from_path(const String &dir) { + return dir.replace("/", "::"); +} + class ProjectDialog : public ConfirmationDialog { GDCLASS(ProjectDialog, ConfirmationDialog); @@ -606,7 +610,7 @@ private: dir = dir.replace("\\", "/"); if (dir.ends_with("/")) dir = dir.substr(0, dir.length() - 1); - String proj = dir.replace("/", "::"); + String proj = get_project_key_from_path(dir); EditorSettings::get_singleton()->set("projects/" + proj, dir); EditorSettings::get_singleton()->save(); @@ -765,6 +769,7 @@ public: set_title(TTR("Install Project:") + " " + zip_title); get_ok()->set_text(TTR("Install & Edit")); + project_name->set_text(zip_title); name_container->show(); install_path_container->hide(); rasterizer_container->hide(); @@ -917,596 +922,960 @@ public: } }; -struct ProjectItem { - String project; - String project_name; - String path; - String conf; - String icon; - String main_scene; - uint64_t last_modified; - bool favorite; - bool grayed; - ProjectListFilter::FilterOption filter_order_option; - ProjectItem() {} - ProjectItem(const String &p_project, const String &p_name, const String &p_path, const String &p_conf, const String &p_icon, const String &p_main_scene, uint64_t p_last_modified, bool p_favorite = false, bool p_grayed = false, const ProjectListFilter::FilterOption p_filter_order_option = ProjectListFilter::FILTER_NAME) { - project = p_project; - project_name = p_name; - path = p_path; - conf = p_conf; - icon = p_icon; - main_scene = p_main_scene; - last_modified = p_last_modified; - favorite = p_favorite; - grayed = p_grayed; - filter_order_option = p_filter_order_option; - } - _FORCE_INLINE_ bool operator<(const ProjectItem &l) const { - switch (filter_order_option) { +class ProjectListItemControl : public HBoxContainer { + GDCLASS(ProjectListItemControl, HBoxContainer) +public: + TextureButton *favorite_button; + TextureRect *icon; + bool icon_needs_reload; + + ProjectListItemControl() { + favorite_button = NULL; + icon = NULL; + icon_needs_reload = true; + } + + void set_is_favorite(bool fav) { + favorite_button->set_modulate(fav ? Color(1, 1, 1, 1) : Color(1, 1, 1, 0.2)); + } +}; + +class ProjectList : public ScrollContainer { + GDCLASS(ProjectList, ScrollContainer) +public: + static const char *SIGNAL_SELECTION_CHANGED; + static const char *SIGNAL_PROJECT_ASK_OPEN; + + // Can often be passed by copy + struct Item { + String project_key; + String project_name; + String path; + String icon; + String main_scene; + uint64_t last_modified; + bool favorite; + bool grayed; + bool missing; + int version; + + ProjectListItemControl *control; + + Item() {} + + Item(const String &p_project, + const String &p_name, + const String &p_path, + const String &p_icon, + const String &p_main_scene, + uint64_t p_last_modified, + bool p_favorite, + bool p_grayed, + bool p_missing, + int p_version) { + + project_key = p_project; + project_name = p_name; + path = p_path; + icon = p_icon; + main_scene = p_main_scene; + last_modified = p_last_modified; + favorite = p_favorite; + grayed = p_grayed; + missing = p_missing; + version = p_version; + control = NULL; + } + + _FORCE_INLINE_ bool operator==(const Item &l) const { + return project_key == l.project_key; + } + }; + + ProjectList(); + ~ProjectList(); + + void load_projects(); + void set_search_term(String p_search_term); + void set_filter_option(ProjectListFilter::FilterOption p_option); + void set_order_option(ProjectListFilter::FilterOption p_option); + void sort_projects(); + int get_project_count() const; + void select_project(int p_index); + void erase_selected_projects(); + Vector<Item> get_selected_projects() const; + const Set<String> &get_selected_project_keys() const; + void ensure_project_visible(int p_index); + int get_single_selected_index() const; + bool is_any_project_missing() const; + void erase_missing_projects(); + int refresh_project(const String &dir_path); + +private: + static void _bind_methods(); + void _notification(int p_what); + + void _panel_draw(Node *p_hb); + void _panel_input(const Ref<InputEvent> &p_ev, Node *p_hb); + void _favorite_pressed(Node *p_hb); + void _show_project(const String &p_path); + + void select_range(int p_begin, int p_end); + void toggle_select(int p_index); + void create_project_item_control(int p_index); + void remove_project(int p_index, bool p_update_settings); + void update_icons_async(); + void load_project_icon(int p_index); + + static void load_project_data(const String &p_property_key, Item &p_item, bool p_favorite); + + String _search_term; + ProjectListFilter::FilterOption _filter_option; + ProjectListFilter::FilterOption _order_option; + Set<String> _selected_project_keys; + String _last_clicked; // Project key + VBoxContainer *_scroll_children; + int _icon_load_index; + + Vector<Item> _projects; +}; + +struct ProjectListComparator { + ProjectListFilter::FilterOption order_option; + + // operator< + _FORCE_INLINE_ bool operator()(const ProjectList::Item &a, const ProjectList::Item &b) const { + if (a.favorite && !b.favorite) { + return true; + } + if (b.favorite && !a.favorite) { + return false; + } + switch (order_option) { case ProjectListFilter::FILTER_PATH: - return project < l.project; + return a.project_key < b.project_key; case ProjectListFilter::FILTER_MODIFIED: - return last_modified > l.last_modified; + return a.last_modified > b.last_modified; default: - return project_name < l.project_name; + return a.project_name < b.project_name; } } - _FORCE_INLINE_ bool operator==(const ProjectItem &l) const { return project == l.project; } }; -void ProjectManager::_notification(int p_what) { +ProjectList::ProjectList() { + _filter_option = ProjectListFilter::FILTER_NAME; + _order_option = ProjectListFilter::FILTER_MODIFIED; - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { + _scroll_children = memnew(VBoxContainer); + _scroll_children->set_h_size_flags(SIZE_EXPAND_FILL); + add_child(_scroll_children); - Engine::get_singleton()->set_editor_hint(false); - } break; - case NOTIFICATION_READY: { + _icon_load_index = 0; +} - if (scroll_children->get_child_count() == 0 && StreamPeerSSL::is_available()) - open_templates->popup_centered_minsize(); - } break; - case NOTIFICATION_VISIBILITY_CHANGED: { +ProjectList::~ProjectList() { +} - set_process_unhandled_input(is_visible_in_tree()); - } break; - case NOTIFICATION_WM_QUIT_REQUEST: { +void ProjectList::update_icons_async() { + _icon_load_index = 0; + set_process(true); +} - _dim_window(); - } break; +void ProjectList::_notification(int p_what) { + if (p_what == NOTIFICATION_PROCESS) { + + // Load icons as a coroutine to speed up launch when you have hundreds of projects + if (_icon_load_index < _projects.size()) { + Item &item = _projects.write[_icon_load_index]; + if (item.control->icon_needs_reload) { + load_project_icon(_icon_load_index); + } + _icon_load_index++; + + } else { + set_process(false); + } } } -void ProjectManager::_dim_window() { - - // This method must be called before calling `get_tree()->quit()`. - // Otherwise, its effect won't be visible +void ProjectList::load_project_icon(int p_index) { + Item &item = _projects.write[p_index]; + + Ref<Texture> default_icon = get_icon("DefaultProjectIcon", "EditorIcons"); + Ref<Texture> icon; + if (item.icon != "") { + Ref<Image> img; + img.instance(); + Error err = img->load(item.icon.replace_first("res://", item.path + "/")); + if (err == OK) { + + img->resize(default_icon->get_width(), default_icon->get_height()); + Ref<ImageTexture> it = memnew(ImageTexture); + it->create_from_image(img); + icon = it; + } + } + if (icon.is_null()) { + icon = default_icon; + } - // Dim the project manager window while it's quitting to make it clearer that it's busy. - // No transition is applied, as the effect needs to be visible immediately - float c = 1.0f - float(EDITOR_GET("interface/editor/dim_amount")); - Color dim_color = Color(c, c, c); - gui_base->set_modulate(dim_color); + item.control->icon->set_texture(icon); + item.control->icon_needs_reload = false; } -void ProjectManager::_panel_draw(Node *p_hb) { +void ProjectList::load_project_data(const String &p_property_key, Item &p_item, bool p_favorite) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(p_hb); + String path = EditorSettings::get_singleton()->get(p_property_key); + String conf = path.plus_file("project.godot"); + bool grayed = false; + bool missing = false; - hb->draw_line(Point2(0, hb->get_size().y + 1), Point2(hb->get_size().x - 10, hb->get_size().y + 1), get_color("guide_color", "Tree")); + Ref<ConfigFile> cf = memnew(ConfigFile); + Error cf_err = cf->load(conf); + + int config_version = 0; + String project_name = TTR("Unnamed Project"); + if (cf_err == OK) { + String cf_project_name = static_cast<String>(cf->get_value("application", "config/name", "")); + if (cf_project_name != "") + project_name = cf_project_name.xml_unescape(); + config_version = (int)cf->get_value("", "config_version", 0); + } - if (selected_list.has(hb->get_meta("name"))) { - hb->draw_style_box(gui_base->get_stylebox("selected", "Tree"), Rect2(Point2(), hb->get_size() - Size2(10, 0) * EDSCALE)); + if (config_version > ProjectSettings::CONFIG_VERSION) { + // Comes from an incompatible (more recent) Godot version, grey it out + grayed = true; } + + String icon = cf->get_value("application", "config/icon", ""); + String main_scene = cf->get_value("application", "run/main_scene", ""); + + uint64_t last_modified = 0; + if (FileAccess::exists(conf)) { + last_modified = FileAccess::get_modified_time(conf); + + String fscache = path.plus_file(".fscache"); + if (FileAccess::exists(fscache)) { + uint64_t cache_modified = FileAccess::get_modified_time(fscache); + if (cache_modified > last_modified) + last_modified = cache_modified; + } + } else { + grayed = true; + missing = true; + print_line("Project is missing: " + conf); + } + + String project_key = p_property_key.get_slice("/", 1); + + p_item = Item(project_key, project_name, path, icon, main_scene, last_modified, p_favorite, grayed, missing, config_version); } -void ProjectManager::_update_project_buttons() { - for (int i = 0; i < scroll_children->get_child_count(); i++) { +void ProjectList::load_projects() { + // This is a full, hard reload of the list. Don't call this unless really required, it's expensive. + // If you have 150 projects, it may read through 150 files on your disk at once + load 150 icons. - CanvasItem *item = Object::cast_to<CanvasItem>(scroll_children->get_child(i)); - item->update(); + // Clear whole list + for (int i = 0; i < _projects.size(); ++i) { + Item &project = _projects.write[i]; + CRASH_COND(project.control == NULL); + memdelete(project.control); // Why not queue_free()? } + _projects.clear(); + _last_clicked = ""; + _selected_project_keys.clear(); - bool empty_selection = selected_list.empty(); - erase_btn->set_disabled(empty_selection); - open_btn->set_disabled(empty_selection); - rename_btn->set_disabled(empty_selection); - run_btn->set_disabled(empty_selection); + // Load data + // TODO Would be nice to change how projects and favourites are stored... it complicates things a bit. + // Use a dictionary associating project path to metadata (like is_favorite). + + List<PropertyInfo> properties; + EditorSettings::get_singleton()->get_property_list(&properties); - bool missing_projects = false; - Map<String, String> list_all_projects; - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (hb) { - list_all_projects.insert(hb->get_meta("name"), hb->get_meta("main_scene")); + Set<String> favorites; + // Find favourites... + for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + String property_key = E->get().name; + if (property_key.begins_with("favorite_projects/")) { + favorites.insert(property_key); } } - for (Map<String, String>::Element *E = list_all_projects.front(); E; E = E->next()) { - String project_name = E->key().replace(":::", ":/").replace("::", "/") + "/project.godot"; - if (!FileAccess::exists(project_name)) { - missing_projects = true; - break; - } + + for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + // This is actually something like "projects/C:::Documents::Godot::Projects::MyGame" + String property_key = E->get().name; + if (!property_key.begins_with("projects/")) + continue; + + String project_key = property_key.get_slice("/", 1); + bool favorite = favorites.has("favorite_projects/" + project_key); + + Item item; + load_project_data(property_key, item, favorite); + + _projects.push_back(item); } - erase_missing_btn->set_visible(missing_projects); + // Create controls + for (int i = 0; i < _projects.size(); ++i) { + create_project_item_control(i); + } + + sort_projects(); + + set_v_scroll(0); + + update_icons_async(); } -void ProjectManager::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) { +void ProjectList::create_project_item_control(int p_index) { - Ref<InputEventMouseButton> mb = p_ev; + // Will be added last in the list, so make sure indexes match + ERR_FAIL_COND(p_index != _scroll_children->get_child_count()); - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + Item &item = _projects.write[p_index]; + ERR_FAIL_COND(item.control != NULL); // Already created - String clicked = p_hb->get_meta("name"); - String clicked_main_scene = p_hb->get_meta("main_scene"); + Ref<Texture> favorite_icon = get_icon("Favorites", "EditorIcons"); + Color font_color = get_color("font_color", "Tree"); + + ProjectListItemControl *hb = memnew(ProjectListItemControl); + hb->connect("draw", this, "_panel_draw", varray(hb)); + hb->connect("gui_input", this, "_panel_input", varray(hb)); + hb->add_constant_override("separation", 10 * EDSCALE); + + VBoxContainer *favorite_box = memnew(VBoxContainer); + favorite_box->set_name("FavoriteBox"); + TextureButton *favorite = memnew(TextureButton); + favorite->set_name("FavoriteButton"); + favorite->set_normal_texture(favorite_icon); + favorite->connect("pressed", this, "_favorite_pressed", varray(hb)); + favorite_box->add_child(favorite); + favorite_box->set_alignment(BoxContainer::ALIGN_CENTER); + hb->add_child(favorite_box); + hb->favorite_button = favorite; + hb->set_is_favorite(item.favorite); + + TextureRect *tf = memnew(TextureRect); + tf->set_texture(get_icon("DefaultProjectIcon", "EditorIcons")); + hb->add_child(tf); + hb->icon = tf; - if (mb->get_shift() && selected_list.size() > 0 && last_clicked != "" && clicked != last_clicked) { + VBoxContainer *vb = memnew(VBoxContainer); + if (item.grayed) + vb->set_modulate(Color(0.5, 0.5, 0.5)); + vb->set_h_size_flags(SIZE_EXPAND_FILL); + hb->add_child(vb); + Control *ec = memnew(Control); + ec->set_custom_minimum_size(Size2(0, 1)); + ec->set_mouse_filter(MOUSE_FILTER_PASS); + vb->add_child(ec); + Label *title = memnew(Label(item.project_name)); + title->add_font_override("font", get_font("title", "EditorFonts")); + title->add_color_override("font_color", font_color); + title->set_clip_text(true); + vb->add_child(title); + + HBoxContainer *path_hb = memnew(HBoxContainer); + path_hb->set_h_size_flags(SIZE_EXPAND_FILL); + vb->add_child(path_hb); + + Button *show = memnew(Button); + show->set_icon(get_icon("Load", "EditorIcons")); // Folder icon + show->set_flat(true); + show->set_modulate(Color(1, 1, 1, 0.5)); + path_hb->add_child(show); + show->connect("pressed", this, "_show_project", varray(item.path)); + show->set_tooltip(TTR("Show in File Manager")); + + Label *fpath = memnew(Label(item.path)); + path_hb->add_child(fpath); + fpath->set_h_size_flags(SIZE_EXPAND_FILL); + fpath->set_modulate(Color(1, 1, 1, 0.5)); + fpath->add_color_override("font_color", font_color); + fpath->set_clip_text(true); + + _scroll_children->add_child(hb); + item.control = hb; +} - int clicked_id = -1; - int last_clicked_id = -1; - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (!hb) continue; - if (hb->get_meta("name") == clicked) clicked_id = i; - if (hb->get_meta("name") == last_clicked) last_clicked_id = i; - } +void ProjectList::set_search_term(String p_search_term) { + _search_term = p_search_term; +} - if (last_clicked_id != -1 && clicked_id != -1) { - int min = clicked_id < last_clicked_id ? clicked_id : last_clicked_id; - int max = clicked_id > last_clicked_id ? clicked_id : last_clicked_id; - for (int i = 0; i < scroll_children->get_child_count(); ++i) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (!hb) continue; - if (i != clicked_id && (i < min || i > max) && !mb->get_control()) { - selected_list.erase(hb->get_meta("name")); - } else if (i >= min && i <= max) { - selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - } - } - } +void ProjectList::set_filter_option(ProjectListFilter::FilterOption p_option) { + if (_filter_option != p_option) { + _filter_option = p_option; + } +} - } else if (selected_list.has(clicked) && mb->get_control()) { +void ProjectList::set_order_option(ProjectListFilter::FilterOption p_option) { + if (_order_option != p_option) { + _order_option = p_option; + EditorSettings::get_singleton()->set("project_manager/sorting_order", (int)_filter_option); + EditorSettings::get_singleton()->save(); + } +} - selected_list.erase(clicked); +void ProjectList::sort_projects() { - } else { + SortArray<Item, ProjectListComparator> sorter; + sorter.compare.order_option = _order_option; + sorter.sort(_projects.ptrw(), _projects.size()); - last_clicked = clicked; - if (mb->get_control() || selected_list.size() == 0) { - selected_list.insert(clicked, clicked_main_scene); - } else { - selected_list.clear(); - selected_list.insert(clicked, clicked_main_scene); + for (int i = 0; i < _projects.size(); ++i) { + Item &item = _projects.write[i]; + + bool visible = true; + if (_search_term != "") { + if (_filter_option == ProjectListFilter::FILTER_PATH) { + visible = item.path.findn(_search_term) != -1; + } else if (_filter_option == ProjectListFilter::FILTER_NAME) { + visible = item.project_name.findn(_search_term) != -1; } } - _update_project_buttons(); + item.control->set_visible(visible); + } - if (mb->is_doubleclick()) - _open_selected_projects_ask(); //open if doubleclicked + for (int i = 0; i < _projects.size(); ++i) { + Item &item = _projects.write[i]; + if (item.control->is_visible()) { + item.control->get_parent()->move_child(item.control, i); + } } + + // Rewind the coroutine because order of projects changed + update_icons_async(); } -void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) { +const Set<String> &ProjectList::get_selected_project_keys() const { + // Faster if that's all you need + return _selected_project_keys; +} - Ref<InputEventKey> k = p_ev; +Vector<ProjectList::Item> ProjectList::get_selected_projects() const { + Vector<Item> items; + if (_selected_project_keys.size() == 0) { + return items; + } + items.resize(_selected_project_keys.size()); + int j = 0; + for (int i = 0; i < _projects.size(); ++i) { + const Item &item = _projects[i]; + if (_selected_project_keys.has(item.project_key)) { + items.write[j++] = item; + } + } + ERR_FAIL_COND_V(j != items.size(), items); + return items; +} - if (k.is_valid()) { +void ProjectList::ensure_project_visible(int p_index) { + const Item &item = _projects[p_index]; - if (!k->is_pressed()) - return; + int item_top = item.control->get_position().y; + int item_bottom = item.control->get_position().y + item.control->get_size().y; - if (tabs->get_current_tab() != 0) - return; + if (item_top < get_v_scroll()) { + set_v_scroll(item_top); - bool scancode_handled = true; + } else if (item_bottom > get_v_scroll() + get_size().y) { + set_v_scroll(item_bottom - get_size().y); + } +} - switch (k->get_scancode()) { +int ProjectList::get_single_selected_index() const { + if (_selected_project_keys.size() == 0) { + // Default selection + return 0; + } + String key; + if (_selected_project_keys.size() == 1) { + // Only one selected + key = _selected_project_keys.front()->get(); + } else { + // Multiple selected, consider the last clicked one as "main" + key = _last_clicked; + } + for (int i = 0; i < _projects.size(); ++i) { + if (_projects[i].project_key == key) { + return i; + } + } + return 0; +} - case KEY_ENTER: { +void ProjectList::remove_project(int p_index, bool p_update_settings) { + const Item item = _projects[p_index]; // Take a copy - _open_selected_projects_ask(); - } break; - case KEY_DELETE: { + _selected_project_keys.erase(item.project_key); - _erase_project(); - } break; - case KEY_HOME: { + if (_last_clicked == item.project_key) { + _last_clicked = ""; + } - for (int i = 0; i < scroll_children->get_child_count(); i++) { + memdelete(item.control); + _projects.remove(p_index); - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (hb) { - selected_list.clear(); - selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - scroll->set_v_scroll(0); - _update_project_buttons(); - break; - } - } + if (p_update_settings) { + EditorSettings::get_singleton()->erase("projects/" + item.project_key); + EditorSettings::get_singleton()->erase("favorite_projects/" + item.project_key); + // Not actually saving the file, in case you are doing more changes to settings + } +} - } break; - case KEY_END: { +bool ProjectList::is_any_project_missing() const { + for (int i = 0; i < _projects.size(); ++i) { + if (_projects[i].missing) { + return true; + } + } + return false; +} - for (int i = scroll_children->get_child_count() - 1; i >= 0; i--) { +void ProjectList::erase_missing_projects() { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (hb) { - selected_list.clear(); - selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - scroll->set_v_scroll(scroll_children->get_size().y); - _update_project_buttons(); - break; - } - } + if (_projects.empty()) { + return; + } - } break; - case KEY_UP: { + int deleted_count = 0; + int remaining_count = 0; - if (k->get_shift()) - break; + for (int i = 0; i < _projects.size(); ++i) { + const Item &item = _projects[i]; - if (selected_list.size()) { + if (item.missing) { + remove_project(i, true); + --i; + ++deleted_count; - bool found = false; + } else { + ++remaining_count; + } + } - for (int i = scroll_children->get_child_count() - 1; i >= 0; i--) { + print_line("Removed " + itos(deleted_count) + " projects from the list, remaining " + itos(remaining_count) + " projects"); - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (!hb) continue; + EditorSettings::get_singleton()->save(); +} - String current = hb->get_meta("name"); +int ProjectList::refresh_project(const String &dir_path) { + // Reads editor settings and reloads information about a specific project. + // If it wasn't loaded and should be in the list, it is added (i.e new project). + // If it isn't in the list anymore, it is removed. + // If it is in the list but doesn't exist anymore, it is marked as missing. - if (found) { - selected_list.clear(); - selected_list.insert(current, hb->get_meta("main_scene")); + String project_key = get_project_key_from_path(dir_path); - int offset_diff = scroll->get_v_scroll() - hb->get_position().y; + // Read project manager settings + bool is_favourite = false; + bool should_be_in_list = false; + String property_key = "projects/" + project_key; + { + List<PropertyInfo> properties; + EditorSettings::get_singleton()->get_property_list(&properties); + String favorite_property_key = "favorite_projects/" + project_key; + + bool found = false; + for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + String prop = E->get().name; + if (!found && prop == property_key) { + found = true; + } else if (!is_favourite && prop == favorite_property_key) { + is_favourite = true; + } + } - if (offset_diff > 0) - scroll->set_v_scroll(scroll->get_v_scroll() - offset_diff); + should_be_in_list = found; + } - _update_project_buttons(); + bool was_selected = _selected_project_keys.has(project_key); - break; + // Remove item in any case + for (int i = 0; i < _projects.size(); ++i) { + const Item &existing_item = _projects[i]; + if (existing_item.path == dir_path) { + remove_project(i, false); + break; + } + } - } else if (current == selected_list.back()->key()) { + int index = -1; + if (should_be_in_list) { + // Recreate it with updated info - found = true; - } - } + Item item; + load_project_data(property_key, item, is_favourite); - break; + _projects.push_back(item); + create_project_item_control(_projects.size() - 1); + + sort_projects(); + + for (int i = 0; i < _projects.size(); ++i) { + if (_projects[i].project_key == project_key) { + if (was_selected) { + select_project(i); + ensure_project_visible(i); } - FALLTHROUGH; + load_project_icon(i); + index = i; + break; } - case KEY_DOWN: { + } + } - if (k->get_shift()) - break; + return index; +} + +int ProjectList::get_project_count() const { + return _projects.size(); +} + +void ProjectList::select_project(int p_index) { + + Vector<Item> previous_selected_items = get_selected_projects(); + _selected_project_keys.clear(); - bool found = selected_list.empty(); + for (int i = 0; i < previous_selected_items.size(); ++i) { + previous_selected_items[i].control->update(); + } + + toggle_select(p_index); +} + +inline void sort(int &a, int &b) { + if (a > b) { + int temp = a; + a = b; + b = temp; + } +} + +void ProjectList::select_range(int p_begin, int p_end) { + sort(p_begin, p_end); + select_project(p_begin); + for (int i = p_begin + 1; i <= p_end; ++i) { + toggle_select(i); + } +} + +void ProjectList::toggle_select(int p_index) { + Item &item = _projects.write[p_index]; + if (_selected_project_keys.has(item.project_key)) { + _selected_project_keys.erase(item.project_key); + } else { + _selected_project_keys.insert(item.project_key); + } + item.control->update(); +} - for (int i = 0; i < scroll_children->get_child_count(); i++) { +void ProjectList::erase_selected_projects() { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (!hb) continue; + if (_selected_project_keys.size() == 0) { + return; + } - String current = hb->get_meta("name"); + for (int i = 0; i < _projects.size(); ++i) { + Item &item = _projects.write[i]; + if (_selected_project_keys.has(item.project_key) && item.control->is_visible()) { - if (found) { - selected_list.clear(); - selected_list.insert(current, hb->get_meta("main_scene")); + EditorSettings::get_singleton()->erase("projects/" + item.project_key); + EditorSettings::get_singleton()->erase("favorite_projects/" + item.project_key); - int last_y_visible = scroll->get_v_scroll() + scroll->get_size().y; - int offset_diff = (hb->get_position().y + hb->get_size().y) - last_y_visible; + memdelete(item.control); + _projects.remove(i); + --i; + } + } - if (offset_diff > 0) - scroll->set_v_scroll(scroll->get_v_scroll() + offset_diff); + EditorSettings::get_singleton()->save(); - _update_project_buttons(); + _selected_project_keys.clear(); + _last_clicked = ""; +} - break; +// Draws selected project highlight +void ProjectList::_panel_draw(Node *p_hb) { + Control *hb = Object::cast_to<Control>(p_hb); - } else if (current == selected_list.back()->key()) { + hb->draw_line(Point2(0, hb->get_size().y + 1), Point2(hb->get_size().x - 10, hb->get_size().y + 1), get_color("guide_color", "Tree")); - found = true; - } + String key = _projects[p_hb->get_index()].project_key; + + if (_selected_project_keys.has(key)) { + hb->draw_style_box(get_stylebox("selected", "Tree"), Rect2(Point2(), hb->get_size() - Size2(10, 0) * EDSCALE)); + } +} + +// Input for each item in the list +void ProjectList::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) { + + Ref<InputEventMouseButton> mb = p_ev; + int clicked_index = p_hb->get_index(); + const Item &clicked_project = _projects[clicked_index]; + + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + + if (mb->get_shift() && _selected_project_keys.size() > 0 && _last_clicked != "" && clicked_project.project_key != _last_clicked) { + + int anchor_index = -1; + for (int i = 0; i < _projects.size(); ++i) { + const Item &p = _projects[i]; + if (p.project_key == _last_clicked) { + anchor_index = p.control->get_index(); + break; } + } + CRASH_COND(anchor_index == -1); + select_range(anchor_index, clicked_index); - } break; - case KEY_F: { - if (k->get_command()) - this->project_filter->search_box->grab_focus(); - else - scancode_handled = false; - } break; - default: { - scancode_handled = false; - } break; + } else if (mb->get_control()) { + toggle_select(clicked_index); + + } else { + _last_clicked = clicked_project.project_key; + select_project(clicked_index); } - if (scancode_handled) { - accept_event(); + emit_signal(SIGNAL_SELECTION_CHANGED); + + if (mb->is_doubleclick()) { + emit_signal(SIGNAL_PROJECT_ASK_OPEN); } } } -void ProjectManager::_favorite_pressed(Node *p_hb) { +void ProjectList::_favorite_pressed(Node *p_hb) { + + ProjectListItemControl *control = Object::cast_to<ProjectListItemControl>(p_hb); + + int index = control->get_index(); + Item item = _projects.write[index]; // Take copy - String clicked = p_hb->get_meta("name"); - bool favorite = !p_hb->get_meta("favorite"); - String proj = clicked.replace(":::", ":/"); - proj = proj.replace("::", "/"); + item.favorite = !item.favorite; - if (favorite) { - EditorSettings::get_singleton()->set("favorite_projects/" + clicked, proj); + if (item.favorite) { + EditorSettings::get_singleton()->set("favorite_projects/" + item.project_key, item.path); } else { - EditorSettings::get_singleton()->erase("favorite_projects/" + clicked); + EditorSettings::get_singleton()->erase("favorite_projects/" + item.project_key); } EditorSettings::get_singleton()->save(); - call_deferred("_load_recent_projects"); -} -void ProjectManager::_load_recent_projects() { + _projects.write[index] = item; + + control->set_is_favorite(item.favorite); - ProjectListFilter::FilterOption filter_option = project_filter->get_filter_option(); - String search_term = project_filter->get_search_term(); + sort_projects(); - while (scroll_children->get_child_count() > 0) { - memdelete(scroll_children->get_child(0)); + if (item.favorite) { + for (int i = 0; i < _projects.size(); ++i) { + if (_projects[i].project_key == item.project_key) { + ensure_project_visible(i); + break; + } + } } +} - Map<String, String> selected_list_copy = selected_list; +void ProjectList::_show_project(const String &p_path) { - List<PropertyInfo> properties; - EditorSettings::get_singleton()->get_property_list(&properties); + OS::get_singleton()->shell_open(String("file://") + p_path); +} - Color font_color = gui_base->get_color("font_color", "Tree"); +const char *ProjectList::SIGNAL_SELECTION_CHANGED = "selection_changed"; +const char *ProjectList::SIGNAL_PROJECT_ASK_OPEN = "project_ask_open"; - ProjectListFilter::FilterOption filter_order_option = project_order_filter->get_filter_option(); - EditorSettings::get_singleton()->set("project_manager/sorting_order", (int)filter_order_option); +void ProjectList::_bind_methods() { - List<ProjectItem> projects; - List<ProjectItem> favorite_projects; + ClassDB::bind_method("_panel_draw", &ProjectList::_panel_draw); + ClassDB::bind_method("_panel_input", &ProjectList::_panel_input); + ClassDB::bind_method("_favorite_pressed", &ProjectList::_favorite_pressed); + ClassDB::bind_method("_show_project", &ProjectList::_show_project); + //ClassDB::bind_method("_unhandled_input", &ProjectList::_unhandled_input); - for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + ADD_SIGNAL(MethodInfo(SIGNAL_SELECTION_CHANGED)); + ADD_SIGNAL(MethodInfo(SIGNAL_PROJECT_ASK_OPEN)); +} - String _name = E->get().name; - if (!_name.begins_with("projects/") && !_name.begins_with("favorite_projects/")) - continue; +void ProjectManager::_notification(int p_what) { - String path = EditorSettings::get_singleton()->get(_name); - if (filter_option == ProjectListFilter::FILTER_PATH && search_term != "" && path.findn(search_term) == -1) - continue; + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { - String project = _name.get_slice("/", 1); - String conf = path.plus_file("project.godot"); - bool favorite = (_name.begins_with("favorite_projects/")) ? true : false; - bool grayed = false; + Engine::get_singleton()->set_editor_hint(false); + } break; + case NOTIFICATION_READY: { - Ref<ConfigFile> cf = memnew(ConfigFile); - Error cf_err = cf->load(conf); + if (_project_list->get_project_count() == 0 && StreamPeerSSL::is_available()) + open_templates->popup_centered_minsize(); + } break; + case NOTIFICATION_VISIBILITY_CHANGED: { - int config_version = 0; - String project_name = TTR("Unnamed Project"); - if (cf_err == OK) { + set_process_unhandled_input(is_visible_in_tree()); + } break; + case NOTIFICATION_WM_QUIT_REQUEST: { - String cf_project_name = static_cast<String>(cf->get_value("application", "config/name", "")); - if (cf_project_name != "") - project_name = cf_project_name.xml_unescape(); - config_version = (int)cf->get_value("", "config_version", 0); - } + _dim_window(); + } break; + } +} - if (config_version > ProjectSettings::CONFIG_VERSION) { - // Comes from an incompatible (more recent) Godot version, grey it out - grayed = true; - } +void ProjectManager::_dim_window() { - String icon = cf->get_value("application", "config/icon", ""); - String main_scene = cf->get_value("application", "run/main_scene", ""); + // This method must be called before calling `get_tree()->quit()`. + // Otherwise, its effect won't be visible - uint64_t last_modified = 0; - if (FileAccess::exists(conf)) { - last_modified = FileAccess::get_modified_time(conf); + // Dim the project manager window while it's quitting to make it clearer that it's busy. + // No transition is applied, as the effect needs to be visible immediately + float c = 0.4f; + Color dim_color = Color(c, c, c); + gui_base->set_modulate(dim_color); +} - String fscache = path.plus_file(".fscache"); - if (FileAccess::exists(fscache)) { - uint64_t cache_modified = FileAccess::get_modified_time(fscache); - if (cache_modified > last_modified) - last_modified = cache_modified; - } - } else { - grayed = true; - } +void ProjectManager::_update_project_buttons() { - ProjectItem item(project, project_name, path, conf, icon, main_scene, last_modified, favorite, grayed, filter_order_option); - if (favorite) - favorite_projects.push_back(item); - else - projects.push_back(item); - } - projects.sort(); - favorite_projects.sort(); + Vector<ProjectList::Item> selected_projects = _project_list->get_selected_projects(); + bool empty_selection = selected_projects.empty(); - for (List<ProjectItem>::Element *E = projects.front(); E;) { - List<ProjectItem>::Element *next = E->next(); - if (favorite_projects.find(E->get()) != NULL) - projects.erase(E->get()); - E = next; - } - for (List<ProjectItem>::Element *E = favorite_projects.back(); E; E = E->prev()) { - projects.push_front(E->get()); - } + erase_btn->set_disabled(empty_selection); + open_btn->set_disabled(empty_selection); + rename_btn->set_disabled(empty_selection); + run_btn->set_disabled(empty_selection); - Ref<Texture> favorite_icon = get_icon("Favorites", "EditorIcons"); + erase_missing_btn->set_visible(_project_list->is_any_project_missing()); +} + +void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) { - for (List<ProjectItem>::Element *E = projects.front(); E; E = E->next()) { + Ref<InputEventKey> k = p_ev; - ProjectItem &item = E->get(); - String project = item.project; - String path = item.path; - String conf = item.conf; + if (k.is_valid()) { - if (filter_option == ProjectListFilter::FILTER_NAME && search_term != "" && item.project_name.findn(search_term) == -1) - continue; + if (!k->is_pressed()) + return; + + if (tabs->get_current_tab() != 0) + return; + + bool scancode_handled = true; + + switch (k->get_scancode()) { + + case KEY_ENTER: { + + _open_selected_projects_ask(); + } break; + case KEY_DELETE: { + + _erase_project(); + } break; + case KEY_HOME: { + + if (_project_list->get_project_count() > 0) { + _project_list->select_project(0); + _update_project_buttons(); + } + + } break; + case KEY_END: { + + if (_project_list->get_project_count() > 0) { + _project_list->select_project(_project_list->get_project_count() - 1); + _update_project_buttons(); + } + + } break; + case KEY_UP: { - Ref<Texture> icon; + if (k->get_shift()) + break; - if (item.icon != "") { - Ref<Image> img; - img.instance(); - Error err = img->load(item.icon.replace_first("res://", path + "/")); - if (err == OK) { + int index = _project_list->get_single_selected_index(); + if (index - 1 > 0) { + _project_list->select_project(index - 1); + _project_list->ensure_project_visible(index - 1); + _update_project_buttons(); + } - Ref<Texture> default_icon = get_icon("DefaultProjectIcon", "EditorIcons"); - img->resize(default_icon->get_width(), default_icon->get_height()); - Ref<ImageTexture> it = memnew(ImageTexture); - it->create_from_image(img); - icon = it; + break; } + case KEY_DOWN: { + + if (k->get_shift()) + break; + + int index = _project_list->get_single_selected_index(); + if (index + 1 < _project_list->get_project_count()) { + _project_list->select_project(index + 1); + _project_list->ensure_project_visible(index + 1); + _update_project_buttons(); + } + + } break; + case KEY_F: { + if (k->get_command()) + this->project_filter->search_box->grab_focus(); + else + scancode_handled = false; + } break; + default: { + scancode_handled = false; + } break; } - if (icon.is_null()) { - icon = get_icon("DefaultProjectIcon", "EditorIcons"); + if (scancode_handled) { + accept_event(); } + } +} - selected_list_copy.erase(project); - - bool is_favorite = item.favorite; - bool is_grayed = item.grayed; - - HBoxContainer *hb = memnew(HBoxContainer); - hb->set_meta("name", project); - hb->set_meta("main_scene", item.main_scene); - hb->set_meta("favorite", is_favorite); - hb->connect("draw", this, "_panel_draw", varray(hb)); - hb->connect("gui_input", this, "_panel_input", varray(hb)); - hb->add_constant_override("separation", 10 * EDSCALE); - - VBoxContainer *favorite_box = memnew(VBoxContainer); - TextureButton *favorite = memnew(TextureButton); - favorite->set_normal_texture(favorite_icon); - if (!is_favorite) - favorite->set_modulate(Color(1, 1, 1, 0.2)); - favorite->connect("pressed", this, "_favorite_pressed", varray(hb)); - favorite_box->add_child(favorite); - favorite_box->set_alignment(BoxContainer::ALIGN_CENTER); - hb->add_child(favorite_box); - - TextureRect *tf = memnew(TextureRect); - tf->set_texture(icon); - hb->add_child(tf); +void ProjectManager::_load_recent_projects() { - VBoxContainer *vb = memnew(VBoxContainer); - if (is_grayed) - vb->set_modulate(Color(0.5, 0.5, 0.5)); - vb->set_name("project"); - vb->set_h_size_flags(SIZE_EXPAND_FILL); - hb->add_child(vb); - Control *ec = memnew(Control); - ec->set_custom_minimum_size(Size2(0, 1)); - ec->set_mouse_filter(MOUSE_FILTER_PASS); - vb->add_child(ec); - Label *title = memnew(Label(item.project_name)); - title->add_font_override("font", gui_base->get_font("title", "EditorFonts")); - title->add_color_override("font_color", font_color); - title->set_clip_text(true); - vb->add_child(title); - - HBoxContainer *path_hb = memnew(HBoxContainer); - path_hb->set_name("path_box"); - path_hb->set_h_size_flags(SIZE_EXPAND_FILL); - vb->add_child(path_hb); - - Button *show = memnew(Button); - show->set_name("show"); - show->set_icon(get_icon("Filesystem", "EditorIcons")); - show->set_flat(true); - show->set_modulate(Color(1, 1, 1, 0.5)); - path_hb->add_child(show); - show->connect("pressed", this, "_show_project", varray(path)); - show->set_tooltip(TTR("Show in File Manager")); - - Label *fpath = memnew(Label(path)); - fpath->set_name("path"); - path_hb->add_child(fpath); - fpath->set_h_size_flags(SIZE_EXPAND_FILL); - fpath->set_modulate(Color(1, 1, 1, 0.5)); - fpath->add_color_override("font_color", font_color); - fpath->set_clip_text(true); - - scroll_children->add_child(hb); - } - - for (Map<String, String>::Element *E = selected_list_copy.front(); E; E = E->next()) { - String key = E->key(); - selected_list.erase(key); - } - - scroll->set_v_scroll(0); + _project_list->set_filter_option(project_filter->get_filter_option()); + _project_list->set_order_option(project_order_filter->get_filter_option()); + _project_list->set_search_term(project_filter->get_search_term()); + _project_list->load_projects(); _update_project_buttons(); - EditorSettings::get_singleton()->save(); - tabs->set_current_tab(0); } void ProjectManager::_on_projects_updated() { - _load_recent_projects(); + Vector<ProjectList::Item> selected_projects = _project_list->get_selected_projects(); + int index = 0; + for (int i = 0; i < selected_projects.size(); ++i) { + index = _project_list->refresh_project(selected_projects[i].path); + } + if (index != -1) { + _project_list->ensure_project_visible(index); + } } void ProjectManager::_on_project_created(const String &dir) { project_filter->clear(); - bool has_already = false; - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - Label *fpath = Object::cast_to<Label>(hb->get_node(NodePath("project/path_box/path"))); - if (fpath->get_text() == dir) { - has_already = true; - break; - } - } - if (has_already) { - _update_scroll_position(dir); - } else { - _load_recent_projects(); - _update_scroll_position(dir); - } + int i = _project_list->refresh_project(dir); + _project_list->select_project(i); + _project_list->ensure_project_visible(i); _open_selected_projects_ask(); } -void ProjectManager::_update_scroll_position(const String &dir) { - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - Label *fpath = Object::cast_to<Label>(hb->get_node(NodePath("project/path_box/path"))); - if (fpath->get_text() == dir) { - last_clicked = hb->get_meta("name"); - selected_list.clear(); - selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - _update_project_buttons(); - int last_y_visible = scroll->get_v_scroll() + scroll->get_size().y; - int offset_diff = (hb->get_position().y + hb->get_size().y) - last_y_visible; - - if (offset_diff > 0) - scroll->set_v_scroll(scroll->get_v_scroll() + offset_diff); - break; - } - } -} - void ProjectManager::_confirm_update_settings() { _open_selected_projects(); } void ProjectManager::_open_selected_projects() { - for (const Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { - const String &selected = E->key(); + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + + for (const Set<String>::Element *E = selected_list.front(); E; E = E->next()) { + const String &selected = E->get(); String path = EditorSettings::get_singleton()->get("projects/" + selected); String conf = path.plus_file("project.godot"); + if (!FileAccess::exists(conf)) { dialog_error->set_text(vformat(TTR("Can't open project at '%s'."), path)); dialog_error->popup_centered_minsize(); @@ -1539,6 +1908,8 @@ void ProjectManager::_open_selected_projects() { void ProjectManager::_open_selected_projects_ask() { + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + if (selected_list.size() < 1) { return; } @@ -1549,22 +1920,11 @@ void ProjectManager::_open_selected_projects_ask() { return; } - // Update the project settings or don't open - String path = EditorSettings::get_singleton()->get("projects/" + selected_list.front()->key()); - String conf = path.plus_file("project.godot"); + ProjectList::Item project = _project_list->get_selected_projects()[0]; - // FIXME: We already parse those in _load_recent_projects, we could instead make - // its `projects` list global and reuse its parsed metadata here. - Ref<ConfigFile> cf = memnew(ConfigFile); - Error cf_err = cf->load(conf); - - if (cf_err != OK) { - dialog_error->set_text(vformat(TTR("Can't open project at '%s'."), path)); - dialog_error->popup_centered_minsize(); - return; - } - - int config_version = (int)cf->get_value("", "config_version", 0); + // Update the project settings or don't open + String conf = project.path.plus_file("project.godot"); + int config_version = project.version; // Check if the config_version property was empty or 0 if (config_version == 0) { @@ -1580,7 +1940,7 @@ void ProjectManager::_open_selected_projects_ask() { } // Check if the file was generated by a newer, incompatible engine version if (config_version > ProjectSettings::CONFIG_VERSION) { - dialog_error->set_text(vformat(TTR("Can't open project at '%s'.") + "\n" + TTR("The project settings were created by a newer engine version, whose settings are not compatible with this version."), path)); + dialog_error->set_text(vformat(TTR("Can't open project at '%s'.") + "\n" + TTR("The project settings were created by a newer engine version, whose settings are not compatible with this version."), project.path)); dialog_error->popup_centered_minsize(); return; } @@ -1591,16 +1951,18 @@ void ProjectManager::_open_selected_projects_ask() { void ProjectManager::_run_project_confirm() { - for (Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { + Vector<ProjectList::Item> selected_list = _project_list->get_selected_projects(); + + for (int i = 0; i < selected_list.size(); ++i) { - const String &selected_main = E->get(); + const String &selected_main = selected_list[i].main_scene; if (selected_main == "") { run_error_diag->set_text(TTR("Can't run project: no main scene defined.\nPlease edit the project and set the main scene in the Project Settings under the \"Application\" category.")); run_error_diag->popup_centered(); return; } - const String &selected = E->key(); + const String &selected = selected_list[i].project_key; String path = EditorSettings::get_singleton()->get("projects/" + selected); if (!DirAccess::exists(path + "/.import")) { @@ -1628,8 +1990,11 @@ void ProjectManager::_run_project_confirm() { } } +// When you press the "Run" button void ProjectManager::_run_project() { + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + if (selected_list.size() < 1) { return; } @@ -1642,11 +2007,6 @@ void ProjectManager::_run_project() { } } -void ProjectManager::_show_project(const String &p_path) { - - OS::get_singleton()->shell_open(String("file://") + p_path); -} - void ProjectManager::_scan_dir(const String &path, List<String> *r_projects) { DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); da->change_dir(path); @@ -1672,7 +2032,7 @@ void ProjectManager::_scan_begin(const String &p_base) { print_line("Found " + itos(projects.size()) + " projects."); for (List<String>::Element *E = projects.front(); E; E = E->next()) { - String proj = E->get().replace("/", "::"); + String proj = get_project_key_from_path(E->get()); EditorSettings::get_singleton()->set("projects/" + proj, E->get()); } EditorSettings::get_singleton()->save(); @@ -1698,12 +2058,14 @@ void ProjectManager::_import_project() { void ProjectManager::_rename_project() { + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + if (selected_list.size() == 0) { return; } - for (Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { - const String &selected = E->key(); + for (Set<String>::Element *E = selected_list.front(); E; E = E->next()) { + const String &selected = E->get(); String path = EditorSettings::get_singleton()->get("projects/" + selected); npdialog->set_project_path(path); npdialog->set_mode(ProjectDialog::MODE_RENAME); @@ -1712,55 +2074,17 @@ void ProjectManager::_rename_project() { } void ProjectManager::_erase_project_confirm() { - - if (selected_list.size() == 0) { - return; - } - for (Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) { - EditorSettings::get_singleton()->erase("projects/" + E->key()); - EditorSettings::get_singleton()->erase("favorite_projects/" + E->key()); - } - EditorSettings::get_singleton()->save(); - selected_list.clear(); - last_clicked = ""; - _load_recent_projects(); + _project_list->erase_selected_projects(); } void ProjectManager::_erase_missing_projects_confirm() { - - Map<String, String> list_all_projects; - for (int i = 0; i < scroll_children->get_child_count(); i++) { - HBoxContainer *hb = Object::cast_to<HBoxContainer>(scroll_children->get_child(i)); - if (hb) { - list_all_projects.insert(hb->get_meta("name"), hb->get_meta("main_scene")); - } - } - - if (list_all_projects.size() == 0) { - return; - } - - int deleted_projects = 0; - int remaining_projects = 0; - for (Map<String, String>::Element *E = list_all_projects.front(); E; E = E->next()) { - String project_name = E->key().replace(":::", ":/").replace("::", "/") + "/project.godot"; - if (!FileAccess::exists(project_name)) { - deleted_projects++; - EditorSettings::get_singleton()->erase("projects/" + E->key()); - EditorSettings::get_singleton()->erase("favorite_projects/" + E->key()); - } else { - remaining_projects++; - } - } - print_line("Deleted " + itos(deleted_projects) + " projects, remaining " + itos(remaining_projects) + " projects"); - EditorSettings::get_singleton()->save(); - selected_list.clear(); - last_clicked = ""; - _load_recent_projects(); + _project_list->erase_missing_projects(); } void ProjectManager::_erase_project() { + const Set<String> &selected_list = _project_list->get_selected_project_keys(); + if (selected_list.size() == 0) return; @@ -1866,13 +2190,23 @@ void ProjectManager::_scan_multiple_folders(PoolStringArray p_files) { } } +void ProjectManager::_on_order_option_changed() { + _project_list->set_order_option(project_order_filter->get_filter_option()); + _project_list->sort_projects(); +} + +void ProjectManager::_on_filter_option_changed() { + _project_list->set_filter_option(project_filter->get_filter_option()); + _project_list->set_search_term(project_filter->get_search_term()); + _project_list->sort_projects(); +} + void ProjectManager::_bind_methods() { ClassDB::bind_method("_open_selected_projects_ask", &ProjectManager::_open_selected_projects_ask); ClassDB::bind_method("_open_selected_projects", &ProjectManager::_open_selected_projects); ClassDB::bind_method("_run_project", &ProjectManager::_run_project); ClassDB::bind_method("_run_project_confirm", &ProjectManager::_run_project_confirm); - ClassDB::bind_method("_show_project", &ProjectManager::_show_project); ClassDB::bind_method("_scan_projects", &ProjectManager::_scan_projects); ClassDB::bind_method("_scan_begin", &ProjectManager::_scan_begin); ClassDB::bind_method("_import_project", &ProjectManager::_import_project); @@ -1885,18 +2219,16 @@ void ProjectManager::_bind_methods() { ClassDB::bind_method("_language_selected", &ProjectManager::_language_selected); ClassDB::bind_method("_restart_confirm", &ProjectManager::_restart_confirm); ClassDB::bind_method("_exit_dialog", &ProjectManager::_exit_dialog); - ClassDB::bind_method("_load_recent_projects", &ProjectManager::_load_recent_projects); + ClassDB::bind_method("_on_order_option_changed", &ProjectManager::_on_order_option_changed); + ClassDB::bind_method("_on_filter_option_changed", &ProjectManager::_on_filter_option_changed); ClassDB::bind_method("_on_projects_updated", &ProjectManager::_on_projects_updated); ClassDB::bind_method("_on_project_created", &ProjectManager::_on_project_created); - ClassDB::bind_method("_update_scroll_position", &ProjectManager::_update_scroll_position); - ClassDB::bind_method("_panel_draw", &ProjectManager::_panel_draw); - ClassDB::bind_method("_panel_input", &ProjectManager::_panel_input); ClassDB::bind_method("_unhandled_input", &ProjectManager::_unhandled_input); - ClassDB::bind_method("_favorite_pressed", &ProjectManager::_favorite_pressed); ClassDB::bind_method("_install_project", &ProjectManager::_install_project); ClassDB::bind_method("_files_dropped", &ProjectManager::_files_dropped); ClassDB::bind_method("_open_asset_library", &ProjectManager::_open_asset_library); ClassDB::bind_method("_confirm_update_settings", &ProjectManager::_confirm_update_settings); + ClassDB::bind_method("_update_project_buttons", &ProjectManager::_update_project_buttons); ClassDB::bind_method(D_METHOD("_scan_multiple_folders", "files"), &ProjectManager::_scan_multiple_folders); } @@ -1924,29 +2256,12 @@ ProjectManager::ProjectManager() { editor_set_scale(OS::get_singleton()->get_screen_dpi(screen) >= 192 && OS::get_singleton()->get_screen_size(screen).x > 2000 ? 2.0 : 1.0); } break; - case 1: { - editor_set_scale(0.75); - } break; - - case 2: { - editor_set_scale(1.0); - } break; - - case 3: { - editor_set_scale(1.25); - } break; - - case 4: { - editor_set_scale(1.5); - } break; - - case 5: { - editor_set_scale(1.75); - } break; - - case 6: { - editor_set_scale(2.0); - } break; + case 1: editor_set_scale(0.75); break; + case 2: editor_set_scale(1.0); break; + case 3: editor_set_scale(1.25); break; + case 4: editor_set_scale(1.5); break; + case 5: editor_set_scale(1.75); break; + case 6: editor_set_scale(2.0); break; default: { editor_set_scale(custom_display_scale); @@ -2029,7 +2344,7 @@ ProjectManager::ProjectManager() { project_order_filter->_setup_filters(sort_filter_titles); project_order_filter->set_filter_size(150); sort_filters->add_child(project_order_filter); - project_order_filter->connect("filter_changed", this, "_load_recent_projects"); + project_order_filter->connect("filter_changed", this, "_on_order_option_changed"); project_order_filter->set_custom_minimum_size(Size2(180, 10) * EDSCALE); int projects_sorting_order = (int)EditorSettings::get_singleton()->get("project_manager/sorting_order"); @@ -2048,7 +2363,7 @@ ProjectManager::ProjectManager() { project_filter->_setup_filters(vec2); project_filter->add_search_box(); search_filters->add_child(project_filter); - project_filter->connect("filter_changed", this, "_load_recent_projects"); + project_filter->connect("filter_changed", this, "_on_filter_option_changed"); project_filter->set_custom_minimum_size(Size2(280, 10) * EDSCALE); sort_filters->add_child(search_filters); @@ -2059,15 +2374,14 @@ ProjectManager::ProjectManager() { search_tree_vb->add_child(pc); pc->set_v_size_flags(SIZE_EXPAND_FILL); - scroll = memnew(ScrollContainer); - pc->add_child(scroll); - scroll->set_enable_h_scroll(false); + _project_list = memnew(ProjectList); + _project_list->connect(ProjectList::SIGNAL_SELECTION_CHANGED, this, "_update_project_buttons"); + _project_list->connect(ProjectList::SIGNAL_PROJECT_ASK_OPEN, this, "_open_selected_projects_ask"); + pc->add_child(_project_list); + _project_list->set_enable_h_scroll(false); VBoxContainer *tree_vb = memnew(VBoxContainer); tree_hb->add_child(tree_vb); - scroll_children = memnew(VBoxContainer); - scroll_children->set_h_size_flags(SIZE_EXPAND_FILL); - scroll->add_child(scroll_children); Button *open = memnew(Button); open->set_text(TTR("Edit")); @@ -2237,14 +2551,13 @@ ProjectManager::ProjectManager() { npdialog->connect("projects_updated", this, "_on_projects_updated"); npdialog->connect("project_created", this, "_on_project_created"); + _load_recent_projects(); if (EditorSettings::get_singleton()->get("filesystem/directories/autoscan_project_path")) { _scan_begin(EditorSettings::get_singleton()->get("filesystem/directories/autoscan_project_path")); } - last_clicked = ""; - SceneTree::get_singleton()->connect("files_dropped", this, "_files_dropped"); run_error_diag = memnew(AcceptDialog); diff --git a/editor/project_manager.h b/editor/project_manager.h index d75d7164cc..4ccb99d6bd 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -39,6 +39,7 @@ #include "scene/gui/tree.h" class ProjectDialog; +class ProjectList; class ProjectListFilter; class ProjectManager : public Control { @@ -68,16 +69,13 @@ class ProjectManager : public Control { AcceptDialog *dialog_error; ProjectDialog *npdialog; - ScrollContainer *scroll; - VBoxContainer *scroll_children; HBoxContainer *projects_hb; TabContainer *tabs; + ProjectList *_project_list; OptionButton *language_btn; Control *gui_base; - Map<String, String> selected_list; // name -> main_scene - String last_clicked; bool importing; void _open_asset_library(); @@ -86,7 +84,6 @@ class ProjectManager : public Control { void _run_project_confirm(); void _open_selected_projects(); void _open_selected_projects_ask(); - void _show_project(const String &p_path); void _import_project(); void _new_project(); void _rename_project(); @@ -111,13 +108,13 @@ class ProjectManager : public Control { void _install_project(const String &p_zip_path, const String &p_title); void _dim_window(); - void _panel_draw(Node *p_hb); - void _panel_input(const Ref<InputEvent> &p_ev, Node *p_hb); void _unhandled_input(const Ref<InputEvent> &p_ev); - void _favorite_pressed(Node *p_hb); void _files_dropped(PoolStringArray p_files, int p_screen); void _scan_multiple_folders(PoolStringArray p_files); + void _on_order_option_changed(); + void _on_filter_option_changed(); + protected: void _notification(int p_what); static void _bind_methods(); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 001846604c..1c588a45f1 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -52,8 +52,8 @@ static const char *_button_names[JOY_BUTTON_MAX] = { "R2", "L3", "R3", - "Select, Nintendo -", - "Start, Nintendo +", + "Select, DualShock Share, Nintendo -", + "Start, DualShock Options, Nintendo +", "D-Pad Up", "D-Pad Down", "D-Pad Left", @@ -965,8 +965,6 @@ void ProjectSettingsEditor::_action_add() { while (r->get_next()) r = r->get_next(); - if (!r) - return; r->select(0); input_editor->ensure_cursor_is_visible(); action_add_error->hide(); diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 82d974cae3..899343c0f8 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -614,7 +614,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: type = Variant::Type(i); } } - if (type) + if (type != Variant::NIL) property_select->select_method_from_basic_type(type, v); updating = false; return false; @@ -971,7 +971,6 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: menu->add_separator(); menu->add_item(TTR("Show in FileSystem"), OBJ_MENU_SHOW_IN_FILE_SYSTEM); } - } else { } RES cb = EditorSettings::get_singleton()->get_resource_clipboard(); diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp index 813e24bd61..3bc93c3900 100644 --- a/editor/property_selector.cpp +++ b/editor/property_selector.cpp @@ -337,7 +337,7 @@ void PropertySelector::_item_selected() { String name = item->get_metadata(0); String class_type; - if (type) { + if (type != Variant::NIL) { class_type = Variant::get_type_name(type); } else { diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 935946bf24..aeee829de2 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -301,6 +301,8 @@ bool SceneTreeDock::_track_inherit(const String &p_target_scene_path, Node *p_de Ref<PackedScene> data = ResourceLoader::load(path); if (data.is_valid()) { p = data->instance(PackedScene::GEN_EDIT_STATE_INSTANCE); + if (!p) + continue; instances.push_back(p); } else break; @@ -338,7 +340,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { tree->edit_selected(); } } break; - case TOOL_NEW: { + case TOOL_NEW: + case TOOL_REPARENT_TO_NEW_NODE: { if (!profile_allow_editing) { break; @@ -394,7 +397,11 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (!profile_allow_editing) { break; } - create_dialog->popup_create(false, true, scene_tree->get_selected()->get_class()); + + Node *selected = scene_tree->get_selected(); + if (selected) + create_dialog->popup_create(false, true, selected->get_class()); + } break; case TOOL_ATTACH_SCRIPT: { @@ -462,8 +469,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { Node *n = Object::cast_to<Node>(selection[i]); Ref<Script> existing = n->get_script(); - if (existing.is_valid()) { - const RefPtr empty; + Ref<Script> empty = EditorNode::get_singleton()->get_object_custom_type_base(n); + if (existing != empty) { editor_data->get_undo_redo().add_do_method(n, "set_script", empty); editor_data->get_undo_redo().add_undo_method(n, "set_script", existing); } @@ -1905,6 +1912,54 @@ Node *SceneTreeDock::_get_selection_group_tail(Node *p_node, List<Node *> p_list return tail; } +void SceneTreeDock::_do_create(Node *p_parent) { + Object *c = create_dialog->instance_selected(); + + ERR_FAIL_COND(!c); + Node *child = Object::cast_to<Node>(c); + ERR_FAIL_COND(!child); + + editor_data->get_undo_redo().create_action(TTR("Create Node")); + + if (edited_scene) { + + editor_data->get_undo_redo().add_do_method(p_parent, "add_child", child); + editor_data->get_undo_redo().add_do_method(child, "set_owner", edited_scene); + editor_data->get_undo_redo().add_do_method(editor_selection, "clear"); + editor_data->get_undo_redo().add_do_method(editor_selection, "add_node", child); + editor_data->get_undo_redo().add_do_reference(child); + editor_data->get_undo_redo().add_undo_method(p_parent, "remove_child", child); + + String new_name = p_parent->validate_child_name(child); + ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger(); + editor_data->get_undo_redo().add_do_method(sed, "live_debug_create_node", edited_scene->get_path_to(p_parent), child->get_class(), new_name); + editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(p_parent)).plus_file(new_name))); + + } else { + + editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", child); + editor_data->get_undo_redo().add_do_method(scene_tree, "update_tree"); + editor_data->get_undo_redo().add_do_reference(child); + editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)NULL); + } + + editor_data->get_undo_redo().commit_action(); + editor->push_item(c); + editor_selection->clear(); + editor_selection->add_node(child); + if (Object::cast_to<Control>(c)) { + //make editor more comfortable, so some controls don't appear super shrunk + Control *ct = Object::cast_to<Control>(c); + + Size2 ms = ct->get_minimum_size(); + if (ms.width < 4) + ms.width = 40; + if (ms.height < 4) + ms.height = 40; + ct->set_size(ms); + } +} + void SceneTreeDock::_create() { if (current_option == TOOL_NEW) { @@ -1923,51 +1978,7 @@ void SceneTreeDock::_create() { ERR_FAIL_COND(!parent); } - Object *c = create_dialog->instance_selected(); - - ERR_FAIL_COND(!c); - Node *child = Object::cast_to<Node>(c); - ERR_FAIL_COND(!child); - - editor_data->get_undo_redo().create_action(TTR("Create Node")); - - if (edited_scene) { - - editor_data->get_undo_redo().add_do_method(parent, "add_child", child); - editor_data->get_undo_redo().add_do_method(child, "set_owner", edited_scene); - editor_data->get_undo_redo().add_do_method(editor_selection, "clear"); - editor_data->get_undo_redo().add_do_method(editor_selection, "add_node", child); - editor_data->get_undo_redo().add_do_reference(child); - editor_data->get_undo_redo().add_undo_method(parent, "remove_child", child); - - String new_name = parent->validate_child_name(child); - ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger(); - editor_data->get_undo_redo().add_do_method(sed, "live_debug_create_node", edited_scene->get_path_to(parent), child->get_class(), new_name); - editor_data->get_undo_redo().add_undo_method(sed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)).plus_file(new_name))); - - } else { - - editor_data->get_undo_redo().add_do_method(editor, "set_edited_scene", child); - editor_data->get_undo_redo().add_do_method(scene_tree, "update_tree"); - editor_data->get_undo_redo().add_do_reference(child); - editor_data->get_undo_redo().add_undo_method(editor, "set_edited_scene", (Object *)NULL); - } - - editor_data->get_undo_redo().commit_action(); - editor->push_item(c); - editor_selection->clear(); - editor_selection->add_node(child); - if (Object::cast_to<Control>(c)) { - //make editor more comfortable, so some controls don't appear super shrunk - Control *ct = Object::cast_to<Control>(c); - - Size2 ms = ct->get_minimum_size(); - if (ms.width < 4) - ms.width = 40; - if (ms.height < 4) - ms.height = 40; - ct->set_size(ms); - } + _do_create(parent); } else if (current_option == TOOL_REPLACE) { List<Node *> selection = editor_selection->get_selected_node_list(); @@ -1984,6 +1995,52 @@ void SceneTreeDock::_create() { replace_node(n, newnode); } + } else if (current_option == TOOL_REPARENT_TO_NEW_NODE) { + List<Node *> selection = editor_selection->get_selected_node_list(); + ERR_FAIL_COND(selection.size() <= 0); + + // Find top level node in selection + bool only_one_top_node = true; + + Node *first = selection.front()->get(); + ERR_FAIL_COND(!first); + int smaller_path_to_top = first->get_path_to(scene_root).get_name_count(); + Node *top_node = first; + + for (List<Node *>::Element *E = selection.front()->next(); E; E = E->next()) { + Node *n = E->get(); + ERR_FAIL_COND(!n); + + int path_length = n->get_path_to(scene_root).get_name_count(); + + if (top_node != n) { + if (smaller_path_to_top > path_length) { + top_node = n; + smaller_path_to_top = path_length; + only_one_top_node = true; + } else if (smaller_path_to_top == path_length) { + if (only_one_top_node && top_node->get_parent() != n->get_parent()) + only_one_top_node = false; + } + } + } + + Node *parent = NULL; + if (only_one_top_node) + parent = top_node->get_parent(); + else + parent = top_node->get_parent()->get_parent(); + + _do_create(parent); + + Vector<Node *> nodes; + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + nodes.push_back(E->get()); + } + + // This works because editor_selection was cleared and populated with last created node in _do_create() + Node *last_created = editor_selection->get_selected_node_list().front()->get(); + _do_reparent(last_created, -1, nodes, true); } scene_tree->get_scene_tree()->call_deferred("grab_focus"); @@ -2325,6 +2382,7 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { menu->clear(); Ref<Script> existing_script; + bool exisiting_script_removable = true; if (selection.size() == 1) { Node *selected = selection[0]; @@ -2344,6 +2402,10 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { menu->add_separator(); existing_script = selected->get_script(); + + if (EditorNode::get_singleton()->get_object_custom_type_base(selected) == existing_script) { + exisiting_script_removable = false; + } } if (profile_allow_script_editing) { @@ -2355,7 +2417,7 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { menu->add_icon_shortcut(get_icon("ScriptExtend", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/extend_script"), TOOL_ATTACH_SCRIPT); } } - if (selection.size() > 1 || existing_script.is_valid()) { + if (selection.size() > 1 || (existing_script.is_valid() && exisiting_script_removable)) { menu->add_icon_shortcut(get_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/clear_script"), TOOL_CLEAR_SCRIPT); } menu->add_separator(); @@ -2373,6 +2435,7 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { menu->add_icon_shortcut(get_icon("MoveDown", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_down"), TOOL_MOVE_DOWN); menu->add_icon_shortcut(get_icon("Duplicate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/duplicate"), TOOL_DUPLICATE); menu->add_icon_shortcut(get_icon("Reparent", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/reparent"), TOOL_REPARENT); + menu->add_icon_shortcut(get_icon("ReparentToNewNode", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/reparent_to_new_node"), TOOL_REPARENT_TO_NEW_NODE); menu->add_icon_shortcut(get_icon("NewRoot", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/make_root"), TOOL_MAKE_ROOT); } } @@ -2669,6 +2732,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel ED_SHORTCUT("scene_tree/move_down", TTR("Move Down"), KEY_MASK_CMD | KEY_DOWN); ED_SHORTCUT("scene_tree/duplicate", TTR("Duplicate"), KEY_MASK_CMD | KEY_D); ED_SHORTCUT("scene_tree/reparent", TTR("Reparent")); + ED_SHORTCUT("scene_tree/reparent_to_new_node", TTR("Reparent to New Node")); ED_SHORTCUT("scene_tree/make_root", TTR("Make Scene Root")); ED_SHORTCUT("scene_tree/merge_from_scene", TTR("Merge From Scene")); ED_SHORTCUT("scene_tree/save_branch_as_scene", TTR("Save Branch as Scene")); diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index 8a2b237b8b..cd582fdf57 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -70,6 +70,7 @@ class SceneTreeDock : public VBoxContainer { TOOL_MOVE_DOWN, TOOL_DUPLICATE, TOOL_REPARENT, + TOOL_REPARENT_TO_NEW_NODE, TOOL_MAKE_ROOT, TOOL_NEW_SCENE_FROM, TOOL_MERGE_FROM_SCENE, @@ -142,6 +143,7 @@ class SceneTreeDock : public VBoxContainer { bool first_enter; void _create(); + void _do_create(Node *p_parent); Node *scene_root; Node *edited_scene; EditorNode *editor; diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 445ca3a792..2d9accc3d8 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -70,7 +70,8 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i } } else if (p_id == BUTTON_SCRIPT) { RefPtr script = n->get_script(); - if (!script.is_null()) + Ref<Script> script_typed = script; + if (!script_typed.is_null()) emit_signal("open_script", script); } else if (p_id == BUTTON_VISIBILITY) { @@ -210,13 +211,20 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { if (connect_to_script_mode) { Color accent = get_color("accent_color", "Editor"); - if (!p_node->get_script().is_null()) { + Ref<Script> script = p_node->get_script(); + if (!script.is_null() && EditorNode::get_singleton()->get_object_custom_type_base(p_node) != script) { //has script item->add_button(0, get_icon("Script", "EditorIcons"), BUTTON_SCRIPT); } else { - //has no script + //has no script (or script is a custom type) item->set_custom_color(0, get_color("disabled_font_color", "Editor")); item->set_selectable(0, false); + + if (!script.is_null()) { // make sure to mark the script if a custom type + item->add_button(0, get_icon("Script", "EditorIcons"), BUTTON_SCRIPT); + item->set_button_disabled(0, item->get_button_count(0) - 1, true); + } + accent.a *= 0.7; } @@ -282,7 +290,10 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { item->add_button(0, get_icon("InstanceOptions", "EditorIcons"), BUTTON_SUBSCENE, false, TTR("Open in Editor")); item->set_tooltip(0, TTR("Instance:") + " " + p_node->get_filename() + "\n" + TTR("Type:") + " " + p_node->get_class()); } else { - item->set_tooltip(0, String(p_node->get_name()) + "\n" + TTR("Type:") + " " + p_node->get_class()); + StringName type = EditorNode::get_singleton()->get_object_custom_type_name(p_node); + if (type == StringName()) + type = p_node->get_class(); + item->set_tooltip(0, String(p_node->get_name()) + "\n" + TTR("Type:") + " " + type); } if (can_open_instance && undo_redo) { //Show buttons only when necessary(SceneTreeDock) to avoid crashes @@ -290,9 +301,12 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { if (!p_node->is_connected("script_changed", this, "_node_script_changed")) p_node->connect("script_changed", this, "_node_script_changed", varray(p_node)); - if (!p_node->get_script().is_null()) { - Ref<Script> script = p_node->get_script(); + Ref<Script> script = p_node->get_script(); + if (!script.is_null()) { item->add_button(0, get_icon("Script", "EditorIcons"), BUTTON_SCRIPT, false, TTR("Open Script:") + " " + script->get_path()); + if (EditorNode::get_singleton()->get_object_custom_type_base(p_node) == script) { + item->set_button_color(0, item->get_button_count(0) - 1, Color(1, 1, 1, 0.5)); + } } if (p_node->is_class("CanvasItem")) { diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index bebfe6d3a1..ed9a24311d 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -126,7 +126,7 @@ bool ScriptCreateDialog::_validate_class(const String &p_string) { return false; // no start with number plz } - bool valid_char = (p_string[i] >= '0' && p_string[i] <= '9') || (p_string[i] >= 'a' && p_string[i] <= 'z') || (p_string[i] >= 'A' && p_string[i] <= 'Z') || p_string[i] == '_'; + bool valid_char = (p_string[i] >= '0' && p_string[i] <= '9') || (p_string[i] >= 'a' && p_string[i] <= 'z') || (p_string[i] >= 'A' && p_string[i] <= 'Z') || p_string[i] == '_' || p_string[i] == '.'; if (!valid_char) return false; @@ -528,7 +528,7 @@ void ScriptCreateDialog::_update_dialog() { if (has_named_classes) { if (is_new_script_created) { class_name->set_editable(true); - class_name->set_placeholder(TTR("Allowed: a-z, A-Z, 0-9 and _")); + class_name->set_placeholder(TTR("Allowed: a-z, A-Z, 0-9, _ and .")); class_name->set_placeholder_alpha(0.3); } else { class_name->set_editable(false); diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index 8fd1064427..f7ff754a0b 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -383,6 +383,74 @@ void ScriptEditorDebugger::_scene_tree_request() { ppeer->put_var(msg); } +/// Populates inspect_scene_tree recursively given data in nodes. +/// Nodes is an array containing 4 elements for each node, it follows this pattern: +/// nodes[i] == number of direct children of this node +/// nodes[i + 1] == node name +/// nodes[i + 2] == node class +/// nodes[i + 3] == node instance id +/// +/// Returns the number of items parsed in nodes from current_index. +/// +/// Given a nodes array like [R,A,B,C,D,E] the following Tree will be generated, assuming +/// filter is an empty String, R and A child count are 2, B is 1 and C, D and E are 0. +/// +/// R +/// |-A +/// | |-B +/// | | |-C +/// | | +/// | |-D +/// | +/// |-E +/// +int ScriptEditorDebugger::_update_scene_tree(TreeItem *parent, const Array &nodes, int current_index) { + String filter = EditorNode::get_singleton()->get_scene_tree_dock()->get_filter(); + String item_text = nodes[current_index + 1]; + bool keep = filter.is_subsequence_ofi(item_text); + + TreeItem *item = inspect_scene_tree->create_item(parent); + item->set_text(0, item_text); + ObjectID id = ObjectID(nodes[current_index + 3]); + Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(nodes[current_index + 2], ""); + if (icon.is_valid()) { + item->set_icon(0, icon); + } + item->set_metadata(0, id); + + // Set current item as collapsed if necessary + if (parent) { + if (!unfold_cache.has(id)) { + item->set_collapsed(true); + } + } + + int children_count = nodes[current_index]; + // Tracks the total number of items parsed in nodes, this is used to skips nodes that + // are not direct children of the current node since we can't know in advance the total + // number of children, direct and not, of a node without traversing the nodes array previously. + // Keeping track of this allows us to build our remote scene tree by traversing the node + // array just once. + int items_count = 1; + for (int i = 0; i < children_count; i++) { + // Called for each direct child of item. + // Direct children of current item might not be adjacent so items_count must + // be incremented by the number of items parsed until now, otherwise we would not + // be able to access the next child of the current item. + // items_count is multiplied by 4 since that's the number of elements in the nodes + // array needed to represent a single node. + items_count += _update_scene_tree(item, nodes, current_index + items_count * 4); + } + + // If item has not children and should not be kept delete it + if (!keep && !item->get_children() && parent) { + parent->remove_child(item); + memdelete(item); + } + + return items_count; +} + void ScriptEditorDebugger::_video_mem_request() { ERR_FAIL_COND(connection.is_null()); @@ -455,48 +523,8 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da updating_scene_tree = true; - for (int i = 0; i < p_data.size(); i += 4) { - - TreeItem *p; - int level = p_data[i]; - if (level == 0) { - p = NULL; - } else { - ERR_CONTINUE(!lv.has(level - 1)); - p = lv[level - 1]; - } - - TreeItem *it = inspect_scene_tree->create_item(p); + _update_scene_tree(NULL, p_data, 0); - ObjectID id = ObjectID(p_data[i + 3]); - - it->set_text(0, p_data[i + 1]); - Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(p_data[i + 2], ""); - if (icon.is_valid()) - it->set_icon(0, icon); - it->set_metadata(0, id); - - if (id == inspected_object_id) { - TreeItem *cti = it->get_parent(); //ensure selected is always uncollapsed - while (cti) { - cti->set_collapsed(false); - cti = cti->get_parent(); - } - it->select(0); - } - - if (p) { - if (!unfold_cache.has(id)) { - it->set_collapsed(true); - } - } else { - if (unfold_cache.has(id)) { //reverse for root - it->set_collapsed(true); - } - } - - lv[level] = it; - } updating_scene_tree = false; le_clear->set_disabled(false); @@ -988,7 +1016,10 @@ void ScriptEditorDebugger::_performance_draw() { Ref<Font> graph_font = get_font("font", "TextEdit"); if (which.empty()) { - perf_draw->draw_string(graph_font, Point2(0, graph_font->get_ascent()), TTR("Pick one or more items from the list to display the graph."), get_color("font_color", "Label"), perf_draw->get_size().x); + String text = TTR("Pick one or more items from the list to display the graph."); + + perf_draw->draw_string(graph_font, Point2i(MAX(0, perf_draw->get_size().x - graph_font->get_string_size(text).x), perf_draw->get_size().y + graph_font->get_ascent()) / 2, text, get_color("font_color", "Label"), perf_draw->get_size().x); + return; } diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h index 05dcab0f80..947b0cca52 100644 --- a/editor/script_editor_debugger.h +++ b/editor/script_editor_debugger.h @@ -173,6 +173,7 @@ class ScriptEditorDebugger : public Control { void _set_reason_text(const String &p_reason, MessageType p_type); void _scene_tree_property_select_object(ObjectID p_object); void _scene_tree_property_value_edited(const String &p_prop, const Variant &p_value); + int _update_scene_tree(TreeItem *parent, const Array &nodes, int current_index); void _video_mem_request(); diff --git a/editor/translations/af.po b/editor/translations/af.po index dda13206c0..e220906bcb 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -137,6 +137,31 @@ msgstr "Anim Verander Roep" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Verander Waarde" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Verander Oorgang" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Verander Transform" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Verander Waarde" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Verander Roep" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Verander Anim Lente" @@ -646,6 +671,10 @@ msgstr "Gaan na Reël" msgid "Line Number:" msgstr "Reël Nommer:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Geen Pasmaats" @@ -695,7 +724,7 @@ msgstr "Zoem Uit" msgid "Reset Zoom" msgstr "Herset Zoem" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -806,6 +835,11 @@ msgid "Connect" msgstr "Koppel" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Seine:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Koppel '%s' aan '%s'" @@ -978,7 +1012,8 @@ msgid "Owners Of:" msgstr "Eienaars van:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Verwyder geselekteerde lêers uit die projek? (geen ontdoen)" #: editor/dependency_editor.cpp @@ -1166,7 +1201,6 @@ msgid "Success!" msgstr "Sukses!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Installeer" @@ -1537,6 +1571,10 @@ msgstr "" msgid "Template file not found:" msgstr "Sjabloon lêer nie gevind nie:\n" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1727,7 +1765,7 @@ msgstr "Open 'n Lêer" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Verfris" @@ -1778,7 +1816,7 @@ msgstr "Gaan Vorentoe" msgid "Go Up" msgstr "Gaan Op" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Wissel Versteekte Lêers" @@ -1804,27 +1842,32 @@ msgstr "Skuif Gunsteling Af" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Voorskou:" +msgid "Go to previous folder." +msgstr "Gaan na ouer vouer" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Skep Vouer" +msgid "Go to next folder." +msgstr "Gaan na ouer vouer" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Gaan na ouer vouer" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Deursoek Klasse" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Kon nie vouer skep nie." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Wissel Versteekte Lêers" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2529,6 +2572,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Verwyder Seleksie" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2722,14 +2770,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3045,6 +3085,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Lede" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3672,6 +3717,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4740,6 +4786,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Installeer" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4769,7 +4820,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4783,7 +4833,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4858,31 +4908,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "Skep Vouer" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Verwyder ongeldige sleutels" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "Skep Vouer" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Verwyder ongeldige sleutels" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6491,10 +6545,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Skep" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6792,7 +6855,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6977,10 +7044,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7561,14 +7624,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7976,6 +8031,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8066,6 +8125,22 @@ msgid "Color uniform." msgstr "Anim Verander Transform" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8073,10 +8148,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8166,7 +8275,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8174,7 +8283,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8186,7 +8295,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8203,7 +8312,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8272,11 +8381,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8292,7 +8401,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8320,11 +8429,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8365,11 +8474,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8379,7 +8492,7 @@ msgstr "Skep Intekening" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8397,15 +8510,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8457,7 +8570,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8485,12 +8598,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8567,47 +8680,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9778,6 +9891,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Skep Nuwe" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9988,7 +10106,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10045,7 +10163,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10449,56 +10567,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "Kon nie vouer skep nie." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "Skep Intekening" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11088,7 +11156,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11137,7 +11205,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11147,7 +11215,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11223,12 +11291,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11307,7 +11375,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11336,6 +11404,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11370,8 +11442,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11382,7 +11454,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11398,7 +11472,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11409,7 +11483,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11446,7 +11522,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Koppel '%s' aan '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11460,7 +11536,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11491,8 +11567,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11512,18 +11587,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11566,9 +11641,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11586,6 +11669,22 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Voorskou:" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Skep Vouer" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "Kon nie vouer skep nie." + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "Skep Intekening" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Deursoek Klasse" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 3ac0bbae58..21d1f3e745 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -27,12 +27,14 @@ # Ibraheem Tawfik <tawfikibraheem@gmail.com>, 2019. # DiscoverSquishy <noaimi@discoversquishy.me>, 2019. # ButterflyOfFire <ButterflyOfFire@protonmail.com>, 2019. +# PhoenixHO <oussamahaddouche0@gmail.com>, 2019. +# orcstudio <orcstudio@orcstudio.org>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-06-16 19:42+0000\n" -"Last-Translator: ButterflyOfFire <ButterflyOfFire@protonmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: orcstudio <orcstudio@orcstudio.org>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -41,7 +43,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 3.7-dev\n" +"X-Generator: Weblate 3.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -102,7 +104,7 @@ msgstr "الوقت:" #: editor/animation_bezier_editor.cpp #, fuzzy msgid "Value:" -msgstr "إسم جديد:" +msgstr "القيمة:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" @@ -153,6 +155,31 @@ msgid "Anim Change Call" msgstr "نداء تغيير Ø§Ù„ØªØØ±ÙŠÙƒ" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "تغيير وقت الإطار الرئيسي Ù„Ù„ØØ±ÙƒØ©" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "تغيير المقطع الإنتقالي" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "تØÙˆÙŠÙ„ تغيير Ø§Ù„ØªØØ±ÙŠÙƒ" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "تغيير قيمة الإطار الأساسي Ù„Ù„ØØ±ÙƒØ©" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "نداء تغيير Ø§Ù„ØªØØ±ÙŠÙƒ" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "تعديل طول عرض Ø§Ù„ØØ±ÙƒØ©" @@ -454,6 +481,12 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"هذا الانيميشن ينتمي الى مشهد مستورد، لذا ÙØ¥Ù† أي تغييرات ÙÙŠ المسارات " +"المستوردة لن يتم ØÙظها.\n" +"\n" +"لتشغيل الامكانية Ù„Ø¥Ø¶Ø§ÙØ© مسارات خاصة، انتقل إلى إعدادات استيراد المشهد واضبط " +"\"Animation > Storage\" إلى \"Files\"ØŒ شغل \"Animation > Keep Custom Tracks" +"\"ØŒ ثم ..." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" @@ -462,7 +495,7 @@ msgstr "" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Select All" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ الكل" #: editor/animation_track_editor.cpp #, fuzzy @@ -645,6 +678,10 @@ msgstr "إذهب إلي الخط" msgid "Line Number:" msgstr "رقم الخط:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "لا مطابقة" @@ -694,7 +731,7 @@ msgstr "إبعاد" msgid "Reset Zoom" msgstr "إرجاع التكبير" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "ØªØØ°ÙŠØ±Ø§Øª" @@ -722,9 +759,8 @@ msgid "Connect to Node:" msgstr "صلها بالعقدة:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "لا يمكن الإتصال Ø¨Ø§Ù„Ù…ÙØ¶ÙŠÙ:" +msgstr "الإتصال بالمخطوطة:" #: editor/connections_dialog.cpp #, fuzzy @@ -762,9 +798,8 @@ msgid "Extra Call Arguments:" msgstr "وسائط إستدعاء إضاÙية :" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "إعدادات الكبس" +msgstr "إعدادات متقدمة" #: editor/connections_dialog.cpp msgid "Deferred" @@ -807,6 +842,11 @@ msgid "Connect" msgstr "وصل" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "الإشارات:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "وصل '%s' إلي '%s'" @@ -973,7 +1013,8 @@ msgid "Owners Of:" msgstr "ملاك:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Ø¥Ù…Ø³Ø Ø§Ù„Ù…Ù„ÙØ§Øª Ø§Ù„Ù…ØØ¯Ø¯Ø© من المشروع؟ (لا رجعة)" #: editor/dependency_editor.cpp @@ -1156,7 +1197,6 @@ msgid "Success!" msgstr "تم بشكل ناجØ!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "تثبيت" @@ -1525,6 +1565,10 @@ msgstr "قالب الإصدار المخصص ليس موجود." msgid "Template file not found:" msgstr "مل٠النموذج غير موجود:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1722,7 +1766,7 @@ msgstr "أظهر ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª" msgid "New Folder..." msgstr "مجلد جديد..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "ØªØØ¯ÙŠØ«" @@ -1773,7 +1817,7 @@ msgstr "إذهب للأمام" msgid "Go Up" msgstr "إذهب للأعلي" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "أظهر Ø§Ù„Ù…Ù„ÙØ§Øª المخÙية" @@ -1798,27 +1842,33 @@ msgid "Move Favorite Down" msgstr "ØØ±Ùƒ المÙÙØ¶Ù„Ø© للأسÙÙ„" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "المجلد السابق" +#, fuzzy +msgid "Go to previous folder." +msgstr "إذهب إلي المجلد السابق" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "المجلد اللاØÙ‚" +msgid "Go to next folder." +msgstr "إذهب إلي المجلد السابق" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "إذهب إلي المجلد السابق" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Ø¥Ø¨ØØ« ÙÙŠ الأصناÙ" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "لا يمكن إنشاء المجلد." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "أظهر Ø§Ù„Ù…Ù„ÙØ§Øª المخÙية" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2072,7 +2122,7 @@ msgstr "أخلاء الخرج" #: editor/editor_node.cpp msgid "Project export failed with error code %d." -msgstr "تصدير المشروع ÙØ´Ù„, رمز الخطأ % d." +msgstr "تصدير المشروع ÙØ´Ù„, رمز الخطأ %d." #: editor/editor_node.cpp msgid "Imported resources can't be saved." @@ -2555,6 +2605,11 @@ msgid "Go to previously opened scene." msgstr "اذهب الي المشهد Ø§Ù„Ù…ÙØªÙˆØ مسبقا." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "نسخ المسار" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "التبويب التالي" @@ -2767,15 +2822,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "ÙØªØ ÙÙŠ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ التالي" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع الشاشة الكاملة" @@ -3103,6 +3149,11 @@ msgid "Calls" msgstr "ندائات" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "الأعضاء" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3740,6 +3791,7 @@ msgid "Nodes not in Group" msgstr "Ø¥Ø¶Ø§ÙØ© إلي مجموعة" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4830,6 +4882,11 @@ msgid "Idle" msgstr "عاطل" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "تثبيت" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "إعادة Ø§Ù„Ù…ØØ§ÙˆÙ„Ø©" @@ -4860,7 +4917,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "الكل" @@ -4874,8 +4930,9 @@ msgid "Sort:" msgstr "ترتيب:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "عكس" +#, fuzzy +msgid "Reverse sorting." +msgstr "جار الطلب..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4954,31 +5011,38 @@ msgid "Rotation Step:" msgstr "خطوة الدوران:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "ØªØØ±ÙŠÙƒ الموجه العمودي" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "إنشاء موجه عمودي جديد" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ¬Ù‡ العمودي" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "ØªØØ±ÙŠÙƒ الموجه الأÙقي" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "إنشاء موجه Ø£Ùقي جديد" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ¬Ù‡ الأÙقي" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "إنشاء موجه عمودي وأÙقي جديد" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6627,10 +6691,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø§Ø·" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6933,7 +7006,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7120,10 +7197,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7720,14 +7793,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8160,6 +8225,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8252,6 +8321,22 @@ msgid "Color uniform." msgstr "تØÙˆÙŠÙ„ تغيير Ø§Ù„ØªØØ±ÙŠÙƒ" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8259,10 +8344,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8353,7 +8472,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8361,7 +8480,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8373,7 +8492,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8390,7 +8509,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8459,11 +8578,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8479,7 +8598,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8507,11 +8626,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8552,11 +8671,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8566,7 +8689,7 @@ msgstr "إنشاء بولي" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8584,15 +8707,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8644,7 +8767,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8672,12 +8795,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8755,47 +8878,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9984,6 +10107,11 @@ msgstr "ÙØªØ الكود" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "إنشاء %s جديد" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "ØÙظ المشهد" @@ -10202,7 +10330,7 @@ msgid "Script is valid." msgstr "شجرة Ø§Ù„ØØ±ÙƒØ© صØÙŠØØ©." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10260,7 +10388,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10677,55 +10805,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "إنشاء الØÙ„..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "لا يمكن إنشاء Ø§Ù„ØØ¯." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "ÙØ´Ù„ ØÙظ الØÙ„." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "تم" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "ÙØ´Ù„ إنشاء مشروع C#‎." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "إنشاء ØÙ„ C#‎" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "بناء المشروع" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11312,8 +11391,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "ليتم إظهار الأطر (اللقطات) ÙÙŠ الAnimatedSprite (النقوش Ø§Ù„Ù…ØªØØ±ÙƒØ©), يجب تكوين " @@ -11366,7 +11446,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11376,7 +11456,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11452,12 +11532,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11534,10 +11614,13 @@ msgid "" msgstr "" #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" +"يجب تزويد ال CollisionShape2D Ø¨Ø¥ØØ¯Ù‰ الأشكال (من نوع Shape2D) لتعمل بالشكل " +"المطلوب. الرجاء تكوين Ùˆ ضبط الشكل لها اولا!" #: scene/3d/collision_shape.cpp msgid "" @@ -11565,6 +11648,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11599,8 +11686,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11611,7 +11698,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11626,10 +11715,13 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" +"ليتم إظهار الأطر (اللقطات) ÙÙŠ الAnimatedSprite (النقوش Ø§Ù„Ù…ØªØØ±ÙƒØ©), يجب تكوين " +"مصدر لها من نوع SpriteFrames Ùˆ ضبط خاصية الFrames (الأطر) بها." #: scene/3d/vehicle_body.cpp msgid "" @@ -11638,7 +11730,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11676,7 +11770,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "قطع إتصال'%s' من '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11690,7 +11784,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "شجرة Ø§Ù„ØØ±ÙƒØ© خاطئة." #: scene/animation/animation_tree_player.cpp @@ -11722,8 +11816,7 @@ msgstr "أض٠اللون Ø§Ù„ØØ§Ù„ÙŠ كإعداد مسبق" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11743,18 +11836,18 @@ msgstr "يرجى التاكيد..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11797,9 +11890,19 @@ msgid "Input" msgstr "إدخال" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "مصدر غير ØµØ§Ù„Ø Ù„ØªØ¸Ù„ÙŠÙ„." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "مصدر غير ØµØ§Ù„Ø Ù„ØªØ¸Ù„ÙŠÙ„." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "مصدر غير ØµØ§Ù„Ø Ù„ØªØ¸Ù„ÙŠÙ„." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "التعيين لتعمل." @@ -11816,6 +11919,45 @@ msgstr "يمكن تعيين المتغيرات Ùقط ÙÙŠ الذروة ." msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "المجلد السابق" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "المجلد اللاØÙ‚" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "ÙØªØ ÙÙŠ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ التالي" + +#~ msgid "Reverse" +#~ msgstr "عكس" + +#~ msgid "Generating solution..." +#~ msgstr "إنشاء الØÙ„..." + +#~ msgid "Failed to create solution." +#~ msgstr "لا يمكن إنشاء Ø§Ù„ØØ¯." + +#~ msgid "Failed to save solution." +#~ msgstr "ÙØ´Ù„ ØÙظ الØÙ„." + +#~ msgid "Done" +#~ msgstr "تم" + +#~ msgid "Failed to create C# project." +#~ msgstr "ÙØ´Ù„ إنشاء مشروع C#‎." + +#~ msgid "Create C# solution" +#~ msgstr "إنشاء ØÙ„ C#‎" + +#~ msgid "Build Project" +#~ msgstr "بناء المشروع" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª" + #, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Ø¥Ø¨ØØ« ÙÙŠ الأصناÙ" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 9a53c70603..848408b8f3 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -139,6 +139,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp #, fuzzy msgid "Change Animation Length" msgstr "Промени Името на ÐнимациÑта:" @@ -646,6 +666,10 @@ msgstr "Отиди на Ред" msgid "Line Number:" msgstr "Ðомер на Реда:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "ÐÑма СъвпадениÑ" @@ -696,7 +720,7 @@ msgstr "Отдалечи" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -804,6 +828,11 @@ msgid "Connect" msgstr "Свържи" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "ÐаÑтройки на редактора" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Свържи '%s' Ñ '%s'" @@ -966,7 +995,8 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Премахни Ñелектираните файлове от проекта? (необратимо)" #: editor/dependency_editor.cpp @@ -1145,7 +1175,6 @@ msgid "Success!" msgstr "Готово!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "ИнÑталиране" @@ -1507,6 +1536,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1700,7 +1733,7 @@ msgstr "Покажи във Файлов Мениджър" msgid "New Folder..." msgstr "Ðова папка..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1751,7 +1784,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Покажи Скрити Файлове" @@ -1777,27 +1810,32 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Предишен подпрозорец" +msgid "Go to previous folder." +msgstr "Към горната папка" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Създаване на папка" +msgid "Go to next folder." +msgstr "Към горната папка" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Към горната папка" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ТърÑене" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "ÐеуÑпешно Ñъздаване на папка." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Покажи Скрити Файлове" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2502,6 +2540,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Копиране" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Следващ подпрозорец" @@ -2697,14 +2740,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "ÐаÑтройки на редактора" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3025,6 +3060,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Файл:" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3658,6 +3698,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" msgstr "ПоÑтавÑне на възелите" @@ -4754,6 +4795,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "ИнÑталиране" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Опитай пак" @@ -4783,7 +4829,6 @@ msgid "Last" msgstr "ПоÑледна" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Ð’Ñички" @@ -4797,8 +4842,9 @@ msgid "Sort:" msgstr "Подреждане:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Ð’ обратен ред" +#, fuzzy +msgid "Reverse sorting." +msgstr "Запитване..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4873,33 +4919,38 @@ msgid "Rotation Step:" msgstr "Съпка при Завъртане:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "ПемеÑти вертикална помощна линиÑ" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "Създай нова вертикална помощна линиÑ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Премахни вертикална помощна линиÑ" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "ПремеÑти хоризонтална помощна линиÑ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Създай нова хоризонтална помощна линиÑ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Премахни хоризонтална помощна линиÑ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Създай нова хоризонтална и вертикална помощна линиÑ" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6514,10 +6565,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Създай точки." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6818,7 +6878,12 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Изглед ОтдÑÑно." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Изглед ОтдÑÑно." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7005,10 +7070,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7595,14 +7656,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8035,6 +8088,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8123,6 +8180,22 @@ msgid "Color uniform." msgstr "ИзнаÑÑне към платформа" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8130,10 +8203,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8222,7 +8329,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8230,7 +8337,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8242,7 +8349,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8259,7 +8366,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8328,11 +8435,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8348,7 +8455,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8376,11 +8483,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8421,11 +8528,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8435,7 +8546,7 @@ msgstr "Създаване на папка" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8453,15 +8564,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8513,7 +8624,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8541,12 +8652,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8623,47 +8734,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9862,6 +9973,11 @@ msgstr "Ðова Ñцена" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Създай нови възли." + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Запазване на Ñцената" @@ -10080,7 +10196,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10138,7 +10254,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Грешки" @@ -10563,57 +10679,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "ÐеуÑпешно Ñъздаване на папка." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "Проект" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Преглед на файловете" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11206,8 +11271,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "За да може AnimatedSprite да показва кадри, първо трÑбва да му Ñе даде " @@ -11269,8 +11335,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "ТеÑктура Ñ Ð½ÑƒÐ¶Ð½Ð°Ñ‚Ð° форма на Ñветлината трÑбва да бъде дадена в параметъра " @@ -11284,7 +11351,8 @@ msgstr "" "да работи тази ÑÑнка." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "ЗатъмнÑващиÑÑ‚ многоъгълник е празен. МолÑ, нариÑувайте един." #: scene/2d/navigation_polygon.cpp @@ -11370,12 +11438,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11452,10 +11520,13 @@ msgid "" msgstr "" #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" +"За да работи CollisionShape2D, е нужно да му Ñе даде форма. МолÑ, Ñъздайте " +"му Shape2D реÑурÑ." #: scene/3d/collision_shape.cpp msgid "" @@ -11483,6 +11554,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11518,8 +11593,8 @@ msgstr "PathFollow2D работи Ñамо когато е наÑледник н #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11531,7 +11606,9 @@ msgstr "" #: scene/3d/remote_transform.cpp #, fuzzy -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" "Параметърът 'Path' трÑбва да Ñочи към дейÑтвителен възел Particles2D, за да " "работи." @@ -11548,10 +11625,13 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" +"За да може AnimatedSprite да показва кадри, първо трÑбва да му Ñе даде " +"SpriteFrames реÑÑƒÑ€Ñ Ð² парамертъра 'Frames'." #: scene/3d/vehicle_body.cpp msgid "" @@ -11560,7 +11640,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11595,7 +11677,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11607,7 +11689,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11638,8 +11720,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11659,18 +11740,18 @@ msgstr "МолÑ, потвърдете..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11713,9 +11794,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11733,6 +11822,29 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Предишен подпрозорец" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Създаване на папка" + +#~ msgid "Reverse" +#~ msgstr "Ð’ обратен ред" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "ÐеуÑпешно Ñъздаване на папка." + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "Проект" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Преглед на файловете" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "ТърÑи КлаÑове" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index ef0a7d10ab..97f6925f1d 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -144,6 +144,31 @@ msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) কল পরিবরà§à¦¤à¦¨ ঠ#: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) à¦à§à¦¯à¦¾à¦²à§ পরিবরà§à¦¤à¦¨ করà§à¦¨" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à§à¦¯à¦¾à¦¨à¦œà¦¿à¦¶à¦¨ পরিবরà§à¦¤à¦¨ করà§à¦¨" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) টà§à¦°à¦¾à¦¨à§à¦¸à¦«à¦°à§à¦® পরিবরà§à¦¤à¦¨ করà§à¦¨" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) à¦à§à¦¯à¦¾à¦²à§ পরিবরà§à¦¤à¦¨ করà§à¦¨" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ (Anim) কল পরিবরà§à¦¤à¦¨ করà§à¦¨" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° লà§à¦ª পরিবরà§à¦¤à¦¨ করà§à¦¨" @@ -665,6 +690,10 @@ msgstr "লাইন-ঠযান" msgid "Line Number:" msgstr "লাইন নামà§à¦¬à¦¾à¦°:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "কোনো মিল নেই" @@ -714,7 +743,7 @@ msgstr "সংকà§à¦šà¦¿à¦¤ করà§à¦¨ (জà§à¦®à§ আউট)" msgid "Reset Zoom" msgstr "সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¨/সংকোচন অপসারণ করà§à¦¨ (রিসেট জà§à¦®à§)" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp #, fuzzy msgid "Warnings" msgstr "সতরà§à¦•তা" @@ -828,6 +857,11 @@ msgid "Connect" msgstr "সংযোগ" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "সিগনà§à¦¯à¦¾à¦²à¦¸/সংকেতসমূহ:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "'%s' à¦à¦° সাথে '%s' সংযà§à¦•à§à¦¤ করà§à¦¨" @@ -1002,7 +1036,8 @@ msgid "Owners Of:" msgstr "সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•ারীসমূহ:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ ফাইলসমূহ পà§à¦°à¦•লà§à¦ª হতে অপসারণ করবেন? (অফেরৎযোগà§à¦¯)" #: editor/dependency_editor.cpp @@ -1189,7 +1224,6 @@ msgid "Success!" msgstr "সমà§à¦ªà¦¨à§à¦¨ হয়েছে!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "ইনà§à¦¸à¦Ÿà¦²" @@ -1569,6 +1603,10 @@ msgstr "সà§à¦¬à¦¨à¦¿à¦°à§à¦®à¦¿à¦¤ রিলিস (release) পà§à¦¯à¦¾à¦• msgid "Template file not found:" msgstr "টেমপà§à¦²à§‡à¦Ÿ ফাইল পাওয়া যায়নি:\n" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1770,7 +1808,7 @@ msgstr "ফাইল-মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°à§‡ দেখà§à¦¨" msgid "New Folder..." msgstr "ফোলà§à¦¡à¦¾à¦° তৈরি করà§à¦¨" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "রিফà§à¦°à§‡à¦¸ করà§à¦¨" @@ -1821,7 +1859,7 @@ msgstr "সামনের দিকে যান" msgid "Go Up" msgstr "উপরের দিকে যান" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "অদৃশà§à¦¯ ফাইলসমূহ অদলবদল/টগল করà§à¦¨" @@ -1847,27 +1885,32 @@ msgstr "ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼à¦•ে নিচের দিকে #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "পূরà§à¦¬à§‡à¦° টà§à¦¯à¦¾à¦¬" +msgid "Go to previous folder." +msgstr "ফোলà§à¦¡à¦¾à¦° তৈরী করা সমà§à¦à¦¬ হয়নি।" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "ফোলà§à¦¡à¦¾à¦° তৈরি করà§à¦¨" +msgid "Go to next folder." +msgstr "ফোলà§à¦¡à¦¾à¦° তৈরী করা সমà§à¦à¦¬ হয়নি।" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "ফোলà§à¦¡à¦¾à¦° তৈরী করা সমà§à¦à¦¬ হয়নি।" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "ফোলà§à¦¡à¦¾à¦° তৈরী করা সমà§à¦à¦¬ হয়নি।" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "অদৃশà§à¦¯ ফাইলসমূহ অদলবদল/টগল করà§à¦¨" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2645,6 +2688,11 @@ msgid "Go to previously opened scene." msgstr "পূরà§à¦¬à§‡ খোলা দৃশà§à¦¯à§‡ যান।" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "পথ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿/কপি করà§à¦¨" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "পরের টà§à¦¯à¦¾à¦¬" @@ -2863,15 +2911,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡à¦° সেটিংস" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "পূরà§à¦£-পরà§à¦¦à¦¾ অদলবদল/টগল করà§à¦¨" @@ -3212,6 +3251,11 @@ msgid "Calls" msgstr "ডাকà§à¦¨ (Call)" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "থিম à¦à¦¡à¦¿à¦Ÿ করà§à¦¨..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "চালà§" @@ -3620,7 +3664,7 @@ msgstr "ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼-সমূহ:" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '%s' as it has not been found in the file system!" -msgstr "'% s' তে নেà¦à¦¿à¦—েট করা যাবে না কারণ à¦à¦Ÿà¦¿ ফাইল সিসà§à¦Ÿà§‡à¦®à§‡ পাওয়া যায়নি!" +msgstr "'%s' তে নেà¦à¦¿à¦—েট করা যাবে না কারণ à¦à¦Ÿà¦¿ ফাইল সিসà§à¦Ÿà§‡à¦®à§‡ পাওয়া যায়নি!" #: editor/filesystem_dock.cpp #, fuzzy @@ -3903,6 +3947,7 @@ msgid "Nodes not in Group" msgstr "গà§à¦°à§à¦ª/দলে যোগ করà§à¦¨" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" msgstr "ফিলà§à¦Ÿà¦¾à¦°à¦¸à¦®à§‚হ" @@ -4009,11 +4054,11 @@ msgstr "সংরকà§à¦·à¦¿à¦¤ হচà§à¦›à§‡..." #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "'% s' à¦à¦° জনà§à¦¯ ডিফলà§à¦Ÿ হিসাবে সেট করà§à¦¨" +msgstr "'%s' à¦à¦° জনà§à¦¯ ডিফলà§à¦Ÿ হিসাবে সেট করà§à¦¨" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "'% s' à¦à¦° জনà§à¦¯ ডিফলà§à¦Ÿ কà§à¦²à¦¿à§Ÿà¦¾à¦° করà§à¦¨" +msgstr "'%s' à¦à¦° জনà§à¦¯ ডিফলà§à¦Ÿ কà§à¦²à¦¿à§Ÿà¦¾à¦° করà§à¦¨" #: editor/import_dock.cpp #, fuzzy @@ -5024,6 +5069,11 @@ msgid "Idle" msgstr "অনিয়োজিত" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "ইনà§à¦¸à¦Ÿà¦²" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "পà§à¦¨à¦°à¦¾à¦¯à¦¼ চেষà§à¦Ÿà¦¾ করà§à¦¨" @@ -5055,7 +5105,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "সকল" @@ -5069,8 +5118,9 @@ msgid "Sort:" msgstr "সাজান:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "উলà§à¦Ÿà¦¾à¦¨/বিপরীত দিকে ফিরান" +#, fuzzy +msgid "Reverse sorting." +msgstr "পরীকà§à¦·à¦¾à¦®à§‚লক উৎস" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -5145,36 +5195,38 @@ msgid "Rotation Step:" msgstr "ঘূরà§à¦£à¦¾à§Ÿà¦¨à§‡à¦° পদকà§à¦·à§‡à¦ª:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "à¦à¦¾à¦°à§à¦Ÿà¦¿à¦•à§à¦¯à¦¾à¦² গাইড সরান" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "নতà§à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তৈরি করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "চলক/à¦à§‡à¦°à¦¿à§Ÿà§‡à¦¬à¦² অপসারণ করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "বকà§à¦°à¦°à§‡à¦–ায় বিনà§à¦¦à§ সরান" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "নতà§à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তৈরি করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ চাবিসমূহ অপসারণ করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "নতà§à¦¨ হরাইজনà§à¦Ÿà¦¾à¦² à¦à¦¬à¦‚ à¦à¦¾à¦°à§à¦Ÿà¦¿à¦•à§à¦¯à¦¾à¦² গাইড তৈরী করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6878,10 +6930,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "বিনà§à¦¦à§ অপসারণ করà§à¦¨" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -7196,9 +7257,14 @@ msgstr "পশà§à¦šà¦¾à§Ž" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "দরà§à¦¶à¦¨à§‡à¦° সাথে সারিবদà§à¦§ করà§à¦¨" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "নিরà§à¦¬à¦¾à¦šà¦¨à¦•ে দরà§à¦¶à¦¨à§‡à¦° সাথে সারিবদà§à¦§ করà§à¦¨" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "ইনসà§à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করার জনà§à¦¯ পà§à¦°à§Ÿà§‹à¦œà¦¨à§€à§Ÿ ধারক উপসà§à¦¥à¦¿à¦¤ নেই।" @@ -7399,10 +7465,6 @@ msgid "Focus Selection" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨à§‡ ফোকাস করà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "নিরà§à¦¬à¦¾à¦šà¦¨à¦•ে দরà§à¦¶à¦¨à§‡à¦° সাথে সারিবদà§à¦§ করà§à¦¨" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" @@ -8020,14 +8082,6 @@ msgid "Transpose" msgstr "পকà§à¦·à¦¾à¦¨à§à¦¤à¦°à¦¿à¦¤ করà§à¦¨" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "পà§à¦°à¦¤à¦¿à¦¬à¦¿à¦®à§à¦¬ X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "পà§à¦°à¦¤à¦¿à¦¬à¦¿à¦®à§à¦¬ Y" - -#: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Disable Autotile" msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ টà§à¦•রো" @@ -8447,7 +8501,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Set Input Default Port" -msgstr "'% s' à¦à¦° জনà§à¦¯ ডিফলà§à¦Ÿ হিসাবে সেট করà§à¦¨" +msgstr "'%s' à¦à¦° জনà§à¦¯ ডিফলà§à¦Ÿ হিসাবে সেট করà§à¦¨" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8469,6 +8523,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Vertex" msgstr "à¦à¦¾à¦°à¦Ÿà§‡à¦•à§à¦¸" @@ -8561,6 +8619,22 @@ msgid "Color uniform." msgstr "রà§à¦ªà¦¾à¦¨à§à¦¤à¦°" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8568,10 +8642,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "à¦à§‡à¦•à§à¦Ÿà¦° ধà§à¦°à§à¦¬à¦• পরিবরà§à¦¤à¦¨ করà§à¦¨" @@ -8664,7 +8772,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8672,7 +8780,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8684,7 +8792,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8701,7 +8809,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8770,11 +8878,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8790,7 +8898,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8818,11 +8926,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8865,12 +8973,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "টেকà§à¦¸à¦¾à¦° ইউনিফরà§à¦® পরিবরà§à¦¤à¦¨ করà§à¦¨" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup." msgstr "টেকà§à¦¸à¦¾à¦° ইউনিফরà§à¦® পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "টেকà§à¦¸à¦¾à¦° ইউনিফরà§à¦® পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8880,7 +8993,7 @@ msgstr "রà§à¦ªà¦¾à¦¨à§à¦¤à¦°à§‡à¦° à¦à¦° সংলাপ..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8898,15 +9011,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8959,7 +9072,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8987,12 +9100,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9071,47 +9184,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9797,7 +9910,7 @@ msgstr "পà§à¦°à¦ªà¦¾à¦°à§à¦Ÿà¦¿:" #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "'% s' সেটিংটি অà¦à§à¦¯à¦¨à§à¦¤à¦°à§€à¦£, à¦à¦¬à¦‚ à¦à¦Ÿà¦¿ মোছা যাবে না।" +msgstr "'%s' সেটিংটি অà¦à§à¦¯à¦¨à§à¦¤à¦°à§€à¦£, à¦à¦¬à¦‚ à¦à¦Ÿà¦¿ মোছা যাবে না।" #: editor/project_settings_editor.cpp #, fuzzy @@ -10379,6 +10492,11 @@ msgstr "পরবরà§à¦¤à§€ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "নোডের নতà§à¦¨ অà¦à¦¿à¦à¦¾à¦¬à¦• দান করà§à¦¨" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "অরà§à¦¥à¦ªà§‚রà§à¦¨!" @@ -10621,7 +10739,8 @@ msgid "Script is valid." msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "অনà§à¦®à§‹à¦¦à¦¿à¦¤: a-z, A-Z, 0-9 à¦à¦¬à¦‚ _" #: editor/script_create_dialog.cpp @@ -10685,7 +10804,7 @@ msgstr "ফà§à¦°à§‡à¦®à¦¸à¦®à§‚হ সà§à¦¤à§‚প করà§à¦¨" msgid "Pick one or more items from the list to display the graph." msgstr "গà§à¦°à¦¾à¦« পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করতে তালিকা থেকে à¦à¦• বা à¦à¦•াধিক আইটেম বাছাই করà§à¦¨à¥¤" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "সমসà§à¦¯à¦¾à¦¸à¦®à§‚হ" @@ -11121,62 +11240,6 @@ msgstr "ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸:" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Generating solution..." -msgstr "ওকটà§à¦°à§€ (octree) গঠনবিনà§à¦¯à¦¾à¦¸ তৈরি করা হচà§à¦›à§‡" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–া তৈরি করা সমà§à¦à¦¬ হয়নি!" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "রিসোরà§à¦¸ লোড বà§à¦¯à¦°à§à¦¥ হয়েছে।" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Done" -msgstr "সমà§à¦ªà¦¨à§à¦¨ হয়েছে!" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create C# project." -msgstr "রিসোরà§à¦¸ লোড বà§à¦¯à¦°à§à¦¥ হয়েছে।" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "মনো" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–া তৈরি করà§à¦¨" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "নতà§à¦¨ পà§à¦°à¦•লà§à¦ª" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "ফাইল" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11810,8 +11873,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "সà§à¦ªà§à¦²à§à¦¯à¦¾à¦¶ পরà§à¦¦à¦¾à¦° (splash screen) ছবির অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ মাতà§à¦°à¦¾ (৬২০x৩০০ হতে হবে)।" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "AnimatedSprite দà§à¦¬à¦¾à¦°à¦¾ ফà§à¦°à§‡à¦® দেখাতে SpriteFrames রিসোরà§à¦¸ অবশà§à¦¯à¦‡ তৈরি করতে হবে " @@ -11871,8 +11935,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "অবশà§à¦¯à¦‡ লাইটের আকৃতি সহ à¦à¦•টি গঠন 'texture' à¦à¦° বৈশিষà§à¦Ÿà§à¦¯à§‡ হিসেবে পà§à¦°à¦¦à¦¾à¦¨ করতে হবে।" @@ -11884,7 +11949,8 @@ msgstr "" "Occluder à¦à¦° পà§à¦°à¦à¦¾à¦¬ ফেলতে à¦à¦•টি occluder বহà§à¦à§à¦œ নিরà§à¦§à¦¾à¦°à¦£ করা (বা, আà¦à¦•া) আবশà§à¦¯à¦•।" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "à¦à¦‡ occluder à¦à¦° জনà§à¦¯ occluder পলিগনটি খালি। অনà§à¦—à§à¦°à¦¹ করে à¦à¦•টি পলিগন আà¦à¦•à§à¦¨!" #: scene/2d/navigation_polygon.cpp @@ -11968,15 +12034,16 @@ msgstr "" "অনà§à¦—à§à¦°à¦¹ করে তা শà§à¦§à§à¦®à¦¾à¦¤à§à¦° তাদের অংশ হিসেবে বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤" #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D সরà§à¦¬à§‹à¦¤à§à¦¤à¦® কারà§à¦¯à¦•র হয় যখন সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ দৃশà§à¦¯ মূল দৃশà§à¦¯ হিসেবে সরাসরি " "বà§à¦¯à¦¬à¦¹à§ƒà¦¤ হয়।" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -12062,9 +12129,10 @@ msgstr "" "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° তাদের অংশ হিসেবে বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤" #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "সফলà§à¦à¦¾à¦¬à§‡ কাজ করতে CollisionShape à¦à¦° à¦à¦•টি আকৃতি পà§à¦°à§Ÿà§‹à¦œà¦¨à¥¤ অনà§à¦—à§à¦°à¦¹ করে তার জনà§à¦¯ à¦à¦•টি " "আকৃতি তৈরি করà§à¦¨!" @@ -12096,6 +12164,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -12135,8 +12207,8 @@ msgstr "PathFollow2D à¦à¦•মাতà§à¦° Path2D à¦à¦° অংশ হিসেà #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -12147,7 +12219,10 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "Path à¦à¦° দিক অবশà§à¦¯à¦‡ à¦à¦•টি কারà§à¦¯à¦•র Spatial নোডের à¦à¦° দিকে নিরà§à¦¦à§‡à¦¶ করাতে হবে।" #: scene/3d/soft_body.cpp @@ -12162,8 +12237,9 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "AnimatedSprite3D দà§à¦¬à¦¾à¦°à¦¾ ফà§à¦°à§‡à¦® দেখাতে SpriteFrames রিসোরà§à¦¸ অবশà§à¦¯à¦‡ তৈরি করতে হবে " @@ -12176,7 +12252,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -12216,7 +12294,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "'%s' à¦à¦° সাথে '%s' সংযà§à¦•à§à¦¤ করà§à¦¨" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -12231,7 +12309,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° তালিকাটি অকারà§à¦¯à¦•র।" #: scene/animation/animation_tree_player.cpp @@ -12262,8 +12340,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -12281,23 +12358,24 @@ msgid "Please Confirm..." msgstr "অনà§à¦—à§à¦°à¦¹ করে নিশà§à¦šà¦¿à¦¤ করà§à¦¨..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "সাধারণত popups লà§à¦•িয়ে যাবে, যদি আপনি popup() বা popup*() à¦à¦° যেকোনো ফাংশন " "বà§à¦¯à¦¬à¦¹à¦¾à¦° না করেন। যদিও সমà§à¦ªà¦¾à¦¦à¦¨à§‡à¦° কাজে তা গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯, কিনà§à¦¤à§ চালনার সময় তা লà§à¦•িয়ে " "যাবে।" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -12346,9 +12424,19 @@ msgstr "ইনপà§à¦Ÿ যোগ করà§à¦¨" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "অকারà§à¦¯à¦•র উৎস!" + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "অকারà§à¦¯à¦•র উৎস!" +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "অকারà§à¦¯à¦•র উৎস!" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -12366,6 +12454,62 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "পূরà§à¦¬à§‡à¦° টà§à¦¯à¦¾à¦¬" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "ফোলà§à¦¡à¦¾à¦° তৈরি করà§à¦¨" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" + +#~ msgid "Reverse" +#~ msgstr "উলà§à¦Ÿà¦¾à¦¨/বিপরীত দিকে ফিরান" + +#~ msgid "Mirror X" +#~ msgstr "পà§à¦°à¦¤à¦¿à¦¬à¦¿à¦®à§à¦¬ X" + +#~ msgid "Mirror Y" +#~ msgstr "পà§à¦°à¦¤à¦¿à¦¬à¦¿à¦®à§à¦¬ Y" + +#, fuzzy +#~ msgid "Generating solution..." +#~ msgstr "ওকটà§à¦°à§€ (octree) গঠনবিনà§à¦¯à¦¾à¦¸ তৈরি করা হচà§à¦›à§‡" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–া তৈরি করা সমà§à¦à¦¬ হয়নি!" + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "রিসোরà§à¦¸ লোড বà§à¦¯à¦°à§à¦¥ হয়েছে।" + +#, fuzzy +#~ msgid "Done" +#~ msgstr "সমà§à¦ªà¦¨à§à¦¨ হয়েছে!" + +#, fuzzy +#~ msgid "Failed to create C# project." +#~ msgstr "রিসোরà§à¦¸ লোড বà§à¦¯à¦°à§à¦¥ হয়েছে।" + +#~ msgid "Mono" +#~ msgstr "মনো" + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "পà§à¦°à¦¾à¦¨à§à¦¤à¦°à§‡à¦–া তৈরি করà§à¦¨" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "নতà§à¦¨ পà§à¦°à¦•লà§à¦ª" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "ফাইল" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index a64716471b..2ef6d44e3e 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:49+0000\n" +"PO-Revision-Date: 2019-07-19 13:41+0000\n" "Last-Translator: roger <616steam@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "godot/ca/>\n" @@ -132,6 +132,31 @@ msgid "Anim Change Call" msgstr "Canviar crida d'animació" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Modifica el temps de la clau" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Modifica la Transició d'Animació" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Modifica la Transformació de l'Animació" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Modifica el valor de la clau" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Canviar crida d'animació" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Canviar la durada de l'Animació" @@ -332,7 +357,6 @@ msgid "Anim Insert Key" msgstr "Insereix una Clau" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Step" msgstr "Canviar Pas d'Animació" @@ -451,7 +475,7 @@ msgstr "Selecciona-ho Tot" #: editor/animation_track_editor.cpp #, fuzzy msgid "Select None" -msgstr "Selecciona un Node" +msgstr "No seleccionar-ne cap" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -627,6 +651,10 @@ msgstr "Vés a la LÃnia" msgid "Line Number:" msgstr "LÃnia:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "S'han trobat %d coincidències." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Cap Coincidència" @@ -676,7 +704,7 @@ msgstr "Allunya" msgid "Reset Zoom" msgstr "Reinicia el Zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Avisos" @@ -783,6 +811,10 @@ msgid "Connect" msgstr "Connecta" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Senyal:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Connecta '%s' amb '%s'" @@ -946,9 +978,8 @@ msgid "Owners Of:" msgstr "Propietaris de:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "" -"Voleu Eliminar els fitxers seleccionats del projecte? (No es pot desfer!)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "Eliminar els fitxers seleccionats del projecte? (No es pot restaurar)" #: editor/dependency_editor.cpp msgid "" @@ -1129,7 +1160,6 @@ msgid "Success!" msgstr "Èxit!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Instal·la" @@ -1256,7 +1286,7 @@ msgstr "Obre un Disseny de Bus d'Àudio" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "No hi ha cap fitxer '% s'." +msgstr "No hi ha cap fitxer '%s'." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -1332,8 +1362,9 @@ msgstr "" "existents." #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "Una paraula clau no es pot utilitzar com a nom de cà rrega automà tica." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -1499,6 +1530,10 @@ msgstr "No s'ha trobat cap plantilla de publicació personalitzada." msgid "Template file not found:" msgstr "No s'ha trobat la Plantilla:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "Editor 3D" @@ -1532,7 +1567,7 @@ msgstr "Sistema de Fitxers" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" -msgstr "Esborra el perfil '% s'? (no es pot desfer)" +msgstr "Esborra el perfil '%s'? (no es pot desfer)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1576,15 +1611,14 @@ msgstr "Classes Habilitades:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "El format del fitxer '% s' no és và lid, s'ha anul·lat la importació." +msgstr "El format del fitxer '%s' no és và lid, s'ha anul·lat la importació." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"El perfil '% s' ja existeix. Elimineu-lo primer abans d'importar, importació " +"El perfil '%s' ja existeix. Elimineu-lo primer abans d'importar, importació " "avortada." #: editor/editor_feature_profile.cpp @@ -1593,12 +1627,11 @@ msgstr "Error en guardar el perfil al camÃ: '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "Desactivar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Perfil Actual" +msgstr "Perfil Actual:" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1621,9 +1654,8 @@ msgid "Export" msgstr "Exportar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Perfils Disponibles" +msgstr "Perfils Disponibles:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1678,7 +1710,7 @@ msgstr "Mostrar en el Gestor de Fitxers" msgid "New Folder..." msgstr "Nou Directori..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Refresca" @@ -1729,7 +1761,7 @@ msgstr "Endavant" msgid "Go Up" msgstr "Puja" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Commuta Fitxers Ocults" @@ -1754,23 +1786,31 @@ msgid "Move Favorite Down" msgstr "Mou Favorit Avall" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Directori Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Anar al directori pare." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Directori Següent" +#, fuzzy +msgid "Go to next folder." +msgstr "Anar al directori pare." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Anar al directori pare." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Cerca Fitxers" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Eliminar carpeta actual de preferits." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Commutar visibilitat dels fitxers ocults." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2071,7 +2111,7 @@ msgstr "Falta '%s' o les seves dependències." #: editor/editor_node.cpp msgid "Error while loading '%s'." -msgstr "S'ha produït un error en carregar '% s'." +msgstr "S'ha produït un error en carregar '%s'." #: editor/editor_node.cpp msgid "Saving Scene" @@ -2342,7 +2382,7 @@ msgstr "" msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" "No s'ha pogut trobar el camp d'Script per al complement a: 'res: // addons /" -"% s'." +"%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2360,13 +2400,13 @@ msgstr "" msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" -"No es pot carregar l'Script complementari: El tipus base de '% s' no és pas " +"No es pot carregar l'Script complementari: El tipus base de '%s' no és pas " "EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" -"No s'ha carregat l'Script d'addon des del camÃ: L'Script '% s' no és en el " +"No s'ha carregat l'Script d'addon des del camÃ: L'Script '%s' no és en el " "mode d'Eina." #: editor/editor_node.cpp @@ -2503,6 +2543,11 @@ msgid "Go to previously opened scene." msgstr "Vés a l'escena oberta anteriorment." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Copia CamÃ" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Pestanya Següent" @@ -2706,32 +2751,22 @@ msgid "Editor Layout" msgstr "Disseny de l'Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Entesos!" +msgstr "Fer captura de pantalla" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Obre el directori de Dades/Configuració de l'Editor" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Obre l'Editor Següent" +"Les captures de pantalla s'emmagatzemen a la carpeta dades/configuració de " +"l'editor." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Mode Pantalla Completa" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Visibilitat del CanvasItem" +msgstr "Commutar la consola del sistema" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2840,14 +2875,12 @@ msgid "Spins when the editor window redraws." msgstr "Gira quan la finestra de l'editor es redibuixa." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Continu" +msgstr "Actualitzar contÃnuament" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Actualitza Canvis" +msgstr "Actualitzar quan es canvia" #: editor/editor_node.cpp #, fuzzy @@ -2895,11 +2928,16 @@ msgid "" msgstr "" #: editor/editor_node.cpp +#, fuzzy msgid "" "Android build template is already installed and it won't be overwritten.\n" "Remove the \"build\" directory manually before attempting this operation " "again." msgstr "" +"La plantilla de compilació d'Android ja està instal·lada i no se " +"sobreescriurà .\n" +"Elimineu el directori \"Build\" manualment abans de tornar a intentar " +"aquesta operació." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3044,6 +3082,11 @@ msgid "Calls" msgstr "Crides" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Activat" @@ -3651,6 +3694,7 @@ msgid "Nodes not in Group" msgstr "Els nodes no es troben en el Grup" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtre els Nodes" @@ -4156,8 +4200,11 @@ msgstr "" "els noms de les pistes." #: editor/plugins/animation_blend_tree_editor_plugin.cpp +#, fuzzy msgid "Player path set is invalid, so unable to retrieve track names." msgstr "" +"El camà del reproductor assignat no és và lid, de manera que no pot recuperar " +"els noms de les pistes." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -4472,8 +4519,11 @@ msgid "Remove selected node or transition." msgstr "Eliminar el node o transició seleccionats." #: editor/plugins/animation_state_machine_editor.cpp +#, fuzzy msgid "Toggle autoplay this animation on start, restart or seek to zero." msgstr "" +"Commuta auto reproducció d'aquesta animació en iniciar, reiniciar o buscar a " +"zero." #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4696,6 +4746,11 @@ msgid "Idle" msgstr "Inactiu" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Instal·la" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Torneu a provar" @@ -4724,7 +4779,6 @@ msgid "Last" msgstr "Últim" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Tot" @@ -4738,8 +4792,9 @@ msgid "Sort:" msgstr "Ordena:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Inverteix" +#, fuzzy +msgid "Reverse sorting." +msgstr "Sol·licitud en marxa..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4821,31 +4876,38 @@ msgid "Rotation Step:" msgstr "Pas de la Rotació:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Mou la guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Crea una nova guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Elimina la guia vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Mou la guia horitzontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Crea una nova guia horitzontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Elimina la guia horitzontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Crea una guia horitzontal i vertical noves" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5111,8 +5173,9 @@ msgid "Show Bones" msgstr "Mostra els Ossos" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Make Custom Bone(s) from Node(s)" -msgstr "" +msgstr "Fer os(sos) personalitzat(s) a partir de Node(s)" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5162,8 +5225,9 @@ msgid "Frame Selection" msgstr "Enquadra la Selecció" #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "Preview Canvas Scale" -msgstr "" +msgstr "Vista prèvia de l'escala del llenç" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -5182,12 +5246,18 @@ msgid "Insert keys (based on mask)." msgstr "Inserir claus (basades en mascara)." #: editor/plugins/canvas_item_editor_plugin.cpp +#, fuzzy msgid "" "Auto insert keys when objects are translated, rotated on scaled (based on " "mask).\n" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." msgstr "" +"Inserir claus automà ticament quan els objectes es traslladen, giren o " +"escalen (basat en la mà scara).\n" +"Les claus només s'afegeixen a les pistes existents, no es crearà cap pista " +"nova.\n" +"Les claus s'han d'inserir manualment per primera vegada." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Auto Insert Key" @@ -5450,8 +5520,9 @@ msgid "Create Trimesh Static Shape" msgstr "Crea un forma amb una malla de triangles" #: editor/plugins/mesh_instance_editor_plugin.cpp +#, fuzzy msgid "Failed creating shapes!" -msgstr "" +msgstr "Ha fallat la creació de formes!" #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -6338,7 +6409,6 @@ msgid "Open Godot online documentation." msgstr "Obrir la documentació en lÃnia de Godot." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Request Docs" msgstr "Sol·licitar Documentació" @@ -6458,10 +6528,19 @@ msgid "Syntax Highlighter" msgstr "Ressaltador de sintaxi" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "Marcadors" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Crea punts." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6758,9 +6837,15 @@ msgid "Rear" msgstr "Darrere" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinear amb la Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinea la Selecció amb la Vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "No hi ha cap node Pare per instanciar-li un fill." @@ -6949,10 +7034,6 @@ msgid "Focus Selection" msgstr "Focalitza't en la Selecció" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinea la Selecció amb la Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Selecciona una Eina" @@ -7241,8 +7322,9 @@ msgid "Add a Texture from File" msgstr "Afegir Textura des de Fitxer" #: editor/plugins/sprite_frames_editor_plugin.cpp +#, fuzzy msgid "Add Frames from a Sprite Sheet" -msgstr "" +msgstr "Afegir fotogrames des d'una fulla de Sprites" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -7511,7 +7593,6 @@ msgid "Cut Selection" msgstr "Tallar Selecció" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Paint TileMap" msgstr "Pintar Mapa de Rajoles" @@ -7528,12 +7609,10 @@ msgid "Bucket Fill" msgstr "Cubell de pintura" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Erase TileMap" msgstr "Elimina Mapa de Rajoles" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Find Tile" msgstr "Trobar Rajola" @@ -7542,14 +7621,6 @@ msgid "Transpose" msgstr "Transposa" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Replica en l'eix X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Replica en l'Eix Y" - -#: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Disable Autotile" msgstr "AutoTiles" @@ -7559,7 +7630,6 @@ msgid "Enable Priority" msgstr "Habilitar Prioritat" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Paint Tile" msgstr "Pinta Rajola" @@ -7573,7 +7643,6 @@ msgstr "" "Maj + Ctrl + RMB: pintar rectangle" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Pick Tile" msgstr "Escollir Rajola" @@ -7620,16 +7689,18 @@ msgid "Next Coordinate" msgstr "Coordenada Següent" #: editor/plugins/tile_set_editor_plugin.cpp +#, fuzzy msgid "Select the next shape, subtile, or Tile." -msgstr "" +msgstr "Seleccioneu la forma, sub-rajola o rajola següent." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Previous Coordinate" msgstr "Coordenada Anterior" #: editor/plugins/tile_set_editor_plugin.cpp +#, fuzzy msgid "Select the previous shape, subtile, or Tile." -msgstr "" +msgstr "Seleccioneu la forma, sub-rajola o rajola anterior." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Region Mode" @@ -7701,12 +7772,10 @@ msgstr "" "l'inspector)." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Display Tile Names (Hold Alt Key)" msgstr "Mostrar noms de les rajoles (manteniu pressionada la tecla Alt)" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected texture? This will remove all tiles which use it." msgstr "" "Eliminar la textura seleccionada? Això eliminarà totes les rajoles que " @@ -7717,7 +7786,6 @@ msgid "You haven't selected a texture to remove." msgstr "No heu seleccionat una textura per eliminar." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create from scene? This will overwrite all current tiles." msgstr "Crear des de l'escena? Això sobreescriurà totes les rajoles actuals." @@ -7749,7 +7817,9 @@ msgstr "Suprimir Rectangle seleccionat." msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." -msgstr "Selecciona la sub-tessel·la en edició." +msgstr "" +"Seleccioneu la sub-rajola editada actual.\n" +"Feu clic en una altra rajola per editar-la." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Delete polygon." @@ -7775,40 +7845,41 @@ msgid "" "bindings.\n" "Click on another Tile to edit it." msgstr "" -"Selecciona una sub-tessel·la com a icona. També s'utilitzarà per les " -"assignacions automà tiques no-và lides de l'autotile." +"Seleccioneu la sub-rajola que voleu utilitzar com a icona, també " +"s'utilitzarà en les vinculacions de rajoles automà tiques no và lides.\n" +"Feu clic en una altra rajola per editar-la." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "" "Select sub-tile to change its priority.\n" "Click on another Tile to edit it." -msgstr "Selecciona una sub-tessel·la per a modificar-ne la prioritat." +msgstr "" +"Seleccioneu la sub-rajola per canviar-ne la prioritat.\n" +"Feu clic en una altra rajola per editar-la." #: 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 "Selecciona una sub-tessel·la per a modificar-ne la prioritat." +msgstr "" +"Seleccioneu la sub-rajola per canviar el seu Ãndex z.\n" +"Feu clic en una altra rajola per editar-la." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Set Tile Region" msgstr "Definir Regió de Rajola" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Tile" msgstr "Crear Rajola" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Set Tile Icon" msgstr "Establir icona de la Rajola" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Bitmask" msgstr "Editar mà scara de bits de la rajola" @@ -7825,12 +7896,10 @@ msgid "Edit Navigation Polygon" msgstr "Editar PolÃgon de Navegació" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste Tile Bitmask" msgstr "Enganxar mà scara de bits del la rajola" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Clear Tile Bitmask" msgstr "Restablir mà scara de bits de la rajola" @@ -7845,7 +7914,6 @@ msgid "Make Polygon Convex" msgstr "Mou el PolÃgon" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Tile" msgstr "Eliminar Rajola" @@ -7862,14 +7930,12 @@ msgid "Remove Navigation Polygon" msgstr "Eliminar PolÃgon de Navegació" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Priority" -msgstr "Editar Propietats de la Rajola" +msgstr "Editar Prioritat de la Rajola" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Z Index" -msgstr "Edita l'Ãndex Z de la rajola" +msgstr "Editar Ãndex Z de la rajola" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Collision Polygon" @@ -7886,7 +7952,7 @@ msgstr "Aquesta propietat no es pot canviar." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "TileSet" -msgstr "Tile Set" +msgstr "Conjunt de rajoles" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -7989,6 +8055,10 @@ msgid "Visual Shader Input Type Changed" msgstr "El tipus d'entrada VisualShader ha canviat" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vèrtex" @@ -8010,12 +8080,10 @@ msgid "Color function." msgstr "Vés a la Funció" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color operator." -msgstr "Operador de color." +msgstr "Operador Color." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." msgstr "Funció d'escala de grisos." @@ -8037,13 +8105,13 @@ msgid "Burn operator." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Darken operator." -msgstr "" +msgstr "Operador enfosquir." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Difference operator." -msgstr "Operador de diferència." +msgstr "Operador diferencial." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." @@ -8054,8 +8122,9 @@ msgid "HardLight operator" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Lighten operator." -msgstr "" +msgstr "Operador Aclarir." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." @@ -8080,15 +8149,54 @@ msgstr "Transforma" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Retorna l'invers de l'arrel quadrada del parà metre." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." msgstr "" -"Retorna un vector associat si els escalars proporcionats són iguals, més " -"grans o menys." +"Retorna un vector associat si els escalars proporcionats són iguals, majors " +"o menors." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" @@ -8096,6 +8204,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Retorna la tangent del parà metre." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Boolean constant." msgstr "Modificar una constant vectorial" @@ -8153,7 +8272,6 @@ msgid "Scalar operator." msgstr "Modifica un operador escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "E constant (2.718282). Represents the base of the natural logarithm." msgstr "Constant E (2,718282). Representa la base del logaritme natural." @@ -8162,22 +8280,18 @@ msgid "Epsilon constant (0.00001). Smallest possible scalar number." msgstr "Constant Èpsilon (0,00001). Menor nombre escalar possible." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Phi constant (1.618034). Golden ratio." msgstr "Constant pi (1,618034). Proporció à uria." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Pi/4 constant (0.785398) or 45 degrees." msgstr "Constant Pi/4 (0,785398) o 45 graus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Pi/2 constant (1.570796) or 90 degrees." msgstr "Constant Pi/2 (1,570796) o 90 graus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Pi constant (3.141593) or 180 degrees." msgstr "Constant Pi (3,141593) o 180 graus." @@ -8187,154 +8301,135 @@ msgid "Tau constant (6.283185) or 360 degrees." msgstr "Constant tau (6,283185) o 360 graus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sqrt2 constant (1.414214). Square root of 2." msgstr "Constant Sqrt2 (1,414214). Arrel quadrada de 2." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the absolute value of the parameter." msgstr "Retorna el valor absolut del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the arc-cosine of the parameter." -msgstr "Retorna el cosinus d'arc del parà metre." +msgstr "Retorna el l'arc cosinus del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "(Només GLES3) Retorna el cosinus hiperbòlic invers del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the arc-sine of the parameter." -msgstr "Retorna l'arc-sinus del parà metre." +msgstr "Retorna l'arc sinus del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "(Només GLES3) Retorna el sinus hiperbòlic invers del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the arc-tangent of the parameter." msgstr "Retorna l'arc tangent del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the arc-tangent of the parameters." msgstr "Retorna l'arc tangent dels parà metres." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "(Només GLES3) Retorna la tangent hiperbòlica inversa del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Finds the nearest integer that is greater than or equal to the parameter." msgstr "Troba l'enter més proper que sigui major o igual que el parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Constrains a value to lie between two further values." -msgstr "Restringeix un valor per a situar-se entre dos valors addicionals." +msgstr "Restringeix un valor entre dos valors addicionals." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the cosine of the parameter." msgstr "Retorna el cosinus del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +#, fuzzy +msgid "Returns the hyperbolic cosine of the parameter." msgstr "(Només GLES3) Retorna el cosinus hiperbòlic del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Converts a quantity in radians to degrees." msgstr "Converteix una quantitat en radians a graus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Base-e Exponential." -msgstr "Base-e Exponencial." +msgstr "Exponencial en base e." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Base-2 Exponential." msgstr "Exponencial en base 2." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Finds the nearest integer less than or equal to the parameter." msgstr "Troba l'enter més proper inferior o igual al parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Computes the fractional part of the argument." msgstr "Calcula la part fraccional de l'argument." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the inverse of the square root of the parameter." msgstr "Retorna l'invers de l'arrel quadrada del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Natural logarithm." msgstr "Logaritme natural." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Base-2 logarithm." msgstr "Logaritme en base 2." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the greater of two values." msgstr "Retorna el major de dos valors." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the lesser of two values." msgstr "Retorna el menor de dos valors." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Linear interpolation between two scalars." msgstr "Interpolació lineal entre dos escalars." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the opposite value of the parameter." msgstr "Retorna el valor oposat del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "1.0 - scalar" msgstr "1.0 - escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns the value of the first parameter raised to the power of the second." -msgstr "Retorna el valor del primer parà metre elevat al poder de la segona." +msgstr "Retorna el valor del primer parà metre elevat a la potència del segon." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Converts a quantity in degrees to radians." msgstr "Converteix una quantitat en graus a radians." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "1.0 / scalar" msgstr "1.0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +#, fuzzy +msgid "Finds the nearest integer to the parameter." msgstr "(Només GLES3) Troba l'enter més proper al parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +#, fuzzy +msgid "Finds the nearest even integer to the parameter." msgstr "(Només GLES3) Troba l'enter parell més proper al parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8342,21 +8437,19 @@ msgid "Clamps the value between 0.0 and 1.0." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Extracts the sign of the parameter." msgstr "Extreu el signe del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the sine of the parameter." msgstr "Retorna el sinus del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +#, fuzzy +msgid "Returns the hyperbolic sine of the parameter." msgstr "(Només GLES3) Retorna el sinus hiperbòlic del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the square root of the parameter." msgstr "Retorna l'arrel quadrada del parà metre." @@ -8377,40 +8470,36 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the tangent of the parameter." msgstr "Retorna la tangent del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +#, fuzzy +msgid "Returns the hyperbolic tangent of the parameter." msgstr "(Només GLES3) Retorna la tangent hiperbòlica del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +#, fuzzy +msgid "Finds the truncated value of the parameter." msgstr "(Només GLES3) Troba el valor truncat del parà metre." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Adds scalar to scalar." msgstr "Afegeix escalar a escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Divides scalar by scalar." msgstr "Divideix escalar per escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Multiplies scalar by scalar." msgstr "Multiplica escalar per escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Returns the remainder of the two scalars." -msgstr "Retorna la resta dels dos escalars." +msgstr "Retorna el residu dels dos escalars." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Subtracts scalar from scalar." msgstr "Resta escalar d'escalar." @@ -8436,12 +8525,17 @@ msgstr "Realitza la cerca de textures." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "Modifica un Uniforme Textura" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup." msgstr "Modifica un Uniforme Textura" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "Modifica un Uniforme Textura" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8451,7 +8545,7 @@ msgstr "Funció de transformació." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8469,15 +8563,18 @@ msgid "Decomposes transform to four vectors." msgstr "Descompon una transformació en quatre vectors." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +#, fuzzy +msgid "Calculates the determinant of a transform." msgstr "(Només GLES3) Calcula el determinant d'una transformació." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +#, fuzzy +msgid "Calculates the inverse of a transform." msgstr "(Només GLES3) Calcula l'invers d'una transformació." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +#, fuzzy +msgid "Calculates the transpose of a transform." msgstr "(Només GLES3) Calcula la transposició d'una transformació." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8528,12 +8625,18 @@ msgid "Calculates the dot product of two vectors." msgstr "Calcula el producte escalar de dos vectors." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" +"Retorna un vector que apunta en la mateixa direcció que un vector de " +"referència. La funció té tres parà metres vectorials: N, el vector a " +"orientar, I, el vector incident, i Nref, el vector de referència. Si el " +"producte de punt d'I i Nref és més petit que zero, el valor retornat és N. " +"en cas contrari es retorna -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." @@ -8556,13 +8659,17 @@ msgid "1.0 / vector" msgstr "1.0 / vector" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" +"Retorna un vector que apunta en la direcció de la reflexió (a: vector " +"d'incident, b: vector normal)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +#, fuzzy +msgid "Returns the vector that points in the direction of refraction." msgstr "Retorna un vector que apunta en la direcció de la refracció." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8646,47 +8753,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8834,8 +8941,9 @@ msgid "Compiled" msgstr "Compilat" #: editor/project_export.cpp +#, fuzzy msgid "Encrypted (Provide Key Below)" -msgstr "" +msgstr "Encriptat (Proporcioneu la clau a sota)" #: editor/project_export.cpp msgid "Invalid Encryption Key (must be 64 characters long)" @@ -9028,6 +9136,7 @@ msgid "Are you sure to open more than one project?" msgstr "Esteu segur que voleu obrir més d'un projecte de cop?" #: editor/project_manager.cpp +#, fuzzy msgid "" "The following project settings file does not specify the version of Godot " "through which it was created.\n" @@ -9039,8 +9148,17 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" +"El següent fitxer de configuració del projecte següent no especifica la " +"versió de Godot amb la que s'ha creat.\n" +"\n" +"% s\n" +"\n" +"Si continueu amb l'obertura, es convertirà al format de fitxer de " +"configuració actual de Godot.\n" +"Advertiment: Ja no podreu obrir el projecte amb versions anteriors del motor." #: editor/project_manager.cpp +#, fuzzy msgid "" "The following project settings file was generated by an older engine " "version, and needs to be converted for this version:\n" @@ -9051,6 +9169,13 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" +"El següent fitxer de configuració del projecte va ser generat per una versió " +"anterior del motor, i necessita ser convertit per a aquesta versió:\n" +"\n" +"% s\n" +"\n" +"Voleu convertir-lo?\n" +"Advertiment: ja no podreu obrir el projecte amb versions anteriors del motor." #: editor/project_manager.cpp msgid "" @@ -9200,7 +9325,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "An action with the name '%s' already exists." -msgstr "Ja existeix una acció amb el nom '% s'." +msgstr "Ja existeix una acció amb el nom '%s'." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -9476,7 +9601,7 @@ msgstr "Remapatges per Llengua:" #: editor/project_settings_editor.cpp msgid "Locale" -msgstr "Localització" +msgstr "Idioma" #: editor/project_settings_editor.cpp msgid "Locales Filter" @@ -9651,8 +9776,9 @@ msgid "Post-Process" msgstr "Post-Processat" #: editor/rename_dialog.cpp +#, fuzzy msgid "Keep" -msgstr "" +msgstr "Mantenir" #: editor/rename_dialog.cpp msgid "CamelCase to under_scored" @@ -9837,7 +9963,6 @@ msgid "User Interface" msgstr "InterfÃcie d'usuari" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" msgstr "Altre Node" @@ -9904,6 +10029,11 @@ msgstr "Estendre el script" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Torna a Parentar el Node" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Entesos!" @@ -10079,9 +10209,8 @@ msgid "Invalid extension." msgstr "L'extensió no és và lida." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Wrong extension chosen." -msgstr "L'extensió triada no és correcta" +msgstr "L'extensió triada no és correcta." #: editor/script_create_dialog.cpp msgid "Error loading template '%s'" @@ -10116,22 +10245,21 @@ msgid "Invalid class name." msgstr "Nom de classe no và lid." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path." -msgstr "El Nom o camà del Pare heretat no és và lid" +msgstr "El nom o camà del pare heretat no és và lid." #: editor/script_create_dialog.cpp msgid "Script is valid." msgstr "El script és và lid." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "Permesos: a-z, a-Z, 0-9 i _" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in script (into scene file)." -msgstr "Script Integrat (en un fitxer d'escena)" +msgstr "Script Integrat (en el fitxer d'escena)." #: editor/script_create_dialog.cpp msgid "Will create a new script file." @@ -10182,7 +10310,7 @@ msgstr "Fotogrames de la Pila" msgid "Pick one or more items from the list to display the graph." msgstr "Trieu un o més elements de la llista per mostrar el Graf." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Errors" @@ -10271,8 +10399,9 @@ msgid "Set From Tree" msgstr "Estableix des de l'Arbre" #: editor/script_editor_debugger.cpp +#, fuzzy msgid "Export measures as CSV" -msgstr "" +msgstr "Exporta les mesures com a CSV" #: editor/settings_config_dialog.cpp msgid "Erase Shortcut" @@ -10407,8 +10536,9 @@ msgid "GDNativeLibrary" msgstr "GDNativeLibrary" #: modules/gdnative/gdnative_library_singleton_editor.cpp +#, fuzzy msgid "Enabled GDNative Singleton" -msgstr "" +msgstr "Habilitar Singleton GDNative" #: modules/gdnative/gdnative_library_singleton_editor.cpp #, fuzzy @@ -10595,54 +10725,6 @@ msgstr "Trieu la distà ncia:" msgid "Class name can't be a reserved keyword" msgstr "El nom de la classe no pot ser una paraula clau reservada" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "S'està generant la solució..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "S'està generant el projecte en C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "No s'ha pogut crear la solució." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "No s'ha pogut desar la solució." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Fet" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "No s'ha pogut crear el projecte en C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Sobre el suport de C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Crea una solució en C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Muntatges" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Munta el Projecte" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Mostra el Registre" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Final de la traça de la pila d'excepció interna" @@ -11043,8 +11125,9 @@ msgid "Package name is missing." msgstr "El nom del paquet falta." #: platform/android/export/export.cpp +#, fuzzy msgid "Package segments must be of non-zero length." -msgstr "" +msgstr "Els segments de paquets han de ser de longitud no zero." #: platform/android/export/export.cpp msgid "The character '%s' is not allowed in Android application package names." @@ -11052,41 +11135,55 @@ msgstr "" "El carà cter '%s' no està permès als noms de paquets d'aplicacions Android." #: platform/android/export/export.cpp +#, fuzzy msgid "A digit cannot be the first character in a package segment." -msgstr "" +msgstr "Un dÃgit no pot ser el primer carà cter d'un segment de paquets." #: platform/android/export/export.cpp +#, fuzzy msgid "The character '%s' cannot be the first character in a package segment." msgstr "" +"El carà cter '%s' no pot ser el primer carà cter d'un segment de paquets." #: platform/android/export/export.cpp msgid "The package must have at least one '.' separator." msgstr "El paquet ha de tenir com a mÃnim un separador '. '." #: platform/android/export/export.cpp +#, fuzzy msgid "ADB executable not configured in the Editor Settings." -msgstr "" +msgstr "L'executable ADB no està configurat a la configuració de l'editor." #: platform/android/export/export.cpp +#, fuzzy msgid "OpenJDK jarsigner not configured in the Editor Settings." -msgstr "" +msgstr "OpenJDK Jarsigner no està configurat en la configuració de l'editor." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." msgstr "" #: platform/android/export/export.cpp +#, fuzzy msgid "Custom build requires a valid Android SDK path in Editor Settings." msgstr "" +"La compilació personalitzada requereix un camà d'Android SDK và lid en la " +"configuració de l'editor." #: platform/android/export/export.cpp +#, fuzzy msgid "Invalid Android SDK path for custom build in Editor Settings." msgstr "" +"El camà de l'SDK d'Android no és và lid per a la compilació personalitzada en " +"la configuració de l'editor." #: platform/android/export/export.cpp +#, fuzzy msgid "" "Android project is not installed for compiling. Install from Editor menu." msgstr "" +"El projecte Android no està instal·lat per a la compilació. Instal·leu-lo " +"des del menú Editor." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -11097,32 +11194,47 @@ msgid "Invalid package name:" msgstr "El nom del paquet no és và lid:" #: platform/android/export/export.cpp +#, fuzzy msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" +"Intentant construir des d'una plantilla personalitzada, però no existeix " +"informació de versió per a això. Torneu a instal·lar des del menú 'projecte'." #: platform/android/export/export.cpp +#, fuzzy msgid "" "Android build version mismatch:\n" " Template installed: %s\n" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" +"La versió de compilació d'Android no coincideix:\n" +" Plantilla instal·lada:% s\n" +" Versió de Godot:% s\n" +"Torneu a instal·lar la plantilla de compilació d'Android des del menú " +"'Projecte'." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" msgstr "" #: platform/android/export/export.cpp +#, fuzzy msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" +"La construcció del projecte Android ha fallat, comproveu la sortida per " +"l'error.\n" +"Alternativament visiteu docs.godotengine.org per a la documentació de " +"compilació d'Android." #: platform/android/export/export.cpp +#, fuzzy msgid "No build apk generated at: " -msgstr "" +msgstr "No s'ha generat cap compilació apk a: " #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -11134,7 +11246,7 @@ msgstr "" #: platform/iphone/export/export.cpp msgid "The character '%s' is not allowed in Identifier." -msgstr "No es permet el carà cter '% s' en l'Identificador." +msgstr "No es permet el carà cter '%s' en l'Identificador." #: platform/iphone/export/export.cpp msgid "A digit cannot be the first character in a Identifier segment." @@ -11144,7 +11256,7 @@ msgstr "Un dÃgit no pot ser el primer carà cter en un segment Identificador." msgid "" "The character '%s' cannot be the first character in a Identifier segment." msgstr "" -"El carà cter '% s' no pot ser el primer carà cter en un segment Identificador." +"El carà cter '%s' no pot ser el primer carà cter en un segment Identificador." #: platform/iphone/export/export.cpp msgid "The Identifier must have at least one '.' separator." @@ -11241,8 +11353,9 @@ msgstr "" "620x300." #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Un recurs del tipus SpriteFrames s'ha de crear or especificar en la " @@ -11308,8 +11421,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "S'ha de proveir la propietat 'textura' amb una textura amb la forma de la " @@ -11323,7 +11437,8 @@ msgstr "" "(occluder) faci efecte." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "El polÃgon oclusiu és buit. Dibuixeu un polÃgon!" #: scene/2d/navigation_polygon.cpp @@ -11399,9 +11514,12 @@ msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." msgstr "" #: scene/2d/skeleton_2d.cpp +#, fuzzy msgid "" "This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." msgstr "" +"Aquest OS no té una postura de descans adequada. Aneu al node Skeleton2D i " +"definiu-ne una." #: scene/2d/tile_map.cpp #, fuzzy @@ -11415,15 +11533,17 @@ msgstr "" "Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "Un node VisibilityEnable2D funcionarà millor en ser emparentat directament " "amb l'arrel de l'escena." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "El node ARVRCamera requereix un Pare del tipus ARVROrigin" #: scene/3d/arvr_nodes.cpp @@ -11518,9 +11638,10 @@ msgstr "" "StaticBody, RigidBody, KinematicBody, etc." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Cal proveir una forma perquè CollisionShape funcioni. Creeu-li un recurs de " "forma!" @@ -11549,10 +11670,19 @@ msgid "Plotting Meshes" msgstr "S'està n traçant les Malles" #: scene/3d/gi_probe.cpp +#, fuzzy msgid "" "GIProbes are not supported by the GLES2 video driver.\n" "Use a BakedLightmap instead." msgstr "" +"Les GIProbes no estan suportades pel controlador de vÃdeo GLES2.\n" +"Utilitzeu un BakedLightmap en el seu lloc." + +#: scene/3d/light.cpp +#, fuzzy +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" +"Un SpotLight amb un angle més ample que 90 graus no pot projectar ombres." #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -11594,8 +11724,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11609,7 +11739,10 @@ msgstr "" "Modifica la mida de les Formes de Col. lisió Filles." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "Cal que la propietat Camà assenyali cap a un node Spatial và lid." #: scene/3d/soft_body.cpp @@ -11629,8 +11762,9 @@ msgstr "" "Modifica la mida de les Formes de Col. lisió Filles." #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Cal crear o establir un recurs SpriteFrames en la propietat 'Frames' perquè " @@ -11646,8 +11780,10 @@ msgstr "" "Modifica la mida de les Formes de Col·lisió Filles." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment necessita un recurs Ambiental." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" #: scene/3d/world_environment.cpp msgid "" @@ -11688,7 +11824,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Desconnecta '%s' de '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11703,7 +11839,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "L'arbre d'animació no és và lid." #: scene/animation/animation_tree_player.cpp @@ -11716,7 +11852,7 @@ msgstr "Trieu un color de la pantalla." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp msgid "Raw" @@ -11735,8 +11871,7 @@ msgstr "Afegeix el Color actual com a predeterminat" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11754,23 +11889,26 @@ msgid "Please Confirm..." msgstr "Confirmeu..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Les finestres emergents s'oculten per defecte tret que s'invoqui popup() o " "qualsevol de les funcions popup*(). És possible fer-les visibles mentre " "s'edita, però s'ocultaran durant l'execució." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" +"Si l'opció \"Exp Edit\" està habilitada, \"Min Value\" ha de ser major que 0." #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer fou pensat per treballar-hi amb un sol Control fill.\n" @@ -11822,13 +11960,22 @@ msgid "Input" msgstr "Entrada" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "Font no và lida pel Shader." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Font no và lida pel Shader." -#: servers/visual/shader_language.cpp +#: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Font no và lida pel Shader." + +#: servers/visual/shader_language.cpp msgid "Assignment to function." -msgstr "Assignació a funció" +msgstr "Assignació a funció." #: servers/visual/shader_language.cpp msgid "Assignment to uniform." @@ -11840,7 +11987,67 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Les constants no es poden modificar." + +#~ msgid "Previous Folder" +#~ msgstr "Directori Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Directori Següent" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Obrir automà ticament captures de pantalla" + +#~ msgid "Open in an external image editor." +#~ msgstr "Obrir en un editor d'imatges extern." + +#~ msgid "Reverse" +#~ msgstr "Inverteix" + +#~ msgid "Mirror X" +#~ msgstr "Replica en l'eix X" + +#~ msgid "Mirror Y" +#~ msgstr "Replica en l'Eix Y" + +#~ msgid "Generating solution..." +#~ msgstr "S'està generant la solució..." + +#~ msgid "Generating C# project..." +#~ msgstr "S'està generant el projecte en C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "No s'ha pogut crear la solució." + +#~ msgid "Failed to save solution." +#~ msgstr "No s'ha pogut desar la solució." + +#~ msgid "Done" +#~ msgstr "Fet" + +#~ msgid "Failed to create C# project." +#~ msgstr "No s'ha pogut crear el projecte en C#." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "Sobre el suport de C#" + +#~ msgid "Create C# solution" +#~ msgstr "Crea una solució en C#" + +#~ msgid "Builds" +#~ msgstr "Muntatges" + +#~ msgid "Build Project" +#~ msgstr "Munta el Projecte" + +#~ msgid "View log" +#~ msgstr "Mostra el Registre" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment necessita un recurs Ambiental." #~ msgid "Enabled Classes" #~ msgstr "Classes Habilitades" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index cc9d195909..f3eaafab33 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -7,7 +7,7 @@ # Jiri Hysek <contact@jirihysek.com>, 2017. # Josef KuchaÅ™ <josef.kuchar267@gmail.com>, 2018, 2019. # LudÄ›k Novotný <gladosicek@gmail.com>, 2016, 2018. -# Martin Novák <maidx@seznam.cz>, 2017. +# Martin Novák <maidx@seznam.cz>, 2017, 2019. # zxey <r.hozak@seznam.cz>, 2018. # VojtÄ›ch Å amla <auzkok@seznam.cz>, 2018, 2019. # Peeter Angelo <contact@peeterangelo.com>, 2019. @@ -15,8 +15,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:49+0000\n" -"Last-Translator: VojtÄ›ch Å amla <auzkok@seznam.cz>\n" +"PO-Revision-Date: 2019-07-09 10:46+0000\n" +"Last-Translator: Martin Novák <maidx@seznam.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -36,7 +36,7 @@ msgstr "" #: 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 "Nedostatek bytů pro dekódovánà bytů, nebo Å¡patný formát." +msgstr "Nedostatek bajtů pro dekódovánà bajtů, nebo neplatný formát." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -44,7 +44,7 @@ msgstr "Neplatný vstup %i (neproÅ¡el) ve výrazu" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "" +msgstr "self nemůže být použito, protože instance je null (neproÅ¡la)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -56,11 +56,11 @@ msgstr "Neplatný index typu %s pro základnà typ %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "" +msgstr "NeplatnÄ› pojmenovaný index '%s' pro základnà typ %s" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "Neplatné argumenty pro konstrukci '%s'" +msgstr "Neplatné argumenty pro zkonstruovánà '%s'" #: core/math/expression.cpp msgid "On call to '%s':" @@ -136,6 +136,31 @@ msgid "Anim Change Call" msgstr "Animace: zmÄ›na volánÃ" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animace: ZmÄ›nit Äas klÃÄového snÃmku" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animace: zmÄ›na pÅ™echodu" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animace: zmÄ›na transformace" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animace: ZmÄ›nit hodnotu klÃÄového snÃmku" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animace: zmÄ›na volánÃ" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "ZmÄ›nit délku animace" @@ -214,8 +239,9 @@ msgid "Interpolation Mode" msgstr "InterpolaÄnà režim" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "" +msgstr "Režim ovinuté smyÄky (interpolace konce se zaÄátkem ve smyÄce)" #: editor/animation_track_editor.cpp msgid "Remove this track." @@ -260,12 +286,14 @@ msgid "Cubic" msgstr "Kubická" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Clamp Loop Interp" -msgstr "" +msgstr "Režim svorkové smyÄky" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Wrap Loop Interp" -msgstr "" +msgstr "Interpolace ovinutou smyÄkou" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp @@ -346,7 +374,7 @@ msgstr "PÅ™eskupit stopy" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "" +msgstr "TransformaÄnà stopy se aplikujà pouze na uzly vycházejÃcà ze Spatial." #: editor/animation_track_editor.cpp msgid "" @@ -366,7 +394,7 @@ msgstr "Stopa animace může odkazovat pouze na uzly AnimationPlayer." #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." -msgstr "" +msgstr "PÅ™ehrávaÄ animace nemůže animovat sám sebe, pouze ostatnà pÅ™ehrávaÄe." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" @@ -378,7 +406,7 @@ msgstr "PÅ™idat Bézierovu stopu" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "Cesta stopy nenà validnÃ, nelze vložit klÃÄ." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" @@ -396,7 +424,7 @@ msgstr "PÅ™idat stopu" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "" +msgstr "Cesta stopy nenà validnÃ, nelze vložit klÃÄ metody." #: editor/animation_track_editor.cpp #, fuzzy @@ -424,9 +452,12 @@ msgid "Anim Scale Keys" msgstr "Animace: zmÄ›nit měřÃtko klÃÄů" #: editor/animation_track_editor.cpp +#, fuzzy msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" +"Tato možnost nefunguje s Beziérovými úpravami, protože se jedná pouze o " +"jednu stopu." #: editor/animation_track_editor.cpp msgid "" @@ -443,7 +474,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "UpozornÄ›nÃ: Upravuje se importovaná animace" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -473,7 +504,7 @@ msgstr "Hodnota animaÄnÃho kroku." #: editor/animation_track_editor.cpp msgid "Seconds" -msgstr "" +msgstr "Sekundy" #: editor/animation_track_editor.cpp msgid "FPS" @@ -630,6 +661,10 @@ msgstr "JÃt na řádek" msgid "Line Number:" msgstr "ÄŒÃslo řádku:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Žádné shody" @@ -661,7 +696,7 @@ msgstr "Pouze výbÄ›r" #: 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/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -679,13 +714,13 @@ msgstr "Oddálit" msgid "Reset Zoom" msgstr "Obnovit původnà pÅ™iblÞenÃ" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "VarovánÃ" #: editor/code_editor.cpp msgid "Line and column numbers." -msgstr "" +msgstr "ÄŒÃsla řádků a sloupců." #: editor/connections_dialog.cpp #, fuzzy @@ -718,7 +753,7 @@ msgstr "Signály:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "" +msgstr "Scéna neobsahuje žádný skript." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -765,12 +800,11 @@ msgstr "JednorázovÄ›" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "" +msgstr "Odpojà signál po jeho prvnÃm vyvolánÃ." #: editor/connections_dialog.cpp -#, fuzzy msgid "Cannot connect signal" -msgstr "PÅ™ipojit Signál: " +msgstr "PÅ™ipojit Signál" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -791,6 +825,11 @@ msgid "Connect" msgstr "PÅ™ipojit" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signály:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "PÅ™ipojit '%s' k '%s'" @@ -958,7 +997,8 @@ msgid "Owners Of:" msgstr "VlastnÃci:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Odebrat vybrané soubory z projektu? (nelze vrátit zpÄ›t)" #: editor/dependency_editor.cpp @@ -1143,7 +1183,6 @@ msgid "Success!" msgstr "ÚspÄ›ch!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Instalovat" @@ -1270,7 +1309,7 @@ msgstr "OtevÅ™Ãt rozloženà Audio Busu" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "Neexistuje '%s' soubor." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -1346,7 +1385,7 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "KlÃÄové slovo nemůže být použito jako název pro autoload." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -1514,6 +1553,10 @@ msgstr "Vlastnà šablona k uveÅ™ejnÄ›nà nebyla nalezena." msgid "Template file not found:" msgstr "Soubor Å¡ablony nenalezen:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1556,7 +1599,7 @@ msgstr "Nahradit vÅ¡echny (bez možnosti vrácenÃ)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "Profil musà být validnà název souboru a nesmà obsahovat '.'" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1565,7 +1608,7 @@ msgstr "Soubor nebo složka s tÃmto názvem již existuje." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(Editor zakázán, Vlastnosti zakázány)" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1604,13 +1647,13 @@ msgstr "Hledat tÅ™Ãdy" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "Formát souboru '%s' je neplatný, import zruÅ¡en." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." -msgstr "" +msgstr "Profil '%s' již existuje. PÅ™ed importem jej odstraňte, import zruÅ¡en." #: editor/editor_feature_profile.cpp #, fuzzy @@ -1619,7 +1662,7 @@ msgstr "Chyba pÅ™i nahrávánà šablony '%s'" #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "OdznaÄit" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1710,7 +1753,7 @@ msgstr "Zobrazit ve správci souborů" msgid "New Folder..." msgstr "Nová složka..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Obnovit" @@ -1761,7 +1804,7 @@ msgstr "Jit dopÅ™edu" msgid "Go Up" msgstr "JÃt o úroveň výš" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Zobrazit skryté soubory" @@ -1786,26 +1829,33 @@ msgid "Move Favorite Down" msgstr "PÅ™esunout oblÃbenou položku dolů" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "PÅ™edchozà složka" +#, fuzzy +msgid "Go to previous folder." +msgstr "JÃt na nadÅ™azenou složku" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Dalšà složka" +#, fuzzy +msgid "Go to next folder." +msgstr "JÃt na nadÅ™azenou složku" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "JÃt na nadÅ™azenou složku" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Hledat soubory" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Nelze vytvoÅ™it složku." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Zobrazit skryté soubory" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -1843,6 +1893,8 @@ msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"Existuje vÃcero importérů různých typů odkazujÃcÃch na soubor %s, import " +"zruÅ¡en" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -2068,6 +2120,8 @@ msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" +"Tento zdroj nemůže být uložen, protože nenáležà editované scénÄ›. NejdÅ™Ãve z " +"nÄ›j udÄ›lejte unikátnà zdroj." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." @@ -2429,6 +2483,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Žádná hlavnà scéna nebyla definována. Vyberte jednu?\n" +"Může být pozdÄ›ji zmÄ›nÄ›no v \"Nastavenà projektu\" v kategorii 'aplikace'." #: editor/editor_node.cpp msgid "" @@ -2524,6 +2580,11 @@ msgid "Go to previously opened scene." msgstr "PÅ™ejÃt na pÅ™edchozà scénu." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "KopÃrovat cestu" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Dalšà záložka" @@ -2735,15 +2796,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "OtevÅ™Ãt složku s daty a nastavenÃm editoru" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "OtevÅ™Ãt dalšà editor" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Celá obrazovka" @@ -3063,6 +3115,11 @@ msgid "Calls" msgstr "VolánÃ" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editovat téma..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3683,6 +3740,7 @@ msgid "Nodes not in Group" msgstr "Uzly nejsou ve skupinÄ›" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtrovat uzly" @@ -4727,6 +4785,11 @@ msgid "Idle" msgstr "NeÄinný" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Instalovat" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Opakovat" @@ -4755,7 +4818,6 @@ msgid "Last" msgstr "PoslednÃ" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "VÅ¡echny" @@ -4769,8 +4831,9 @@ msgid "Sort:" msgstr "Řadit:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Naopak" +#, fuzzy +msgid "Reverse sorting." +msgstr "PosÃlá se žádost..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4845,31 +4908,38 @@ msgid "Rotation Step:" msgstr "Krok rotace:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "PÅ™esunout svislé vodÃtko" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "VytvoÅ™it nové svislé vodÃtko" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Odstranit svislé vodÃtko" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "PÅ™esunout vodorovné vodÃtko" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "VytvoÅ™it nové vodorovné vodÃtko" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Odstranit vodorovné vodÃtko" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "VytvoÅ™it nové vodorovné a svislé vodÃtka" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6482,10 +6552,19 @@ msgid "Syntax Highlighter" msgstr "ZvýrazňovaÄ syntaxe" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "VytvoÅ™it body." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6780,9 +6859,14 @@ msgstr "ZadnÃ" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Zarovnat s výhledem" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Zarovnat výbÄ›r s pohledem" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" @@ -6973,10 +7057,6 @@ msgid "Focus Selection" msgstr "Zaměřit výbÄ›r" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Zarovnat výbÄ›r s pohledem" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Nástroj VýbÄ›r" @@ -7567,14 +7647,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Zrcadlit X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Zrcadlit Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8004,6 +8076,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vrchol" @@ -8095,6 +8171,23 @@ msgid "Color uniform." msgstr "Animace: zmÄ›na transformace" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Vrátà inverznà odmocninu z parametru." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8102,10 +8195,45 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Vrátà tangens parametru." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8136,15 +8264,15 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for light shader mode." -msgstr "" +msgstr "'%s' vstupnà parametr pro mód svÄ›telného shaderu." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "'%s' vstupnà parametr pro mód vertexového shaderu." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "" +msgstr "'%s' vstupnà parametr pro mód vertexového a fragmentového shaderu." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8158,100 +8286,105 @@ msgstr "ZmÄ›nit skalárnà operátor" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." -msgstr "" +msgstr "E konstanta (2.718282). Reprezentuje základ pÅ™irozeného logaritmu." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "Epsilon konstanta (0.00001). Nejmenšà možné skalárnà ÄÃslo." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "Phi konstanta (1.618034). Zlatý Å™ez." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "Pi/4 konstanta (0.785398) nebo 45 stupňů." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "Pi/2 konstanta (1.570796) nebo 90 stupňů." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "Pi konstanta (3.141593) nebo 180 stupňů." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "Tau konstanta (6.283185) nebo 360 stupňů." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." -msgstr "" +msgstr "Sqrt2 konstanta (1.414214). Druhá odmocnina ze 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "" +msgstr "Vrátà absolutnà hodnotu parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." -msgstr "" +msgstr "Vrátà arkus kosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "" +#, fuzzy +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "(Pouze GLES3) Vrátà inverznà hyperbolický kosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." -msgstr "" +msgstr "Vrátà arkus sinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "" +#, fuzzy +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "(Pouze GLES3) Vrátà inverznà hyperbolický sinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." -msgstr "" +msgstr "Vrátà arkus tangent parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameters." -msgstr "" +msgstr "Vrátà arkus tangent parametrů." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "" +#, fuzzy +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "(Pouze GLES3) Vrátà inverznà hyperbolický tangent parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." msgstr "" +"Nalezne nejbližšà celé ÄÃslo, které je vÄ›tšà nebo stejné jako parametr." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." -msgstr "" +msgstr "Omezà hodnotu, aby náležela intervalu dvou hodnot." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." -msgstr "" +msgstr "Vrátà kosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "" +#, fuzzy +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "(Pouze GLES3) Vrátà hyperbolický kosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "" +msgstr "Konvertuje množstvà v radiánech na stupnÄ›." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." -msgstr "" +msgstr "Exponenciál se základem e." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 Exponential." -msgstr "" +msgstr "Exponenciál se základem 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "" +msgstr "Nalezne nejbližšà celé ÄÃslo menšà nebo stejné jako parametr." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." @@ -8259,76 +8392,79 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." -msgstr "" +msgstr "Vrátà inverznà odmocninu z parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." -msgstr "" +msgstr "PÅ™irozený logaritmus." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 logarithm." -msgstr "" +msgstr "Logaritmus se základem 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "Vrátà vÄ›tšà ze dvou hodnot." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "Vrátà menšà ze dvou hodnot." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "" +msgstr "Lineárnà interpolace mezi dvÄ›ma skaláry." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "Vrátà opaÄnou hodnotu parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" -msgstr "" +msgstr "1.0 - skalár" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." -msgstr "" +msgstr "Vrátà hodnotu prvnÃho parametru umocnÄ›ného druhým." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "Konvertuje množstvà ve stupnÃch na radiány." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" -msgstr "" +msgstr "1.0 / skalár" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "" +#, fuzzy +msgid "Finds the nearest integer to the parameter." +msgstr "(Pouze GLES3) Nalezne nejbližšà celé ÄÃslo k parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "" +#, fuzzy +msgid "Finds the nearest even integer to the parameter." +msgstr "(Pouze GLES3) Nalezne nejbližšà sudé celé ÄÃslo k parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "SevÅ™e hodnotu mezi 0.0 a 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "ZÃská znaménko z parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "Vrátà sinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "" +#, fuzzy +msgid "Returns the hyperbolic sine of the parameter." +msgstr "(Pouze GLES3) Vrátà hyperbolický sinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "Vrátà odmocninu parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8348,27 +8484,29 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "Vrátà tangens parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "" +#, fuzzy +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "(Pouze GLES3) Vrátà hyperbolický tangens parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "" +#, fuzzy +msgid "Finds the truncated value of the parameter." +msgstr "Vrátà absolutnà hodnotu parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." -msgstr "" +msgstr "PÅ™iÄte skalár ke skaláru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "PodÄ›là skalár skalárem." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "Vynásobà skalár skalárem." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." @@ -8397,11 +8535,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8411,7 +8553,7 @@ msgstr "Transformovat polygon" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8429,15 +8571,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8489,7 +8631,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8517,12 +8659,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8599,47 +8741,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9828,6 +9970,11 @@ msgstr "OtevÅ™Ãt skript" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "PÅ™idat/VytvoÅ™it nový uzel" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Dává smysl!" @@ -10048,7 +10195,8 @@ msgid "Script is valid." msgstr "Skript je validnÃ" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "Povoleno: a-z, A-Z, 0-9 a _" #: editor/script_create_dialog.cpp @@ -10106,7 +10254,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Chyby" @@ -10524,54 +10672,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "Název tÅ™Ãdy nemůže být rezervované klÃÄové slovo" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Generovánà řeÅ¡enÃ..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Generovánà C# projektu..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "NepodaÅ™ilo se vytvoÅ™it Å™eÅ¡enÃ." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "NepodaÅ™ilo se uložit Å™eÅ¡enÃ." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Hotovo" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "VytvoÅ™enà C# projektu selhalo." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "O podpoÅ™e C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "VytvoÅ™it C# Å™eÅ¡enÃ" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "SestavenÃ" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Sestavit projekt" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Zobrazit logy" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11175,8 +11275,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Neplatné rozmÄ›ry obrázku uvÃtacà obrazovky (mÄ›ly by být 620x300)." #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Aby AnimatedSprite mohl zobrazovat snÃmky, zdroj SpriteFrames musà být " @@ -11242,8 +11343,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "Textura svÄ›tla musà být nastavena vlastnostà 'texture'." @@ -11254,7 +11356,7 @@ msgstr "" "Polygon stÃnÃtka musà být nastaven (nebo namalován), aby stÃnÃtko fungovalo." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11340,15 +11442,16 @@ msgstr "" "jejich tvaru." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D funguje nejlépe, když je nastaven jako rodiÄ editované " "scény." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11435,9 +11538,10 @@ msgstr "" "a KinematicBody, abyste jim dali tvar." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Aby CollisionShape mohl fungovat, musà mu být poskytnut tvar. VytvoÅ™te mu " "prosÃm zdroj tvar!" @@ -11468,6 +11572,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11506,8 +11614,8 @@ msgstr "PathFollow funguje pouze, když je dÃtÄ›tem uzlu Path." #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11519,7 +11627,9 @@ msgstr "" #: scene/3d/remote_transform.cpp #, fuzzy -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" "Aby ParticleAttractor2D fungoval, musà vlastnost path ukazovat na platný " "uzel Particles2D." @@ -11538,8 +11648,9 @@ msgstr "" "Změňte mÃsto nÄ›ho velikost koliznÃch tvarů potomků." #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Zdroj SpriteFrames musà být vytvoÅ™en nebo nastaven ve vlastnosti 'Frames', " @@ -11554,7 +11665,9 @@ msgstr "" "potomka VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11592,7 +11705,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Odpojit '%s' od '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11606,7 +11719,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Strom animace je neplatný." #: scene/animation/animation_tree_player.cpp @@ -11638,8 +11751,7 @@ msgstr "PÅ™idat aktuálnà barvu jako pÅ™edvolbu" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11657,23 +11769,25 @@ msgid "Please Confirm..." msgstr "PotvrÄte prosÃm..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Popupy budou standardnÄ› skryty, dokud nezavoláte popup() nebo nÄ›kterou z " "popup*() funkcÃ. I když je jejich zviditelnÄ›nà pro úpravu v pořádku, za bÄ›hu " "budou skryty." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +#, fuzzy +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "Pokud má exp_edit hodnotu true, pak min_value musà být > 0." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11723,9 +11837,19 @@ msgid "Input" msgstr "Vstup" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "Neplatný zdroj pro shader." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Neplatný zdroj pro shader." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Neplatný zdroj pro shader." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11740,7 +11864,62 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Konstanty nenà možné upravovat." + +#~ msgid "Previous Folder" +#~ msgstr "PÅ™edchozà složka" + +#~ msgid "Next Folder" +#~ msgstr "Dalšà složka" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "OtevÅ™Ãt dalšà editor" + +#~ msgid "Reverse" +#~ msgstr "Naopak" + +#~ msgid "Mirror X" +#~ msgstr "Zrcadlit X" + +#~ msgid "Mirror Y" +#~ msgstr "Zrcadlit Y" + +#~ msgid "Generating solution..." +#~ msgstr "Generovánà řeÅ¡enÃ..." + +#~ msgid "Generating C# project..." +#~ msgstr "Generovánà C# projektu..." + +#~ msgid "Failed to create solution." +#~ msgstr "NepodaÅ™ilo se vytvoÅ™it Å™eÅ¡enÃ." + +#~ msgid "Failed to save solution." +#~ msgstr "NepodaÅ™ilo se uložit Å™eÅ¡enÃ." + +#~ msgid "Done" +#~ msgstr "Hotovo" + +#~ msgid "Failed to create C# project." +#~ msgstr "VytvoÅ™enà C# projektu selhalo." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "O podpoÅ™e C#" + +#~ msgid "Create C# solution" +#~ msgstr "VytvoÅ™it C# Å™eÅ¡enÃ" + +#~ msgid "Builds" +#~ msgstr "SestavenÃ" + +#~ msgid "Build Project" +#~ msgstr "Sestavit projekt" + +#~ msgid "View log" +#~ msgstr "Zobrazit logy" #, fuzzy #~ msgid "Enabled Classes" diff --git a/editor/translations/da.po b/editor/translations/da.po index ddd6ed5b12..33b763b7ee 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -139,6 +139,31 @@ msgstr "Anim Skift Call" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Skift Keyframetid" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Skift Overgang" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Skift Transformering" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Skift Keyframeværdi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Skift Call" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Ændre Animation Navn:" @@ -644,6 +669,10 @@ msgstr "GÃ¥ til linje" msgid "Line Number:" msgstr "Linjenummer:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Ingen Match" @@ -693,7 +722,7 @@ msgstr "Zoom Ud" msgid "Reset Zoom" msgstr "Nulstil Zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -805,6 +834,11 @@ msgid "Connect" msgstr "Forbind" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signaler:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Forbind '%s' til '%s'" @@ -972,7 +1006,8 @@ msgid "Owners Of:" msgstr "Ejere af:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Fjern de valgte filer fra projektet? (ej fortrydes)" #: editor/dependency_editor.cpp @@ -1155,7 +1190,6 @@ msgid "Success!" msgstr "Succes!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Installér" @@ -1526,6 +1560,10 @@ msgstr "" msgid "Template file not found:" msgstr "Skabelonfil ikke fundet:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1721,7 +1759,7 @@ msgstr "Vis i FilhÃ¥ndtering" msgid "New Folder..." msgstr "Opret mappe..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Opdater" @@ -1772,7 +1810,7 @@ msgstr "GÃ¥ Fremad" msgid "Go Up" msgstr "GÃ¥ Op" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Skifter Skjulte Filer" @@ -1798,27 +1836,32 @@ msgstr "Flyt Favorit Ned" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Forrige fane" +msgid "Go to previous folder." +msgstr "GÃ¥ til overliggende mappe" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Opret Mappe" +msgid "Go to next folder." +msgstr "GÃ¥ til overliggende mappe" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "GÃ¥ til overliggende mappe" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Søg Classes" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Kunne ikke oprette mappe." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Skifter Skjulte Filer" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2549,6 +2592,11 @@ msgid "Go to previously opened scene." msgstr "GÃ¥ til den forrige Ã¥bnede scene." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Kopier Sti" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Næste fane" @@ -2761,15 +2809,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Ã…bn redaktør Data/Indstillinger-mappe" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Ã…bn næste Editor" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Skifter fuldskærm" @@ -3090,6 +3129,11 @@ msgid "Calls" msgstr "Kald" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Medlemmer" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3731,6 +3775,7 @@ msgid "Nodes not in Group" msgstr "Føj til Gruppe" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtrer noder" @@ -4821,6 +4866,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Installér" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4850,7 +4900,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alle" @@ -4864,8 +4913,9 @@ msgid "Sort:" msgstr "Sorter:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Omvendt" +#, fuzzy +msgid "Reverse sorting." +msgstr "Anmoder..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4939,32 +4989,39 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "" +#, fuzzy +msgid "Move Vertical Guide" +msgstr "Fjern vertikal guide" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Opret ny vertikal guide" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Fjern vertikal guide" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "" +#, fuzzy +msgid "Move Horizontal Guide" +msgstr "Fjern horisontal guide" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Opret ny horisontal guide" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Fjern horisontal guide" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" +msgstr "Opret ny vertikal guide" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6596,10 +6653,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Slet points" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6902,7 +6968,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7090,10 +7160,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Vælg værktøj" @@ -7679,14 +7745,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8116,6 +8174,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8207,6 +8269,22 @@ msgid "Color uniform." msgstr "Anim Skift Transformering" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8214,10 +8292,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8307,7 +8419,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8315,7 +8427,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8327,7 +8439,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8344,7 +8456,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8413,11 +8525,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8433,7 +8545,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8461,11 +8573,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8506,11 +8618,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8520,7 +8636,7 @@ msgstr "Opret Poly" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8538,15 +8654,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8598,7 +8714,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8626,12 +8742,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8708,47 +8824,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9948,6 +10064,11 @@ msgstr "Ã…ben script" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Opret Ny %s" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Gem Scene" @@ -10168,7 +10289,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10227,7 +10348,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10638,60 +10759,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "Fejler med at indlæse ressource." - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "Fejler med at indlæse ressource." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create C# project." -msgstr "Fejler med at indlæse ressource." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "Opret Abonnement" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "Projekt" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Vis filer" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11296,8 +11363,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "En SpriteFrames ressource skal oprettes eller angives i egenskaben 'Frames' " @@ -11358,8 +11426,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "En tekstur med formen pÃ¥ lyset skal gives til egenskaben 'teksture'." @@ -11371,7 +11440,8 @@ msgstr "" "i kraft." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "Occluder polygon for denne occluder er tom. Tegn venligst en polygon!" #: scene/2d/navigation_polygon.cpp @@ -11457,15 +11527,16 @@ msgstr "" "StaticBody2D, RigidBody2D, KinematicBody2D, etc. til at give dem en form." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D fungerer bedst, nÃ¥r det bruges med den redigerede " "scenerod direkte som parent." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11548,9 +11619,10 @@ msgstr "" "StaticBody, RigidBody, KinematicBody, etc. til at give dem en form." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "En figur skal gives for at CollisionShape fungerer. Opret en figur ressource " "til det!" @@ -11581,6 +11653,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11621,8 +11697,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11633,7 +11709,10 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "Stien skal pege pÃ¥ en gyldig fysisk node for at virke." #: scene/3d/soft_body.cpp @@ -11648,8 +11727,9 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "En SpriteFrames ressource skal oprettes eller angivets i egenskaben 'Frames' " @@ -11662,7 +11742,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11702,7 +11784,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Afbryd '%s' fra '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11716,7 +11798,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11747,8 +11829,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11766,23 +11847,24 @@ msgid "Please Confirm..." msgstr "Bekræft venligst..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Popups er skjulte som standard, medmindre du kalder popup() eller nogen af " "popup*() funktionerne. At gøre dem synlige for redigering er fint, men de " "bliver skjult under afvikling." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11830,9 +11912,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Ugyldig skriftstørrelse." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Ugyldig skriftstørrelse." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Ugyldig skriftstørrelse." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11850,6 +11942,45 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Forrige fane" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Opret Mappe" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Ã…bn næste Editor" + +#~ msgid "Reverse" +#~ msgstr "Omvendt" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "Fejler med at indlæse ressource." + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "Fejler med at indlæse ressource." + +#, fuzzy +#~ msgid "Failed to create C# project." +#~ msgstr "Fejler med at indlæse ressource." + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "Opret Abonnement" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "Projekt" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Vis filer" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Søg Classes" diff --git a/editor/translations/de.po b/editor/translations/de.po index 3ab7a8c3eb..0816cf1a85 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -43,12 +43,13 @@ # Marcus Naschke <marcus.naschke@gmail.com>, 2019. # datenbauer <d-vaupel@web.de>, 2019. # Alexander Hausmann <alexander-hausmann+weblate@posteo.de>, 2019. +# Nicolas Mohr <81moni1bif@hft-stuttgart.de>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:47+0000\n" -"Last-Translator: Alexander Hausmann <alexander-hausmann+weblate@posteo.de>\n" +"PO-Revision-Date: 2019-07-21 11:06+0000\n" +"Last-Translator: Nicolas Mohr <81moni1bif@hft-stuttgart.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -169,6 +170,31 @@ msgid "Anim Change Call" msgstr "Aufruf ändern" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Schlüsselbildzeit ändern" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Übergang bearbeiten" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Transformation bearbeiten" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Schlüsselbildwert ändern" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Aufruf ändern" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Animationslänge ändern" @@ -670,6 +696,10 @@ msgstr "Gehe zu Zeile" msgid "Line Number:" msgstr "Zeilennummer:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "%d Übereinstimmung(en) gefunden." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Keine Übereinstimmungen" @@ -719,7 +749,7 @@ msgstr "Verkleinern" msgid "Reset Zoom" msgstr "Vergrößerung zurücksetzen" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Warnungen" @@ -826,6 +856,10 @@ msgid "Connect" msgstr "Verbinden" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Signal:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Verbinde ‚%s‘ mit ‚%s‘" @@ -988,10 +1022,10 @@ msgid "Owners Of:" msgstr "Besitzer von:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" -"Ausgewählte Dateien aus dem Projekt löschen? (Kann nicht rückgängig gemacht " -"werden)" +"Ausgewählte Dateien aus dem Projekt entfernen? (Kann nicht rückgängig " +"gemacht werden)" #: editor/dependency_editor.cpp msgid "" @@ -1175,7 +1209,6 @@ msgid "Success!" msgstr "Geschafft!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Installieren" @@ -1363,7 +1396,6 @@ msgid "Must not collide with an existing engine class name." msgstr "Darf nicht mit existierenden Klassennamen der Engine übereinstimmen." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "Darf nicht mit existierenden eingebauten Typnamen übereinstimmen." @@ -1542,6 +1574,11 @@ msgstr "Selbst konfigurierte Release-Exportvorlage nicht gefunden." msgid "Template file not found:" msgstr "Vorlagendatei nicht gefunden:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"In 32-bit-Exporten kann das eingebettete PCK nicht größer als 4 GiB sein." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "3D-Editor" @@ -1567,9 +1604,8 @@ msgid "Node Dock" msgstr "Node-Leiste" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Dateisystemleiste" +msgstr "Dateisystem- und Import-Leiste" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1621,13 +1657,12 @@ msgid "File '%s' format is invalid, import aborted." msgstr "Datei ‚%s‘ ist ungültig, Import wurde abgebrochen." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" "Profil ‚%s‘ existiert bereits. Es muss erst entfernt werden bevor es " -"importiert werden kann. Import wurde abgebrochen." +"importiert werden kann, Import wurde abgebrochen." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." @@ -1638,9 +1673,8 @@ msgid "Unset" msgstr "Deaktivieren" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Aktuelles Profil" +msgstr "Aktuelles Profil:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1662,9 +1696,8 @@ msgid "Export" msgstr "Exportieren" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Verfügbare Profile" +msgstr "Verfügbare Profile:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1688,7 +1721,7 @@ msgstr "Profil exportieren" #: editor/editor_feature_profile.cpp msgid "Manage Editor Feature Profiles" -msgstr "Verwalte Editor-Funktionen-Profile" +msgstr "Verwalte Editorfunktionenprofile" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1719,7 +1752,7 @@ msgstr "Im Dateimanager anzeigen" msgid "New Folder..." msgstr "Neuer Ordner..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Aktualisieren" @@ -1770,7 +1803,7 @@ msgstr "Vor" msgid "Go Up" msgstr "Hoch" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Versteckte Dateien ein- und ausblenden" @@ -1795,23 +1828,31 @@ msgid "Move Favorite Down" msgstr "Favorit nach unten schieben" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Vorheriger Ordner" +#, fuzzy +msgid "Go to previous folder." +msgstr "Gehe zu übergeordnetem Ordner." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Nächster Ordner" +#, fuzzy +msgid "Go to next folder." +msgstr "Gehe zu übergeordnetem Ordner." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Gehe zu übergeordnetem Ordner." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Dateien suchen" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Gegenwärtigen Ordner (de)favorisieren." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Versteckte Dateien ein- oder ausblenden." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2351,7 +2392,7 @@ msgstr "Editor verlassen?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "Projektverwaltung öffnen?" +msgstr "Aktuelles Projekt schließen und zur Projektverwaltung zurückkehren?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -2552,6 +2593,10 @@ msgid "Go to previously opened scene." msgstr "Gehe zu vorher geöffneter Szene." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Text kopieren" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Nächster Tab" @@ -2647,7 +2692,7 @@ msgstr "Android-Build-Vorlage installieren" #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "Verlasse zur Projektverwaltung" +msgstr "Zur Projektverwaltung zurückkehren" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp @@ -2755,32 +2800,21 @@ msgid "Editor Layout" msgstr "Editorlayout" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Szenen-Wurzel erstellen" +msgstr "Bildschirmfoto erstellen" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Editordaten-/Einstellungenordner öffnen" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Nächsten Editor öffnen" +"Bildschirmfotos werden im „Editor Data/Settings“-Verzeichnis gespeichert." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Vollbildmodus umschalten" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "CanvasItem-Sichtbarkeit umschalten" +msgstr "Systemkonsole umschalten" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2788,7 +2822,7 @@ msgstr "Editordaten-/Einstellungenordner öffnen" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "Editor-Dateiverzeichnis öffnen" +msgstr "Editordateiverzeichnis öffnen" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" @@ -2796,7 +2830,7 @@ msgstr "Editoreinstellungenordner öffnen" #: editor/editor_node.cpp msgid "Manage Editor Features" -msgstr "Editor-Funktionen verwalten" +msgstr "Editorfunktionen verwalten" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" @@ -2889,19 +2923,16 @@ msgid "Spins when the editor window redraws." msgstr "Dreht sich, wenn das Editorfenster neu gezeichnet wird." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Fortlaufend" +msgstr "Fortlaufend aktualisieren" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Änderungen aktualisieren" +msgstr "Bei Änderungen aktualisieren" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Update-Anzeigerad deaktivieren" +msgstr "Aktualisierungsanzeigerad ausblenden" #: editor/editor_node.cpp msgid "FileSystem" @@ -3099,6 +3130,11 @@ msgid "Calls" msgstr "Aufrufe" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Thema bearbeiten" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "An" @@ -3720,6 +3756,7 @@ msgid "Nodes not in Group" msgstr "Nodes nicht in der Gruppe" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Nodes filtern" @@ -4767,6 +4804,11 @@ msgid "Idle" msgstr "Leerlauf" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Installieren" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Erneut versuchen" @@ -4795,7 +4837,6 @@ msgid "Last" msgstr "Letzte" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alle" @@ -4809,8 +4850,9 @@ msgid "Sort:" msgstr "Sortiere:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Umkehren" +#, fuzzy +msgid "Reverse sorting." +msgstr "Frage an..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4892,31 +4934,38 @@ msgid "Rotation Step:" msgstr "Rotationsabstand:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Vertikale Hilfslinie verschieben" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Neue vertikale Hilfslinie erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Vertikale Hilfslinie löschen" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Horizontale Hilfslinie verschieben" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Neue horizontale Hilfslinie erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Horizontale Hilfslinie löschen" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Neue horizontale und vertikale Hilfslinien erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5351,9 +5400,8 @@ msgstr "Emissionsmaske laden" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Jetzt Neustarten" +msgstr "Neustarten" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6268,18 +6316,16 @@ msgid "Find Next" msgstr "Finde Nächstes" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Eigenschaften filtern" +msgstr "Skripte filtern" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Alphabetische Sortierung der Methodenliste umschalten." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Filtermodus:" +msgstr "Methoden filtern" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6513,10 +6559,18 @@ msgid "Syntax Highlighter" msgstr "Syntaxhervorhebung" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Springe zu" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "Lesezeichen" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Haltepunkte" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6806,9 +6860,15 @@ msgid "Rear" msgstr "Hinten" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Mit Sicht ausrichten" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Auswahl auf Ansicht ausrichten" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" @@ -6997,10 +7057,6 @@ msgid "Focus Selection" msgstr "Auswahl fokussieren" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Auswahl auf Ansicht ausrichten" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Werkzeugauswahl" @@ -7563,14 +7619,6 @@ msgid "Transpose" msgstr "Transponieren" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "X-Koordinaten spiegeln" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Y-Koordinaten spiegeln" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "Autokacheln deaktivieren" @@ -7969,6 +8017,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Visual-Shader-Eingabetyp geändert" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vertex" @@ -8053,6 +8105,23 @@ msgid "Color uniform." msgstr "Farb-Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Gibt die inverse Quadratwurzel des Parameters zurück." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8062,12 +8131,47 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" "Gibt einen geeigneten Vektor zurück je nach dem ob der übergebene Wert wahr " "oder falsch ist." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Gibt den Tangens des Parameters zurück." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "Boolean-Konstante." @@ -8076,43 +8180,36 @@ msgid "Boolean uniform." msgstr "Boolean-Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for all shader modes." -msgstr "‚uv‘-Eingabeparameter für alle Shadermodi." +msgstr "‚%s‘-Eingabeparameter für alle Shadermodi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." msgstr "Eingabeparameter." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "‚uv‘-Eingabeparameter für Vertex- und Fragment-Shadermodus." +msgstr "‚%s‘-Eingabeparameter für Vertex- und Fragment-Shadermodus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." -msgstr "‚view‘-Eingabeparameter für Vertex- und Light-Shadermodus." +msgstr "‚%s‘-Eingabeparameter für Fragment- und Light-Shadermodus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "‚side‘-Eingabeparameter für Fragment-Shadermodus." +msgstr "‚%s‘-Eingabeparameter für Fragment-Shadermodus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "‚diffuse‘-Eingabeparameter für Light-Shadermodus." +msgstr "‚%s‘-Eingabeparameter für Light-Shadermodus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "'custom'-Eingabeparameter für Vertex-Shadermodus." +msgstr "‚%s‘-Eingabeparameter für Vertex-Shadermodus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "‚uv‘-Eingabeparameter für Vertex- und Fragment-Shadermodus." +msgstr "‚%s‘-Eingabeparameter für Vertex- und Fragment-Shadermodus." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -8163,7 +8260,8 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Gibt den Arkuskosinus des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" "(Nur GLES3) Gibt den inversen hyperbolischen Kosinus des Parameters zurück." @@ -8172,7 +8270,8 @@ msgid "Returns the arc-sine of the parameter." msgstr "Gibt den Arkussinus des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" "(Nur GLES3) Gibt den inversen hyperbolischen Sinus des Parameters zurück." @@ -8185,7 +8284,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Gibt den Arkuskosinus2 der Parameter zurück." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" "(Nur GLES3) Gibt den inversen hyperbolischen Tangens des Parameters zurück." @@ -8203,7 +8303,8 @@ msgid "Returns the cosine of the parameter." msgstr "Gibt den Kosinus des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +#, fuzzy +msgid "Returns the hyperbolic cosine of the parameter." msgstr "(Nur GLES3) Gibt den hyperbolischen Kosinus des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8272,11 +8373,13 @@ msgid "1.0 / scalar" msgstr "1.0 / Skalar" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +#, fuzzy +msgid "Finds the nearest integer to the parameter." msgstr "(nur GLES3) Gibt die nächste Ganzzahl vom Parameter zurück." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +#, fuzzy +msgid "Finds the nearest even integer to the parameter." msgstr "(nur GLES3) Gibt die nächste gerade Ganzzahl vom Parameter zurück." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8292,7 +8395,8 @@ msgid "Returns the sine of the parameter." msgstr "Gibt den Sinus des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +#, fuzzy +msgid "Returns the hyperbolic sine of the parameter." msgstr "(nur GLES3) Gibt den hyperbolischen Sinus des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8328,11 +8432,13 @@ msgid "Returns the tangent of the parameter." msgstr "Gibt den Tangens des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +#, fuzzy +msgid "Returns the hyperbolic tangent of the parameter." msgstr "(nur GLES3) Gibt den hyperbolischen Tangens des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +#, fuzzy +msgid "Finds the truncated value of the parameter." msgstr "(Nur GLES3) Gibt den abgeschnittenen Wert des Parameters zurück." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8372,11 +8478,18 @@ msgid "Perform the texture lookup." msgstr "Texturfinden ausführen." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +#, fuzzy +msgid "Cubic texture uniform lookup." msgstr "Kubisches Textur-Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +#, fuzzy +msgid "2D texture uniform lookup." +msgstr "2D-Textur-Uniform." + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup with triplanar." msgstr "2D-Textur-Uniform." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8384,8 +8497,9 @@ msgid "Transform function." msgstr "Transformierungsfunktion." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8410,15 +8524,18 @@ msgid "Decomposes transform to four vectors." msgstr "Extrahiert vier Vektoren aus Transform." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +#, fuzzy +msgid "Calculates the determinant of a transform." msgstr "(nur GLES3) Berechnet die Determinante eines Transforms." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +#, fuzzy +msgid "Calculates the inverse of a transform." msgstr "(nur GLES3) Invertiert ein Transform." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +#, fuzzy +msgid "Calculates the transpose of a transform." msgstr "(nur GLES3) Transponiert ein Transform." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8466,8 +8583,9 @@ msgid "Calculates the dot product of two vectors." msgstr "Berechnet das Skalarprodukt aus zwei Vektoren." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8499,15 +8617,17 @@ msgid "1.0 / vector" msgstr "1.0 / Vektor" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" "Berechnet den Vektor der in die Richtung einer Reflektion zeigt (a: " "Einfallsvektor, b: Normalenvektor)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +#, fuzzy +msgid "Returns the vector that points in the direction of refraction." msgstr "Berechnet den Vektor der in Richtung einer Brechung zeigt." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8607,59 +8727,67 @@ msgstr "" "Eingänge müssen übergeben werden)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +#, fuzzy +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" "(nur GLES3) (nur für Fragment-/Light-Modus) Skalare Ableitungsfunktion." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +#, fuzzy +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" "(nur GLES3) (nur für Fragment-/Light-Modus) Vektorielle Ableitungsfunktion." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" "(nur GLES3) (nur für Fragment-/Light-Modus) (Vektor) Lokale differenzielle " "Ableitung in ‚x‘-Richtung." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" "(nur GLES3) (nur für Fragment-/Light-Modus) (Skalar) Lokale differenzielle " "Ableitung in ‚x‘-Richtung." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" "(nur GLES3) (nur für Fragment-/Light-Modus) (Vektor) Lokale differenzielle " "Ableitung in ‚y‘-Richtung." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" "(nur GLES3) (nur für Fragment-/Light-Modus) (Skalar) Lokale differenzielle " "Ableitung in ‚y‘-Richtung." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" "(nur GLES3) (nur für Fragment-/Light-Modus) (Vektor) Summe der absoluten " "Ableitungen in ‚x‘- und ‚y‘-Richtung." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" "(nur GLES3) (nur für Fragment-/Light-Modus) (Skalar) Summe der absoluten " "Ableitungen in ‚x‘- und ‚y‘-Richtung." @@ -9882,9 +10010,8 @@ msgid "Add Child Node" msgstr "Node hier anhängen" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "Alle einklappen" +msgstr "Alle ein-/ausklappen" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9895,6 +10022,11 @@ msgid "Extend Script" msgstr "Skript erweitern" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Node umhängen" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Szenen-Wurzel erstellen" @@ -9915,9 +10047,8 @@ msgid "Delete (No Confirm)" msgstr "Löschen (keine Bestätigung)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Hinzufügen/Erstellen eines neuen Nodes" +msgstr "Hinzufügen/Erstellen eines neuen Nodes." #: editor/scene_tree_dock.cpp msgid "" @@ -10113,7 +10244,8 @@ msgid "Script is valid." msgstr "Skript ist gültig." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "Erlaubt: a-z, A-Z, 0-9 und _" #: editor/script_create_dialog.cpp @@ -10168,7 +10300,7 @@ msgstr "Stacktrace" msgid "Pick one or more items from the list to display the graph." msgstr "Ein oder mehrere Einträge der Liste auswählen um Graph anzuzeigen." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Fehler" @@ -10570,54 +10702,6 @@ msgstr "Auswahlradius:" msgid "Class name can't be a reserved keyword" msgstr "Der Klassenname kann nicht ein reserviertes Schlüsselwort sein" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Lösungen erzeugen..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "C#-Projekt erzeugen..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Fehler beim Erzeugen einer Lösung." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Fehler beim Speichern der Lösung." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Fertig" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "C#-Projekt-Erzeugen fehlgeschlagen." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Über die C#-Unterstützung" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Erzeuge C#-Lösung" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Fertigstellungen" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Projekt bauen" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Log anschauen" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Ende des inneren Exception-Stack-Traces" @@ -11233,7 +11317,7 @@ msgstr "Ungültige Abmessungen für Startbildschirm (sollte 620x300 sein)." #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Eine SpriteFrames-Ressource muss in der ‚Frames‘-Eigenschaft erstellt oder " @@ -11303,10 +11387,10 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" -"Eine Textur mit der Form des Lichtkegels muss in der ‚Texture‘-Eigenschaft " +"Eine Textur mit der Form des Lichtkegels muss in der „Texture“-Eigenschaft " "angegeben werden." #: scene/2d/light_occluder_2d.cpp @@ -11317,9 +11401,10 @@ msgstr "" "Occluder funktioniert." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" -"Das Occluder-Polygon für diesen Occluder ist leer. Bitte zeichne ein Polygon!" +"Das Occluder-Polygon für diesen Occluder ist leer. Zum Fortfahren Polygon " +"zeichnen." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11413,28 +11498,27 @@ msgstr "" "festgelegt werden." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D liefert nur eine Kollisionsform für ein von " -"CollisionObject2D abgeleitetes Node. Es kann nur als Unterobjekt von Area2D, " -"StaticBody2D, RigidBody2D, KinematicBody2D usw. eingehängt werden um diesen " -"eine Form zu geben." +"Ein TileMap mit aktivierter „Use Parent“-Option benötigt ein " +"CollisionObject2D-Elternnode dem es Form verleiht. Das TileMap sollte als " +"als Unterobjekt von Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, usw. " +"verwendet werden um ihnen eine Form zu geben." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D funktioniert am besten, wenn es ein Unterobjekt erster " -"Ordnung der bearbeiteten Szene ist." +"VisibilityEnable2D funktioniert am besten, wenn die Wurzel der bearbeiteten " +"Szene das Elternobjekt ist." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera braucht ein ARVROrigin-Node als Überobjekt" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera braucht ein ARVROrigin-Node als Überobjekt." #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -11526,10 +11610,10 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" -"Damit CollisionShape funktionieren kann, muss eine Form vorhanden sein. " -"Bitte erzeuge eine shape Ressource dafür!" +"Zum Funktionieren eines CollisionShape benötigt es eine zugeordnete Form. " +"Zum Fortfahren ist eine Shape-Ressource dafür zu erzeugen." #: scene/3d/collision_shape.cpp msgid "" @@ -11563,6 +11647,12 @@ msgstr "" "GIProbes werden vom GLES2-Videotreiber nicht unterstützt.\n" "BakedLightmaps können als Alternative verwendet werden." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" +"Ein SpotLight mit einem Winkel von mehr als 90 Grad kann keine Schatten " +"werfen." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11609,11 +11699,11 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED erfordert die Aktivierung von „Up Vector“ in " -"der Curve-Ressource des übergeordneten Pfades." +"PathFollow mit aktiviertem ROTATION_ORIENTED erfordert die Aktivierung von " +"„Up Vector“ in der Curve-Ressource des übergeordneten Pfades." #: scene/3d/physics_body.cpp msgid "" @@ -11627,8 +11717,12 @@ msgstr "" "geändert werden." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." -msgstr "Die Pfad-Eigenschaft muss auf ein gültiges Spatial-Node verweisen." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." +msgstr "" +"Die „Remote Path“-Eigenschaft muss auf ein gültiges Spatial-Node oder ein " +"von Spatial-Node abgeleitetes Node verweisen." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -11647,11 +11741,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Eine SpriteFrames-Ressource muss in der ‚Frames‘-Eigenschaft erzeugt oder " -"definiert werden, damit AnimatedSprite3D Einzelbilder anzeigen kann." +"Eine SpriteFrames-Ressource muss in der „Frames“-Eigenschaft erzeugt oder " +"gesetzt werden, damit AnimatedSprite3D Einzelbilder anzeigen kann." #: scene/3d/vehicle_body.cpp msgid "" @@ -11663,8 +11757,12 @@ msgstr "" "verwendet werden." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "Ein WorldEnvironment benötigt eine Environment-Ressource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WorldEnvironment benötigt dass die Eigenschaft „Environment“ auf ein " +"Environment mit einem sichtbaren Effekt verweist." #: scene/3d/world_environment.cpp msgid "" @@ -11703,8 +11801,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Nichts ist mit dem Eingang ‚%s‘ von Node ‚%s‘ verbunden." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." -msgstr "Für diesen Graphen wurde kein Wurzel-Animation-Node festgelegt." +msgid "No root AnimationNode for the graph is set." +msgstr "Für diesen Graphen wurde kein Wurzel-AnimationNode festgelegt." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." @@ -11719,8 +11817,8 @@ msgstr "" "AnimationPlayer-Node." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "Die Wurzel des Animationsspieler ist kein gültiges Node." +msgid "The AnimationPlayer root node is not a valid node." +msgstr "Die Wurzel des Animationsspielers ist kein gültiges Node." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11734,12 +11832,11 @@ msgstr "Wählt eine Farbe vom Bildschirm aus." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "Gieren" +msgstr "Roh" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11750,15 +11847,13 @@ msgid "Add current color as a preset." msgstr "Aktuelle Farbe als Vorlage hinzufügen." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" -"Einfache Container sind unnötig solange ihnen kein Skript angehängt ist das " -"die Platzierung der Inhalte vornimmt.\n" +"Container sind unnötig solange kein Skript die Platzierung der Inhalte " +"vornimmt.\n" "Falls kein Skript angehängt werden soll wird empfohlen ein einfaches " "‚Control‘-Node zu verwenden." @@ -11767,6 +11862,9 @@ msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"Der Hinweis-Tooltip wird nicht angezeigt da der Mausfilter dieses Controls " +"als „Ignore“ festgelegt wurde. Zum Beheben muss der Mausfilter als „Stop“ " +"oder „Pass“ festgelegt werden." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11779,22 +11877,22 @@ msgstr "Bitte bestätigen..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" -"Popups werden standardmäßig versteckt, es sei denn Sie rufen popup() oder " -"irgendeine der popup*() Funktionen auf. Sie für die Bearbeitung sichtbar zu " -"machen ist in Ordnung, aber sie werden zur Laufzeit automatisch wieder " -"versteckt." +"Popups werden standardmäßig nicht angezeigt, es sei denn sie werden durch " +"popup() oder andere popup*()-Funktionen aufgerufen. Sie als sichtbar zu " +"markieren kann für die Bearbeitung nützlich sein, zur Laufzeit werden sie " +"allerdings nicht automatisch angezeigt." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "Wenn exp_edit true ist muss min_value größer als null sein." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "Wenn „Exp Edit“ aktiviert ist muss „Min Value“ größer als null sein." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer sollte mit einem einzigen Control-Unterobjekt verwendet " @@ -11849,9 +11947,18 @@ msgid "Input" msgstr "Eingang" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "Ungültige Quelle für Vorschau." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Ungültige Quelle für Shader." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Ungültige Quelle für Shader." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Zuweisung an Funktion." @@ -11868,6 +11975,66 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." msgid "Constants cannot be modified." msgstr "Konstanten können nicht verändert werden." +#~ msgid "Previous Folder" +#~ msgstr "Vorheriger Ordner" + +#~ msgid "Next Folder" +#~ msgstr "Nächster Ordner" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Bildschirmfotos automatisch öffnen" + +#~ msgid "Open in an external image editor." +#~ msgstr "In externem Bildbearbeitungsprogramm öffnen." + +#~ msgid "Reverse" +#~ msgstr "Umkehren" + +#~ msgid "Mirror X" +#~ msgstr "X-Koordinaten spiegeln" + +#~ msgid "Mirror Y" +#~ msgstr "Y-Koordinaten spiegeln" + +#~ msgid "Generating solution..." +#~ msgstr "Lösungen erzeugen..." + +#~ msgid "Generating C# project..." +#~ msgstr "C#-Projekt erzeugen..." + +#~ msgid "Failed to create solution." +#~ msgstr "Fehler beim Erzeugen einer Lösung." + +#~ msgid "Failed to save solution." +#~ msgstr "Fehler beim Speichern der Lösung." + +#~ msgid "Done" +#~ msgstr "Fertig" + +#~ msgid "Failed to create C# project." +#~ msgstr "C#-Projekt-Erzeugen fehlgeschlagen." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "Über die C#-Unterstützung" + +#~ msgid "Create C# solution" +#~ msgstr "Erzeuge C#-Lösung" + +#~ msgid "Builds" +#~ msgstr "Fertigstellungen" + +#~ msgid "Build Project" +#~ msgstr "Projekt bauen" + +#~ msgid "View log" +#~ msgstr "Log anschauen" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "Ein WorldEnvironment benötigt eine Environment-Ressource." + #~ msgid "Enabled Classes" #~ msgstr "Aktivierte Klassen" diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po index 432f1cb11d..9b3fdf7b02 100644 --- a/editor/translations/de_CH.po +++ b/editor/translations/de_CH.po @@ -134,6 +134,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp #, fuzzy msgid "Change Animation Length" msgstr "Typ ändern" @@ -641,6 +661,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -690,7 +714,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -799,6 +823,11 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Script hinzufügen" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -962,7 +991,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1142,7 +1171,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1507,6 +1535,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1696,7 +1728,7 @@ msgstr "Datei öffnen" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1747,7 +1779,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1773,12 +1805,12 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Node(s) löschen" +msgid "Go to previous folder." +msgstr "Node erstellen" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" +msgid "Go to next folder." msgstr "Node erstellen" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp @@ -1786,12 +1818,16 @@ msgstr "Node erstellen" msgid "Go to parent folder." msgstr "Node erstellen" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2490,6 +2526,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Script hinzufügen" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2687,14 +2728,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3016,6 +3049,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Node Filter editieren" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3643,6 +3681,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" msgstr "Node erstellen" @@ -4727,6 +4766,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4755,7 +4798,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4769,7 +4811,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4844,36 +4886,39 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "" +#, fuzzy +msgid "Move Vertical Guide" +msgstr "Ungültige Bilder löschen" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "Neues Projekt erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "Ungültige Bilder löschen" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "" +#, fuzzy +msgid "Move Horizontal Guide" +msgstr "Ungültige Bilder löschen" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "Neues Projekt erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "Ungültige Bilder löschen" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" +msgstr "Neues Projekt erstellen" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6494,10 +6539,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Bild einfügen" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6794,7 +6848,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6983,10 +7041,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7570,14 +7624,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8006,6 +8052,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8092,6 +8142,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8099,10 +8165,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8191,7 +8291,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8199,7 +8299,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8211,7 +8311,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8228,7 +8328,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8297,11 +8397,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8317,7 +8417,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8345,11 +8445,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8389,11 +8489,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8403,7 +8507,7 @@ msgstr "Transformationstyp" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8421,15 +8525,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8480,7 +8584,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8508,12 +8612,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8590,47 +8694,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9824,6 +9928,11 @@ msgid "Extend Script" msgstr "Script hinzufügen" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Node erstellen" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -10039,7 +10148,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10098,7 +10207,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10506,56 +10615,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "Projektname:" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Datei(en) öffnen" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11160,8 +11219,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Damit AnimatedSprite Frames anzeigen kann, muss eine SpriteFrame Resource " @@ -11215,7 +11275,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11227,7 +11287,8 @@ msgstr "" "Okkluder funktioniert." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" "Das Okkluder Polygon für diesen Okkluder ist leer. Bitte zeichne ein Polygon!" @@ -11315,14 +11376,14 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp #, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D funktioniert am besten, wenn es ein Unterobjekt erster " "Ordnung der bearbeiteten Hauptszene ist." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11401,7 +11462,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11430,6 +11491,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11467,8 +11532,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11480,7 +11545,9 @@ msgstr "" #: scene/3d/remote_transform.cpp #, fuzzy -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "Die Pfad-Variable muss auf einen gültigen Particles2D Node verweisen." #: scene/3d/soft_body.cpp @@ -11495,10 +11562,13 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" +"Damit AnimatedSprite Frames anzeigen kann, muss eine SpriteFrame Resource " +"unter der 'Frames' Property erstellt oder gesetzt sein." #: scene/3d/vehicle_body.cpp msgid "" @@ -11507,7 +11577,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11543,7 +11615,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11555,7 +11627,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11586,8 +11658,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11607,18 +11678,18 @@ msgstr "Bitte bestätigen..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11662,9 +11733,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11682,6 +11761,22 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Node(s) löschen" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Node erstellen" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "Projektname:" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Datei(en) öffnen" + +#, fuzzy #~ msgid "Raw Mode" #~ msgstr "Node erstellen" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 76823f1227..d239d252ac 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -121,6 +121,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -604,6 +624,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -653,7 +677,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -756,6 +780,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -914,7 +942,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1090,7 +1118,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1449,6 +1476,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1619,7 +1650,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1670,7 +1701,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1695,23 +1726,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2386,6 +2421,10 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2577,14 +2616,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2898,6 +2929,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3493,6 +3528,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4518,6 +4554,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4546,7 +4586,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4560,7 +4599,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4635,31 +4674,31 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6218,10 +6257,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6507,7 +6554,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6692,10 +6743,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7256,14 +7303,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7641,6 +7680,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7725,6 +7768,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7732,10 +7791,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7824,7 +7917,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7832,7 +7925,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7844,7 +7937,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7861,7 +7954,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7930,11 +8023,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7950,7 +8043,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7978,11 +8071,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8022,11 +8115,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8035,7 +8132,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8053,15 +8150,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8110,7 +8207,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8138,12 +8235,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8220,47 +8317,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9411,6 +9508,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9613,7 +9714,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9668,7 +9769,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10068,54 +10169,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10692,7 +10745,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10741,7 +10794,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10751,7 +10804,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10827,12 +10880,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10911,7 +10964,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10940,6 +10993,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -10974,8 +11031,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -10986,7 +11043,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11002,7 +11061,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11013,7 +11072,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11048,7 +11109,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11060,7 +11121,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11091,8 +11152,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11112,18 +11172,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11166,9 +11226,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 2e76f4cd6a..e0be979450 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:48+0000\n" +"PO-Revision-Date: 2019-07-15 13:10+0000\n" "Last-Translator: George Tsiamasiotis <gtsiam@windowslive.com>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" @@ -131,6 +131,31 @@ msgid "Anim Change Call" msgstr "Anim Αλλαγή κλήσης" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Αλλαγή χÏόνου στιγμιοτÏπου" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Αλλαγή μετάβασης" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Αλλαγή μετασχηματισμοÏ" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Αλλαγή τιμής στιγμιοτÏπου" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Αλλαγή κλήσης" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Αλλαγή Μήκους Κίνησης" @@ -455,9 +480,8 @@ msgid "Select All" msgstr "Επιλογή όλων" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "Επιλογή κόμβου" +msgstr "Αποεπιλογή Όλων" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -633,6 +657,10 @@ msgstr "Πήγαινε σε γÏαμμή" msgid "Line Number:" msgstr "ΑÏ. γÏαμμής:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Î’ÏÎθηκαν %d αποτελÎσματα." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Δεν υπάÏχουν αντιστοιχίες" @@ -682,7 +710,7 @@ msgstr "ΣμÏκÏινση" msgid "Reset Zoom" msgstr "ΕπαναφοÏά μεγÎθυνσης" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Î Ïοειδοποιήσεις" @@ -789,6 +817,10 @@ msgid "Connect" msgstr "ΣÏνδεση" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Σήμα:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "ΣÏνδεση του '%s' στο '%s'" @@ -953,8 +985,8 @@ msgid "Owners Of:" msgstr "Ιδιοκτήτες του:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "Îα αφαιÏεθοÏν τα επιλεγμÎνα αÏχεία από το ÎÏγο; (ΑδÏνατη η αναίÏεση)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "ΑφαίÏεση επιλεγμÎνων αÏχείων από το ÎÏγο; (Αδυναμία αναίÏεσης)" #: editor/dependency_editor.cpp msgid "" @@ -1136,7 +1168,6 @@ msgid "Success!" msgstr "Επιτυχία!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Εγκατάσταση" @@ -1324,7 +1355,6 @@ msgid "Must not collide with an existing engine class name." msgstr "Δεν μποÏεί να συγχÎεται με υπαÏκτό όνομα κλάσης της μηχανής." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "Δεν μποÏεί να συγχÎεται με υπαÏκτό ενσωματωμÎνο όνομα Ï„Ïπου." @@ -1505,6 +1535,11 @@ msgstr "Δεν βÏÎθηκε Ï€ÏοσαÏμοσμÎνο πακÎτο παÏαγ msgid "Template file not found:" msgstr "Δεν βÏÎθηκε αÏχείο Ï€ÏοτÏπου:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"Σε εξαγωγÎÏ‚ 32-bit, το ενσωματωμÎνο PCK δεν μποÏεί να υπεÏβαίνει τα 4 GiB." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "3D ΕπεξεÏγαστής" @@ -1530,9 +1565,8 @@ msgid "Node Dock" msgstr "ΠλατφόÏμα Κόμβου" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "ΠλατφόÏμα Συστήματος ΑÏχείων" +msgstr "ΠλατφόÏμες Συστήματος ΑÏχείων και Εισαγωγής" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1583,12 +1617,11 @@ msgid "File '%s' format is invalid, import aborted." msgstr "ΆκυÏη μοÏφή αÏχείου «%s», ακÏÏωση εισαγωγής." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"ΥπαÏκτό Ï€Ïοφίλ «%s». ΑφαιÏÎστε το Ï€Ïιν την εισαγωγή, ακÏÏωση εισαγωγής." +"ΥπαÏκτό Ï€Ïοφίλ «%s». ΑφαιÏÎστε το Ï€Ïιν την εισαγωγή. Ματαίωση εισαγωγής." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." @@ -1599,9 +1632,8 @@ msgid "Unset" msgstr "ΚατάÏγηση" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "ΤÏÎχων Î Ïοφίλ" +msgstr "ΤÏÎχων Î Ïοφίλ:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1623,9 +1655,8 @@ msgid "Export" msgstr "Εξαγωγή" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "ΔιαθÎσιμα Î Ïοφίλ" +msgstr "ΔιαθÎσιμα Î Ïοφίλ:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1680,7 +1711,7 @@ msgstr "Εμφάνιση στη διαχείÏιση αÏχείων" msgid "New Folder..." msgstr "ÎÎος φάκελος..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Αναναίωση" @@ -1731,7 +1762,7 @@ msgstr "Πήγαινε μπÏοστά" msgid "Go Up" msgstr "Πήγαινε πάνω" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Εναλλαγή κÏυμμÎνων αÏχείων" @@ -1756,23 +1787,31 @@ msgid "Move Favorite Down" msgstr "Μετακίνηση αγαπημÎνου κάτω" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Î ÏοηγοÏμενος φάκελος" +#, fuzzy +msgid "Go to previous folder." +msgstr "Πήγαινε στον γονικό φάκελο." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Επόμενος φάκελος" +#, fuzzy +msgid "Go to next folder." +msgstr "Πήγαινε στον γονικό φάκελο." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Πήγαινε στον γονικό φάκελο." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Αναζήτηση αÏχείων" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Εναλλαγή αγαπημÎνου Ï„ÏÎχοντος φακÎλου." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Εναλλαγή οÏατότητας κÏυμÎνων αÏχείων." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2515,6 +2554,11 @@ msgid "Go to previously opened scene." msgstr "ΕπιστÏοφή στην Ï€ÏοηγουμÎνως ανοιγμÎνη σκηνή." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "ΑντιγÏαφή διαδÏομής" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Επόμενη καÏÏ„Îλα" @@ -2718,32 +2762,22 @@ msgid "Editor Layout" msgstr "Διάταξη επεξεÏγαστή" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Βγάζει νόημα!" +msgstr "Λήψη Στιγμιότυπου Οθόνης" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Άνοιγμα φακÎλου δεδομÎνων/Ïυθμίσεων επεξεÏγαστή" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Άνοιγμα του επόμενου επεξεÏγαστή" +"Τα στιγμιότυπα οθόνης αποθηκεÏονται στον φάκελο δεδομÎνων/Ïυθμίσεων του " +"επεξεÏγαστή." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Εναλλαγή πλήÏους οθόνης" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Εναλλαγή οÏατότητας CanvasItem" +msgstr "Εναλλαγή Κονσόλας Συστήματος" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2852,19 +2886,16 @@ msgid "Spins when the editor window redraws." msgstr "ΠεÏιστÏÎφεται όταν το παÏάθυÏο του επεξεÏγαστή επαναχÏωματίζεται." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Συνεχόμενη" +msgstr "Συνεχόμενη ΑνανÎωση" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "ΕνημÎÏωση αλλαγών" +msgstr "ΑνανÎωση στην Αλλαγή" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "ΑπενεÏγοποίηση δείκτη ενημÎÏωσης" +msgstr "ΑπόκÏυψη Δείκτη ΕνημÎÏωσης" #: editor/editor_node.cpp msgid "FileSystem" @@ -3062,6 +3093,11 @@ msgid "Calls" msgstr "Κλήσεις" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "ΕπεξεÏγασία ΘÎματος" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Îαι" @@ -3682,6 +3718,7 @@ msgid "Nodes not in Group" msgstr "Κόμβοι εκτός ομάδας" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "ΦιλτÏάÏισμα κόμβων" @@ -4730,6 +4767,11 @@ msgid "Idle" msgstr "ΑνενεÏγό" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Εγκατάσταση" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Ξαναδοκίμασε" @@ -4758,7 +4800,6 @@ msgid "Last" msgstr "Τελευταίο" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Όλα" @@ -4772,8 +4813,9 @@ msgid "Sort:" msgstr "Ταξινόμηση:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "ΑντιστÏοφή" +#, fuzzy +msgid "Reverse sorting." +msgstr "Γίνεται αίτημα..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4855,31 +4897,38 @@ msgid "Rotation Step:" msgstr "Βήμα πεÏιστÏοφής:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Μετακίνηση κάθετου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "ΔημιουÏγία νÎου κάθετου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "ΑφαίÏεση κάθετου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Μετακίνηση οÏιζόντιου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "ΔημιουÏγία νÎου οÏιζόντιου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "ΑφαίÏεση οÏιζόντιου οδηγοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "ΔημιουÏγία νÎων οÏιζοντίων και κάθετων οδηγών" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5312,9 +5361,8 @@ msgstr "ΦόÏτωση μάσκας εκπομπής" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Επανεκκίνηση τώÏα" +msgstr "Επανεκκίνηση" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6229,18 +6277,16 @@ msgid "Find Next" msgstr "ΕÏÏεση επόμενου" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "ΦιλτÏάÏισμα ιδιοτήτων" +msgstr "ΦιλτÏάÏισμα δεσμών ενεÏγειών" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Εναλλαγή αλφαβητικής ταξινόμησης λίστας μεθόδων." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "ΛειτουÏγία φιλτÏαÏίσματος:" +msgstr "ΦιλτÏάÏισμα μεθόδων" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6474,10 +6520,18 @@ msgid "Syntax Highlighter" msgstr "Επισημαντής ΣÏνταξης" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Πήγαινε Σε" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "ΑγαπημÎνα" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Σημεία Διακοπής" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6767,9 +6821,15 @@ msgid "Rear" msgstr "Πίσω" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Στοίχιση με Î Ïοβολή" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Στοίχηση επιλογής με την Ï€Ïοβολή" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" @@ -6959,10 +7019,6 @@ msgid "Focus Selection" msgstr "Εστίαση στην επιλογή" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Στοίχηση επιλογής με την Ï€Ïοβολή" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "ΕÏγαλείο επιλογής" @@ -7523,14 +7579,6 @@ msgid "Transpose" msgstr "Μετατόπιση" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "ΣυμμετÏία στον άξονα Χ" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "ΣυμμετÏία στον άξονα Î¥" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "ΑπενεÏγοποίηση Αυτόματων Πλακιδίων" @@ -7927,6 +7975,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Αλλαγή ΤÏπου Εισόδου ÎŸÏ€Ï„Î¹ÎºÎ¿Ï Î ÏογÏάμματος Σκίασης" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "ΚοÏυφή" @@ -8011,6 +8063,23 @@ msgid "Color uniform." msgstr "Ενιαία μεταβλητή χÏώματος." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "ΕπιστÏÎφει το αντίστÏοφο της τετÏαγωνικής Ïίζας της παÏαμÎÏ„Ïου." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8020,11 +8089,46 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" "ΕπιστÏÎφει Îνα συσχετισμÎνο διάνυσμα εάν η λογική τιμή είναι αληθής ή ψευδής." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "ΕπιστÏÎφει την εφαπτομÎνη της παÏαμÎÏ„Ïου." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "Λογική σταθεÏά." @@ -8033,43 +8137,36 @@ msgid "Boolean uniform." msgstr "Λογική ενιαία μεταβλητή." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for all shader modes." -msgstr "ΠαÏάμετÏος εισόδου «uv» για όλες τις λειτουÏγίες σκίασης." +msgstr "ΠαÏάμετÏος εισόδου «%s» για όλες τις λειτουÏγίες σκίασης." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." msgstr "ΠαÏάμετÏος εισόδου." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "ΠαÏάμετÏος εισόδου «uv» για σκίαση κοÏυφής και τμήματος." +msgstr "ΠαÏάμετÏος εισόδου «%s» για σκίαση κοÏυφής και τμήματος." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." -msgstr "ΠαÏάμετÏος εισόδου «view» για σκίαση τμήματος και φωτός." +msgstr "ΠαÏάμετÏος εισόδου «%s» για σκίαση τμήματος και φωτός." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "ΠαÏάμετÏος εισόδου «side» για σκίαση τμήματος." +msgstr "ΠαÏάμετÏος εισόδου «%s» για σκίαση τμήματος." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "ΠαÏάμετÏος εισόδου «diffuse» για σκίαση φωτός." +msgstr "ΠαÏάμετÏος εισόδου «%s» για σκίαση φωτός." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "ΠαÏάμετÏος εισόδου «custom» για σκίαση κοÏυφής." +msgstr "ΠαÏάμετÏος εισόδου «%s» για σκίαση κοÏυφής." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "ΠαÏάμετÏος εισόδου «uv» για σκίαση κοÏυφής και τμήματος." +msgstr "ΠαÏάμετÏος εισόδου «%s» για σκίαση κοÏυφής και τμήματος." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -8120,7 +8217,8 @@ msgid "Returns the arc-cosine of the parameter." msgstr "ΕπιστÏÎφει το τόξο συνημιτόνου της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" "(Μόνο GLES3) ΕπιστÏÎφει το αντίστÏοφο υπεÏβολικό συνημίτονο της παÏαμÎÏ„Ïου." @@ -8129,7 +8227,8 @@ msgid "Returns the arc-sine of the parameter." msgstr "ΕπιστÏÎφει το τόξο ημιτόνου της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" "(Μόνο GLES3) ΕπιστÏÎφει το αντίστÏοφο υπεÏβολικό ημίτονο της παÏαμÎÏ„Ïου." @@ -8142,7 +8241,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "ΕπιστÏÎφει το τόξο εφαπτομÎνης των παÏαμÎÏ„Ïων." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +#, fuzzy +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" "(Μόνο GLES3) ΕπιστÏÎφει την αντίστÏοφη υπεÏβολική εφαπτομÎνη της παÏαμÎÏ„Ïου." @@ -8160,7 +8260,8 @@ msgid "Returns the cosine of the parameter." msgstr "ΕπιστÏÎφει το συνημίτονο της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +#, fuzzy +msgid "Returns the hyperbolic cosine of the parameter." msgstr "(Μόνο GLES3) ΕπιστÏÎφει το υπεÏβολικό συνημίτονο της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8230,11 +8331,13 @@ msgid "1.0 / scalar" msgstr "1.0 / βαθμωτό μÎγεθος" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +#, fuzzy +msgid "Finds the nearest integer to the parameter." msgstr "(Μόνο GLES3) Î’Ïίσκει τον κοντινότεÏο ακÎÏαιο στην παÏάμετÏο." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +#, fuzzy +msgid "Finds the nearest even integer to the parameter." msgstr "(Μόνο GLES3) Î’Ïίσκει τον κοντινότεÏο άÏτιο ακÎÏαιο στην παÏάμετÏο." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8250,7 +8353,8 @@ msgid "Returns the sine of the parameter." msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +#, fuzzy +msgid "Returns the hyperbolic sine of the parameter." msgstr "(Μόνο GLES3) ΕπιστÏÎφει το υπεÏβολικό ημίτονο της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8268,7 +8372,7 @@ msgstr "" "ΣυνάÏτηση SmoothStep( βαθμωτό(ÏŒÏιο0), βαθμωτό(ÏŒÏιο1), βαθμωτό(x) ).\n" "\n" "ΕπιστÏÎφει 0.0 αν x < ÏŒÏιο0 και 1.0 αν x > ÏŒÏιο1. Αλλιώς επιστÏÎφει μια " -"παÏεμβεβλημÎνη τιμή ανάμεσα στο 0.0 και το 1.0 χÏησιμοποιώντας πολυώνυμα " +"παÏεμβλημÎνη τιμή ανάμεσα στο 0.0 και το 1.0 χÏησιμοποιώντας πολυώνυμα " "Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8286,11 +8390,13 @@ msgid "Returns the tangent of the parameter." msgstr "ΕπιστÏÎφει την εφαπτομÎνη της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +#, fuzzy +msgid "Returns the hyperbolic tangent of the parameter." msgstr "(Μόνο GLES3) ΕπιστÏÎφει την υπεÏβολική εφαπτομÎνη της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +#, fuzzy +msgid "Finds the truncated value of the parameter." msgstr "(Μόνο GLES3) Î’Ïίσκει την πεÏικομμÎνη τιμή της παÏαμÎÏ„Ïου." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8330,11 +8436,18 @@ msgid "Perform the texture lookup." msgstr "ΕκτÎλεση αντιστοιχίας υφής." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +#, fuzzy +msgid "Cubic texture uniform lookup." msgstr "Ενιαία μεταβλητή κυβικής υφής." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +#, fuzzy +msgid "2D texture uniform lookup." +msgstr "Ενιαία μεταβλητή 2D υφής." + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup with triplanar." msgstr "Ενιαία μεταβλητή 2D υφής." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8342,8 +8455,9 @@ msgid "Transform function." msgstr "ΣυνάÏτηση μετασχηματισμοÏ." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8351,112 +8465,127 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" +"(Μόνο GLES3) Υπολογισμός Ï„Î±Î½Ï…ÏƒÏ„Î¹ÎºÎ¿Ï Î³Î¹Î½Î¿Î¼Îνου δÏο διανυσμάτων.\n" +"\n" +"Το OuterProduct αντιμετωπίζει την Ï€Ïώτη παÏάμετÏο «c» σαν διάνυσμα στήλης " +"και την δεÏτεÏη παÏάμετÏο «r» σαν διάνυσμα γÏαμμής και κάνει τον αλγεβÏικό " +"πολλαπλασιασμό πινάκων «c * r», παÏάγοντας Îναν πίνακα με στήλες όσα και τα " +"στοιχεία του «c», και γÏαμμÎÏ‚ όσα και τα στοιχεία του «r»." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." -msgstr "" +msgstr "ΣυνθÎτει μετασχηματισμό από Ï„ÎσσεÏα διανÏσματα." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes transform to four vectors." -msgstr "" +msgstr "ΑποσυνθÎτει μετασχηματισμό σε Ï„ÎσσεÏα διανÏσματα." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "" +#, fuzzy +msgid "Calculates the determinant of a transform." +msgstr "(Μόνο GLES3) Υπολογίζει την οÏίζουσα ενός μετασχηματισμοÏ." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "" +#, fuzzy +msgid "Calculates the inverse of a transform." +msgstr "(Μόνο GLES3) Υπολογίζει το αντίστÏοφο ενός μετασχηματισμοÏ." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "" +#, fuzzy +msgid "Calculates the transpose of a transform." +msgstr "(Μόνο GLES3) Υπολογίζει το ανάστÏοφο ενός μετασχηματισμοÏ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." -msgstr "" +msgstr "Πολ/σμός δÏο μετασχηματισμών." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by transform." -msgstr "" +msgstr "Πολ/σμός διανÏσματος με μετασχηματισμό." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "Ο μετασχηματισμός ματαιώθηκε." +msgstr "ΣταθεÏά μετασχηματισμοÏ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "Ο μετασχηματισμός ματαιώθηκε." +msgstr "Ενιαία μεταβλητή μετασχηματισμοÏ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Πήγαινε σε συνάÏτηση..." +msgstr "ΣυνάÏτηση διανÏσματος." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector operator." -msgstr "Αλλαγή Î´Î¹Î±Î½Ï…ÏƒÎ¼Î±Ï„Î¹ÎºÎ¿Ï Ï„ÎµÎ»ÎµÏƒÏ„Î®" +msgstr "Τελεστής διανÏσματος." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." -msgstr "" +msgstr "ΣυνθÎτει διάνυσμα από 3 βαθμωτά μεγÎθη." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes vector to three scalars." -msgstr "" +msgstr "ΑποσυνθÎτει διάνυσμα σε 3 βαθμωτά μεγÎθη." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "" +msgstr "Υπολογίζει το εξωτεÏικό γινόμενο 2 διανυσμάτων." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "" +msgstr "ΕπιστÏÎφει την απόσταση 2 σημείων." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." -msgstr "" +msgstr "Υπολογίζει το εσωτεÏικό γινόμενο 2 διανυσμάτων." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" +"ΕπιστÏÎφει Îνα διάνυσμα ίδιας κατεÏθυνσης με Îνα διάνυσμα αναφοÏάς. Η " +"συνάÏτηση Îχει 3 διανυσματικÎÏ‚ παÏαμÎÏ„Ïους: N, το διάνυσμα για " +"ανακατεÏθυνση, I, το διάνυσμα συμβάτος, και Nref, το διάνυσμα αναφοÏάς. Αν " +"το εσωτεÏικό γινόμενο των I και Nref εναι αÏνητικό, επιστÏÎφει N, αλλιώς " +"επιστÏÎφει -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." -msgstr "" +msgstr "Υπολογίζει το μήκος ενός διανÏσματος." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors." -msgstr "" +msgstr "ΓÏαμμική παÏεμβολή Î¼ÎµÏ„Î±Î¾Ï 2 διανυσμάτων." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." -msgstr "" +msgstr "Κανονικοποιεί Îνα διάνυσμα." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - vector" -msgstr "" +msgstr "1.0 - διάνυσμα" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / vector" -msgstr "" +msgstr "1.0 / διάνυσμα" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" +"ΕπιστÏÎφει Îνα διάνυσμα που δείχνει Ï€Ïος την κατεÏθυνση αντανάκλασης ( a : " +"διάνυσμα συμβάντος, b : κανονικό διάνυσμα )." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." -msgstr "" +#, fuzzy +msgid "Returns the vector that points in the direction of refraction." +msgstr "ΕπιστÏÎφει Îνα διάνυσμα που δείχνει Ï€Ïος την κατεÏθυνση διάθλασης." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8466,6 +8595,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"ΣυνάÏτηση SmoothStep( διάνυσμα(ÏŒÏιο0), διάνυσμα(ÏŒÏιο1), διάνυσμα(x) ).\n" +"\n" +"ΕπιστÏÎφει 0.0 αν x < ÏŒÏιο0 και 1.0 αν x > ÏŒÏιο1. Αλλιώς επιστÏÎφει μια " +"παÏεμβλημÎνη τιμή ανάμεσα στο 0.0 και το 1.0 χÏησιμοποιώντας πολυώνυμα " +"Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8475,6 +8609,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"ΣυνάÏτηση SmoothStep( βαθμωτό(ÏŒÏιο0), βαθμωτό(ÏŒÏιο1), διάνυσμα(x) ).\n" +"\n" +"ΕπιστÏÎφει 0.0 αν x < ÏŒÏιο0 και 1.0 αν x > ÏŒÏιο1. Αλλιώς επιστÏÎφει μια " +"παÏεμβλημÎνη τιμή ανάμεσα στο 0.0 και το 1.0 χÏησιμοποιώντας πολυώνυμα " +"Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8482,6 +8621,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"ΣυνάÏτηση Step( διάνυσμα(ÏŒÏιο), διάνυσμα(x) ).\n" +"\n" +"ΕπιστÏÎφει 0.0 αν x < ÏŒÏιο αλλιώς 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8489,36 +8631,37 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"ΣυνάÏτηση Step( βαθμωτό(ÏŒÏιο), διάνυσμα(x) ).\n" +"\n" +"ΕπιστÏÎφει 0.0 αν x < ÏŒÏιο αλλιώς 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." -msgstr "" +msgstr "Î ÏοσθÎτει 2 διανÏσματα." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "" +msgstr "ΔιαιÏεί 2 διανÏσματα." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." -msgstr "" +msgstr "Πολλαπλασιάζει 2 διανÏσματα." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two vectors." -msgstr "" +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts vector from vector." -msgstr "" +msgstr "ΑφαίÏεση 2 διανυσμάτων." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector constant." -msgstr "Αλλαγή διανυσματικής σταθεÏάς" +msgstr "Διανυσματική σταθεÏά." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "Αλλαγή διανυσματικής ομοιόμοÏφης μεταβλητής" +msgstr "Διανυσματικής ενιαία μεταβλητή." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8526,70 +8669,93 @@ msgid "" "output ports. This is a direct injection of code into the vertex/fragment/" "light function, do not use it to write the function declarations inside." msgstr "" +"Î ÏοσαÏμοσμÎνη ÎκφÏαση γλώσσας σκίασης της Godot, με Ï€ÏοσαÏμοσμÎνο αÏιθμό " +"εισόδων και εξόδων. Αυτό είναι μία άμεση παÏεμβολή κώδικα στην συνάÏτηση " +"κοÏυφής/τμήματος/φωτός, μην γÏάψετε μÎσα οÏισμοÏÏ‚ συναÏτήσεων." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns falloff based on the dot product of surface normal and view " "direction of camera (pass associated inputs to it)." msgstr "" +"ΕπιστÏÎφει μείωση βάση του εσωτεÏÎ¹ÎºÎ¿Ï Î³Î¹Î½Î¿Î¼Îνου του διανÏσματος επιφάνειας " +"και της κατεÏθυνσης της κάμεÏας (δώστε τις σχετικÎÏ‚ εισόδους)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "" +#, fuzzy +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) Βαθμωτή παÏάγωγη συνάÏτηση." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "" +#, fuzzy +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) Διανυσματική παÏάγωγη συνάÏτηση." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" +"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΠαÏάγωγος στο «x» με " +"τοπική διαφόÏιση." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" +"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΠαÏάγωγος στο «x» με τοπική " +"διαφόÏιση." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" +"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΠαÏάγωγος στο «y» με " +"τοπική διαφόÏιση." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" +"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΠαÏάγωγος στο «y» με τοπική " +"διαφόÏιση." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Διανυσματικά) ΆθÏοισμα απόλυτης " +"παÏαγώγου σε «x» και «y»." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(Μόνο GLES3 σε σκίαση Τμήματος/Φωτός) (Βαθμωτά) ΆθÏοισμα απόλυτης παÏαγώγου " +"σε «x» και «y»." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" msgstr "Οπτικό Î ÏόγÏαμμα Σκίασης" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property" -msgstr "ΕπεξεÏγασία φίλτÏων" +msgstr "ΕπεξεÏγασία Οπτικής Ιδιότητας" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Visual Shader Mode Changed" -msgstr "ΑλλαγÎÏ‚ Ï€ÏογÏάμματος σκίασης" +msgstr "Αλλαγή ΛειτουÏγίας ÎŸÏ€Ï„Î¹ÎºÎ¿Ï Î ÏογÏάμματος Σκίασης" #: editor/project_export.cpp msgid "Runnable" @@ -8608,6 +8774,8 @@ msgid "" "Failed to export the project for platform '%s'.\n" "Export templates seem to be missing or invalid." msgstr "" +"Αποτυχία εξαγωγής ÎÏγου στην πλατφόÏμα «%s».\n" +"Τα Ï€Ïότυπα εξαγωγής λείπουν ή είναι άκυÏα." #: editor/project_export.cpp msgid "" @@ -8615,21 +8783,21 @@ msgid "" "This might be due to a configuration issue in the export preset or your " "export settings." msgstr "" +"Αποτυχία εξαγωγής ÎÏγου στην πλατφόÏμα «%s».\n" +"Αυτό μποÏεί να οφείλεται σε λάθος της διαμόÏφωσης εξαγωγής ή στις Ïυθμίσεις " +"εξαγωγής σας." #: editor/project_export.cpp -#, fuzzy msgid "Release" -msgstr "μόλις απελευθεÏώθηκε" +msgstr "ΚυκλοφοÏία" #: editor/project_export.cpp -#, fuzzy msgid "Exporting All" -msgstr "Εξαγωγή για %s" +msgstr "Εξαγωγή Όλων" #: editor/project_export.cpp -#, fuzzy msgid "The given export path doesn't exist:" -msgstr "Η διαδÏομή δεν υπάÏχει." +msgstr "Η δεδομÎνη διαδÏομή εξαγωγής δεν υπάÏχει:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" @@ -8645,9 +8813,8 @@ msgid "Add..." msgstr "Î Ïοσθήκη..." #: editor/project_export.cpp -#, fuzzy msgid "Export Path" -msgstr "Εξαγωγή ÎÏγου" +msgstr "ΔιαδÏομή Εξαγωγής" #: editor/project_export.cpp msgid "Resources" @@ -8708,50 +8875,44 @@ msgid "Feature List:" msgstr "Λίστα δυνατοτήτων:" #: editor/project_export.cpp -#, fuzzy msgid "Script" -msgstr "Îεα δεσμή ενεÏγειών" +msgstr "ΔÎσμες ΕνεÏγειών" #: editor/project_export.cpp -#, fuzzy msgid "Script Export Mode:" -msgstr "ΛειτουÏγία εξαγωγής:" +msgstr "ΛειτουÏγία Εξαγωγής Δεσμών ΕνεÏγειών:" #: editor/project_export.cpp -#, fuzzy msgid "Text" -msgstr "Υφή" +msgstr "Κείμενο" #: editor/project_export.cpp -#, fuzzy msgid "Compiled" -msgstr "Συμπίεση" +msgstr "ΜεταγλωτισμÎνες" #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" -msgstr "" +msgstr "ΚÏυπτογÏαφημÎνες (Δώστε Κλειδί ΠαÏακάτω)" #: editor/project_export.cpp msgid "Invalid Encryption Key (must be 64 characters long)" -msgstr "" +msgstr "ΆκυÏο Κλειδί ΚÏυπτογÏάφησης (Ï€ÏÎπει να Îχει 64 χαÏακτήÏες)" #: editor/project_export.cpp msgid "Script Encryption Key (256-bits as hex):" -msgstr "" +msgstr "Κλειδί ΚÏυπτογÏάφησης Δεσμών ΕνεÏγειών (256-bit σε δεκαεξαδικό):" #: editor/project_export.cpp msgid "Export PCK/Zip" msgstr "Εξαγωγή PCK/ZIP" #: editor/project_export.cpp -#, fuzzy msgid "Export mode?" -msgstr "ΛειτουÏγία εξαγωγής:" +msgstr "ΛειτουÏγία εξαγωγής;" #: editor/project_export.cpp -#, fuzzy msgid "Export All" -msgstr "Εξαγωγή" +msgstr "Εξαγωγή Όλων" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" @@ -8766,23 +8927,20 @@ msgid "The path does not exist." msgstr "Η διαδÏομή δεν υπάÏχει." #: editor/project_manager.cpp -#, fuzzy msgid "Invalid '.zip' project file, does not contain a 'project.godot' file." -msgstr "" -"ΠαÏακαλοÏμε επιλÎξτε Îναν φάκελο που δεν πεÏιÎχει Îνα αÏχείο 'project.godot'." +msgstr "ΆκυÏο αÏχείο ÎÏγου «.zip», δεν πεÏιÎχει αÏχείο «project.godot»." #: editor/project_manager.cpp msgid "Please choose an empty folder." msgstr "ΠαÏακαλοÏμε επιλÎξτε Îναν άδειο φάκελο." #: editor/project_manager.cpp -#, fuzzy msgid "Please choose a 'project.godot' or '.zip' file." -msgstr "ΠαÏακαλοÏμε επιλÎκτε Îνα αÏχείο 'project.godot'." +msgstr "ΠαÏακαλοÏμε επιλÎξτε Îνα αÏχείο «project.godot» ή «.zip»." #: editor/project_manager.cpp msgid "Directory already contains a Godot project." -msgstr "" +msgstr "Ο κατάλογος πεÏιÎχει ήδη Îνα ÎÏγο της Godot." #: editor/project_manager.cpp msgid "New Game Project" @@ -8870,17 +9028,16 @@ msgid "Project Path:" msgstr "ΔιαδÏομή ÎÏγου:" #: editor/project_manager.cpp -#, fuzzy msgid "Project Installation Path:" -msgstr "ΔιαδÏομή ÎÏγου:" +msgstr "ΔιαδÏομή Εγκατάστασης ΕÏγου:" #: editor/project_manager.cpp msgid "Renderer:" -msgstr "" +msgstr "ΜÎθοδος Απόδοσης:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" -msgstr "" +msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "" @@ -8889,10 +9046,14 @@ msgid "" "Incompatible with older hardware\n" "Not recommended for web games" msgstr "" +"ΥψηλότεÏη οπτική ποιότητα\n" +"Διάθεση όλων των δυνατοτήτων\n" +"Μη-συμβατό με παλαιότεÏο υλικό\n" +"Δεν Ï€Ïοτείνεται για διαδικτυακά παιχνίδια" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" -msgstr "" +msgstr "OpenGL ES 2.0" #: editor/project_manager.cpp msgid "" @@ -8901,19 +9062,24 @@ msgid "" "Works on most hardware\n" "Recommended for web games" msgstr "" +"ΧαμηλότεÏη οπτική ποιότητα\n" +"ΜεÏική διάθεση δυνατοτήτων\n" +"ΔουλεÏει στο πεÏισσότεÏο υλικό\n" +"Î Ïοτείνεται για διαδικτυακά παιχνίδια" #: editor/project_manager.cpp msgid "Renderer can be changed later, but scenes may need to be adjusted." msgstr "" +"Η μÎθοδος απόδοσης μποÏεί να αλλάξει αÏγότεÏα, αλλά οι σκηνÎÏ‚ μποÏεί να " +"απαιτοÏν αναπÏοσαÏμογή." #: editor/project_manager.cpp msgid "Unnamed Project" msgstr "Ανώνυμο ÎÏγο" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project at '%s'." -msgstr "Δεν ήταν δυνατό το άνοιγμα του ÎÏγου" +msgstr "Αδυνατό το άνοιγμα του ÎÏγου στο «%s»." #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" @@ -8931,6 +9097,15 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" +"Το ακόλουθο αÏχείο Ïυθμίσεων ÎÏγου δεν οÏίζει την Îκδοση της Godot με την " +"οποία δημιουÏγήθηκε.\n" +"\n" +"%s\n" +"\n" +"Εάν συνεχίσετε με το άνοιγμα του, θα μετατÏαπεί στην Ï„ÏÎχουσα μοÏφή " +"Ïυθμίσεων της Godot.\n" +"Î Ïοσοχή: Δεν θα μποÏείτε να ανοίξετε το ÎÏγο με Ï€ÏοηγοÏμενες εκδόσεις της " +"μηχανής στο μÎλλον." #: editor/project_manager.cpp msgid "" @@ -8943,23 +9118,32 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" +"Το ακόλουθο αÏχείο Ïυθμίσεων ÎÏγου δημιουÏγήθηκε από παλαιότεÏη Îκδοση της " +"μηχανής, και Ï€ÏÎπει να μετατÏαπεί στην νÎα Îκδοση:\n" +"\n" +"%s\n" +"\n" +"ΘÎλετε να το μετατÏÎψετε;\n" +"Î Ïοσοχή: Δεν θα μποÏείτε να ανοίξετε το ÎÏγο με Ï€ÏοηγοÏμενες εκδόσεις της " +"μηχανής στο μÎλλον." #: editor/project_manager.cpp msgid "" "The project settings were created by a newer engine version, whose settings " "are not compatible with this version." msgstr "" +"Οι Ïυθμίσεις ÎÏγου δημιουÏγήθηκαν από μια νεότεÏη Îκδοση της μηχανής, που " +"δεν Îχει συμβατÎÏ‚ Ïυθμίσεις με αυτήν την Îκδοση." #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" -"Δεν είναι δυνατή η εκτÎλεση του ÎÏγου: Δεν Îχει καθοÏιστεί κÏÏια σκηνή.\n" -"ΠαÏακαλώ επεξεÏγαστείτε το ÎÏγο και οÏίστε την κÏÏια σκηνή στις «Ρυθμίσεις " -"ÎÏγου» κάτω από την κατηγοÏία «ΕφαÏμογή»." +"Αδυναμία εκτÎλεσης ÎÏγου: Δεν Îχει καθοÏιστεί κÏÏια σκηνή.\n" +"ΕπεξεÏγαστείτε το ÎÏγο και οÏίστε την κÏÏια σκηνή στις «Ρυθμίσεις ÎÏγου» " +"κάτω από την κατηγοÏία «Application»." #: editor/project_manager.cpp msgid "" @@ -8970,27 +9154,24 @@ msgstr "" "ΠαÏακαλώ επεξεÏγαστείτε το ÎÏγο για να γίνει η αÏχική εισαγωγή." #: editor/project_manager.cpp -#, fuzzy msgid "Are you sure to run %d projects at once?" -msgstr "Είστε σίγουÏοι πως θÎλετε να Ï„ÏÎξετε πεÏισσότεÏα από Îνα ÎÏγα;" +msgstr "Είστε σίγουÏοι πως θÎλετε να Ï„ÏÎξετε %d ÎÏγα ταυτόχÏονα;" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." msgstr "" -"ΑφαίÏεση ÎÏγου από την λίστα; (Τα πεÏιεχόμενα το φακÎλου δεν θα " -"Ï„ÏοποποιηθοÏν)" +"ΑφαίÏεση %d ÎÏγων από την λίστα;\n" +"Τα πεÏιεχόμενα των καταλόγων των ÎÏγων δεν θα Ï„ÏοποποιηθοÏν." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." msgstr "" -"ΑφαίÏεση ÎÏγου από την λίστα; (Τα πεÏιεχόμενα το φακÎλου δεν θα " -"Ï„ÏοποποιηθοÏν)" +"ΑφαίÏεση ÎÏγου από την λίστα;\n" +"Τα πεÏιεχόμενα του καταλόγου του ÎÏγου δεν θα Ï„ÏοποποιηθοÏν." #: editor/project_manager.cpp #, fuzzy @@ -9823,6 +10004,11 @@ msgstr "Άνοιγμα δεσμής ενεÏγειών" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "ΕπαναπÏοσδιοÏισμός γονÎα κόμβου" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Βγάζει νόημα!" @@ -10060,7 +10246,8 @@ msgid "Script is valid." msgstr "ΈγκυÏη δεσμή ενεÏγειών" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "ΕπιτÏεπόμενα: a-z, A-Z, 0-9 και _" #: editor/script_create_dialog.cpp @@ -10121,7 +10308,7 @@ msgstr "" "ΕπιλÎξτε Îνα ή πεÏισσότεÏα αντικείμενα από την λίστα για να εμφανιστεί το " "γÏάφημα." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Σφάλματα" @@ -10537,54 +10724,6 @@ msgstr "Επιλογή απόστασης:" msgid "Class name can't be a reserved keyword" msgstr "Το όνομα της κλάσης δεν μποÏεί να είναι λÎξη-κλειδί" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Επίλυση..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "ΔημιουÏγία ÎÏγου C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "ΑπÎτυχε η δημιουÏγία λÏσης." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "ΑπÎτυχε η αποθήκευση της λÏσης." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "ΤÎλος" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "ΑπÎτυχε η δημιουÏγία ÎÏγου C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Μονοφωνικό" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Σχετικά με την υποστήÏιξη C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "ΔημιουÏγία λÏσης C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Δόμηση" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Δόμηση ÎÏγου" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Î Ïοβολή αÏχείου καταγÏαφής" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "ΤÎλος ιχνηλάτησης στοίβας εσωτεÏικής εξαίÏεσης" @@ -11187,8 +11326,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "ΆκυÏες διαστάσεις εικόνας οθόνης εκκίνησης (Ï€ÏÎπει να είναι 620x300)." #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Ένας πόÏος SpriteFrames Ï€ÏÎπει να Îχει δημιουÏγηθεί ή οÏισθεί στην ιδιότητα " @@ -11256,8 +11396,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "Μία υφή με το σχήμα του φωτός Ï€ÏÎπει να δοθεί στην ιδιότητα 'texture'." @@ -11269,7 +11410,8 @@ msgstr "" "αυτό το εμπόδιο." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" "Το πολÏγωνο εμποδίου για αυτό το εμπόδιο είναι άδειο. ΖωγÏαφίστε Îνα " "πολÏγονο!" @@ -11364,15 +11506,17 @@ msgstr "" "να τους δώσετε Îνα σχήμα." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "Το VisibilityEnable2D δουλεÏει καλÏτεÏα όταν χÏησιμοποιείται μα την Ïίζα της " "επεξεÏγασμÎνης σκηνÎÏ‚ κατευθείαν ως γονÎας." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "Η ARVRCamera Ï€ÏÎπει να Îχει Îναν κόμβο ARVROrigin ως γονÎα" #: scene/3d/arvr_nodes.cpp @@ -11471,9 +11615,10 @@ msgstr "" "δώσετε Îνα σχήμα." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Ένα σχήμα Ï€ÏÎπει να δοθεί στο CollisionShape για να λειτουÏγήσει. " "ΔημιουÏγήστε Îνα πόÏο σχήματος για αυτό!" @@ -11506,6 +11651,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11546,8 +11695,8 @@ msgstr "Το PathFollow2D δουλεÏει μόνο όταν κληÏονομεΠ#: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11561,7 +11710,10 @@ msgstr "" "Αλλάξτε μÎγεθος στα σχήματα σÏγκÏουσης των παιδιών." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" "Η ιδιότητα Path Ï€ÏÎπει να δείχνει σε Îναν ÎγκυÏο κόμβο Spatial για να " "δουλÎψει αυτός ο κόμβος." @@ -11582,8 +11734,9 @@ msgstr "" "Αλλάξτε μÎγεθος στα σχήματα σÏγκÏουσης των παιδιών." #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Ένας πόÏος SpriteFrames Ï€ÏÎπει να δημιουÏγηθεί ή οÏισθεί στην ιδιότητα " @@ -11598,8 +11751,10 @@ msgstr "" "χÏησιμοποιήστε το ως παιδί του VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "Το WorldEnvironment χÏειάζεται Îναν πόÏο Environment." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" #: scene/3d/world_environment.cpp msgid "" @@ -11640,7 +11795,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "ΑποσÏνδεση του '%s' απο το '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11656,7 +11811,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Το δÎντÏο κίνησης δεν είναι ÎγκυÏο." #: scene/animation/animation_tree_player.cpp @@ -11689,8 +11844,7 @@ msgstr "Î Ïοσθήκη Ï„ÏÎχοντος χÏώματος στα Ï€Ïοκαθ msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "Το Container από μόνο του δεν Îχει κάποιο σκοπό αν κάποια δÎσμη ενεÏγειών " "δεν οÏίσει την τοποθÎτηση των παιδιών του.\n" @@ -11712,23 +11866,25 @@ msgid "Please Confirm..." msgstr "ΠαÏακαλώ επιβεβαιώστε..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Οι κόμβοι Ï„Ïπου Popup θα είναι κÏυμμÎνοι από Ï€Ïοεπιλογή, εκτός κι αν " "καλÎσετε την popup() ή καμία από τις συναÏτήσεις popup*(). Το να τους κάνετε " "οÏατοÏÏ‚ κατά την επεξεÏγασία, όμως, δεν είναι Ï€Ïόβλημα." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "Το ScrollContainer είναι φτιαγμÎνο για να δουλεÏει με Îνα μόνο υπο-στοιχείο " @@ -11755,7 +11911,7 @@ msgid "" "obtain a size. Otherwise, make it a RenderTarget and assign its internal " "texture to some node for display." msgstr "" -"Το Viewport δεν Îχει οÏισθεί ως «render target». Αν σκοπεÏετε να δείχνει τα " +"Το Viewport δεν Îχει οÏισθεί ως στόχος απόδοσης. Αν σκοπεÏετε να δείχνει τα " "πεÏιεχόμενα του, κάντε το να κληÏονομεί Îνα Control, ώστε να αποκτήσει " "μÎγεθος. Αλλιώς, κάντε το Îνα RenderTarget και οÏίστε το internal texture σε " "Îναν κόμβο για απεικόνιση." @@ -11782,9 +11938,19 @@ msgstr "Είσοδος" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Μη ÎγκυÏη πηγή!" + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Μη ÎγκυÏη πηγή!" +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Μη ÎγκυÏη πηγή!" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11801,6 +11967,66 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Î ÏοηγοÏμενος φάκελος" + +#~ msgid "Next Folder" +#~ msgstr "Επόμενος φάκελος" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Αυτόματο Άνοιγμα ΣτιγμιοτÏπων Οθόνης" + +#~ msgid "Open in an external image editor." +#~ msgstr "Άνοιγμα σε εξωτεÏικό επεξεÏγαστή εικόνων." + +#~ msgid "Reverse" +#~ msgstr "ΑντιστÏοφή" + +#~ msgid "Mirror X" +#~ msgstr "ΣυμμετÏία στον άξονα Χ" + +#~ msgid "Mirror Y" +#~ msgstr "ΣυμμετÏία στον άξονα Î¥" + +#~ msgid "Generating solution..." +#~ msgstr "Επίλυση..." + +#~ msgid "Generating C# project..." +#~ msgstr "ΔημιουÏγία ÎÏγου C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "ΑπÎτυχε η δημιουÏγία λÏσης." + +#~ msgid "Failed to save solution." +#~ msgstr "ΑπÎτυχε η αποθήκευση της λÏσης." + +#~ msgid "Done" +#~ msgstr "ΤÎλος" + +#~ msgid "Failed to create C# project." +#~ msgstr "ΑπÎτυχε η δημιουÏγία ÎÏγου C#." + +#~ msgid "Mono" +#~ msgstr "Μονοφωνικό" + +#~ msgid "About C# support" +#~ msgstr "Σχετικά με την υποστήÏιξη C#" + +#~ msgid "Create C# solution" +#~ msgstr "ΔημιουÏγία λÏσης C#" + +#~ msgid "Builds" +#~ msgstr "Δόμηση" + +#~ msgid "Build Project" +#~ msgstr "Δόμηση ÎÏγου" + +#~ msgid "View log" +#~ msgstr "Î Ïοβολή αÏχείου καταγÏαφής" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "Το WorldEnvironment χÏειάζεται Îναν πόÏο Environment." + #~ msgid "Enabled Classes" #~ msgstr "ΕνεÏγοποιημÎνες Κλάσεις" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 920ec81e1b..c3b755c31e 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -126,6 +126,31 @@ msgid "Anim Change Call" msgstr "Animado Aliigi Alvokon" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animado Aliigi Kernakadron Fojon" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animado Aliigi Transiron" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animado Aliigi Transformon" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animado Aliigi Kernakadron Valoron" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animado Aliigi Alvokon" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Aliigi Animadon Longecon" @@ -624,6 +649,10 @@ msgstr "Iri al Lineon" msgid "Line Number:" msgstr "Lineo-Numeron:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Ne Rezultoj" @@ -673,7 +702,7 @@ msgstr "Malzomi" msgid "Reset Zoom" msgstr "Rekomencigi Zomon" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Avertoj" @@ -776,6 +805,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -934,7 +967,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1110,7 +1143,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1469,6 +1501,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1639,7 +1675,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1690,7 +1726,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1715,23 +1751,29 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "Iri al AntaÅa PaÅo" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "Iri al Neksta PaÅo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2406,6 +2448,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Duplikati" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2597,14 +2644,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2919,6 +2958,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3514,6 +3557,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4539,6 +4583,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4567,7 +4615,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4581,7 +4628,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4656,31 +4703,33 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Forigi Nevalidajn Åœlosilojn" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Forigi Nevalidajn Åœlosilojn" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6239,10 +6288,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6528,7 +6585,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6713,10 +6774,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7277,14 +7334,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7662,6 +7711,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7746,6 +7799,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7753,10 +7822,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7845,7 +7948,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7853,7 +7956,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7865,7 +7968,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7882,7 +7985,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7951,11 +8054,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7971,7 +8074,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7999,11 +8102,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8043,11 +8146,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8056,7 +8163,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8074,15 +8181,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8131,7 +8238,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8159,12 +8266,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8241,47 +8348,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9432,6 +9539,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9634,7 +9745,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9689,7 +9800,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10089,54 +10200,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10713,7 +10776,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10762,7 +10825,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10772,7 +10835,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10848,12 +10911,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10932,7 +10995,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10961,6 +11024,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -10995,8 +11062,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11007,7 +11074,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11023,7 +11092,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11034,7 +11103,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11069,7 +11140,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11081,7 +11152,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11112,8 +11183,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11133,18 +11203,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11187,9 +11257,19 @@ msgid "Input" msgstr "Enigo" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "Nevalida fonto por ombrigilo." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Nevalida fonto por ombrigilo." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Nevalida fonto por ombrigilo." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index 8ff4610eb5..2450229f9a 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -44,7 +44,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:50+0000\n" +"PO-Revision-Date: 2019-07-21 11:06+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -165,6 +165,31 @@ msgid "Anim Change Call" msgstr "Cambiar Llamada de Animación" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Cambiar Tiempo del Fotograma Clave de Animación" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Cambiar Transición de Animación" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Cambiar Transformación de la Animación" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Cambiar Valor de la Clave de Animación" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Cambiar Llamada de Animación" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Cambiar Duración de la Animación" @@ -256,7 +281,7 @@ msgstr "Tiempo (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "Pista de Conmutación Activada" +msgstr "Act./Desact. Pista" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -669,6 +694,10 @@ msgstr "Ir a LÃnea" msgid "Line Number:" msgstr "Número de LÃnea:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Se encontraron %d coincidencias." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Sin Coincidencias" @@ -718,7 +747,7 @@ msgstr "Alejar Zoom" msgid "Reset Zoom" msgstr "Restablecer Zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Advertencias" @@ -825,6 +854,10 @@ msgid "Connect" msgstr "Conectar" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Señal:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Conectar «%s» a «%s»" @@ -989,8 +1022,9 @@ msgid "Owners Of:" msgstr "Propietarios De:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "¿Eliminar los archivos seleccionados del proyecto? (irreversible)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "" +"¿Eliminar los archivos seleccionados del proyecto? (No puede ser restaurado)" #: editor/dependency_editor.cpp msgid "" @@ -1172,7 +1206,6 @@ msgid "Success!" msgstr "¡Éxito!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Instalar" @@ -1360,9 +1393,8 @@ msgid "Must not collide with an existing engine class name." msgstr "No debe coincidir con el nombre de una clase ya existente del motor." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "No debe coincidir con un nombre de tipo buit-in existente." +msgstr "No debe coincidir con un nombre de tipo built-in existente." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." @@ -1541,6 +1573,11 @@ msgstr "Plantilla release personalizada no encontrada." msgid "Template file not found:" msgstr "Archivo de plantilla no encontrado:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"En la exportación de 32 bits el PCK embebido no puede ser mayor de 4 GiB." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "3D Editor" @@ -1566,9 +1603,8 @@ msgid "Node Dock" msgstr "Nodos" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Sistema de Archivos" +msgstr "Sistema de Archivo e Importación" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1621,7 +1657,6 @@ msgstr "" "El formato '%s' del archivo no es válido, la importación ha sido cancelada." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." @@ -1638,9 +1673,8 @@ msgid "Unset" msgstr "Desactivar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Perfil Actual" +msgstr "Perfil Actual:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1662,9 +1696,8 @@ msgid "Export" msgstr "Exportar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Perfiles Disponibles" +msgstr "Perfiles Disponibles:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1719,7 +1752,7 @@ msgstr "Mostrar en Explorador de Archivos" msgid "New Folder..." msgstr "Nueva Carpeta..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Recargar" @@ -1770,7 +1803,7 @@ msgstr "Avanzar" msgid "Go Up" msgstr "Subir" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Act./Desact. Archivos Ocultos" @@ -1795,23 +1828,31 @@ msgid "Move Favorite Down" msgstr "Bajar Favorito" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Carpeta Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ir a la carpeta padre." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Carpeta Siguiente" +#, fuzzy +msgid "Go to next folder." +msgstr "Ir a la carpeta padre." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Ir a la carpeta padre." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Buscar archivos" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Eliminar carpeta actual de favoritos." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Ver/Ocultar archivos ocultos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2553,6 +2594,10 @@ msgid "Go to previously opened scene." msgstr "Ir a la escena abierta previamente." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Copiar Texto" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Pestaña siguiente" @@ -2755,32 +2800,22 @@ msgid "Editor Layout" msgstr "Layout del Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Convertir en RaÃz de Escena" +msgstr "Realizar Captura de Pantalla" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Abrir Editor de Datos/Carpeta de Configuración" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Abrir Editor siguiente" +"Las capturas de pantalla se almacenan en la carpeta Editor de Datos / " +"Configuración." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Cambiar a Pantalla Completa" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Act/desact. CanvasItem visible" +msgstr "Act./Desact. Consola del Sistema" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2788,7 +2823,7 @@ msgstr "Abrir Editor de Datos/Carpeta de Configuración" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "Abrir Carpeta de Datos del Editor" +msgstr "Abrir Carpeta de Editor de Datos" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" @@ -2889,19 +2924,16 @@ msgid "Spins when the editor window redraws." msgstr "Gira cuando la ventana del editor se redibuja." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Continuo" +msgstr "Actualizar Continuamente" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Actualizar Cambios" +msgstr "Actualizar Al Cambiar" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Desactivar Indicador de Actividad" +msgstr "Ocultar Spinner de Actualización" #: editor/editor_node.cpp msgid "FileSystem" @@ -3099,6 +3131,11 @@ msgid "Calls" msgstr "Llamadas" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Activado" @@ -3721,6 +3758,7 @@ msgid "Nodes not in Group" msgstr "Nodos fuera del Grupo" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtrar nodos" @@ -4771,6 +4809,10 @@ msgid "Idle" msgstr "Inactivo" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Instalar..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Reintentar" @@ -4799,7 +4841,6 @@ msgid "Last" msgstr "Último" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Todos" @@ -4813,8 +4854,8 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Invertir" +msgid "Reverse sorting." +msgstr "Orden inverso." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4895,32 +4936,32 @@ msgid "Rotation Step:" msgstr "Step de Rotación:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "Mover guÃa vertical" +msgid "Move Vertical Guide" +msgstr "Mover GuÃa Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "Crear nueva guÃa vertical" +msgid "Create Vertical Guide" +msgstr "Crear GuÃa Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "Eliminar guÃa vertical" +msgid "Remove Vertical Guide" +msgstr "Eliminar GuÃa Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "Mover guÃa horizontal" +msgid "Move Horizontal Guide" +msgstr "Mover GuÃa Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "Crear nueva guÃa horizontal" +msgid "Create Horizontal Guide" +msgstr "Crear GuÃa Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "Eliminar guÃa horizontal" +msgid "Remove Horizontal Guide" +msgstr "Eliminar GuÃa Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "Crear nuevas guÃas horizontales y verticales" +msgid "Create Horizontal and Vertical Guides" +msgstr "Crear GuÃas Horizontales y Verticales" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -4963,8 +5004,8 @@ msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" -"Cuando está activo, los nodos de Control en movimiento cambian sus anclajes " -"en lugar de sus márgenes." +"Cuando está activo, el movimiento de los nodos de Control cambian sus " +"anclajes en lugar de sus márgenes." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -4991,12 +5032,12 @@ msgstr "Desbloquear Seleccionado" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Group Selected" -msgstr "Grupo Seleccionado" +msgstr "Agrupar Seleccionados" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Ungroup Selected" -msgstr "Desagrupar Seleccionado" +msgstr "Desagrupar Seleccionados" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" @@ -5353,9 +5394,8 @@ msgstr "Cargar Máscara de Emisión" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Reiniciar Ahora" +msgstr "Reiniciar" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5759,7 +5799,7 @@ msgstr "¡Sin caras!" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." -msgstr "El nodo no posee geometrÃa." +msgstr "El nodo no tiene geometrÃa." #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry (faces)." @@ -6268,18 +6308,16 @@ msgid "Find Next" msgstr "Buscar Siguiente" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Filtrar propiedades" +msgstr "Filtrar scripts" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Alternar la ordenación alfabética de la lista de métodos." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Modo de filtrado:" +msgstr "Filtrar métodos" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6513,10 +6551,18 @@ msgid "Syntax Highlighter" msgstr "Resaltador de Sintaxis" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Ir A" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "Marcadores" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Puntos de interrupción" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6713,7 +6759,7 @@ msgstr "Escalado: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Translating: " -msgstr "Trasladando: " +msgstr "Trasladar: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -6804,9 +6850,15 @@ msgid "Rear" msgstr "Detrás" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinear con Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinear Selección Con Vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "No hay padre al que instanciarle un hijo." @@ -6994,10 +7046,6 @@ msgid "Focus Selection" msgstr "Foco en Selección" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinear Selección Con Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Seleccionar Herramienta" @@ -7558,14 +7606,6 @@ msgid "Transpose" msgstr "Transponer" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Voltear X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Voltear Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "Desactivar Autotile" @@ -7962,6 +8002,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Cambiar Tipo de Entrada del Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(Sólo GLES3)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vértice" @@ -8046,6 +8090,23 @@ msgid "Color uniform." msgstr "Color uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" +"Devuelve el resultado booleano de la comparación de %s entre dos parámetros." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "Igual (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "Mayor Que (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "Mayor o Igual Que (>=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8055,12 +8116,52 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" +"Devuelve el resultado booleano de la comparación entre INF y un parámetro " +"escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" +"Devuelve el resultado booleano de la comparación entre NaN y un parámetro " +"escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "Menor Que (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "Menor o Igual Que (<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "Diferente (!=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" "Devuelve un vector asociado si el valor booleano proporcionado es verdadero " "o falso." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Devuelve el resultado booleano de la comparación entre dos parámetros." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"Devuelve el resultado booleano de la comparación entre INF (o NaN) y un " +"parámetro escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "Constante booleana." @@ -8069,43 +8170,36 @@ msgid "Boolean uniform." msgstr "Boolean uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for all shader modes." -msgstr "Parámetro de entrada 'uv' para todos los modos de shader." +msgstr "Parámetro de entrada %s' para todos los modos de shader." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." msgstr "Parámetro de entrada." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "Parámetro de entrada 'uv' para vértices y fragmentos en modo shader." +msgstr "Parámetro de entrada '%s' para vértices y fragmentos en modo shader." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." -msgstr "Parámetro de entrada 'view' para fragmentos y luces en modo shader." +msgstr "Parámetro de entrada '%s' para fragmentos y luces en modo shader." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "Parámetro de entrada 'side' para fragmentos en modo de shader." +msgstr "Parámetro de entrada '%s' para fragmentos en modo de shader." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "Parámetro de entrada 'diffuse' para luces en modo shader." +msgstr "Parámetro de entrada '%s' para luces en modo shader." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "Parámetro de entrada 'custom' para vértices en modo shader." +msgstr "Parámetro de entrada '%s' para vértices en modo shader." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "Parámetro de entrada 'uv' para vértices y fragmentos en modo shader." +msgstr "Parámetro de entrada '%s' para vértices y fragmentos en modo shader." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -8156,16 +8250,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Devuelve el arcocoseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Sólo GLES3) Devuelve el coseno hiperbólico inverso del parámetro." +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "Devuelve el coseno hiperbólico inverso del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Devuelve el arcoseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "(Sólo GLES3) Devuelve el seno hiperbólico inverso del parámetro." +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "Devuelve el seno hiperbólico inverso del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8176,8 +8270,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Devuelve el arcotangente de los parámetros." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Sólo GLES3) Devuelve la tangente hiperbólica inversa del parámetro." +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "Devuelve la tangente hiperbólica inversa del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8193,8 +8287,8 @@ msgid "Returns the cosine of the parameter." msgstr "Devuelve el coseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "(Sólo GLES3) Devuelve el coseno hiperbólico del parámetro." +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "Devuelve el coseno hiperbólico del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8263,12 +8357,12 @@ msgid "1.0 / scalar" msgstr "1.0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "(Sólo GLES3) Encuentra el entero más cercano al parámetro." +msgid "Finds the nearest integer to the parameter." +msgstr "Encuentra el entero más cercano al parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "(Sólo GLES3) Encuentra el entero más cercano al parámetro." +msgid "Finds the nearest even integer to the parameter." +msgstr "Encuentra el entero más cercano al parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8283,8 +8377,8 @@ msgid "Returns the sine of the parameter." msgstr "Devuelve el seno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "(Sólo GLES3) Devuelve el seno hiperbólico del parámetro." +msgid "Returns the hyperbolic sine of the parameter." +msgstr "Devuelve el seno hiperbólico del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8319,12 +8413,12 @@ msgid "Returns the tangent of the parameter." msgstr "Devuelve la tangente del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "(Sólo GLES3) Devuelve la tangente hiperbólica del parámetro." +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "Devuelve la tangente hiperbólica del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "(Sólo GLES3) Encuentra el valor truncado del parámetro." +msgid "Finds the truncated value of the parameter." +msgstr "Encuentra el valor truncado del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8363,12 +8457,16 @@ msgid "Perform the texture lookup." msgstr "Realiza una búsqueda de texturas." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." -msgstr "Textura cúbica uniforme." +msgid "Cubic texture uniform lookup." +msgstr "Búsqueda de textura cúbica uniforme." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." +msgstr "Búsqueda de textura uniforme 2D." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." -msgstr "Textura 2D uniforme." +msgid "2D texture uniform lookup with triplanar." +msgstr "Búsqueda de textura uniforme 2D con triplanar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." @@ -8376,7 +8474,7 @@ msgstr "Función Transform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8384,7 +8482,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(GLES3 solamente) Calcula el producto exterior de un par de vectores.\n" +"Calcular el producto exterior de un par de vectores.\n" "\n" "OuterProduct trata el primer parámetro 'c' como un vector de columna (matriz " "con una columna) y el segundo parámetro 'r' como un vector de fila (matriz " @@ -8401,16 +8499,16 @@ msgid "Decomposes transform to four vectors." msgstr "Se descompone y transforma en cuatro vectores." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "(Sólo GLES3) Calcula el determinante de una transformación." +msgid "Calculates the determinant of a transform." +msgstr "Calcula el determinante de una transformación." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "(Sólo GLES3) Calcula el inverso de una transformación." +msgid "Calculates the inverse of a transform." +msgstr "Calcula el inverso de una transformación." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "(Sólo GLES3) Calcula la transposición de una transformación." +msgid "Calculates the transpose of a transform." +msgstr "Calcula la transposición de una transformación." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8458,16 +8556,16 @@ msgstr "Calcula el producto punto de dos vectores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" -"Devuelve un vector que apunta en la misma dirección que un vector de " +"Devuelve el vector que apunta en la misma dirección que un vector de " "referencia. La función tiene tres parámetros vectoriales: N, el vector a " "orientar, I, el vector incidente, y Nref, el vector de referencia. Si el " -"producto punto de I y Nref es menor que cero, el valor de retorno es N. De " -"lo contrario, se devuelve -N." +"producto de punto de I y Nref es menor que cero, el valor de retorno es N. " +"De lo contrario, se devuelve -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." @@ -8491,15 +8589,15 @@ msgstr "1.0 / vector" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" -"Devuelve un vector que apunta en dirección a su reflexión ( a : vector " +"Devuelve el vector que apunta en la dirección de reflexión ( a : vector " "incidente, b : vector normal)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." -msgstr "Devuelve un vector que apunta en dirección a su refracción." +msgid "Returns the vector that points in the direction of refraction." +msgstr "Devuelve el vector que apunta en la dirección de refracción." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8598,61 +8696,58 @@ msgstr "" "esta)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "(Sólo GLES3) (Sólo modo Fragmento/Luz) Función de derivación escalar." +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(Sólo modo Fragmento/Luz) Función de derivación escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) Función de derivación vectorial." +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(Sólo modo Fragmento/Luz) Función de derivación vectorial." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Derivado en 'x' utilizando " -"diferenciación local." +"(Sólo modo Fragmento/Luz) (Vector) Derivado en 'x' utilizando diferenciación " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Derivado en 'x' utilizando " +"(Sólo modo Fragmento/Luz) (Escalar) Derivado en 'x' utilizando " "diferenciación local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Derivado en 'y' utilizando " -"diferenciación local." +"(Sólo modo Fragmento/Luz) (Vector) Derivado en 'y' utilizando diferenciación " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Derivado en 'y' utilizando " +"(Sólo modo Fragmento/Luz) (Escalar) Derivado en 'y' utilizando " "diferenciación local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Vector) Suma de la derivada absoluta " -"en 'x' e 'y'." +"(Sólo modo Fragmento/Luz) (Vector) Suma de la derivada absoluta en 'x' e 'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" -"(Sólo GLES3) (Sólo modo Fragmento/Luz) (Escalar) Suma del derivado absoluto " -"en 'x' e 'y'." +"(Sólo modo Fragmento/Luz) (Escalar) Suma del derivado absoluto en 'x' e 'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -8664,7 +8759,7 @@ msgstr "Editar Propiedad Visual" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" -msgstr "Se ha cambiado el Modo de Visual Shader" +msgstr "Cambiar Modo de Visual Shader" #: editor/project_export.cpp msgid "Runnable" @@ -9868,9 +9963,8 @@ msgid "Add Child Node" msgstr "Añadir Nodo Hijo" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "Colapsar Todo" +msgstr "Expandir/Colapsar Todo" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9881,6 +9975,11 @@ msgid "Extend Script" msgstr "Extender Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Reemparentar nodo" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Convertir en RaÃz de Escena" @@ -9901,9 +10000,8 @@ msgid "Delete (No Confirm)" msgstr "Eliminar (Sin confirmar)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Añadir/Crear un Nuevo Nodo" +msgstr "Añadir/Crear un Nuevo Nodo." #: editor/scene_tree_dock.cpp msgid "" @@ -10099,8 +10197,8 @@ msgid "Script is valid." msgstr "El script es válido." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "Permitido: a-z, A-Z, 0-9 y _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "Permitido: a-z, A-Z, 0-9, _ y ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -10154,7 +10252,7 @@ msgstr "Stack Trace" msgid "Pick one or more items from the list to display the graph." msgstr "Elige uno o más elementos de la lista para mostrar el gráfico." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Errores" @@ -10164,7 +10262,7 @@ msgstr "Proceso Hijo Conectado" #: editor/script_editor_debugger.cpp msgid "Copy Error" -msgstr "Error de Copia" +msgstr "Copiar Error" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" @@ -10558,54 +10656,6 @@ msgstr "Seleccionar Distancia:" msgid "Class name can't be a reserved keyword" msgstr "El nombre de la clase no puede ser una palabra reservada" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Generando solución..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Generando proyecto C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Fallo al crear solución." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Fallo al guardar solución." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Hecho" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "Fallo al crear proyecto C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Sobre el soporte de C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Crear solución C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Compilaciones" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Compilar proyecto" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Ver registro" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fin del reporte de la pila de excepciones" @@ -11236,11 +11286,11 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" -"Se debe crear o establecer un recurso SpriteFrames en la propiedad 'Frames' " -"para que AnimatedSprite pueda mostrar frames." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" +"\" para que AnimatedSprite pueda mostrar frames." #: scene/2d/canvas_modulate.cpp msgid "" @@ -11305,10 +11355,11 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" -"Se debe asignar una textura con la forma de la luz a la propiedad 'texture'." +"Se debe proporcionar una textura con la forma de la luz a la propiedad \" " +"Texture\"." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -11318,10 +11369,10 @@ msgstr "" "tenga efecto." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" -"El polÃgono oclusor para este oclusor esta vacÃo. Por favor, ¡dibuja un " -"polÃgono!" +"El polÃgono oclusor para este oclusor está vacÃo. Por favor, dibuja un " +"polÃgono." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11410,27 +11461,26 @@ msgstr "" "asÃgnale una." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D solo sirve para proveer de una forma de colisión a un nodo " -"derivado de CollisionObject2D. Por favor, úsalo solo como hijo de Area2D, " -"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para dotarlos de forma." +"TileMap con Use Parent activado necesita un CollisionObject2D padre para " +"darle forma. Por favor, úsalo como hijo de Area2D, StaticBody2D, " +"RigidBody2D, KinematicBody2D, etc. para que puedan tener forma." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D funciona mejor cuando se usa directamente con la raÃz de " -"la escena editada como padre." +"VisibilityEnabler2D funciona mejor cuando se usa con la raÃz de la escena " +"editada directamente como padre." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera tiene que tener un nodo ARVROrigin como padre" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera tiene que tener un nodo ARVROrigin como padre." #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -11522,10 +11572,10 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" -"Se debe proveer de una forma a CollisionShape para que funcione. Por favor, " -"¡crea un recurso \"shape\"!" +"Se debe proporcionar un shape para que CollisionShape funcione. Por favor, " +"crea un recurso de shape para ello." #: scene/3d/collision_shape.cpp msgid "" @@ -11559,6 +11609,11 @@ msgstr "" "Las GIProbes no están soportadas por el controlador de video GLES2.\n" "Usa un BakedLightmap en su lugar." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" +"Un SpotLight con un ángulo superior a 90 grados no puede proyectar sombras." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11605,11 +11660,11 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED requiere que \"Up Vector\" esté activo en el " -"recurso Curve de su Path padre." +"PathFollow's ROTATION_ORIENTED requiere que \"Up Vector\" esté activado en " +"el recurso Curve de su Path padre." #: scene/3d/physics_body.cpp msgid "" @@ -11622,9 +11677,12 @@ msgstr "" "En lugar de esto, cambie el tamaño en las formas de colisión hijas." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" -"La propiedad Path debe apuntar a un nodo Spatial válido para funcionar." +"La propiedad \"Remote Path\" debe apuntar a un nodo Spatial o derivado de " +"Spatial válido para que funcione." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -11642,11 +11700,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Se debe crear o establecer un recurso SpriteFrames en la propiedad 'Frames' " -"para que AnimatedSprite3D pueda mostrar frames." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" +"\" para que AnimatedSprite3D pueda mostrar frames." #: scene/3d/vehicle_body.cpp msgid "" @@ -11657,8 +11715,12 @@ msgstr "" "Por favor, úselo como hijo de un VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment necesita un recurso Environment." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WorldEnvironment requiere que su propiedad \"Environment\" contenga un " +"Environment para que tenga un efecto visible." #: scene/3d/world_environment.cpp msgid "" @@ -11697,8 +11759,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Nada conectado a la entrada '%s' del nodo '%s'." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." -msgstr "No hay asignado ningún nodo AnimationNode raÃz para el gráfico." +msgid "No root AnimationNode for the graph is set." +msgstr "No se ha establecido ningún nodo AnimationNode raÃz para el gráfico." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." @@ -11711,8 +11773,8 @@ msgstr "" "La ruta asignada al AnimationPlayer no apunta a un nodo AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "La raÃz del AnimationPlayer no es un nodo válido." +msgid "The AnimationPlayer root node is not a valid node." +msgstr "La raÃz del nodo AnimationPlayer no es un nodo válido." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11724,12 +11786,11 @@ msgstr "Selecciona un color de la pantalla." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "Yaw" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11740,16 +11801,14 @@ msgid "Add current color as a preset." msgstr "Añadir el color actual como preset." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" -"Container por sà mismo no sirve para nada a menos que un script configure el " +"Container por sà mismo no sirve para nada a menos que un script defina el " "comportamiento de colocación de sus hijos.\n" -"Si no tienes intención de añadir un script, utiliza un nodo 'Control' " +"Si no tienes intención de añadir un script, utiliza un nodo de Control " "sencillo." #: scene/gui/control.cpp @@ -11757,6 +11816,9 @@ msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"Los Tooltip de Ayuda no se mostrarán cuando los controles del Filtro del " +"Ratón estén configurados en \"Ignore\". Para solucionarlo, establece el " +"Filtro del Ratón en \"Stop\" o \"Pass\"." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11769,26 +11831,26 @@ msgstr "Por favor, Confirma..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" -"Los popups se esconderán por defecto a menos que llames a popup() o " -"cualquiera de las funciones popup*(). Sin embargo, no hay problema con " -"hacerlos visibles para editar, aunque se esconderán al ejecutar." +"Los popups se ocultarán por defecto a menos que llames a popup() o a " +"cualquiera de las funciones popup*(). Puedes hacerlos visibles para su " +"edición, pero se esconderán al iniciar." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "Si exp_edit es `true` min_value debe ser > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "Si \"Exp Edit\" está activado, \"Min Value\" debe ser mayor que 0." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer está pensado para funcionar con un control hijo únicamente.\n" -"Usa un contenedor como hijo (VBox,HBox,etc), o un Control y ajusta el tamaño " -"mÃnimo manualmente." +"ScrollContainer está pensado para funcionar con un solo control hijo.\n" +"Utiliza un container como hijo (VBox, HBox, etc.), o un Control y establece " +"manualmente el tamaño mÃnimo personalizado." #: scene/gui/tree.cpp msgid "(Other)" @@ -11835,9 +11897,17 @@ msgid "Input" msgstr "Entrada" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "Fuente inválida para la vista previa." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Fuente inválida para el shader." +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "Función de comparación inválida para este tipo." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Asignación a función." @@ -11854,6 +11924,66 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "Previous Folder" +#~ msgstr "Carpeta Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Carpeta Siguiente" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Abrir Capturas de Pantalla Automáticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Abrir en un editor de imágenes externo." + +#~ msgid "Reverse" +#~ msgstr "Invertir" + +#~ msgid "Mirror X" +#~ msgstr "Voltear X" + +#~ msgid "Mirror Y" +#~ msgstr "Voltear Y" + +#~ msgid "Generating solution..." +#~ msgstr "Generando solución..." + +#~ msgid "Generating C# project..." +#~ msgstr "Generando proyecto C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "Fallo al crear solución." + +#~ msgid "Failed to save solution." +#~ msgstr "Fallo al guardar solución." + +#~ msgid "Done" +#~ msgstr "Hecho" + +#~ msgid "Failed to create C# project." +#~ msgstr "Fallo al crear proyecto C#." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "Sobre el soporte de C#" + +#~ msgid "Create C# solution" +#~ msgstr "Crear solución C#" + +#~ msgid "Builds" +#~ msgstr "Compilaciones" + +#~ msgid "Build Project" +#~ msgstr "Compilar proyecto" + +#~ msgid "View log" +#~ msgstr "Ver registro" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment necesita un recurso Environment." + #~ msgid "Enabled Classes" #~ msgstr "Clases Activadas" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index acf2394702..0b03b5517a 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:51+0000\n" -"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:21+0000\n" +"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" "Language: es_AR\n" @@ -85,9 +85,8 @@ msgid "Time:" msgstr "Tiempo:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Value:" -msgstr "Valor" +msgstr "Valor:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" @@ -138,6 +137,31 @@ msgid "Anim Change Call" msgstr "Cambiar Call de Anim" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Cambiar Tiempo de Keyframe de Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Cambio de transición Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Cambiar Transform de Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Cambiar Valor de Keyframe de Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Cambiar Call de Anim" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Cambiar Duración de la Animación" @@ -443,10 +467,19 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"Esta animación pertenece a una escena importada, por lo que los cambios en " +"las pistas importadas no se guardarán.\n" +"\n" +"Para habilitar la capacidad de añadir pistas personalizadas, andá a la " +"configuración de importación de la escena y establece\n" +"\"Animation > Storage\" a \"Files\", activa \"Animation > Keep Custom Tracks" +"\", y luego reimporta.\n" +"También podés usar un preset de importación que importa animaciones a " +"archivos separados." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "Advertencia: Se esta editando una animación importada" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -631,6 +664,10 @@ msgstr "Ir a LÃnea" msgid "Line Number:" msgstr "Numero de LÃnea:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Se encontraron %d coincidencias." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Sin Coincidencias" @@ -680,7 +717,7 @@ msgstr "Alejar Zoom" msgid "Reset Zoom" msgstr "Resetear el Zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Advertencias" @@ -689,38 +726,32 @@ msgid "Line and column numbers." msgstr "Números de lÃnea y columna." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "El método en el Nodo objetivo debe ser especificado!" +msgstr "El método en el nodo objetivo debe ser especificado." #: editor/connections_dialog.cpp -#, fuzzy msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"El método objetivo no fue encontrado! Especificá un método válido o agregá " -"un script al Nodo objetivo." +"El método objetivo no fue encontrado. Especificá un método válido o agregá " +"un script al nodo objetivo." #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "Conectar a Nodo:" +msgstr "Conectar al Nodo:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "No se puede conectar al host:" +msgstr "Conectar al Script:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "Señales:" +msgstr "Desde la Señal:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Scene does not contain any script." -msgstr "El nodo no contiene geometrÃa." +msgstr "La escena no contiene ningún script." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -748,9 +779,8 @@ msgid "Extra Call Arguments:" msgstr "Argumentos de Llamada Extras:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "Opciones avanzadas" +msgstr "Avanzado" #: editor/connections_dialog.cpp msgid "Deferred" @@ -760,6 +790,8 @@ msgstr "Diferido" msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" +"Difiere la señal, almacenándola en una cola y solo disparándola en tiempo de " +"inactividad." #: editor/connections_dialog.cpp msgid "Oneshot" @@ -767,12 +799,11 @@ msgstr "Oneshot" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "" +msgstr "Desconecta la señal después de su primera emisión." #: editor/connections_dialog.cpp -#, fuzzy msgid "Cannot connect signal" -msgstr "Conectar Señal: " +msgstr "No se puede conectar la señal" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -793,6 +824,10 @@ msgid "Connect" msgstr "Conectar" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Señal:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Conectar '%s' a '%s'" @@ -814,14 +849,12 @@ msgid "Disconnect" msgstr "Desconectar" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect a Signal to a Method" -msgstr "Conectar Señal: " +msgstr "Conectar una Señal a un Método" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "Editar Conexión: " +msgstr "Editar Conexión:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -898,20 +931,20 @@ msgid "Dependencies For:" msgstr "Dependencias Para:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" -"La Escena '%s' esté siendo editada actualmente.\n" -"Los cambios no tendrán efecto hasta recargarlo." +"La Escena '%s' está siendo editada.\n" +"Los cambios solo tendrán efecto al recargarla." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." -msgstr "El recurso '%s' está en uso. Los cambios tendrán efecto al recargarlo." +msgstr "" +"El recurso '%s' está en uso.\n" +"Los cambios solo tendrán efecto al recargarlo." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -958,8 +991,9 @@ msgid "Owners Of:" msgstr "Dueños De:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "Quitar los archivos seleccionados del proyecto? (imposible deshacer)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "" +"¿Eliminar los archivos seleccionados del proyecto? (No puede ser restaurado)" #: editor/dependency_editor.cpp msgid "" @@ -1004,9 +1038,8 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "Eliminar permanentemente %d item(s)? (Imposible deshacer!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "Dependencias" +msgstr "Mostrar Dependencias" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" @@ -1142,7 +1175,6 @@ msgid "Success!" msgstr "¡Éxito!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Instalar" @@ -1269,7 +1301,7 @@ msgstr "Abrir Layout de Bus de Audio" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "No hay ningún archivo `%s'." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -1326,29 +1358,20 @@ msgid "Valid characters:" msgstr "Caracteres válidos:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing engine class name." -msgstr "" -"Nombre inválido. No debe colisionar con un nombre existente de clases del " -"engine." +msgstr "No debe coincidir con el nombre de una clase ya existente del motor." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "" -"Nombre inválido. No debe colisionar con un nombre existente de un tipo built-" -"in." +msgstr "No debe coincidir con el nombre de un tipo built-in ya existente." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." -msgstr "" -"Nombre inválido. No debe colisionar con un nombre de constante global " -"existente." +msgstr "No debe coincidir con un nombre de constante global existente." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "La palabra clave no se puede utilizar como nombre de autoload." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -1379,7 +1402,6 @@ msgid "Rearrange Autoloads" msgstr "Reordenar Autoloads" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." msgstr "Ruta inválida." @@ -1434,9 +1456,8 @@ msgid "[unsaved]" msgstr "[sin guardar]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "Por favor elegà un directorio base primero" +msgstr "Por favor elegà un directorio base primero." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1520,122 +1541,112 @@ msgstr "Plantilla release personalizada no encontrada." msgid "Template file not found:" msgstr "Plantilla no encontrada:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"En la exportación de 32 bits el PCK embebido no puede ser mayor de 4 GiB." + #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "Editor" +msgstr "Editor 3D" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "Abrir en Editor de Script" +msgstr "Editor de Scripts" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Asset Library" -msgstr "Abrir Biblioteca de Assets" +msgstr "Biblioteca de Assets" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "Arbol de Escenas (Nodos):" +msgstr "Edición de Ãrbol de Escenas" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Dock" -msgstr "Importar" +msgstr "Dock de Importación" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Node Dock" -msgstr "Nodo Movido" +msgstr "Dock de Nodos" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Sistema de Archivos" +msgstr "Docks de Sistema de Archivos e Importación" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "Reemplazar todo (no se puede deshacer)" +msgstr "¿Borrar perfil '%s'? (no se puede deshacer)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" msgstr "" +"El perfil debe tener un nombre de archivo válido y no debe contener '.'" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." -msgstr "Un archivo o carpeta con este nombre ya existe." +msgstr "Ya existe un perfil con este nombre." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(Editor Desactivado, Propiedades Desactivadas)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Properties Disabled)" -msgstr "Solo Propiedades" +msgstr "(Propiedades Desactivadas)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Editor Disabled)" -msgstr "Clip Desactivado" +msgstr "(Editor Desactivado)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "Descripción de Clase:" +msgstr "Opciones de Clase:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "Abrir el Editor siguiente" +msgstr "Activar el Editor Contextual" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Properties:" -msgstr "Propiedades:" +msgstr "Propiedades Activadas:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Features:" -msgstr "CaracterÃsticas" +msgstr "CaracterÃsticas Activadas:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Classes:" -msgstr "Buscar Clases" +msgstr "Clases Activadas:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." msgstr "" +"El formato '%s' del archivo no es válido, la importación ha sido cancelada." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"El perfil '%s' ya existe. Eliminalo primero antes de importar, la " +"importación ha sido cancelada." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "Error al cargar la plantilla '%s'" +msgstr "Error al guardar el perfil en la ruta: '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "Desactivar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Version Actual:" +msgstr "Perfil Actual:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Make Current" -msgstr "Actual:" +msgstr "Hacer Actual" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1653,39 +1664,32 @@ msgid "Export" msgstr "Exportar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Nodos Disponibles:" +msgstr "Perfiles Disponibles:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options" -msgstr "Descripción de Clase" +msgstr "Opciones de Clase" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "New profile name:" -msgstr "Nuevo nombre:" +msgstr "Nuevo nombre de perfil:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase Profile" -msgstr "Borrar Ãrea" +msgstr "Borrar Perfil" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Profile(s)" -msgstr "Proyecto Importado" +msgstr "Importar Perfil(es)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Export Profile" -msgstr "Exportar Proyecto" +msgstr "Exportar Perfil" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Manage Editor Feature Profiles" -msgstr "Gestionar Plantillas de Exportación" +msgstr "Administrar Perfiles de CaracterÃsticas del Editor" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1716,7 +1720,7 @@ msgstr "Mostrar en Explorador de Archivos" msgid "New Folder..." msgstr "Nueva Carpeta..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Refrescar" @@ -1767,7 +1771,7 @@ msgstr "Avanzar" msgid "Go Up" msgstr "Subir" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Act/Desact. Archivos Ocultos" @@ -1792,25 +1796,32 @@ msgid "Move Favorite Down" msgstr "Bajar Favorito" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Carpeta Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ir a la carpeta padre." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Carpeta Siguiente" +#, fuzzy +msgid "Go to next folder." +msgstr "Ir a la carpeta padre." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Ir a la carpeta padre." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Buscar archivos" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Quitar carpeta actual de favoritos." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." -msgstr "Act/Desact. Archivos Ocultos" +msgid "Toggle the visibility of hidden files." +msgstr "Ver/Ocultar archivos ocultos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1847,6 +1858,8 @@ msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"Hay varios importadores para diferentes tipos que apuntan al archivo %s, " +"importación abortada" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -2192,13 +2205,13 @@ msgstr "" "mejor este workflow." #: editor/editor_node.cpp -#, fuzzy msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." msgstr "" -"Este recurso pertenece a una escena que fue instanciada o heredada.\n" -"Los cambios que se le realicen no perduraran al guardar la escena actual." +"Este recurso pertenece a una escena instanciada o heredada.\n" +"Los cambios realizados sobre éste no se mantendrán al guardar la escena " +"actual." #: editor/editor_node.cpp msgid "" @@ -2209,28 +2222,25 @@ msgstr "" "el panel de importación y luego reimportá." #: editor/editor_node.cpp -#, fuzzy msgid "" "This scene was imported, so changes to it won't be kept.\n" "Instancing it or inheriting will allow making changes to it.\n" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"Esta escena fue importada, por tanto los cambios que se le realicen no " -"perduraran.\n" -"Instancia o hereda para poder realizar cambios.\n" -"Por favor lee la documentación relevante a importar escenas para entender " -"mejor este workflow." +"Esta escena fue importada, por lo que los cambios no se mantendrán.\n" +"Instanciarla o heredarla permitirá realizar cambios en esta.\n" +"Por favor, lee la documentación relevante para importar escenas para " +"entender mejor este flujo de trabajo." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object, so changes to it won't be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Este es un objeto remoto, los cambios que se hagan no se van a mantener.\n" -"Lea la documentación relacionada con la depuración para comprender mejor " +"Este es un objeto remoto, por lo que los cambios en él no se mantendrán.\n" +"Por favor, lee la documentación relativa a la depuración para entender mejor " "este workflow." #: editor/editor_node.cpp @@ -2502,12 +2512,11 @@ msgstr "Cerrar Otras Pestañas" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "Cerrar Pestañas a la Derecha" #: editor/editor_node.cpp -#, fuzzy msgid "Close All Tabs" -msgstr "Cerrar Todos" +msgstr "Cerrar Todas las Pestañas" #: editor/editor_node.cpp msgid "Switch Scene Tab" @@ -2550,6 +2559,10 @@ msgid "Go to previously opened scene." msgstr "Ir a la escena abierta previamente." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Copiar Texto" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Pestaña siguiente" @@ -2641,7 +2654,7 @@ msgstr "Abrir Carpeta de Datos del Proyecto" #: editor/editor_node.cpp msgid "Install Android Build Template" -msgstr "" +msgstr "Instalar plantilla de compilación de Android" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2753,32 +2766,20 @@ msgid "Editor Layout" msgstr "Layout del Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Convertir en RaÃz de Escena" +msgstr "Tomar Captura de Pantalla" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Abrir Carpeta de Datos/Configuración del Editor" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Abrir el Editor siguiente" +msgstr "Las capturas se almacenan en la carpeta Editor Datta/Settings." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Act./Desact. Pantalla Completa" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Act/Desact. CanvasItem Visible" +msgstr "Act/Desact. Consola de Sistema" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2793,9 +2794,8 @@ msgid "Open Editor Settings Folder" msgstr "Abrir Carpeta de Configuración del Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features" -msgstr "Gestionar Plantillas de Exportación" +msgstr "Administrar CaracterÃsticas del Editor" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" @@ -2888,19 +2888,16 @@ msgid "Spins when the editor window redraws." msgstr "Gira cuando la ventana del editor se redibuja." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "ContÃnuo" +msgstr "Actualizar Continuamente" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Actualizar Cambios" +msgstr "Actualizar Al Cambiar" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Desactivar Update Spinner" +msgstr "Ocultar Spinner de Actualización" #: editor/editor_node.cpp msgid "FileSystem" @@ -2929,17 +2926,21 @@ msgstr "No Guardar" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"Falta la plantilla de compilación de Android, por favor, instala las " +"plantillas correspondientes." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Templates" -msgstr "Gestionar Plantillas de Exportación" +msgstr "Administrar Plantillas" #: editor/editor_node.cpp msgid "" "This will install the Android project for custom builds.\n" "Note that, in order to use it, it needs to be enabled per export preset." msgstr "" +"Esto instalará el proyecto de Android para compilaciones personalizadas.\n" +"Tené en cuenta que, para usarlo, necesita estar activado por cada preset de " +"exportación." #: editor/editor_node.cpp msgid "" @@ -2947,6 +2948,10 @@ msgid "" "Remove the \"build\" directory manually before attempting this operation " "again." msgstr "" +"La plantilla de compilación de Android ya está instalada y no se " +"sobrescribirá.\n" +"Eliminá el directorio \"build\" manualmente antes de intentar esta operación " +"nuevamente." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3091,6 +3096,11 @@ msgid "Calls" msgstr "Llamadas" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "On" @@ -3419,9 +3429,8 @@ msgid "SSL Handshake Error" msgstr "Error de Handshake SSL" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uncompressing Android Build Sources" -msgstr "Descomprimiendo Assets" +msgstr "Descomprimiendo Fuentes de Compilación Android" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -3440,9 +3449,8 @@ msgid "Remove Template" msgstr "Remover Plantilla" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select Template File" -msgstr "Elegir archivo de plantilla" +msgstr "Elegir Archivo de Plantilla" #: editor/export_template_manager.cpp msgid "Export Template Manager" @@ -3503,9 +3511,8 @@ msgid "No name provided." msgstr "No se indicó ningún nombre." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Provided name contains invalid characters." -msgstr "El nombre indicado contiene caracteres inválidos" +msgstr "El nombre indicado contiene caracteres inválidos." #: editor/filesystem_dock.cpp msgid "Name contains invalid characters." @@ -3532,28 +3539,24 @@ msgid "Duplicating folder:" msgstr "Duplicando carpeta:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Inherited Scene" -msgstr "Nueva Escena Heredada..." +msgstr "Nueva Escena Heredada" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Open Scenes" -msgstr "Abrir Escena" +msgstr "Abrir Escenas" #: editor/filesystem_dock.cpp msgid "Instance" msgstr "Instancia" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Add to Favorites" -msgstr "Agregar a favoritos" +msgstr "Agregar a Favoritos" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Remove from Favorites" -msgstr "Quitar de favoritos" +msgstr "Quitar de Favoritos" #: editor/filesystem_dock.cpp msgid "Edit Dependencies..." @@ -3601,23 +3604,20 @@ msgid "Rename" msgstr "Renombrar" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Previous Folder/File" -msgstr "Carpeta Anterior" +msgstr "Carpeta/Archivo Anterior" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Next Folder/File" -msgstr "Carpeta Siguiente" +msgstr "Carpeta/Archivo Siguiente" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" msgstr "Reexaminar Sistema de Archivos" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Toggle Split Mode" -msgstr "Act/Desact. Modo Partido" +msgstr "Act/Desact. Modo Dividido" #: editor/filesystem_dock.cpp msgid "Search files" @@ -3668,6 +3668,8 @@ msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." msgstr "" +"Incluye los archivos con las siguientes extensiones. Agregalos o eliminalos " +"en Ajustes del proyecto." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3719,6 +3721,7 @@ msgid "Nodes not in Group" msgstr "Nodos fuera del Grupo" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtrar nodos" @@ -4108,9 +4111,8 @@ msgid "Open Animation Node" msgstr "Abrir Nodo de Animación" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "El triángulo ya existe" +msgstr "El triángulo ya existe." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Add Triangle" @@ -4258,9 +4260,8 @@ msgid "Edit Filtered Tracks:" msgstr "Editar Pistas Filtradas:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Enable Filtering" -msgstr "Habilitar filtrado" +msgstr "Habilitar Filtrado" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -4396,9 +4397,8 @@ msgid "Enable Onion Skinning" msgstr "Activar Onion Skinning" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Onion Skinning Options" -msgstr "Papel Cebolla" +msgstr "Opciones de Papel Cebolla" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" @@ -4773,6 +4773,10 @@ msgid "Idle" msgstr "Desocupado" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Instalar..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Reintentar" @@ -4801,7 +4805,6 @@ msgid "Last" msgstr "Ultimo" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Todos" @@ -4815,8 +4818,8 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Invertir" +msgid "Reverse sorting." +msgstr "Orden inverso." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4897,32 +4900,32 @@ msgid "Rotation Step:" msgstr "Step de Rotación:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "Mover guÃa vertical" +msgid "Move Vertical Guide" +msgstr "Mover GuÃa Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "Crear nueva guÃa vertical" +msgid "Create Vertical Guide" +msgstr "Crear GuÃa Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "Quitar guÃa vertical" +msgid "Remove Vertical Guide" +msgstr "Eliminar GuÃa Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "Mover guÃa horizontal" +msgid "Move Horizontal Guide" +msgstr "Mover GuÃa Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "Crear nueva guÃa horizontal" +msgid "Create Horizontal Guide" +msgstr "Crear GuÃa Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "Quitar guÃa horizontal" +msgid "Remove Horizontal Guide" +msgstr "Eliminar GuÃa Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "Crear nuevas guÃas horizontales y verticales" +msgid "Create Horizontal and Vertical Guides" +msgstr "Crear GuÃas Horizontales y Verticales" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -4965,6 +4968,8 @@ msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" +"Cuando está activo, mover nodos Control cambia sus anclajes en vez de sus " +"márgenes." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -4980,41 +4985,35 @@ msgstr "Cambiar Anclas" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected" -msgstr "Seleccionar Herramienta" +msgstr "Bloqueo Seleccionado" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected" -msgstr "Eliminar Seleccionados" +msgstr "Desbloquear Seleccionados" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected" -msgstr "Copiar Selección" +msgstr "Agrupar Seleccionados" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected" -msgstr "Copiar Selección" +msgstr "Desagrupar Seleccionados" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" msgstr "Pegar Pose" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "Crear Hueso(s) Personalizados a partir de Nodo(s)" +msgstr "Crear Hueso(s) Personalizado(s) a partir de Nodo(s)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "Restablecer Pose" +msgstr "Restablecer Huesos" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -5102,9 +5101,8 @@ msgid "Snapping Options" msgstr "Opciones de Alineado" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Grid" -msgstr "Alinear a la grilla" +msgstr "Ajustar a la Grilla" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" @@ -5124,39 +5122,32 @@ msgid "Use Pixel Snap" msgstr "Usar Pixel Snap" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Smart Snapping" -msgstr "Alineado inteligente" +msgstr "Ajuste inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Parent" -msgstr "Alinear al Padre" +msgstr "Ajustar al Padre" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" -msgstr "Alinear al ancla de nodo" +msgstr "Ajustar al Ancla de Nodo" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" -msgstr "Alinear a los lados del nodo" +msgstr "Ajustar a los Lados del Nodo" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" -msgstr "Alinear al centro del nodo" +msgstr "Ajustar al Centro del Nodo" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" -msgstr "Alinear a otros nodos" +msgstr "Ajustar a Otros Nodos" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Guides" -msgstr "Alinear a guÃas" +msgstr "Ajustar a las GuÃas" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5237,9 +5228,8 @@ msgid "Frame Selection" msgstr "Encuadrar Selección" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Preview Canvas Scale" -msgstr "Vista Previa de Atlas" +msgstr "Vista Previa de Escala de Canvas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -5295,9 +5285,8 @@ msgid "Divide grid step by 2" msgstr "Dividir step de grilla por 2" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Pan View" -msgstr "Vista Anterior" +msgstr "Panear Vista" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -5322,9 +5311,8 @@ msgid "Error instancing scene from %s" msgstr "Error al instanciar escena desde %s" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Default Type" -msgstr "Cambiar typo por defecto" +msgstr "Cambiar Tipo por Defecto" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5369,9 +5357,8 @@ msgstr "Cargar Máscara de Emisión" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Reiniciar Ahora" +msgstr "Reiniciar" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5419,14 +5406,12 @@ msgid "Create Emission Points From Node" msgstr "Crear Puntos de Emisión Desde Nodo" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 0" -msgstr "Flat0" +msgstr "Flat 0" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 1" -msgstr "Flat1" +msgstr "Flat 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -5453,29 +5438,24 @@ msgid "Load Curve Preset" msgstr "Cargar Preset de Curva" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add Point" -msgstr "Agregar punto" +msgstr "Agregar Punto" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Point" -msgstr "Quitar punto" +msgstr "Quitar Punto" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left Linear" -msgstr "Lineal izquierda" +msgstr "Lineal Izquierda" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right Linear" -msgstr "Lineal derecha" +msgstr "Lineal Derecha" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Preset" -msgstr "Cargar preset" +msgstr "Cargar Preset" #: editor/plugins/curve_editor_plugin.cpp msgid "Remove Curve Point" @@ -5530,13 +5510,12 @@ msgid "This doesn't work on scene root!" msgstr "Esto no funciona en una escena raiz!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Trimesh Static Shape" -msgstr "Crear Trimesh Shape" +msgstr "Crear Trimesh Static Shape" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Failed creating shapes!" -msgstr "" +msgstr "¡Fallo al crear shapes!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Convex Shape(s)" @@ -5596,9 +5575,8 @@ msgid "Create Trimesh Collision Sibling" msgstr "Crear Trimesh Collision Sibling" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Convex Collision Sibling(s)" -msgstr "Crear Collision Sibling Convexo" +msgstr "Crear Convex Collision Hemano(s)" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -5959,9 +5937,8 @@ msgid "Split Segment (in curve)" msgstr "Partir Segmento (en curva)" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" -msgstr "Mover unión" +msgstr "Mover Unión" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" @@ -6294,18 +6271,16 @@ msgid "Find Next" msgstr "Encontrar Siguiente" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Filtrar propiedades" +msgstr "Filtrar scripts" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Alternar la ordenación alfabética de la lista de métodos." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Filtrar modo:" +msgstr "Filtrar métodos" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6418,18 +6393,16 @@ msgid "Debug with External Editor" msgstr "Depurar con Editor Externo" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open Godot online documentation." -msgstr "Abrir la documentación online de Godot" +msgstr "Abrir la documentación en lÃnea de Godot." #: editor/plugins/script_editor_plugin.cpp msgid "Request Docs" msgstr "Solicitar Docum." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Help improve the Godot documentation by giving feedback." -msgstr "Ayudá a mejorar la documentación de Godot dando feedback" +msgstr "Ayudá a mejorar la documentación de Godot dando feedback." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." @@ -6474,29 +6447,27 @@ msgid "Search Results" msgstr "Resultados de la Búsqueda" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Connections to method:" -msgstr "Conectar a Nodo:" +msgstr "Conexiones al método:" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Source" -msgstr "Fuente:" +msgstr "Fuente" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" -msgstr "Señales" +msgstr "Señal" #: editor/plugins/script_text_editor.cpp msgid "Target" msgstr "Objetivo" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." -msgstr "Nada conectado a la entrada '%s' del nodo '%s'." +msgstr "" +"No se encuentra el método conectado '%s' para la señal '%s' del nodo '%s' al " +"nodo '%s'." #: editor/plugins/script_text_editor.cpp msgid "Line" @@ -6543,9 +6514,17 @@ msgid "Syntax Highlighter" msgstr "Resaltador de Sintaxis" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Ir A" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" -msgstr "" +msgstr "Marcadores" + +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Puntos de interrupción" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -6569,24 +6548,20 @@ msgid "Toggle Comment" msgstr "Act/Desact. Comentario" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Toggle Bookmark" -msgstr "Act./Desact. Vista Libre" +msgstr "Act./Desact. Marcador" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Bookmark" -msgstr "Ir al Breakpoint Siguiente" +msgstr "Ir al Siguiente Marcador" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Bookmark" -msgstr "Ir al Breakpoint Anterior" +msgstr "Ir al Marcador Anterior" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Remove All Bookmarks" -msgstr "Quitar Todos los Ãtems" +msgstr "Eliminar Todos los Marcadores" #: editor/plugins/script_text_editor.cpp msgid "Fold/Unfold Line" @@ -6662,13 +6637,12 @@ msgid "Contextual Help" msgstr "Ayuda Contextual" #: editor/plugins/shader_editor_plugin.cpp -#, fuzzy msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" -"Los siguientes archivos son nuevos en disco.\n" -"¿Qué acción se deberÃa tomar?:" +"Este shader ha sido modificado en disco.\n" +"¿Qué acciones deben tomarse?" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" @@ -6748,7 +6722,7 @@ msgstr "Escalando: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Translating: " -msgstr "Trasladando: " +msgstr "Trasladar: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -6839,9 +6813,15 @@ msgid "Rear" msgstr "Detrás" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinear con Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinear Selección Con Vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "No hay padre al que instanciarle un hijo." @@ -7013,9 +6993,8 @@ msgid "Right View" msgstr "Vista Derecha" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Switch Perspective/Orthogonal View" -msgstr "Intercambiar entre vista Perspectiva/Orthogonal" +msgstr "Intercambiar entre Vista Perspectiva/Orthogonal" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" @@ -7030,10 +7009,6 @@ msgid "Focus Selection" msgstr "Foco en Selección" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinear Selección Con Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Seleccionar Herramienta" @@ -7059,9 +7034,8 @@ msgid "Transform" msgstr "Transform" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Object to Floor" -msgstr "Ajustar objeto al suelo" +msgstr "Ajustar Objeto al Suelo" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." @@ -7305,13 +7279,12 @@ msgid "Animation Frames:" msgstr "Fotogramas de animación:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add a Texture from File" -msgstr "Agregar Textura(s) al TileSet." +msgstr "Añadir Textura desde Archivo" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "" +msgstr "Añadir Frames desde un Sprite Sheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -7330,29 +7303,24 @@ msgid "Move (After)" msgstr "Mover (Despues)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" -msgstr "Frames del Stack" +msgstr "Seleccionar Frames" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Horizontal:" -msgstr "Espejar horizontalmente" +msgstr "Horizontal:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Vertical:" -msgstr "Vértices" +msgstr "Vertical:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select/Clear All Frames" -msgstr "Seleccionar Todo" +msgstr "Seleccionar/Reestablecer Todos los Frames" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Create Frames from Sprite Sheet" -msgstr "Crear desde Escena" +msgstr "Crear Frames a partir de Sprite Sheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" @@ -7424,9 +7392,8 @@ msgid "Remove All" msgstr "Quitar Todos" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "Editar tema..." +msgstr "Editar Tema" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." @@ -7453,23 +7420,20 @@ msgid "Create From Current Editor Theme" msgstr "Crear Desde Tema de Editor Actual" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Toggle Button" -msgstr "Botón de Mouse" +msgstr "Botón de Conmutación" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Button" -msgstr "Botón del Medio" +msgstr "Botón Desactivado" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" msgstr "Ãtem" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Item" -msgstr "Desactivado" +msgstr "Desactivar Ãtem" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" @@ -7489,21 +7453,19 @@ msgstr "Radio Ãtem Tildado" #: editor/plugins/theme_editor_plugin.cpp msgid "Named Sep." -msgstr "" +msgstr "Separador con nombre." #: editor/plugins/theme_editor_plugin.cpp msgid "Submenu" -msgstr "" +msgstr "Submenú" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Item 1" -msgstr "Item" +msgstr "Ãtem 1" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Item 2" -msgstr "Item" +msgstr "Ãtem 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" @@ -7514,9 +7476,8 @@ msgid "Many" msgstr "Muchas" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled LineEdit" -msgstr "Desactivado" +msgstr "LineEdit Desactivado" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" @@ -7531,9 +7492,8 @@ msgid "Tab 3" msgstr "Tab 3" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Editable Item" -msgstr "Hijos Editables" +msgstr "Ãtem Editable" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" @@ -7609,21 +7569,12 @@ msgid "Transpose" msgstr "Transponer" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Espejar X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Espejar Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "Desactivar Autotile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Enable Priority" -msgstr "Editar Prioridad de Tile" +msgstr "Activar Prioridad" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" @@ -7634,35 +7585,32 @@ msgid "" "Shift+RMB: Line Draw\n" "Shift+Ctrl+RMB: Rectangle Paint" msgstr "" +"Shift + Clic derecho: Dibujar lÃnea\n" +"Shift + Ctrl + Clic derecho: Pintar Rectángulo" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" msgstr "Elegir Tile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Left" -msgstr "Rotar a la izquierda" +msgstr "Rotar a la Izquierda" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Right" -msgstr "Rotar a la derecha" +msgstr "Rotar a la Derecha" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Horizontally" -msgstr "Espejar horizontalmente" +msgstr "Espejar Horizontalmente" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Vertically" -msgstr "Espejar verticalmente" +msgstr "Espejar Verticalmente" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Clear Transform" -msgstr "Reestablecer transform" +msgstr "Reestablecer Transform" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." @@ -7697,44 +7645,36 @@ msgid "Select the previous shape, subtile, or Tile." msgstr "Seleccionar la forma, subtile o Tile anterior." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Region Mode" -msgstr "Modo de Ejecución:" +msgstr "Modo Región" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision Mode" -msgstr "Modo de Interpolación" +msgstr "Modo Colisión" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion Mode" -msgstr "Editar PolÃgono de Oclusión" +msgstr "Modo Oclusión" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Mode" -msgstr "Crear Mesh de Navegación" +msgstr "Modo Navegación" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "Modo Rotar" +msgstr "Modo Bitmask" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority Mode" -msgstr "Modo de Exportación:" +msgstr "Modo Prioridad" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "Modo Paneo" +msgstr "Modo Icono" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Z Index Mode" -msgstr "Modo Paneo" +msgstr "Modo Ãndice Z" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." @@ -7818,16 +7758,16 @@ msgid "Delete polygon." msgstr "Eliminar polÃgono." #: 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 "" -"Click izq: Activar bit.\n" -"Click der: Desactivar bit.\n" -"Click en otro Tile para editarlo." +"Clic Izquierdo: Activar bit.\n" +"Clic Derecho: Desactivar bit.\n" +"Shift + Clic Izquierdo: Establecer valor de bit comodÃn.\n" +"Hacé clic en otro Tile para editarlo." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -7940,76 +7880,64 @@ msgid "TileSet" msgstr "TileSet" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input +" -msgstr "Agregar Entrada" +msgstr "Añadir entrada +" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add output +" -msgstr "Agregar Entrada" +msgstr "Añadir salida +" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar" msgstr "Escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector" -msgstr "Inspector" +msgstr "Vector" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" -msgstr "" +msgstr "Booleano" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input port" -msgstr "Agregar Entrada" +msgstr "Agregar puerto de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" -msgstr "" +msgstr "Añadir puerto de salida" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port type" -msgstr "Cambiar typo por defecto" +msgstr "Cambiar tipo de puerto de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port type" -msgstr "Cambiar typo por defecto" +msgstr "Cambiar tipo de puerto de salida" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port name" -msgstr "Cambiar Nombre de Entrada" +msgstr "Cambiar nombre del puerto de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port name" -msgstr "Cambiar Nombre de Entrada" +msgstr "Cambiar nombre del puerto de salida" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove input port" -msgstr "Quitar punto" +msgstr "Eliminar puerto de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove output port" -msgstr "Quitar punto" +msgstr "Eliminar puerto de salida" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set expression" -msgstr "Cambiar Expresión" +msgstr "Establecer expresión" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Resize VisualShader node" -msgstr "VisualShader" +msgstr "Redimensionar nodo VisualShader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" @@ -8036,6 +7964,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Se cambió el Tipo de Entrada de Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(Sólo GLES3)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vértice" @@ -8048,320 +7980,371 @@ msgid "Light" msgstr "Luz" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Create Shader Node" -msgstr "Crear Nodo" +msgstr "Crear Nodo Shader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color function." -msgstr "Ir a Función" +msgstr "Función Color." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." -msgstr "" +msgstr "Operador Color." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." -msgstr "Crear Función" +msgstr "Función Escala de Grises." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." -msgstr "" +msgstr "Convertir vector HSV a equivalente RGB." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts RGB vector to HSV equivalent." -msgstr "" +msgstr "Convertir vector RGB a equivalente HSV." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "Renombrar Función" +msgstr "Función Sepia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." -msgstr "" +msgstr "Operador Burn(subexponer)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Darken operator." -msgstr "" +msgstr "Operador Darken(oscurecer)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Difference operator." -msgstr "Solo Diferencias" +msgstr "Operador Difference(diferencia)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "" +msgstr "Operador Dodge(sobreexponer)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "HardLight operator" -msgstr "" +msgstr "Operador HardLight(luz fuerte)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." -msgstr "" +msgstr "Operador Lighten(aclarar)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." -msgstr "" +msgstr "Operador Overlay(superponer)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Screen operator." -msgstr "" +msgstr "Operador Screen(trama)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "" +msgstr "Operador SoftLight(luz suave)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color constant." -msgstr "Constante" +msgstr "Constante de color." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color uniform." -msgstr "Reestablecer transform" +msgstr "Color uniforme." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" +"Devuelve el resultado booleano de la comparación de %s entre dos parámetros." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "Igual (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "Mayor Que (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "Mayor o Igual Que (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." msgstr "" +"Devuelve un vector asociado si los escalares proporcionados son iguales, " +"mayores o menores." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" +"Devuelve el resultado booleano de la comparación entre INF y un parámetro " +"escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" +"Devuelve el resultado booleano de la comparación entre NaN y un parámetro " +"escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "Menor Que (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "Menor o Igual Que (<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "No igual (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" +"Devuelve un vector asociado si el valor booleano proporcionado es verdadero " +"o falso." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Devuelve el resultado booleano de la comparación entre dos parámetros." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"Devuelve el resultado booleano de la comparación entre INF (o NaN) y un " +"parámetro escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Boolean constant." -msgstr "Cambiar Constante Vec." +msgstr "Constante booleana." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." -msgstr "" +msgstr "Uniform booleano." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for all shader modes." -msgstr "" +msgstr "Parámetro de entrada %s' para todos los modos de shader." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "Alinear al Padre" +msgstr "Parámetro de entrada." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "" +msgstr "Parámetro de entrada '%s' para modos vertex y fragment shader." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "" +msgstr "Parámetro de entrada '%s' para modos fragment y light shader." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." -msgstr "" +msgstr "Parámetro de entrada '%s' para modo fragment shader." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for light shader mode." -msgstr "" +msgstr "Parámetro de entrada '%s' para modo light shader." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "Parámetro de entrada '%s' para modo vertex shader." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "" +msgstr "Parámetro de entrada '%s' para modos vertex y fragment shader." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar function." -msgstr "Cambiar Función Escalar" +msgstr "Función Escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar operator." -msgstr "Cambiar Operador Escalar" +msgstr "Operador Escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." -msgstr "" +msgstr "Constante E (2.718282). Representa la base del logaritmo natural." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "Constante de Épsilon (0.00001). El número escalar más pequeño posible." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "Constante Phi (1.618034). Proporcion áurea." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "Constante Pi/4 (0.785398) o 45 grados." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "Constante Pi/2 (1.570796) o 90 grados." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "Constante Pi (3.141593) o 180 grados." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "Constante Tau (6.283185) o 360 grados." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." -msgstr "" +msgstr "Constante Sqrt2 (1.414214). RaÃz cuadrada de 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "" +msgstr "Devuelve el valor absoluto del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." -msgstr "" +msgstr "Devuelve el arcocoseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "" +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "Devuelve el coseno hiperbólico inverso del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." -msgstr "" +msgstr "Devuelve el arcoseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "" +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "Devuelve el seno hiperbólico inverso del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." -msgstr "" +msgstr "Devuelve el arcotangente del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameters." -msgstr "" +msgstr "Devuelve el arcotangente de los parámetros." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "" +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "Devuelve la tangente hiperbólica inversa del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "" +msgstr "Encuentra el entero más cercano mayor o igual que el parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." -msgstr "" +msgstr "Limita un valor a estar entre dos valores más." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." -msgstr "" +msgstr "Devuelve el coseno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "" +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "Devuelve el coseno hiperbólico del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "" +msgstr "Convierte una cantidad en radianes a grados." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." -msgstr "" +msgstr "Exponencial en base e." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 Exponential." -msgstr "" +msgstr "Exponencial en base 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "" +msgstr "Encuentra el número entero más cercano menor o igual que el parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "Calcula la parte fraccional del argumento." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." -msgstr "" +msgstr "Devuelve el inverso de la raÃz cuadrada del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." -msgstr "" +msgstr "Logaritmo natural." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 logarithm." -msgstr "" +msgstr "Logaritmo de la base 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "Devuelve el mayor de dos valores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "Devuelve el menor de dos valores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "" +msgstr "Interpolación lineal entre dos escalares." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "Devuelve el valor opuesto del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" -msgstr "" +msgstr "1.0 - escalar" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." msgstr "" +"Devuelve el valor del primer parámetro elevado a la potencia del segundo." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "Convierte una cantidad de grados a radianes." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" -msgstr "" +msgstr "1.0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "" +msgid "Finds the nearest integer to the parameter." +msgstr "Encuentra el entero más cercano al parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "" +msgid "Finds the nearest even integer to the parameter." +msgstr "Encuentra el entero más cercano al parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "Ajusta el valor entre 0.0 y 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "Extrae el signo del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "Devuelve el seno del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "" +msgid "Returns the hyperbolic sine of the parameter." +msgstr "Devuelve el seno hiperbólico del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "Devuelve la raÃz cuadrada del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8371,6 +8354,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Devuelve 0.0 si 'x' es menor que 'edge0' y 1.0 si x es mayor que 'edge1'. De " +"lo contrario, el valor de retorno se interpola entre 0.0 y 1.0 utilizando " +"polinomios de Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8378,75 +8366,77 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Step function( scalar(edge), scalar(x) ).\n" +"\n" +"Devuelve 0.0 si 'x' es menor que 'edge' y en caso contrario devuelve 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "Devuelve la tangente del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "" +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "Devuelve la tangente hiperbólica del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "" +msgid "Finds the truncated value of the parameter." +msgstr "Encuentra el valor truncado del parámetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." -msgstr "" +msgstr "Añade escalar a escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "Divide escalar por escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "Multiplica escalar por escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." -msgstr "" +msgstr "Devuelve el resto de dos escalares." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." -msgstr "" +msgstr "Resta escalar de escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar constant." -msgstr "Cambiar Constante Escalar" +msgstr "Constante escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar uniform." -msgstr "Cambiar Uniforme Escalar" +msgstr "Uniform escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "Realiza una búsqueda de texturas cúbicas." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." -msgstr "" +msgstr "Realiza una búsqueda de texturas." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy -msgid "Cubic texture uniform." -msgstr "Cambiar Uniforme Textura" +msgid "Cubic texture uniform lookup." +msgstr "Búsqueda en uniform de textura cúbica." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy -msgid "2D texture uniform." -msgstr "Cambiar Uniforme Textura" +msgid "2D texture uniform lookup." +msgstr "Búsqueda en uniform de textura 2D." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." +msgstr "Búsqueda en uniform de textura 2D con triplanar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform function." -msgstr "Cuadro de diálogo de Transform..." +msgstr "Función Transform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8454,112 +8444,122 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" +"Calcula el producto exterior de un par de vectores.\n" +"\n" +"OuterProduct trata el primer parámetro 'c' como un vector de columna (matriz " +"con una columna) y el segundo parámetro 'r' como un vector de fila (matriz " +"con una fila) y multiplica una matriz algebraica lineal 'c * r', dando como " +"resultado una matriz cuyo número de filas es el número de componentes en 'c' " +"y cuyo número de columnas es el número de componentes en 'r'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." -msgstr "" +msgstr "Compone un transform a partir de cuatro vectores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes transform to four vectors." -msgstr "" +msgstr "Descompone un transform en cuatro vectores." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "" +msgid "Calculates the determinant of a transform." +msgstr "Calcula la determinante de un transform." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "" +msgid "Calculates the inverse of a transform." +msgstr "Calcula el inverso de un transform." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "" +msgid "Calculates the transpose of a transform." +msgstr "Calcula la transposición de un transform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." -msgstr "" +msgstr "Multiplica transform por transform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by transform." -msgstr "" +msgstr "Multiplica vector por transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "Transformación Abortada." +msgstr "Constante transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "Transformación Abortada." +msgstr "Uniform de transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Asignación a función." +msgstr "Función Vector." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector operator." -msgstr "Cambiar Operador Vec." +msgstr "Operador vector." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." -msgstr "" +msgstr "Compone vector a partir de tres escalares." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes vector to three scalars." -msgstr "" +msgstr "Descompone vector a tres escalares." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "" +msgstr "Calcula el producto cruzado de dos vectores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "" +msgstr "Devuelve la distancia entre dos puntos." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." -msgstr "" +msgstr "Calcula el producto punto de dos vectores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" +"Devuelve el vector que apunta en la misma dirección que un vector de " +"referencia. La función tiene tres parámetros vectoriales: N, el vector a " +"orientar, I, el vector incidente, y Nref, el vector de referencia. Si el " +"producto de punto de I y Nref es menor que cero, el valor de retorno es N. " +"De lo contrario, se devuelve -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." -msgstr "" +msgstr "Calcula la longitud de un vector." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors." -msgstr "" +msgstr "Interpolación lineal entre dos vectores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." -msgstr "" +msgstr "Calcula el producto normalizado del vector." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - vector" -msgstr "" +msgstr "1.0 - vector" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / vector" -msgstr "" +msgstr "1.0 / vector" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" +"Devuelve el vector que apunta en la dirección de reflexión ( a : vector " +"incidente, b : vector normal)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." -msgstr "" +msgid "Returns the vector that points in the direction of refraction." +msgstr "Devuelve el vector que apunta en la dirección de refracción." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8569,6 +8569,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" +"\n" +"Devuelve 0.0 si 'x' es menor que 'edge0' y 1.0 si 'x' es mayor que 'edge1'. " +"De lo contrario, el valor de retorno se interpola entre 0.0 y 1.0 utilizando " +"polinomios de Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8578,6 +8583,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" +"\n" +"Devuelve 0.0 si 'x' es menor que 'edge0' y 1.0 si 'x' es mayor que 'edge1'. " +"De lo contrario, el valor de retorno se interpola entre 0.0 y 1.0 utilizando " +"polinomios de Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8585,6 +8595,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Step function( vector(edge), vector(x) ).\n" +"\n" +"Devuelve 0.0 si 'x' es menor que 'edge' y 1.0 en caso contrario." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8592,36 +8605,37 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Step function( scalar(edge), vector(x) ).\n" +"\n" +"Devuelve 0.0 si 'x' es menor que 'edge' y 1.0 en caso contrario." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." -msgstr "" +msgstr "Suma vector a vector." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "" +msgstr "Divide vector por vector." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." -msgstr "" +msgstr "Multiplica vector por vector." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two vectors." -msgstr "" +msgstr "Devuelve el resto de los dos vectores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts vector from vector." -msgstr "" +msgstr "Sustrae vector de vector." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector constant." -msgstr "Cambiar Constante Vec." +msgstr "Constante vectorial." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "Asignación a uniform." +msgstr "Uniform vectorial." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8629,56 +8643,73 @@ msgid "" "output ports. This is a direct injection of code into the vertex/fragment/" "light function, do not use it to write the function declarations inside." msgstr "" +"Expresión personalizada del lenguaje de shaders de Godot, con una cantidad " +"determinada de puertos de entrada y salida. Esta es una inyección directa de " +"código en la función vertex/fragment/light, no la uses para escribir " +"declaraciones de funciones en su interior." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns falloff based on the dot product of surface normal and view " "direction of camera (pass associated inputs to it)." msgstr "" +"Devuelve el falloff en base al producto punto de la superficie normal y la " +"dirección de vista de la camara ( pasale los puntos asociados)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "" +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(Sólo modo Fragmento/Luz) Función derivada escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "" +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(Sólo modo Fragmento/Luz) Función derivada vectorial." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" +"(Sólo modo Fragmento/Luz) (Vector) Derivada en 'x' utilizando diferenciación " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" +"(Sólo modo Fragmento/Luz) (Escalar) Derivada en 'x' utilizando " +"diferenciación local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" +"(Sólo modo Fragmento/Luz) (Vector) Derivada en 'y' utilizando diferenciación " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" +"(Sólo modo Fragmento/Luz) (Escalar) Derivada en 'y' utilizando " +"diferenciación local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(Sólo modo Fragmento/Luz) (Vector) Suma de la derivada absoluta en 'x' e 'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(Sólo modo Fragmento/Luz) (Escalar) Suma de la derivada absoluta en 'x' e " +"'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -8690,7 +8721,7 @@ msgstr "Editar Propiedad Visual" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" -msgstr "Se cambió el Modo de Visual Shader" +msgstr "Cambiar Modo de Visual Shader" #: editor/project_export.cpp msgid "Runnable" @@ -9022,7 +9053,6 @@ msgid "Are you sure to open more than one project?" msgstr "¿Estás seguro/a que quieres abrir más de un proyecto?" #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file does not specify the version of Godot " "through which it was created.\n" @@ -9045,7 +9075,6 @@ msgstr "" "anteriores del motor." #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file was generated by an older engine " "version, and needs to be converted for this version:\n" @@ -9056,12 +9085,12 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" -"Las siguientes configuraciones de proyecto fueron generadas para una versión " -"anterior del motor, y deben ser convertidas para esta versión:\n" +"El siguiente archivo de configuración de proyecto fue generado por una " +"versión anterior del motor, y debe se convertido para esta versión:\n" "\n" "%s\n" "\n" -"¿Querés convertirlas?\n" +"¿Querés convertirlo?\n" "Advertencia: No vas a poder volver a abrir el proyecto con versiones " "anteriores del motor." @@ -9074,15 +9103,14 @@ msgstr "" "del motor y no son compatibles con esta versión." #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" -"No sé puede ejecutar el proyecto: No se ha definido ninguna escena " +"No se puede ejecutar el proyecto: No se ha definido ninguna escena " "principal.\n" -"Por favor editá el proyecto y seteá la escena principal en \"Ajustes de " +"Por favor editá el proyecto y asigná la escena principal en \"Ajustes de " "Proyecto\" bajo la categorÃa 'Aplicación'." #: editor/project_manager.cpp @@ -9094,55 +9122,50 @@ msgstr "" "Por favor editá el proyecto para provocar la importación inicial." #: editor/project_manager.cpp -#, fuzzy msgid "Are you sure to run %d projects at once?" -msgstr "¿Estás seguro/a que quieres ejecutar más de un proyecto?" +msgstr "¿Estás seguro/a que querés ejecutar %d proyectos a la vez?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." msgstr "" -"¿Quitar proyecto de la lista? (Los contenidos de la carpeta no serán " -"modificados)" +"¿Quitar %d proyectos de la lista?\n" +"El contenido de las carpetas de proyecto no será modificado." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." msgstr "" -"¿Quitar proyecto de la lista? (Los contenidos de la carpeta no serán " -"modificados)" +"¿Quitar este proyecto de la lista?\n" +"El contenido de la carpeta de proyecto no será modificado." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list? (Folders contents will not be " "modified)" msgstr "" -"¿Quitar proyecto de la lista? (Los contenidos de la carpeta no serán " -"modificados)" +"¿Eliminar todos los proyectos faltantes de la lista? (El contenido de las " +"carpetas no se modificará)" #: editor/project_manager.cpp -#, fuzzy msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." msgstr "" "Lenguaje cambiado.\n" -"La interfaz de usuario se actualizara la próxima vez que el editor o gestor " -"de proyectos inicie." +"La interfaz de usuario se actualizara luego de reiniciar el editor o gestor " +"de proyectos." #: editor/project_manager.cpp -#, fuzzy msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." msgstr "" -"Estás a punto de examinar %s carpetas en busca de proyectos de Godot. " -"¿Confirmar?" +"¿Estás seguro de querer examinar %s carpetas en busca de proyectos de Godot " +"existentes?\n" +"PodrÃa demorar un rato." #: editor/project_manager.cpp msgid "Project Manager" @@ -9165,9 +9188,8 @@ msgid "New Project" msgstr "Proyecto Nuevo" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Quitar punto" +msgstr "Eliminar Faltantes" #: editor/project_manager.cpp msgid "Templates" @@ -9186,13 +9208,12 @@ msgid "Can't run project" msgstr "No se puede ejecutar el proyecto" #: editor/project_manager.cpp -#, fuzzy msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" -"Actualmente no tenés ningun proyecto.\n" -"Te gustarÃa explorar los ejemplos oficiales en la Biblioteca de Assets?" +"Actualmente no tenés ningún proyecto.\n" +"¿Te gustarÃa explorar los ejemplos oficiales en la Biblioteca de Assets?" #: editor/project_settings_editor.cpp msgid "Key " @@ -9219,9 +9240,8 @@ msgstr "" "'\\' o '\"'" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "La acción '%s' ya existe!" +msgstr "Ya existe una acción con el nombre '%s'." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -9440,9 +9460,8 @@ msgid "Override For..." msgstr "Sobreescribir Para..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -#, fuzzy msgid "The editor must be restarted for changes to take effect." -msgstr "Se debe reiniciar el editor para que los cambios surtan efecto" +msgstr "Debe reiniciarse el editor para que los cambios surtan efecto." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -9501,14 +9520,12 @@ msgid "Locales Filter" msgstr "Filtro de Locales" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" -msgstr "Mostrar todos los locales" +msgstr "Mostrar Todas las Localizaciones" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" -msgstr "Mostrar solo los locales seleccionados" +msgstr "Mostrar Sólo las Localizaciones Seleccionadas" #: editor/project_settings_editor.cpp msgid "Filter mode:" @@ -9596,9 +9613,8 @@ msgid "Suffix" msgstr "Sufijo" #: editor/rename_dialog.cpp -#, fuzzy msgid "Advanced Options" -msgstr "Opciones avanzadas" +msgstr "Opciones Avanzadas" #: editor/rename_dialog.cpp msgid "Substitute" @@ -9859,9 +9875,8 @@ msgid "User Interface" msgstr "Interfaz de Usuario" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" -msgstr "Eliminar Nodo" +msgstr "Otro Nodo" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -9905,18 +9920,16 @@ msgid "Clear Inheritance" msgstr "Limpiar Herencia" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" -msgstr "Abrir documentación" +msgstr "Abrir Documentación" #: editor/scene_tree_dock.cpp msgid "Add Child Node" msgstr "Agregar Nodo Hijo" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "Colapsar Todos" +msgstr "Expandir/Colapsar Todo" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9927,6 +9940,11 @@ msgid "Extend Script" msgstr "Extender Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Reemparentar Nodo" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Convertir en RaÃz de Escena" @@ -9947,9 +9965,8 @@ msgid "Delete (No Confirm)" msgstr "Eliminar (Sin Confirmación)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Agregar/Crear un Nuevo Nodo" +msgstr "Añadir/Crear un Nuevo Nodo." #: editor/scene_tree_dock.cpp msgid "" @@ -9984,19 +10001,16 @@ msgid "Toggle Visible" msgstr "Act/Desact. Visible" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Unlock Node" -msgstr "Seleccionar Nodo" +msgstr "Desbloquear Nodo" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Button Group" -msgstr "Botón 7" +msgstr "Grupo de Botones" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "(Connecting From)" -msgstr "Error de Conexión" +msgstr "(Conectando Desde)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" @@ -10027,9 +10041,8 @@ msgstr "" "Click para mostrar el panel de grupos." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "Abrir Script" +msgstr "Abrir Script:" #: editor/scene_tree_editor.cpp msgid "" @@ -10081,39 +10094,32 @@ msgid "Select a Node" msgstr "Seleccionar un Nodo" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "La ruta está vacÃa" +msgstr "La ruta está vacÃa." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "Nombre de archivo vacio" +msgstr "El nombre del archivo está vacÃo." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is not local." -msgstr "La ruta no es local" +msgstr "La ruta no es local." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid base path." -msgstr "Ruta base inválida" +msgstr "Ruta base inválida." #: editor/script_create_dialog.cpp -#, fuzzy msgid "A directory with the same name exists." -msgstr "Existe un directorio con el mismo nombre" +msgstr "Existe un directorio con el mismo nombre." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid extension." -msgstr "Extensión invalida" +msgstr "Extensión inválida." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Wrong extension chosen." -msgstr "Extensión incorrecta elegida" +msgstr "Extensión incorrecta elegida." #: editor/script_create_dialog.cpp msgid "Error loading template '%s'" @@ -10132,52 +10138,44 @@ msgid "N/A" msgstr "N/A" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" -msgstr "Abrir Script/Elegir Ubicación" +msgstr "Abrir Script / Seleccionar Ubicación" #: editor/script_create_dialog.cpp msgid "Open Script" msgstr "Abrir Script" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, it will be reused." -msgstr "El archivo existe, será reutilizado" +msgstr "El archivo existe, será reutilizado." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." -msgstr "Nombre de clase inválido" +msgstr "Nombre de clase inválido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path." -msgstr "Ruta o nombre del padre heredado inválido" +msgstr "Ruta o nombre del padre heredado inválido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script is valid." -msgstr "Script válido" +msgstr "El script es válido." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "Permitidos: a-z, A-Z, 0-9 y _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "Permitido: a-z, A-Z, 0-9, _ y ." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in script (into scene file)." -msgstr "Script Integrado (dentro del archivo de escena)" +msgstr "Script Integrado (dentro del archivo de escena)." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "Crear script nuevo" +msgstr "Se creará un nuevo archivo de script." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "Cargar script existente" +msgstr "Se cargará un archivo de script existente." #: editor/script_create_dialog.cpp msgid "Language" @@ -10219,7 +10217,7 @@ msgstr "Stack Trace" msgid "Pick one or more items from the list to display the graph." msgstr "Elegir uno o mas items de la lista para mostrar el gráfico." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Errores" @@ -10309,7 +10307,7 @@ msgstr "Setear Desde Arbol" #: editor/script_editor_debugger.cpp msgid "Export measures as CSV" -msgstr "" +msgstr "Exportar medidas como CSV" #: editor/settings_config_dialog.cpp msgid "Erase Shortcut" @@ -10441,12 +10439,11 @@ msgstr "GDNativeLibrary" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" -msgstr "" +msgstr "Activar Singleton GDNative" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Disabled GDNative Singleton" -msgstr "Desactivar Update Spinner" +msgstr "GDNative Singleton desactivado" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Library" @@ -10536,9 +10533,8 @@ msgid "GridMap Fill Selection" msgstr "Llenar Selección en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paste Selection" -msgstr "Eliminar Seleccionados en GridMap" +msgstr "Pegar lo Seleccionado en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -10624,54 +10620,6 @@ msgstr "Elegir Instancia:" msgid "Class name can't be a reserved keyword" msgstr "El nombre de la clase no puede ser una palabra reservada" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Generando solución..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Generando proyecto en C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "No se pudo crear la solución." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "No se pudo guardar la solución." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Hecho" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "No se pudo crear el proyecto en C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Sobre el soporte de C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Crear solución en C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Builds" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Construir Proyecto" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Ver registro" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fin del stack trace de excepción interna" @@ -10966,9 +10914,8 @@ msgid "Available Nodes:" msgstr "Nodos Disponibles:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Select or create a function to edit its graph." -msgstr "Seleccioná o creá una función para editar el grafo" +msgstr "Selecciona o crea una función para editar el gráfico." #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -11107,15 +11054,21 @@ msgstr "" #: platform/android/export/export.cpp msgid "Custom build requires a valid Android SDK path in Editor Settings." msgstr "" +"La compilación personalizada requiere una ruta de Android SDK válida en " +"Configuración del Editor." #: platform/android/export/export.cpp msgid "Invalid Android SDK path for custom build in Editor Settings." msgstr "" +"Ruta del SDK de Android inválida para la compilación personalizada en " +"Configuración del Editor." #: platform/android/export/export.cpp msgid "" "Android project is not installed for compiling. Install from Editor menu." msgstr "" +"El proyecto Android no está instalado para la compilación. Instálalo desde " +"el menú Editor." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -11130,6 +11083,9 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" +"Intentando construir a partir de una plantilla personalizada, pero no existe " +"información de la versión para ello. Por favor, reinstalá desde el menú " +"'Proyecto'." #: platform/android/export/export.cpp msgid "" @@ -11138,20 +11094,28 @@ msgid "" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" +"La versión de compilación de Android no coincide:\n" +" Plantilla instalada: %s\n" +" Versión de Godot: %s\n" +"Por favor, reinstalá la plantilla de compilación de Android desde el menú " +"'Proyecto'." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "" +msgstr "Construir Proyecto 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 "" +"La construcción del proyecto Android falló, comprueba la salida del error.\n" +"También podés visitar docs.godotengine.org para consultar la documentación " +"de compilación de Android." #: platform/android/export/export.cpp msgid "No build apk generated at: " -msgstr "" +msgstr "No se ha generado ninguna compilación apk en: " #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -11283,11 +11247,11 @@ msgstr "Dimensiones de la imagen del splash inválidas (deberÃa ser 620x300)." #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" -"Un recurso SpriteFrames debe ser creado o seteado en la propiedad 'Frames' " -"para que AnimatedSprite pueda mostrar frames." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" +"\" para que AnimatedSprite pueda mostrar frames." #: scene/2d/canvas_modulate.cpp msgid "" @@ -11351,10 +11315,11 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" -"Se debe proveer una textura con la forma de la luz a la propiedad 'texture'." +"Se debe proporcionar una textura con la forma de la luz a la propiedad " +"\"Texture\"." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -11364,8 +11329,10 @@ msgstr "" "efecto." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" -msgstr "El polÃgono de este oclusor está vacÃo. ¡Dibuja un polÃgono!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "" +"El polÃgono oclusor para este oclusor está vacÃo. Por favor, dibujá un " +"polÃgono." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11453,60 +11420,54 @@ msgstr "" "asÃgnale una." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D solo sirve para proveer de un collision shape a un nodo " -"derivado de CollisionObject2D. Favor de usarlo solo como un hijo de Area2D, " -"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para darles un shape." +"TileMap con Use Parent activado necesita un CollisionObject2D padre para " +"darle forma. Por favor, úsalo como hijo de Area2D, StaticBody2D, " +"RigidBody2D, KinematicBody2D, etc. para que puedan tener forma." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D funciona mejor cuando se usa con la raÃz de escena " +"VisibilityEnabler2D funciona mejor cuando se usa con la raÃz de la escena " "editada directamente como padre." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera debe tener un nodo ARVROrigin como su padre" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera tiene que tener un nodo ARVROrigin como padre." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRController must have an ARVROrigin node as its parent." -msgstr "ARVRController debe tener un nodo ARVROrigin como su padre" +msgstr "ARVRController debe tener un nodo ARVROrigin como padre." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The controller ID must not be 0 or this controller won't be bound to an " "actual controller." msgstr "" -"El id de controlador no debe ser 0 o este controlador no será vinculado a un " -"controlador real" +"El ID del controlador no debe ser 0 o este controlador no estará asociado a " +"un controlador real." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "ARVRAnchor debe tener un nodo ARVROrigin como su padre" +msgstr "ARVRAnchor debe tener un nodo ARVROrigin como su padre." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The anchor ID must not be 0 or this anchor won't be bound to an actual " "anchor." msgstr "" -"El id de anclaje no debe ser 0 o este anclaje no podrá ser vinculado a un " -"anclaje real" +"El ID del ancla no puede ser 0 o este ancla no estará asociada a una ancla " +"real." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin requiere un nodo hijo ARVRCamera" +msgstr "ARVROrigin requiere un nodo hijo ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "%d%%" @@ -11570,10 +11531,10 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" -"Se debe proveer un shape para que CollisionShape funcione. Creale un recurso " -"shape!" +"Se debe proporcionar un shape para que CollisionShape funcione. Por favor, " +"crea un recurso de shape para ello." #: scene/3d/collision_shape.cpp msgid "" @@ -11588,13 +11549,12 @@ msgid "Nothing is visible because no mesh has been assigned." msgstr "Nada visible ya que no se asignó ningún mesh." #: scene/3d/cpu_particles.cpp -#, fuzzy msgid "" "CPUParticles animation requires the usage of a SpatialMaterial whose " "Billboard Mode is set to \"Particle Billboard\"." msgstr "" -"Animar CPUParticles requiere el uso de un SpatialMaterial con \"Billboard " -"Particles\" activado." +"La animación de CPUParticles requiere el uso de un SpatialMaterial cuyo Modo " +"Billboard esté ajustado a \"Particle Billboard\"." #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" @@ -11608,6 +11568,12 @@ msgstr "" "Las GIProbes no están soportadas por el controlador de video GLES2.\n" "Usá un BakedLightmap en su lugar." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" +"Un SpotLight con un ángulo mas ancho que 90 grados no puede proyectar " +"sombras." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11638,13 +11604,12 @@ msgid "" msgstr "Nada visible ya que no se asigno pasadas de dibujado a los meshes." #: scene/3d/particles.cpp -#, fuzzy msgid "" "Particles animation requires the usage of a SpatialMaterial whose Billboard " "Mode is set to \"Particle Billboard\"." msgstr "" -"Animar Particles requiere el uso de un SpatialMaterial con \"Billboard " -"Particles\" activado." +"La animación de partÃculas requiere el uso de un SpatialMaterial cuyo Modo " +"Billboard esté ajustado a \"Particle Billboard\"." #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -11653,11 +11618,11 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED requiere que \"Up Vector\" esté activo en el " -"recurso Curve de su Path padre." +"PathFollow's ROTATION_ORIENTED requiere que \"Up Vector\" esté activado en " +"el recurso Curve de su Path padre." #: scene/3d/physics_body.cpp msgid "" @@ -11670,14 +11635,16 @@ msgstr "" "Cambiá el tamaño de los collision shapes hijos." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" -"La propiedad Path debe apuntar a un nodo Spatial valido para funcionar." +"La propiedad \"Remote Path\" debe apuntar a un nodo Spatial o derivado de " +"Spatial válido para que funcione." #: scene/3d/soft_body.cpp -#, fuzzy msgid "This body will be ignored until you set a mesh." -msgstr "Este cuerpo sera ignorado hasta que le asignes un mesh" +msgstr "Este cuerpo será ignorado hasta que se establezca un mesh." #: scene/3d/soft_body.cpp msgid "" @@ -11691,11 +11658,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Un recurso SpriteFrames debe ser creado o asignado en la propiedad 'Frames' " -"para que AnimatedSprite3D pueda mostrar frames." +"Se debe crear o establecer un recurso SpriteFrames en la propiedad \"Frames" +"\" para que AnimatedSprite3D pueda mostrar frames." #: scene/3d/vehicle_body.cpp msgid "" @@ -11706,8 +11673,12 @@ msgstr "" "favor usálo como hijo de VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment necesita un recurso Environment." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WorldEnvironment requiere que su propiedad \"Environment\" contenga un " +"Environment para que tenga un efecto visible." #: scene/3d/world_environment.cpp msgid "" @@ -11746,8 +11717,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Nada conectado a la entrada '%s' del nodo '%s'." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." -msgstr "No hay asignado ningún nodo AnimationNode raÃz para el gráfico." +msgid "No root AnimationNode for the graph is set." +msgstr "No se ha establecido ningún nodo AnimationNode raÃz para el gráfico." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." @@ -11760,8 +11731,8 @@ msgstr "" "La ruta asignada al AnimationPlayer no apunta a un nodo AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "La raÃz del AnimationPlayer no es un nodo válido." +msgid "The AnimationPlayer root node is not a valid node." +msgstr "La raÃz del nodo AnimationPlayer no es un nodo válido." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11773,12 +11744,11 @@ msgstr "Elegir un color de la pantalla." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "Yaw" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11789,23 +11759,24 @@ msgid "Add current color as a preset." msgstr "Agregar color actual como preset." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" -"El contenedor en sà mismo no sirve ningún propósito a menos que un script " -"configure el comportamiento de posicionamiento de sus hijos.\n" -"Si no tenés pensado usar un script, entonces simplemente usá un nodo " -"'Control' en su lugar." +"Container por sà mismo no sirve para nada a menos que un script defina el " +"comportamiento de colocación de sus hijos.\n" +"Si no tenés intención de añadir un script, utilizá un nodo de Control " +"sencillo." #: scene/gui/control.cpp msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"Los Tooltip de Ayuda no se mostrarán cuando los controles del Filtro del " +"Mouse estén configurados en \"Ignore\". Para solucionarlo, establece el " +"Filtro del Mouse en \"Stop\" o \"Pass\"." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11818,26 +11789,26 @@ msgstr "Confirmá, por favor..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" -"Los popups se esconderán por defecto a menos que llames a popup() o " -"cualquiera de las funciones popup*(). Sin embargo, no hay problema con " -"hacerlos visibles para editar, aunque se esconderán al ejecutar." +"Los popups se ocultarán por defecto a menos que llames a popup() o a " +"cualquiera de las funciones popup*(). Puedes hacerlos visibles para su " +"edición, pero se esconderán al iniciar." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "Si exp_edit es verdadero min_value debe ser > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "Si \"Exp Edit\" está activado, \"Min Value\" debe ser mayor que 0." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer está diseñado para trabajar con un único control hijo.\n" -"Usa un container como hijo (VBox, HBox, etc), o un Control y setea el tamaño " -"mÃnimo personalizado de forma manual." +"ScrollContainer está pensado para funcionar con un solo control hijo.\n" +"Utilizá un container como hijo (VBox, HBox, etc.), o un Control y establecé " +"manualmente el tamaño mÃnimo personalizado." #: scene/gui/tree.cpp msgid "(Other)" @@ -11884,9 +11855,17 @@ msgid "Input" msgstr "Entrada" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "Fuente inválida para la vista previa." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Fuente inválida para el shader." +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "Función de comparación inválida para este tipo." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Asignación a función." @@ -11901,7 +11880,67 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Las constantes no pueden modificarse." + +#~ msgid "Previous Folder" +#~ msgstr "Carpeta Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Carpeta Siguiente" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Abrir Capturas de Pantalla Automaticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Abrir en editor de imagenes externo." + +#~ msgid "Reverse" +#~ msgstr "Invertir" + +#~ msgid "Mirror X" +#~ msgstr "Espejar X" + +#~ msgid "Mirror Y" +#~ msgstr "Espejar Y" + +#~ msgid "Generating solution..." +#~ msgstr "Generando solución..." + +#~ msgid "Generating C# project..." +#~ msgstr "Generando proyecto en C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "No se pudo crear la solución." + +#~ msgid "Failed to save solution." +#~ msgstr "No se pudo guardar la solución." + +#~ msgid "Done" +#~ msgstr "Hecho" + +#~ msgid "Failed to create C# project." +#~ msgstr "No se pudo crear el proyecto en C#" + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "Sobre el soporte de C#" + +#~ msgid "Create C# solution" +#~ msgstr "Crear solución en C#" + +#~ msgid "Builds" +#~ msgstr "Builds" + +#~ msgid "Build Project" +#~ msgstr "Construir Proyecto" + +#~ msgid "View log" +#~ msgstr "Ver registro" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment necesita un recurso Environment." #, fuzzy #~ msgid "Enabled Classes" diff --git a/editor/translations/et.po b/editor/translations/et.po index 6f4dbb8452..18b8252b94 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -3,94 +3,100 @@ # Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. # Jens <arrkiin@gmail.com>, 2019. +# Mattias Aabmets <mattias.aabmets@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2019-07-19 13:41+0000\n" +"Last-Translator: Mattias Aabmets <mattias.aabmets@gmail.com>\n" "Language-Team: Estonian <https://hosted.weblate.org/projects/godot-engine/" "godot/et/>\n" "Language: et\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.8-dev\n" #: 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 "" +"Kehtetu argument sisestatud convert() funktsiooni, kasuta TYPE_* konstante." #: 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 "Ebapiisav kogus baite nende dekodeerimiseks või kehtetu formaat." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "" +msgstr "Väljendis on kehtetu sisend %i (mitte edastatud)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "" +msgstr "'self' märksõna ei saa kasutada, sest loode puudub (mitte edastatud)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "" +msgstr "Kehtetud väärtused operaatorisse %s, %s ja %s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "" +msgstr "Kehtetu %s tüübi indeks %s põhitüübi jaoks" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "" +msgstr "Kehtetu '%s' nimega indeks %s põhitüübi jaoks" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "" +msgstr "Kehtetud argumendid '%s' ehitamise jaoks" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "" +msgstr "'%' kutsudes:" #: editor/animation_bezier_editor.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" -msgstr "" +msgstr "Vaba" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "Tasakaalustatud" #: editor/animation_bezier_editor.cpp msgid "Mirror" -msgstr "" +msgstr "Peegel" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" -msgstr "" +msgstr "Aeg:" #: editor/animation_bezier_editor.cpp msgid "Value:" -msgstr "" +msgstr "Väärtus:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" -msgstr "" +msgstr "Sisesta Võti Siia" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" -msgstr "" +msgstr "Kopeeri Valitud Võti (Võtmed)" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" -msgstr "" +msgstr "Kustuta Valitud Võti (Võtmed)" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "" +msgstr "Lisa Bezieri Punkt" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "" +msgstr "Liiguta Bezieri Punkte" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -121,13 +127,33 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp -msgid "Change Animation Length" +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Length" +msgstr "Muuda Animatsiooni Pikkust" + +#: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "Muuda Animatsiooni Silmust" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -172,15 +198,15 @@ msgstr "" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" -msgstr "" +msgstr "Funktsioonid:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "" +msgstr "Heliklipid:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "" +msgstr "Animatsiooni Klipid:" #: editor/animation_track_editor.cpp msgid "Change Track Path" @@ -208,7 +234,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Time (s): " -msgstr "" +msgstr "Aeg (Ajad): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -216,15 +242,15 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Continuous" -msgstr "" +msgstr "Pidev" #: editor/animation_track_editor.cpp msgid "Discrete" -msgstr "" +msgstr "Mittepidev" #: editor/animation_track_editor.cpp msgid "Trigger" -msgstr "" +msgstr "Päästik" #: editor/animation_track_editor.cpp msgid "Capture" @@ -232,16 +258,16 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Nearest" -msgstr "" +msgstr "Lähim" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp msgid "Linear" -msgstr "" +msgstr "Sirgjooneline" #: editor/animation_track_editor.cpp msgid "Cubic" -msgstr "" +msgstr "Kuupmõõtmeline" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" @@ -254,27 +280,27 @@ msgstr "" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "" +msgstr "Sisesta Võti" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" -msgstr "" +msgstr "Kopeeri Võti (Võtmed)" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" -msgstr "" +msgstr "Kustuta Võti (Võtmed)" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" -msgstr "" +msgstr "Muuda Animatsiooni Uuendamise Töörežiimi" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" -msgstr "" +msgstr "Muuda Animatsiooni Interpolatsiooni Töörežiimi" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "" +msgstr "Muuda Animatsiooni Silmuse Töörežiimi" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" @@ -297,7 +323,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #: editor/script_create_dialog.cpp msgid "Create" -msgstr "" +msgstr "Loo" #: editor/animation_track_editor.cpp msgid "Anim Insert" @@ -321,7 +347,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Change Animation Step" -msgstr "" +msgstr "Muuda Animatsiooni Sammu" #: editor/animation_track_editor.cpp msgid "Rearrange Tracks" @@ -341,23 +367,24 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "" +msgstr "Animatsiooni rajad võivad osutada ainult AnimationPlayer sõlmedele." #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." msgstr "" +"Animatsiooni mängija ei saa animeerida iseennast, ainult teisi mängijaid." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "Ei saa lisada uut rada ilma tüveta" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" -msgstr "" +msgstr "Lisa Bezieri Rada" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "Raja tee on kehtetu, mistõttu ei sa lisada võtit." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" @@ -369,19 +396,19 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Add Track Key" -msgstr "" +msgstr "Lisa Raja Võti" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "" +msgstr "Raja tee on kehtetu, mistõttu ei saa lisada meetodi võtit." #: editor/animation_track_editor.cpp msgid "Add Method Track Key" -msgstr "" +msgstr "Lisa Meetodi Raja Võti" #: editor/animation_track_editor.cpp msgid "Method not found in object: " -msgstr "" +msgstr "Meetod ei ole leitud objektis: " #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -389,11 +416,11 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Clipboard is empty" -msgstr "" +msgstr "Lõikelaud on tühi" #: editor/animation_track_editor.cpp msgid "Paste Tracks" -msgstr "" +msgstr "Kleebi Rajad" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" @@ -424,11 +451,11 @@ msgstr "" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Select All" -msgstr "" +msgstr "Vali Kõik" #: editor/animation_track_editor.cpp msgid "Select None" -msgstr "" +msgstr "Tühista Valik" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -448,11 +475,11 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Seconds" -msgstr "" +msgstr "Sekundid" #: editor/animation_track_editor.cpp msgid "FPS" -msgstr "" +msgstr "Kaadrit/Sekundis" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -461,7 +488,7 @@ msgstr "" #: editor/project_manager.cpp editor/project_settings_editor.cpp #: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "" +msgstr "Muuda" #: editor/animation_track_editor.cpp msgid "Animation properties." @@ -469,7 +496,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Copy Tracks" -msgstr "" +msgstr "Kopeeri Rajad" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -489,31 +516,31 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Delete Selection" -msgstr "" +msgstr "Kustuta Valim" #: editor/animation_track_editor.cpp msgid "Go to Next Step" -msgstr "" +msgstr "Mine Järgmisele Sammule" #: editor/animation_track_editor.cpp msgid "Go to Previous Step" -msgstr "" +msgstr "Mine Eelmisele Sammule" #: editor/animation_track_editor.cpp msgid "Optimize Animation" -msgstr "" +msgstr "Optimiseeri Animatsiooni" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation" -msgstr "" +msgstr "Korrasta Animatsiooni" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" -msgstr "" +msgstr "Vali sõlm mida animeerida:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "" +msgstr "Kasuta Bezieri Kurve" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -533,27 +560,27 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Optimize" -msgstr "" +msgstr "Optimiseeri" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" -msgstr "" +msgstr "Eemalda kehtetud võtmed" #: editor/animation_track_editor.cpp msgid "Remove unresolved and empty tracks" -msgstr "" +msgstr "Eemalda lahenduseta ja tühjad rajad" #: editor/animation_track_editor.cpp msgid "Clean-up all animations" -msgstr "" +msgstr "Korrasta kõik animatsioonid" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "" +msgstr "Korrasta Animatsioon(id) (EI SAA TAGASI VÕTTA!)" #: editor/animation_track_editor.cpp msgid "Clean-Up" -msgstr "" +msgstr "Korrasta" #: editor/animation_track_editor.cpp msgid "Scale Ratio:" @@ -570,7 +597,7 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" -msgstr "" +msgstr "Kopeeri" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -604,6 +631,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -653,7 +684,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -756,6 +787,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -914,7 +949,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1090,7 +1125,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1449,6 +1483,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1619,7 +1657,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1670,7 +1708,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1695,23 +1733,29 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "Mine Eelmisele Sammule" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "Mine Järgmisele Sammule" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2386,6 +2430,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Kopeeri" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2577,14 +2626,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2898,6 +2939,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3493,6 +3538,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4518,6 +4564,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4546,7 +4596,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4560,7 +4609,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4635,31 +4684,33 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Eemalda kehtetud võtmed" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Eemalda kehtetud võtmed" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6218,10 +6269,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6507,7 +6566,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6692,10 +6755,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7256,14 +7315,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7641,6 +7692,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7725,6 +7780,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7732,10 +7803,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7824,7 +7929,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7832,7 +7937,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7844,7 +7949,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7861,7 +7966,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7930,11 +8035,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7950,7 +8055,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7978,11 +8083,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8022,11 +8127,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8035,7 +8144,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8053,15 +8162,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8110,7 +8219,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8138,12 +8247,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8220,47 +8329,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9411,6 +9520,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9613,7 +9726,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9668,7 +9781,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10068,54 +10181,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10692,7 +10757,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10741,7 +10806,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10751,7 +10816,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10827,12 +10892,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10911,7 +10976,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10940,6 +11005,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -10974,8 +11043,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -10986,7 +11055,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11002,7 +11073,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11013,7 +11084,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11048,7 +11121,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11060,7 +11133,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11091,8 +11164,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11112,18 +11184,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11166,9 +11238,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 7ae3bd3c8f..60e6216f01 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-06-16 19:42+0000\n" +"PO-Revision-Date: 2019-07-09 10:47+0000\n" "Last-Translator: hpn33 <hamed.hpn332@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" @@ -24,10 +24,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.7-dev\n" +"X-Generator: Weblate 3.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp +#, fuzzy msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "" "نوع آرگومان برای متد ()convert ‌ نامعتبر است ،‌ از ثابت های *_TYPE‌ Ø§Ø³ØªÙØ§Ø¯Ù‡ " @@ -43,7 +44,7 @@ msgstr "" #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "" +msgstr "ورودی نامعتبر i% (تایید نشده) در عبارت" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -145,6 +146,31 @@ msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ را در انیمیشن تغییر بده" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "تغییر زمان ÙØ±ÛŒÙ… کلید در انیمیشن" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "انتقال را در انیمیشن تغییر بده" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "انتقال را در انیمیشن تغییر بده" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "تغییر مقدار ÙØ±ÛŒÙ… کلید در انیمیشن" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ را در انیمیشن تغییر بده" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "طول انیمیشن را تغییر بده" @@ -656,6 +682,10 @@ msgstr "برو به خط" msgid "Line Number:" msgstr "شماره خط:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "تطبیقی ندارد" @@ -705,7 +735,7 @@ msgstr "بزرگنمایی کمتر" msgid "Reset Zoom" msgstr "بازنشانی بزرگنمایی" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -817,6 +847,11 @@ msgid "Connect" msgstr "اتصال" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "سیگنال ها:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "'s%' را به 's%' متصل Ú©Ù†" @@ -987,7 +1022,8 @@ msgid "Owners Of:" msgstr "مالکانÙ:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "آیا پرونده‌های انتخاب شده از پروژه ØØ°Ù شوند؟ (بدون undo)" #: editor/dependency_editor.cpp @@ -1168,7 +1204,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "نصب کردن" @@ -1537,6 +1572,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1736,7 +1775,7 @@ msgstr "باز شدن مدیر پروژه؟" msgid "New Folder..." msgstr "ساختن پوشه..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1787,7 +1826,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1813,26 +1852,31 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "زبانه قبلی" +msgid "Go to previous folder." +msgstr "Ø±ÙØªÙ† به پوشه والد" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "ساختن پوشه" +msgid "Go to next folder." +msgstr "Ø±ÙØªÙ† به پوشه والد" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Ø±ÙØªÙ† به پوشه والد" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "جستجوی کلاسها" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "ناتوان در ساختن پوشه." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2535,6 +2579,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Ú©Ù¾ÛŒ کردن" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "زبانه بعدی" @@ -2729,15 +2778,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "ویرایشگر ØªØ±Ø¬ÛŒØØ§Øª" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "گشودن ویرایشگر متن" - -#: editor/editor_node.cpp #, fuzzy msgid "Toggle Fullscreen" msgstr "ØØ§Ù„ت تمام ØµÙØÙ‡" @@ -3064,6 +3104,11 @@ msgid "Calls" msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "عضوها" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3701,6 +3746,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "صاÙÛŒ کردن گره‌ها" @@ -4783,6 +4829,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "نصب کردن" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4812,7 +4863,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "همه" @@ -4826,8 +4876,9 @@ msgid "Sort:" msgstr "مرتب‌سازی:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "معکوس" +#, fuzzy +msgid "Reverse sorting." +msgstr "در ØØ§Ù„ درخواست..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4901,34 +4952,39 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "" +#, fuzzy +msgid "Move Vertical Guide" +msgstr "برداشتن متغیر" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "ساختن راهنمای عمودی" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "برداشتن متغیر" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "" +#, fuzzy +msgid "Move Horizontal Guide" +msgstr "کلیدهای نامعتبر را ØØ°Ù Ú©Ù†" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "ساختن راهنمای اÙÙ‚ÛŒ" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "کلیدهای نامعتبر را ØØ°Ù Ú©Ù†" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" +msgstr "ساختن راهنمای عمودی" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6562,10 +6618,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "ØØ°Ù Ú©Ù†" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6870,7 +6935,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7063,10 +7132,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "همه‌ی انتخاب ها" @@ -7660,14 +7725,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8094,6 +8151,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8185,6 +8246,22 @@ msgid "Color uniform." msgstr "انتقال را در انیمیشن تغییر بده" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8192,10 +8269,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8285,7 +8396,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8293,7 +8404,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8305,7 +8416,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8322,7 +8433,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8391,11 +8502,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8411,7 +8522,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8439,11 +8550,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8484,11 +8595,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8498,7 +8613,7 @@ msgstr "انتخاب شده را تغییر مقیاس بده" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8516,15 +8631,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8576,7 +8691,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8604,12 +8719,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8686,47 +8801,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9936,6 +10051,11 @@ msgid "Extend Script" msgstr "باز کردن Ùˆ اجرای یک اسکریپت" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "گره تغییر والد" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -10157,7 +10277,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10218,7 +10338,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10640,59 +10760,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "ناتوان در ساختن پوشه." - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "انتخاب شده را تغییر مقیاس بده" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "انتخاب شده را تغییر مقیاس بده" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "پروژه" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "نمایش پرونده ها" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11309,8 +11376,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "یک منبع SpriteFrames باید در دارایی Frames ایجاد یا تنظیم شود تا " @@ -11373,8 +11441,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "یک Ø¨Ø§ÙØª با Ø´Ú©Ù„ نور باید برای دارایی texture ÙØ±Ø§Ù‡Ù… شده باشد." @@ -11386,7 +11455,8 @@ msgstr "" "تأثیرگذار باشد." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "چندضلعی مسدود برای این مسدودکننده، خالی است. Ù„Ø·ÙØ§ یک چندضلعی رسم کنید!" #: scene/2d/navigation_polygon.cpp @@ -11474,15 +11544,16 @@ msgstr "" "یک Ø´Ú©Ù„ بدهید." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D زمانی بهتر کار می‌کند Ú©Ù‡ در یک ریشه‌ی صØÙ†Ù‡â€ŒÛŒ ویرایش شده به " "صورت پدر (parent) Ø§Ø³ØªÙØ§Ø¯Ù‡ شود." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11567,9 +11638,10 @@ msgstr "" "بدهید." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "باید یک Ø´Ú©Ù„ برای CollisionShape ÙØ±Ø§Ù‡Ù… شده باشد تا عمل کند. Ù„Ø·ÙØ§ یک منبع Ø´Ú©Ù„ " "برای آن ایجاد کنید!" @@ -11600,6 +11672,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "یک منبع NavigationMesh باید برای یک گره تنظیم یا ایجاد شود تا کار کند." @@ -11639,8 +11715,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11652,7 +11728,9 @@ msgstr "" #: scene/3d/remote_transform.cpp #, fuzzy -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "دارایی Path باید به یک گره Particles2D معتبر اشاره کند تا کار کند." #: scene/3d/soft_body.cpp @@ -11667,8 +11745,9 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "یک منبع SpriteFrames باید در دارایی Frames ایجاد شده باشد تا " @@ -11681,7 +11760,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11721,7 +11802,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "'s%' را از 's%' جدا Ú©Ù†" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11735,7 +11816,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11766,8 +11847,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11785,23 +11865,24 @@ msgid "Please Confirm..." msgstr "Ù„Ø·ÙØ§Ù‹ تأیید کنید…" #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Popup ها به صورت Ù¾ÛŒØ´â€ŒÙØ±Ø¶ مخÙÛŒ می‌شوند مگر اینکه ()popup یا یکی از توابع " "()*popup را ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ کنید. در هر صورت نمایان کردن آن‌ها برای ویرایش خوب است، " "اما به Ù…ØØ¶ اجرا مخÙÛŒ می‌شوند." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11849,9 +11930,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "اندازهٔ قلم نامعتبر." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "اندازهٔ قلم نامعتبر." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "اندازهٔ قلم نامعتبر." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11869,6 +11960,41 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "زبانه قبلی" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "ساختن پوشه" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "گشودن ویرایشگر متن" + +#~ msgid "Reverse" +#~ msgstr "معکوس" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "ناتوان در ساختن پوشه." + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "انتخاب شده را تغییر مقیاس بده" + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "انتخاب شده را تغییر مقیاس بده" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "پروژه" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "نمایش پرونده ها" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "جستجوی کلاسها" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 00049ac967..e6a6e101b8 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:51+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -134,6 +134,31 @@ msgid "Anim Change Call" msgstr "Animaatio: muuta kutsua" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animaatio: muuta avainruudun aikaa" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animaatio: muuta siirtymää" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animaatio: muuta muunnosta" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animaatio: muuta avainruudun arvoa" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animaatio: muuta kutsua" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Muuta animaation pituutta" @@ -452,9 +477,8 @@ msgid "Select All" msgstr "Valitse kaikki" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "Valitse solmu" +msgstr "Tyhjennä valinta" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -630,6 +654,10 @@ msgstr "Mene riville" msgid "Line Number:" msgstr "Rivinumero:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Löydettiin %d osuma(a)." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Ei osumia" @@ -679,7 +707,7 @@ msgstr "Loitonna" msgid "Reset Zoom" msgstr "Palauta oletuslähennystaso" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Varoitukset" @@ -785,6 +813,10 @@ msgid "Connect" msgstr "Yhdistä" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Signaali:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Yhdistä solmu '%s' solmuun '%s'" @@ -947,8 +979,8 @@ msgid "Owners Of:" msgstr "Omistajat kohteelle:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "Poista valitut tiedostot projektista? (ei voi kumota)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "Poista valitut tiedostot projektista? (Ei voida palauttaa)" #: editor/dependency_editor.cpp msgid "" @@ -1130,7 +1162,6 @@ msgid "Success!" msgstr "Onnistui!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Asenna" @@ -1318,7 +1349,6 @@ msgid "Must not collide with an existing engine class name." msgstr "Ei saa mennä päällekkäin olemassa olevan engine-luokkanimen kanssa." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "" "Ei saa mennä päällekkäin olemassa olevan sisäänrakennetun tyypin nimen " @@ -1500,6 +1530,11 @@ msgstr "Mukautettua release-vientimallia ei löytynyt." msgid "Template file not found:" msgstr "Mallitiedostoa ei löytynyt:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"32-bittisissä vienneissä sisällytetty PCK ei voi olla suurempi kuin 4 Gt." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "3D-editori" @@ -1525,9 +1560,8 @@ msgid "Node Dock" msgstr "Solmutelakka" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Tiedostojärjestelmätelakka" +msgstr "Tiedostojärjestelmä- ja tuontitelakat" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1580,7 +1614,6 @@ msgid "File '%s' format is invalid, import aborted." msgstr "Tiedoston '%s' tiedostomuoto on virheellinen, tuonti keskeytetty." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." @@ -1597,9 +1630,8 @@ msgid "Unset" msgstr "Poista asetus" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Nykyinen profiili" +msgstr "Nykyinen profiili:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1621,9 +1653,8 @@ msgid "Export" msgstr "Vie" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Saatavilla olevat profiilit" +msgstr "Saatavilla olevat profiilit:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1678,7 +1709,7 @@ msgstr "Näytä tiedostonhallinnassa" msgid "New Folder..." msgstr "Uusi kansio..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Päivitä" @@ -1729,7 +1760,7 @@ msgstr "Mene eteenpäin" msgid "Go Up" msgstr "Mene ylös" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Näytä piilotiedostot" @@ -1754,23 +1785,31 @@ msgid "Move Favorite Down" msgstr "Siirrä suosikkia alas" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Edellinen kansio" +#, fuzzy +msgid "Go to previous folder." +msgstr "Siirry yläkansioon." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Seuraava kansio" +#, fuzzy +msgid "Go to next folder." +msgstr "Siirry yläkansioon." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Siirry yläkansioon." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Etsi tiedostoista" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Kansio suosikkeihin." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Aseta piilotiedostojen näyttäminen." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2492,6 +2531,10 @@ msgid "Go to previously opened scene." msgstr "Mene aiemmin avattuun skeneen." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Kopioi teksti" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Seuraava välilehti" @@ -2693,32 +2736,20 @@ msgid "Editor Layout" msgstr "Editorin ulkoasu" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Tee skenen juuri" +msgstr "Ota kuvakaappaus" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Avaa editorin data/asetuskansio" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Avaa seuraava editori" +msgstr "Kuvakaappaukset tallennetaan editorin data/asetuskansioon." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Siirry koko näytön tilaan" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Aseta CanvasItem näkyvyys päälle/pois" +msgstr "Aseta järjestelmäkonsolin näkyvyys päälle/pois" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2827,19 +2858,16 @@ msgid "Spins when the editor window redraws." msgstr "Pyörii kun editorin ikkuna päivittyy." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Jatkuva" +msgstr "Päivitä jatkuvasti" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Päivitä muutokset" +msgstr "Päivitä kun muuttuu" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Poista päivitysanimaatio" +msgstr "Piilota päivitysanimaatio" #: editor/editor_node.cpp msgid "FileSystem" @@ -3035,6 +3063,11 @@ msgid "Calls" msgstr "Kutsuja" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Muokkaa teemaa" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Päällä" @@ -3654,6 +3687,7 @@ msgid "Nodes not in Group" msgstr "Ryhmään kuulumattomat solmut" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Suodata solmuja" @@ -4702,6 +4736,10 @@ msgid "Idle" msgstr "Toimeton" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Asenna..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Yritä uudelleen" @@ -4730,7 +4768,6 @@ msgid "Last" msgstr "Viimeinen" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Kaikki" @@ -4744,8 +4781,8 @@ msgid "Sort:" msgstr "Lajittele:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Käänteinen" +msgid "Reverse sorting." +msgstr "Käännä lajittelu." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4826,32 +4863,32 @@ msgid "Rotation Step:" msgstr "Kierron välistys:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "Siirrä pystysuoraa apuviivaa" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "Luo uusi pystysuora apuviiva" +msgid "Create Vertical Guide" +msgstr "Luo pystysuora apuviiva" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "Poista pystysuora apuviiva" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "Siirrä vaakasuoraa apuviivaa" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "Luo uusi vaakasuora apuviiva" +msgid "Create Horizontal Guide" +msgstr "Luo vaakasuora apuviiva" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "Poista vaakasuora apuviiva" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "Luo uudet vaaka- ja pystysuorat apuviivat" +msgid "Create Horizontal and Vertical Guides" +msgstr "Luo vaaka- ja pystysuorat apuviivat" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -5283,9 +5320,8 @@ msgstr "Lataa emissiomaski" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Käynnistä uudelleen nyt" +msgstr "Käynnistä uudelleen" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5306,7 +5342,7 @@ msgstr "Luotujen pisteiden määrä:" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Mask" -msgstr "Emission maski" +msgstr "Emissiomaski" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5316,7 +5352,7 @@ msgstr "Nappaa pikselistä" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Colors" -msgstr "Emission väri" +msgstr "Emissiovärit" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" @@ -6198,18 +6234,16 @@ msgid "Find Next" msgstr "Etsi seuraava" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Suodata ominaisuuksia" +msgstr "Suodata skriptejä" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Käytä metodilistalla aakkosellista järjestystä." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Suodatustila:" +msgstr "Suodata metodeja" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6442,10 +6476,18 @@ msgid "Syntax Highlighter" msgstr "Syntaksin korostaja" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Mene" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "Kirjanmerkit" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Keskeytyskohdat" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6733,9 +6775,15 @@ msgid "Rear" msgstr "Taka" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Kohdista näkymään" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Kohdista valinta näkymään" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Isäntää, jonka alle ilmentymä luodaan, ei ole valittu." @@ -6923,10 +6971,6 @@ msgid "Focus Selection" msgstr "Kohdista valintaan" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Kohdista valinta näkymään" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Valintatyökalu" @@ -7487,14 +7531,6 @@ msgid "Transpose" msgstr "Transponoi" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Peilaa X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Peilaa Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "Poista automaattiruudutus käytöstä" @@ -7871,7 +7907,7 @@ msgstr "Aseta uniformin nimi" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Input Default Port" -msgstr "Aseta syötteen oletusportti" +msgstr "Aseta oletustuloportti" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node to Visual Shader" @@ -7890,6 +7926,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Visual Shaderin syötteen tyyppi vaihdettu" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(Vain GLES3)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Kärkipiste" @@ -7946,9 +7986,8 @@ msgid "Dodge operator." msgstr "Värinväistöoperaattori." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "HardLight operator" -msgstr "HardLight-operaattori." +msgstr "Kovavalo-operaattori" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -7975,64 +8014,109 @@ msgid "Color uniform." msgstr "Väri-uniform." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Palauttaa kahden parametrin %s vertailun totuusarvon." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "Yhtä suuri (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "Suurempi kuin (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "Yhtä suuri tai suurempi kuin (>=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." msgstr "" +"Palauttaa liitetyn vektorin, jos annetut skalaarit ovat yhtä suuria, " +"suurempia tai pienempiä." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "Palauttaa INF ja skalaarin parametrien vertailun totuusarvon." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "Palauttaa NaN- ja skalaariparametrien vertailun totuusarvon." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "Pienempi kuin (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "Yhtä suuri tai pienempi kuin (<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "Erisuuri (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" +"Palauttaa liitetyn vektorin, jos annettu totuusarvo on tosi tai epätosi." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Palauttaa kahden parametrin vertailun totuusarvon." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"Palauttaa INF- (tai NaN-) ja skalaariparametrien vertailun totuusarvon." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Boolean constant." -msgstr "Muuta vektorivakiota" +msgstr "Totuusarvovakio." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." -msgstr "" +msgstr "Totuusarvo-uniform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for all shader modes." -msgstr "'normal' syöteparametri valosävytintilaan." +msgstr "'%s' syöteparametri kaikille sävytintiloille." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "Tartu isäntään" +msgstr "Syöteparametri." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "'custom' syöteparametri kärkipistesävytintilaan." +msgstr "'%s' syöteparametri kärkipiste- ja kuvapistesävytintiloille." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." -msgstr "'normal' syöteparametri valosävytintilaan." +msgstr "'%s' syöteparametri kuvapiste- ja valosävytintiloille." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "'custom' syöteparametri kärkipistesävytintilaan." +msgstr "'%s' syöteparametri kuvapistesävytintilaan." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "'normal' syöteparametri valosävytintilaan." +msgstr "'%s' syöteparametri valosävytintilaan." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "'custom' syöteparametri kärkipistesävytintilaan." +msgstr "'%s' syöteparametri kärkipistesävytintilaan." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "'custom' syöteparametri kärkipistesävytintilaan." +msgstr "'%s' syöteparametri kärkipiste- ja kuvapistesävytintilaan." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -8076,23 +8160,23 @@ msgstr "Sqrt2-vakio (1.414214). Kahden neliöjuuri." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "Palauttaa parametrin absoluuttisen arvon." +msgstr "Palauttaa parametrin itseisarvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." msgstr "Palauttaa parametrin arkuskosinin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin käänteisen hyperbolisen kosinin." +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "Palauttaa parametrin käänteisen hyperbolisen kosinin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Palauttaa parametrin arkussinin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin käänteisen hyperbolisen sinin." +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "Palauttaa parametrin käänteisen hyperbolisen sinin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8103,8 +8187,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Palauttaa parametrien arkustangentin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin käänteisen hyperbolisen tangentin." +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "Palauttaa parametrin käänteisen hyperbolisen tangentin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8121,8 +8205,8 @@ msgid "Returns the cosine of the parameter." msgstr "Palauttaa parametrin kosinin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "(Vain GLES3) Palauttaa parametrin hyperbolisen kosinin." +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "Palauttaa parametrin hyperbolisen kosinin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8167,56 +8251,58 @@ msgstr "Palauttaa pienemmän kahdesta arvosta." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "" +msgstr "Lineaari-interpolaatio kahden skalaarin välillä." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "Palauttaa parametrin vasta-arvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" -msgstr "" +msgstr "1.0 - skalaari" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." msgstr "" +"Palauttaa arvon, joka on ensimmäisen parametrin arvo potenssiin toisen " +"parametrin arvo." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "Muuntaa suureen asteista radiaaneiksi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" -msgstr "" +msgstr "1.0 / skalaari" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "" +msgid "Finds the nearest integer to the parameter." +msgstr "Etsii parametria lähinnä olevan kokonaisluvun." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "" +msgid "Finds the nearest even integer to the parameter." +msgstr "Etsii parametria lähinnä olevan parillisen kokonaisluvun." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "Rajaa arvon 0.0 ja 1.0 välille." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "Poimii parametrin etumerkin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "Palauttaa parametrin sinin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "" +msgid "Returns the hyperbolic sine of the parameter." +msgstr "Palauttaa parametrin hyperbolisen sinin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "Palauttaa parametrin neliöjuuren." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8226,6 +8312,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep-funktio( skalaari(edge0), skalaari(edge1), skalaari(x) ).\n" +"\n" +"Palauttaa 0.0, jos 'x' on pienempi kuin 'edge0', ja 1.0, jos 'x' on suurempi " +"kuin 'edge1'. Muutoin paluuarvo interpoloidaan 0.0 ja 1.0 väliltä Hermiten " +"polynomeilla." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8233,75 +8324,77 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Step function( scalar(edge), scalar(x) ).\n" +"\n" +"Palauttaa 0.0, jos 'x' on pienempi kuin 'edge', ja muuten 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "Palauttaa parametrin tangentin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "" +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "Palauttaa parametrin hyperbolisen tangentin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "" +msgid "Finds the truncated value of the parameter." +msgstr "Hakee parametrin katkaistun arvon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." -msgstr "" +msgstr "Lisää skalaarin skalaariin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "Jakaa skalaarin skalaarilla." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "Kertoo skalaarin skalaarilla." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." -msgstr "" +msgstr "Palauttaa kahden skalaarin jäännöksen." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." -msgstr "" +msgstr "Vähentää skalaarin skalaarista." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar constant." -msgstr "Muuta skalaarivakiota" +msgstr "Skalaarivakio." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar uniform." -msgstr "Muuta skalaariuniformia" +msgstr "Skalaariuniformi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "Suorittaa kuutiollisen tekstuurin haun." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." -msgstr "" +msgstr "Suorittaa tekstuurin haun." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy -msgid "Cubic texture uniform." -msgstr "Muuta tekstuuriuniformia" +msgid "Cubic texture uniform lookup." +msgstr "Kuutiollisen tekstuuriuniformin haku." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy -msgid "2D texture uniform." -msgstr "Muuta tekstuuriuniformia" +msgid "2D texture uniform lookup." +msgstr "2D-tekstuuriuniformin haku." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." +msgstr "2D-tekstuuriuniformin haku kolmitasolla." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform function." -msgstr "Muunnosikkuna..." +msgstr "Muunnosfunktio." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8309,112 +8402,121 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" +"Laskee vektoriparin ulkotulon.\n" +"\n" +"Ulkotulo ottaa ensimmäisen parametrin 'c' sarakevektorina (matriisi, jolla " +"on yksi sarake) ja toisen parametrin 'r' rivivektorina (matriisi, jolla on " +"yksi rivi) ja suorittaa lineaarialgebrallisen matriisitulon 'c * r', antaen " +"tulokseksi matriisin, jolla on 'c' vektorin komponenttien verran rivejä ja " +"'r' vektorin komponenttien verran sarakkeita." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." -msgstr "" +msgstr "Muodostaa muunnoksen neljästä vektorista." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes transform to four vectors." -msgstr "" +msgstr "Hajoittaa muunnoksen neljään vektoriin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "" +msgid "Calculates the determinant of a transform." +msgstr "Laskee muunnoksen determinantin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "" +msgid "Calculates the inverse of a transform." +msgstr "Laskee muunnoksen käänteismatriisin." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "" +msgid "Calculates the transpose of a transform." +msgstr "Laskee muunnoksen transpoosin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." -msgstr "" +msgstr "Kertoo muunnoksen muunnoksella." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by transform." -msgstr "" +msgstr "Kertoo vektorin muunnoksella." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "Muunnos keskeytetty." +msgstr "Muunnosvakio." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "Muunnos keskeytetty." +msgstr "Muunnosuniformi." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Sijoitus funktiolle." +msgstr "Vektorifunktio." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector operator." -msgstr "Muuta vektorioperaattoria" +msgstr "Vektorioperaattori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." -msgstr "" +msgstr "Koostaa vektorin kolmesta skalaarista." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes vector to three scalars." -msgstr "" +msgstr "Purkaa vektorin kolmeksi skalaariksi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "" +msgstr "Laskee kahden vektorin ristitulon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "" +msgstr "Palauttaa kahden pisteen välisen etäisyyden." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." -msgstr "" +msgstr "Laskee kahden vektorin pistetulon." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" +"Palauttaa vektorin, joka osoittaa samaan suuntaan kuin viitevektori. Funktio " +"ottaa kolme vektoriparametria: N eli suunnattava vektori, I eli tulovektori, " +"ja Nref eli viitevektori. Jos I ja Nref pistetulo on pienempi kuin nolla, " +"paluuarvo on N. Muutoin palautetaan -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." -msgstr "" +msgstr "Laskee vektorin pituuden." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors." -msgstr "" +msgstr "Kahden vektorin välinen lineaari-interpolaatio." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." -msgstr "" +msgstr "Laskee ja palauttaa vektorin normaalin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - vector" -msgstr "" +msgstr "1.0 - vektori" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / vector" -msgstr "" +msgstr "1.0 / vektori" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" +"Palauttaa vektorin, joka osoittaa heijastuksen suuntaan ( a : tulovektori, " +"b : normaalivektori )." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." -msgstr "" +msgid "Returns the vector that points in the direction of refraction." +msgstr "Palauttaa vektorin, joka osoittaa taittumisen suuntaan." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8424,6 +8526,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep-funktio( vektori(edge0), vektori(edge1), vektori(x) ).\n" +"\n" +"Palauttaa 0.0, jos 'x' on pienempi kuin 'edge0', ja 1.0, jos 'x' on suurempi " +"kuin 'edge1'. Muutoin paluuarvo interpoloidaan 0.0 ja 1.0 väliltä Hermiten " +"polynomeilla." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8433,6 +8540,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep-funktio( skalaari(edge0), skalaari(edge1), vektori(x) ).\n" +"\n" +"Palauttaa 0.0, jos 'x' on pienempi kuin 'edge0', ja 1.0, jos 'x' on suurempi " +"kuin 'edge1'. Muutoin paluuarvo interpoloidaan 0.0 ja 1.0 väliltä Hermiten " +"polynomeilla." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8440,6 +8552,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Askelfunktio( vektori(edge), vektori(x) ).\n" +"\n" +"Palauttaa 0.0, jos 'x' on pienempi kuin 'edge', ja muutoin 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8447,36 +8562,37 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Askelfunktio( skalaari(edge), vektori(x) ).\n" +"\n" +"Palauttaa 0.0, jos 'x' on pienempi kuin 'edge', ja muutoin 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." -msgstr "" +msgstr "Lisää vektorin vektoriin." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "" +msgstr "Jakaa vektorin vektorilla." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." -msgstr "" +msgstr "Kertoo vektorin vektorilla." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two vectors." -msgstr "" +msgstr "Palauttaa kahden vektorin jäännöksen." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts vector from vector." -msgstr "" +msgstr "Vähentää vektorin vektorista." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector constant." -msgstr "Muuta vektorivakiota" +msgstr "Vektorivakio." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "Sijoitus uniformille." +msgstr "Vektoriuniformi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8484,56 +8600,73 @@ msgid "" "output ports. This is a direct injection of code into the vertex/fragment/" "light function, do not use it to write the function declarations inside." msgstr "" +"Mukautettu Godot Shader Language lauseke, jolla on haluttu määrä tulo- ja " +"lähtöportteja. Tämä tarkoittaa koodin lisäämistä suoraan vertex/fragment/" +"light funktioiden sisään, älä käytä sitä kirjoittaaksesi funktioesittelyitä." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns falloff based on the dot product of surface normal and view " "direction of camera (pass associated inputs to it)." msgstr "" +"Palauttaa valovähentymän perustuen pinnan normaalivektorin ja kameran " +"suuntavektorin pistetuloon (välitä nämä syötteinä)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "" +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(Vain Fragment/Light tilat) Skalaariderivaattafunktio." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "" +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(Vain Fragment/Light tilat) Vektoriderivaattafunktio." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" +"(Vain Fragment/Light tilat) (Vektori) 'x' derivaatta käyttäen " +"paikallisdifferentiaalia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" +"(Vain Fragment/Light tilat) (Skalaari) 'x' derivaatta käyttäen " +"paikallisdifferentiaalia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" +"(Vain Fragment/Light tilat) (Vektori) 'y' derivaatta käyttäen " +"paikallisdifferentiaalia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" +"(Vain Fragment/Light tilat) (Skalaari) 'y' derivaatta käyttäen " +"paikallisdifferentiaalia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(Vain Fragment/Light tilat) (Vektori) 'x' ja 'y' derivaattojen itseisarvojen " +"summa." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(Vain Fragment/Light tilat) (Skalaari) 'x' ja 'y' derivaattojen " +"itseisarvojen summa." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -8875,7 +9008,6 @@ msgid "Are you sure to open more than one project?" msgstr "Haluatko varmasti avata useamman kuin yhden projektin?" #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file does not specify the version of Godot " "through which it was created.\n" @@ -8892,12 +9024,11 @@ msgstr "" "\n" "%s\n" "\n" -"Jos haluat jatkaa sen avaamista, se muunnetaan nykyiseen Godotin " +"Jos jatkat sen avaamista, se muunnetaan nykyiseen Godotin " "asetustiedostomuotoon.\n" "Varoitus: et voi avata projektia tämän jälkeen enää vanhemmilla versioilla." #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file was generated by an older engine " "version, and needs to be converted for this version:\n" @@ -8925,7 +9056,6 @@ msgstr "" "yhteensopivia tämän version kanssa." #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " @@ -8944,47 +9074,48 @@ msgstr "" "Muokkaa projektia käynnistääksesi uudelleentuonnin." #: editor/project_manager.cpp -#, fuzzy msgid "Are you sure to run %d projects at once?" -msgstr "Haluatko varmasti suorittaa usemman projektin?" +msgstr "Haluatko varmasti suorittaa %d projektia yhdenaikaisesti?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." -msgstr "Poista projekti listalta? (Kansion sisältöä ei muuteta)" +msgstr "" +"Poista %d projektia listalta?\n" +"Projektikansioiden sisältöjä ei muuteta." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." -msgstr "Poista projekti listalta? (Kansion sisältöä ei muuteta)" +msgstr "" +"Poista tämä projekti listalta?\n" +"Projektikansion sisältöä ei muuteta." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list? (Folders contents will not be " "modified)" -msgstr "Poista projekti listalta? (Kansion sisältöä ei muuteta)" +msgstr "" +"Poista kaikki puuttuvat projektit listalta? (Kansioiden sisältöjä ei muuteta)" #: editor/project_manager.cpp -#, fuzzy msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." msgstr "" "Kieli vaihdettu.\n" -"Muutokset astuvat voimaan kun editori tai projektinhallinta käynnistetään " +"Käyttöliittymä päivittyy, kun editori tai projektinhallinta käynnistetään " "uudelleen." #: editor/project_manager.cpp -#, fuzzy msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." -msgstr "Olet aikeissa etsiä hakemistosta %s Godot projekteja. Oletko varma?" +msgstr "" +"Haluatko varmasti etsiä %s kansiosta olemassa olevia Godot-projekteja?\n" +"Tämä saattaa kestää hetken." #: editor/project_manager.cpp msgid "Project Manager" @@ -9007,9 +9138,8 @@ msgid "New Project" msgstr "Uusi projekti" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Poista piste" +msgstr "Poista puuttuva" #: editor/project_manager.cpp msgid "Templates" @@ -9028,13 +9158,12 @@ msgid "Can't run project" msgstr "Projektia ei voida käynnistää" #: editor/project_manager.cpp -#, fuzzy msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" "Sinulla ei ole tällä hetkellä yhtään projekteja.\n" -"Haluaisitko selata virallisia malliprojekteja Asset-kirjastosta?" +"Haluaisitko selata virallisia esimerkkiprojekteja Asset-kirjastosta?" #: editor/project_settings_editor.cpp msgid "Key " @@ -9061,9 +9190,8 @@ msgstr "" "'/', ':', '=', '\\' tai '\"'" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "Tapahtuma '%s' on jo olemassa!" +msgstr "Toiminto nimellä '%s' on jo olemassa." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -9282,9 +9410,8 @@ msgid "Override For..." msgstr "Ohita alustalle..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -#, fuzzy msgid "The editor must be restarted for changes to take effect." -msgstr "Editori täytyy käynnistää uudelleen, jotta muutokset tulevat voimaan" +msgstr "Editori täytyy käynnistää uudelleen, jotta muutokset tulevat voimaan." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -9343,14 +9470,12 @@ msgid "Locales Filter" msgstr "Kielten suodatus" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" -msgstr "Näytä kaikki kielet" +msgstr "Näytä kaikki kielialueet" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" -msgstr "Näytä vain valitut kielet" +msgstr "Näytä vain valitut kielialueet" #: editor/project_settings_editor.cpp msgid "Filter mode:" @@ -9437,7 +9562,6 @@ msgid "Suffix" msgstr "Pääte" #: editor/rename_dialog.cpp -#, fuzzy msgid "Advanced Options" msgstr "Edistyneet asetukset" @@ -9702,9 +9826,8 @@ msgid "User Interface" msgstr "Käyttöliittymä" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" -msgstr "Poista solmu" +msgstr "Toinen solmu" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -9747,7 +9870,6 @@ msgid "Clear Inheritance" msgstr "Poista perintä" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" msgstr "Avaa dokumentaatio" @@ -9756,9 +9878,8 @@ msgid "Add Child Node" msgstr "Lisää alisolmu" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "Tiivistä kaikki" +msgstr "Laajenna/tiivistä kaikki" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9769,6 +9890,11 @@ msgid "Extend Script" msgstr "Laajenna skriptiä" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Vaihda solmun isäntää" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Tee skenen juuri" @@ -9789,9 +9915,8 @@ msgid "Delete (No Confirm)" msgstr "Poista (ei varmistusta)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Lisää/Luo uusi solmu" +msgstr "Lisää/Luo uusi solmu." #: editor/scene_tree_dock.cpp msgid "" @@ -9826,19 +9951,16 @@ msgid "Toggle Visible" msgstr "Aseta näkyvyys" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Unlock Node" -msgstr "Valitse solmu" +msgstr "Poista solmun lukitus" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Button Group" -msgstr "Painike 7" +msgstr "Painikeryhmä" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "(Connecting From)" -msgstr "Yhteysvirhe" +msgstr "(Yhdistetään paikasta)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" @@ -9869,9 +9991,8 @@ msgstr "" "Napsauta näyttääksesi ryhmätelakan." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "Avaa skripti" +msgstr "Avaa skripti:" #: editor/scene_tree_editor.cpp msgid "" @@ -9922,39 +10043,32 @@ msgid "Select a Node" msgstr "Valitse solmu" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "Polku on tyhjä" +msgstr "Polku on tyhjä." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "Tiedostonimi on tyhjä" +msgstr "Tiedostonimi on tyhjä." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is not local." -msgstr "Polku ei ole paikallinen" +msgstr "Polku ei ole paikallinen." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid base path." -msgstr "Virheellinen kantapolku" +msgstr "Virheellinen kantapolku." #: editor/script_create_dialog.cpp -#, fuzzy msgid "A directory with the same name exists." -msgstr "Samanniminen hakemisto on jo olemassa" +msgstr "Samanniminen hakemisto on jo olemassa." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid extension." -msgstr "Virheellinen laajennus" +msgstr "Virheellinen tiedostopääte." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Wrong extension chosen." -msgstr "Valittu väärä tiedostopääte" +msgstr "Valittu väärä tiedostopääte." #: editor/script_create_dialog.cpp msgid "Error loading template '%s'" @@ -9973,7 +10087,6 @@ msgid "N/A" msgstr "Ei mitään" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" msgstr "Avaa skripti / Valitse sijainti" @@ -9982,43 +10095,36 @@ msgid "Open Script" msgstr "Avaa skripti" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, it will be reused." -msgstr "Tiedosto on jo olemassa, käytetään uudelleen" +msgstr "Tiedosto on jo olemassa, se käytetään uudelleen." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." -msgstr "Virheellinen luokan nimi" +msgstr "Virheellinen luokan nimi." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path." -msgstr "Virheellinen peritty isännän nimi tai polku" +msgstr "Virheellinen peritty isännän nimi tai polku." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script is valid." -msgstr "Skripti kelpaa" +msgstr "Skripti kelpaa." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "Sallittu: a-z, A-Z, 0-9 ja _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "Sallittu: a-z, A-Z, 0-9, _ ja ." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in script (into scene file)." -msgstr "Sisäänrakennettu skripti (skenetiedostoon)" +msgstr "Sisäänrakennettu skripti (skenetiedostoon)." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "Luo uusi skriptitiedosto" +msgstr "Luo uuden skriptitiedoston." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "Lataa olemassaoleva skriptitiedosto" +msgstr "Lataa olemassaolevan skriptitiedoston." #: editor/script_create_dialog.cpp msgid "Language" @@ -10060,7 +10166,7 @@ msgstr "Pinojäljitys" msgid "Pick one or more items from the list to display the graph." msgstr "Valitse yksi tai useampi kohde listasta näyttääksesi graafin." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Virheet" @@ -10150,7 +10256,7 @@ msgstr "Aseta puusta" #: editor/script_editor_debugger.cpp msgid "Export measures as CSV" -msgstr "" +msgstr "Vie mittaustulokset CSV-tiedostoon" #: editor/settings_config_dialog.cpp msgid "Erase Shortcut" @@ -10282,12 +10388,11 @@ msgstr "GDNativeLibrary" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" -msgstr "" +msgstr "GDNative singleton on otettu käyttöön" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Disabled GDNative Singleton" -msgstr "Poista päivitysanimaatio" +msgstr "GDNative singleton on poistettu käytöstä" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Library" @@ -10378,9 +10483,8 @@ msgid "GridMap Fill Selection" msgstr "Täytä valinta" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paste Selection" -msgstr "Poista valinta" +msgstr "Liitä valinta" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -10466,54 +10570,6 @@ msgstr "Poimintaetäisyys:" msgid "Class name can't be a reserved keyword" msgstr "Luokan nimi ei voi olla varattu avainsana" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Luodaan ratkaisua..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Luodaan C# projekti..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Ratkaisun luonti epäonnistui." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Ratkaisun tallennus epäonnistui." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Valmis" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "C# projektin luonti epäonnistui." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Lisätietoja C# tuesta" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Luo C# ratkaisu" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Käännökset" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Käännä projekti" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Näytä loki" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Sisemmän poikkeuksen kutsupinon loppu" @@ -10808,9 +10864,8 @@ msgid "Available Nodes:" msgstr "Saatavilla olevat solmut:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Select or create a function to edit its graph." -msgstr "Valitse tai luo funktio graafin muokkaamiseksi" +msgstr "Valitse tai luo funktio graafin muokkaamiseksi." #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -10945,15 +11000,21 @@ msgstr "" #: platform/android/export/export.cpp msgid "Custom build requires a valid Android SDK path in Editor Settings." msgstr "" +"Mukautettu käännös edellyttää kelvollista Android SDK -polkua editorin " +"asetuksissa." #: platform/android/export/export.cpp msgid "Invalid Android SDK path for custom build in Editor Settings." msgstr "" +"Virheellinen Android SDK -polku mukautettu käännöstä varten editorin " +"asetuksissa." #: platform/android/export/export.cpp msgid "" "Android project is not installed for compiling. Install from Editor menu." msgstr "" +"Android-projektia ei ole asennettu kääntämistä varten. Asenna se Editori-" +"valikosta." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -10968,6 +11029,8 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" +"Yritetään kääntää mukautetulla käännösmallilla, mutta sillä ei ole " +"versiotietoa. Ole hyvä ja uudelleenasenna se 'Projekti'-valikosta." #: platform/android/export/export.cpp msgid "" @@ -10976,20 +11039,27 @@ msgid "" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" +"Androidin käännösversion epäyhteensopivuus:\n" +" Malli asennettu: %s\n" +" Godotin versio: %s\n" +"Ole hyvä ja uudelleenasenna Androidin käännösmalli 'Projekti'-valikosta." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "" +msgstr "Käännetään Android-projektia (gradle)" #: platform/android/export/export.cpp msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" +"Android-projektin käännös epäonnistui, tarkista virhe tulosteesta.\n" +"Vaihtoehtoisesti, lue docs.godotengine.org sivustolta Androidin " +"käännösdokumentaatio." #: platform/android/export/export.cpp msgid "No build apk generated at: " -msgstr "" +msgstr "Käännöksen apk:ta ei generoitu: " #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -11108,10 +11178,10 @@ msgstr "Virheellinen käynnistyskuvan kuvakoko (pitäisi olla 620x300)." #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" -"SpriteFrames resurssi on luotava tai asetettava 'Frames' ominaisuudelle, " +"SpriteFrames resurssi on luotava tai asetettava \"Frames\" ominaisuudelle, " "jotta AnimatedSprite voi näyttää ruutuja." #: scene/2d/canvas_modulate.cpp @@ -11175,10 +11245,10 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" -"Tekstuuri, jolta löytyy valon muoto, täytyy antaa 'texture' ominaisuudella." +"Tekstuuri, jolta löytyy valon muoto, täytyy antaa \"texture\" ominaisuudelle." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -11188,8 +11258,8 @@ msgstr "" "peittopolygoni." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" -msgstr "Tämän peittäjän peittopolygoni on tyhjä. Ole hyvä ja piirrä polygoni!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "Tämän peittäjän peittopolygoni on tyhjä. Ole hyvä ja piirrä polygoni." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11277,60 +11347,55 @@ msgstr "" "ja aseta sellainen." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D toimii törmäysmuotona ainoastaan CollisionObject2D solmusta " -"perityille solmuille. Käytä sitä ainoastaan Area2D, StaticBody2D, " -"RigidBody2D, KinematicBody2D, jne. alla antaaksesi niille muodon." +"TileMap, jolla on \"Use Parent on\", tarvitsee CollisionObject2D " +"isäntäsolmun, jolle voi antaa muotoja. Käytä sitä ainoastaan Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, jne. alla antaaksesi niille " +"muodon." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D toimii parhaiten, kun sitä käytetään suoraan muokatun " +"VisibilityEnabler2D toimii parhaiten, kun sitä käytetään suoraan muokatun " "skenen juuren isäntänä." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera solmun isännän täytyy olla ARVROrigin solmu" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera solmun isännän täytyy olla ARVROrigin solmu." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRController must have an ARVROrigin node as its parent." -msgstr "ARVRController solmun isännän täytyy olla ARVROrigin solmu" +msgstr "ARVRController solmun isännän täytyy olla ARVROrigin solmu." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The controller ID must not be 0 or this controller won't be bound to an " "actual controller." msgstr "" "Ohjaimen tunnus ei saa olla 0, tai tämä ohjain ei ole sidottu oikeaan " -"ohjaimeen" +"ohjaimeen." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "ARVRAnchor solmun isännän täytyy olla ARVROrigin solmu" +msgstr "ARVRAnchor solmun isännän täytyy olla ARVROrigin solmu." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The anchor ID must not be 0 or this anchor won't be bound to an actual " "anchor." msgstr "" "Ankkurin tunnus ei saa olla 0, tai tämä ankkuri ei ole sidottu oikeaan " -"ankkuriin" +"ankkuriin." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin solmu tarvitsee ARVRCamera alisolmun" +msgstr "ARVROrigin solmu tarvitsee ARVRCamera alisolmun." #: scene/3d/baked_lightmap.cpp msgid "%d%%" @@ -11394,10 +11459,10 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "CollisionShape solmulle täytyy antaa muoto, jotta se toimisi. Ole hyvä ja " -"luo sille muotoresurssi!" +"luo sille muotoresurssi." #: scene/3d/collision_shape.cpp msgid "" @@ -11412,13 +11477,12 @@ msgid "Nothing is visible because no mesh has been assigned." msgstr "Mitään ei näy, koska meshiä ei ole asetettu." #: scene/3d/cpu_particles.cpp -#, fuzzy msgid "" "CPUParticles animation requires the usage of a SpatialMaterial whose " "Billboard Mode is set to \"Particle Billboard\"." msgstr "" -"CPUParticles animaatio edellyttää SpatialMaterial käyttöä niin että " -"\"Billboard Particles\" on kytketty päälle." +"CPUParticles animaatio edellyttää SpatialMaterial käyttöä niin, että " +"Billboard Mode tilaksi on asetettu \"Particle Billboard\"." #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" @@ -11432,6 +11496,11 @@ msgstr "" "GIProbe ei ole tuettu GLES2 näyttöajurissa.\n" "Käytä sen sijaan BakedLightmap resurssia." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" +"SpotLight, jonka kulma on suurempi kuin 90 astetta, ei voi heittää varjoja." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11464,13 +11533,12 @@ msgstr "" "passes)." #: scene/3d/particles.cpp -#, fuzzy msgid "" "Particles animation requires the usage of a SpatialMaterial whose Billboard " "Mode is set to \"Particle Billboard\"." msgstr "" -"Particles animaatio edellyttää SpatialMaterial käyttöä niin että \"Billboard " -"Particles\" on kytketty päälle." +"Particles animaatio edellyttää SpatialMaterial käyttöä niin, että Billboard " +"Mode tilaksi on asetettu \"Particle Billboard\"." #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -11478,8 +11546,8 @@ msgstr "PathFollow toimii ainoastaan ollessaan asetettuna Path solmun alle." #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" "PathFollow ROTATION_ORIENTED edellyttää, että sen Path isäntäsolmun Curve " "resurssin \"Up Vector\" on asetettu päälle." @@ -11495,13 +11563,16 @@ msgstr "" "Muuta sen sijaan solmun alla olevia törmäysmuotoja." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." -msgstr "Polkuominaisuuden täytyy osoittaa Spatial solmuun toimiakseen." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." +msgstr "" +"\"Remote Path\" etäpolkuominaisuuden täytyy osoittaa kelvolliseen Spatial " +"tai Spatial-perittyyn solmuun toimiakseen." #: scene/3d/soft_body.cpp -#, fuzzy msgid "This body will be ignored until you set a mesh." -msgstr "Tämä kappale sivuutetaan, kunnes asetat meshin" +msgstr "Tämä kappale sivuutetaan, kunnes asetat meshin." #: scene/3d/soft_body.cpp msgid "" @@ -11514,10 +11585,10 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"AnimatedSprite3D solmulle täytyy luoda tai asettaa 'Frames' ominaisuudeksi " +"AnimatedSprite3D solmulle täytyy luoda tai asettaa \"Frames\" ominaisuudeksi " "SpriteFrames resurssi ruutujen näyttämiseksi." #: scene/3d/vehicle_body.cpp @@ -11529,8 +11600,12 @@ msgstr "" "ja käytä sitä VehicleBody solmun alla." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment tarvitsee Environment resurssin." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WorldEnvironment solmun \"Environment\" ominaisuuden tulee sisältää " +"Environment, jotta sillä olisi näkyviä vaikutuksia." #: scene/3d/world_environment.cpp msgid "" @@ -11569,7 +11644,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Mitään ei ole yhdistetty syötteeseen '%s' solmussa '%s'." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "Graafille ei ole asetettu AnimationNode juurisolmua." #: scene/animation/animation_tree.cpp @@ -11581,8 +11656,8 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "AnimationPlayerille asetettu polku ei johda AnimationPlayer solmuun." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "AnimationPlayer juuri ei ole kelvollinen solmu." +msgid "The AnimationPlayer root node is not a valid node." +msgstr "AnimationPlayer solmun juurisolmu ei ole kelvollinen." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11595,12 +11670,11 @@ msgstr "Valitse väri ruudulta." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "Käännös (yaw)" +msgstr "Raaka" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11611,23 +11685,24 @@ msgid "Add current color as a preset." msgstr "Lisää nykyinen väri esiasetukseksi." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" -"Säilöllä ei ole itsessään mitään merkitystä ellei jokin skripti säädä sen " +"Säilöllä ei ole itsessään mitään merkitystä, ellei jokin skripti säädä sen " "alisolmujen sijoitustapaa.\n" -"Jos et aio lisätä skriptiä, ole hyvä ja käytä sen sijaan tavallista " -"'Control' solmua." +"Jos et aio lisätä skriptiä, ole hyvä ja käytä sen sijaan tavallista Control " +"solmua." #: scene/gui/control.cpp msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"Työkaluvihjettä ei näytettä, sillä ohjaimen Mouse Filter asetus on \"Ignore" +"\". Ratkaistaksesi tämän, laita Mouse Filter asetukseksi \"Stop\" tai \"Pass" +"\"." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11640,26 +11715,26 @@ msgstr "Ole hyvä ja vahvista..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" -"Pop-upit piilotetaan oletusarvoisesti ellet kutsu popup() tai jotain muuta " -"popup*() -funktiota. Ne saadaan näkyville muokatessa, mutta eivät näy " -"suoritettaessa." +"Ponnahdusikkunat piilotetaan oletusarvoisesti ellet kutsu popup()-funktiota " +"tai jotain muuta popup*() -funktiota. Ne saadaan näkyville muokattaessa, " +"mutta eivät näy suoritettaessa." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "Jos exp_edit on tosi, min_value täytyy olla > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "Jos \"Exp Edit\" on päällä, \"Min Value\" täytyy olla suurempi kuin 0." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer on tarkoitettu toimimaan yhdellä lapsikontrollilla.\n" -"Käytä containeria lapsena (VBox, HBox, jne), tai Control:ia ja aseta haluttu " -"minimikoko manuaalisesti." +"ScrollContainer on tarkoitettu toimimaan yhdellä alikontrollilla.\n" +"Käytä alisolmuna jotakin säilöä (VBox, HBox, jne), tai Control solmua ja " +"aseta haluttu minimikoko käsin." #: scene/gui/tree.cpp msgid "(Other)" @@ -11706,9 +11781,17 @@ msgid "Input" msgstr "Syöte" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "Virheellinen lähde esikatselulle." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Virheellinen lähde sävyttimelle." +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "Virheellinen vertailufunktio tälle tyypille." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Sijoitus funktiolle." @@ -11723,7 +11806,67 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa." #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Vakioita ei voi muokata." + +#~ msgid "Previous Folder" +#~ msgstr "Edellinen kansio" + +#~ msgid "Next Folder" +#~ msgstr "Seuraava kansio" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Avaa kuvakaappaukset automaattisesti" + +#~ msgid "Open in an external image editor." +#~ msgstr "Avaa ulkoisessa kuvankäsittelyohjelmassa." + +#~ msgid "Reverse" +#~ msgstr "Käänteinen" + +#~ msgid "Mirror X" +#~ msgstr "Peilaa X" + +#~ msgid "Mirror Y" +#~ msgstr "Peilaa Y" + +#~ msgid "Generating solution..." +#~ msgstr "Luodaan ratkaisua..." + +#~ msgid "Generating C# project..." +#~ msgstr "Luodaan C# projekti..." + +#~ msgid "Failed to create solution." +#~ msgstr "Ratkaisun luonti epäonnistui." + +#~ msgid "Failed to save solution." +#~ msgstr "Ratkaisun tallennus epäonnistui." + +#~ msgid "Done" +#~ msgstr "Valmis" + +#~ msgid "Failed to create C# project." +#~ msgstr "C# projektin luonti epäonnistui." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "Lisätietoja C# tuesta" + +#~ msgid "Create C# solution" +#~ msgstr "Luo C# ratkaisu" + +#~ msgid "Builds" +#~ msgstr "Käännökset" + +#~ msgid "Build Project" +#~ msgstr "Käännä projekti" + +#~ msgid "View log" +#~ msgstr "Näytä loki" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment tarvitsee Environment resurssin." #~ msgid "Enabled Classes" #~ msgstr "Käytössä olevat luokat" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 70dcd9056e..c863ce1071 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -610,6 +630,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -659,7 +683,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -762,6 +786,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -920,7 +948,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1096,7 +1124,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1455,6 +1482,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1625,7 +1656,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1676,7 +1707,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1701,23 +1732,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2392,6 +2427,10 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2583,14 +2622,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2905,6 +2936,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3500,6 +3535,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4525,6 +4561,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4553,7 +4593,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4567,7 +4606,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4642,31 +4681,32 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Ilipat Ang Mga Bezier Points" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6228,10 +6268,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6517,7 +6565,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6702,10 +6754,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7266,14 +7314,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7652,6 +7692,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7736,6 +7780,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7743,10 +7803,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7835,7 +7929,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7843,7 +7937,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7855,7 +7949,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7872,7 +7966,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7941,11 +8035,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7961,7 +8055,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7989,11 +8083,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8033,11 +8127,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8046,7 +8144,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8064,15 +8162,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8122,7 +8220,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8150,12 +8248,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8232,47 +8330,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9423,6 +9521,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9625,7 +9727,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9680,7 +9782,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10080,54 +10182,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10704,7 +10758,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10753,7 +10807,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10763,7 +10817,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10839,12 +10893,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10923,7 +10977,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10952,6 +11006,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -10986,8 +11044,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -10998,7 +11056,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11014,7 +11074,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11025,7 +11085,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11060,7 +11122,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11072,7 +11134,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11103,8 +11165,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11124,18 +11185,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11178,9 +11239,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 12b915efbf..d5798892a5 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -56,12 +56,15 @@ # Peter Kent <0.peter.kent@gmail.com>, 2019. # jef dered <themen098s@vivaldi.net>, 2019. # Patrick Zoch Alves <patrickzochalves@gmail.com>, 2019. +# Alexis Comte <comtealexis@gmail.com>, 2019. +# Julian Murgia <the.straton@gmail.com>, 2019. +# Ducoté <Raphalielle@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:50+0000\n" -"Last-Translator: Chenebel Dorian <LoubiTek54@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: Hugo Locurcio <hugo.locurcio@hugo.pro>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -181,6 +184,31 @@ msgid "Anim Change Call" msgstr "Changer l'appel de l'animation" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Modifier le temps de l'image-clé" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Changer la transition de l'animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Changer la transformation de l'animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Changer la valeur de l'image-clé de l'animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Changer l'appel de l'animation" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Modifier la longueur de l'animation" @@ -509,9 +537,8 @@ msgid "Select All" msgstr "Tout sélectionner" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "Sélectionner un nÅ“ud" +msgstr "Tout désélectionner" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -689,6 +716,10 @@ msgstr "Aller à la ligne" msgid "Line Number:" msgstr "Numéro de ligne :" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "%d correspondance(s) trouvée(s)" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Pas de correspondances" @@ -738,7 +769,7 @@ msgstr "Dézoomer" msgid "Reset Zoom" msgstr "Réinitialiser le zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Avertissements" @@ -845,6 +876,11 @@ msgid "Connect" msgstr "Connecter" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signaux :" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Connecter « %s » à « %s »" @@ -1007,7 +1043,8 @@ msgid "Owners Of:" msgstr "Propriétaires de :" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" "Supprimer les fichiers sélectionnés de ce projet ? (annulation impossible)" @@ -1147,7 +1184,7 @@ msgstr "Licence" #: editor/editor_about.cpp msgid "Thirdparty License" -msgstr "Licence tierce partie" +msgstr "Licences tierce partie" #: editor/editor_about.cpp msgid "" @@ -1191,7 +1228,6 @@ msgid "Success!" msgstr "Succès !" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Installer" @@ -1562,6 +1598,10 @@ msgstr "Modèle de version personnalisée introuvable." msgid "Template file not found:" msgstr "Fichier modèle introuvable :" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "Le PCK inclus dans un export 32-bits ne peut dépasser 4 Go." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "Éditeur 3D" @@ -1645,6 +1685,8 @@ msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"Le profil '%s' existe déjà . Veuillez le supprimer avant d'importer. Import " +"interrompu." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." @@ -1738,7 +1780,7 @@ msgstr "Montrer dans le gestionnaire de fichiers" msgid "New Folder..." msgstr "Nouveau dossier..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Rafraîchir" @@ -1789,7 +1831,7 @@ msgstr "Avancer" msgid "Go Up" msgstr "Monter" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Basculer les fichiers cachés" @@ -1814,23 +1856,31 @@ msgid "Move Favorite Down" msgstr "Déplacer le favori vers le bas" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Dossier précédent" +#, fuzzy +msgid "Go to previous folder." +msgstr "Aller au dossier parent." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Dossier suivant" +#, fuzzy +msgid "Go to next folder." +msgstr "Aller au dossier parent." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Aller au dossier parent." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Rechercher des fichiers" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Ajouter ou supprimer des favoris le dossier courant." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Activer / désactiver la visibilité des fichiers cachés." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -1998,7 +2048,7 @@ msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "Chercher dans l'aide" +msgstr "Rechercher dans l'aide" #: editor/editor_help_search.cpp msgid "Display All" @@ -2526,8 +2576,9 @@ msgid "Close Other Tabs" msgstr "Fermer les autres onglets" #: editor/editor_node.cpp +#, fuzzy msgid "Close Tabs to the Right" -msgstr "" +msgstr "Fermer la fenêtre à droite" #: editor/editor_node.cpp msgid "Close All Tabs" @@ -2574,6 +2625,11 @@ msgid "Go to previously opened scene." msgstr "Aller à la scène ouverte précédemment." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Copier le chemin" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Onglet suivant" @@ -2665,7 +2721,7 @@ msgstr "Ouvrir le dossier de données du projets" #: editor/editor_node.cpp msgid "Install Android Build Template" -msgstr "" +msgstr "Installer un modèle de compilation Android" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2778,9 +2834,8 @@ msgid "Editor Layout" msgstr "Disposition de l'éditeur" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Choisir comme racine de scène" +msgstr "Prendre une capture d'écran" #: editor/editor_node.cpp #, fuzzy @@ -2788,15 +2843,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Ouvrir le dossier de données/paramètres de l'éditeur" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Ouvrir l'éditeur suivant" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Activer/Désactiver le plein écran" @@ -2844,7 +2890,7 @@ msgstr "Documentation en ligne" #: editor/editor_node.cpp msgid "Q&A" -msgstr "Q & R" +msgstr "Questions et réponses" #: editor/editor_node.cpp msgid "Issue Tracker" @@ -2953,6 +2999,8 @@ msgstr "Ne pas enregistrer" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"Le modèle de compilation Android est manquant, veuillez installer les " +"modèles appropriés." #: editor/editor_node.cpp msgid "Manage Templates" @@ -2963,6 +3011,9 @@ msgid "" "This will install the Android project for custom builds.\n" "Note that, in order to use it, it needs to be enabled per export preset." msgstr "" +"Ceci va installer le projet Android pour des compilations personnalisées.\n" +"Notez que pour l'utiliser, vous devez l'activer pour chaque préréglage " +"d'exportation." #: editor/editor_node.cpp msgid "" @@ -3114,6 +3165,11 @@ msgid "Calls" msgstr "Appels" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Modifier le thème" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Activé" @@ -3738,6 +3794,7 @@ msgid "Nodes not in Group" msgstr "NÅ“uds non groupés" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtrer les nÅ“uds" @@ -4792,6 +4849,11 @@ msgid "Idle" msgstr "Inactif" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Installer" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Réessayer" @@ -4820,7 +4882,6 @@ msgid "Last" msgstr "Dernier" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Tout" @@ -4834,8 +4895,9 @@ msgid "Sort:" msgstr "Trier :" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Inverser" +#, fuzzy +msgid "Reverse sorting." +msgstr "Envoi d'une requête..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4856,7 +4918,7 @@ msgstr "Officiel" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Testing" -msgstr "Tester" +msgstr "En période de test" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -4917,31 +4979,38 @@ msgid "Rotation Step:" msgstr "Pas de la rotation :" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Déplacer le guide vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Créer un nouveau guide vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Supprimer le guide vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Déplacer le guide horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Créer un nouveau guide horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Supprimer le guide horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Créer de nouveaux guides horizontaux et verticaux" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6432,7 +6501,7 @@ msgstr "Aider à améliorer la documentation de Godot en donnant vos réactions. #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "Chercher dans la documentation de référence." +msgstr "Rechercher dans la documentation de référence." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." @@ -6539,10 +6608,19 @@ msgid "Syntax Highlighter" msgstr "Coloration syntaxique" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Créer des points." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6834,9 +6912,15 @@ msgid "Rear" msgstr "Arrière" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Aligner avec la vue" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Aligner la sélection avec la vue" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Pas de parent dans lequel instancier l'enfant." @@ -7027,10 +7111,6 @@ msgid "Focus Selection" msgstr "Focaliser la sélection" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Aligner la sélection avec la vue" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Outil sélection" @@ -7600,14 +7680,6 @@ msgid "Transpose" msgstr "Transposer" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Miroir X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Miroir Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8016,6 +8088,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Type d’entrée Visual Shader changée" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vertex" @@ -8107,6 +8183,22 @@ msgid "Color uniform." msgstr "Supprimer la transformation" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8114,10 +8206,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8209,7 +8335,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8217,7 +8343,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8229,7 +8355,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8246,7 +8372,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8315,11 +8441,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8335,7 +8461,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8363,11 +8489,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8408,11 +8534,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8422,7 +8552,7 @@ msgstr "Dialogue de transformation…" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8440,15 +8570,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8500,7 +8630,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8528,12 +8658,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8611,47 +8741,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9097,7 +9227,6 @@ msgstr "" "Supprimer le projet de la liste ? (Le contenu du dossier ne sera pas modifié)" #: editor/project_manager.cpp -#, fuzzy msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." @@ -9136,9 +9265,8 @@ msgid "New Project" msgstr "Nouveau projet" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Supprimer point" +msgstr "Nettoyer la liste" #: editor/project_manager.cpp msgid "Templates" @@ -9472,14 +9600,12 @@ msgid "Locales Filter" msgstr "Filtre de langues" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" -msgstr "Montrer toutes les langues" +msgstr "Afficher toutes les langues" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" -msgstr "Montrer uniquement les langues sélectionnées" +msgstr "Afficher uniquement les langues sélectionnées" #: editor/project_settings_editor.cpp msgid "Filter mode:" @@ -9897,6 +10023,11 @@ msgid "Extend Script" msgstr "Hériter d'un script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Re-parenter le nÅ“ud" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Choisir comme racine de scène" @@ -10131,7 +10262,8 @@ msgid "Script is valid." msgstr "Script valide" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "Autorisé : a-z, A-Z, 0-9 et _" #: editor/script_create_dialog.cpp @@ -10190,7 +10322,7 @@ msgid "Pick one or more items from the list to display the graph." msgstr "" "Sélectionnez un ou plusieurs éléments de la liste pour afficher le graphique." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Erreurs" @@ -10596,54 +10728,6 @@ msgstr "Choisissez distance :" msgid "Class name can't be a reserved keyword" msgstr "Le nom de classe ne peut pas être un mot-clé réservé" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Génération de la solution en cours..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Création du projet C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Impossible de créer la solution." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Impossible de sauvegarder la solution." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Terminé" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "Impossible de créer le projet C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "À propos du support C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Créer la solution C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Constructions" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Compiler le projet" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Voir les fichiers log" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fin de la trace d'appel (stack trace) intrinsèque" @@ -11093,6 +11177,8 @@ msgstr "" msgid "" "Android project is not installed for compiling. Install from Editor menu." msgstr "" +"Le projet Android n'est pas installé et ne peut donc pas être compilé. " +"Installez-le depuis le menu Éditeur." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -11261,8 +11347,9 @@ msgstr "" "Les dimensions du splash screen sont invalides (doivent être de 620x300)." #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Une ressource SpriteFrames doit être créée ou assignée à la propriété « " @@ -11328,8 +11415,9 @@ msgstr "" "« Particles Animation » activé." #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "Une texture avec la forme de la lumière doit être fournie dans la propriété " @@ -11343,7 +11431,8 @@ msgstr "" "occulteur ait un effet." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" "Le polygone d'occultation pour cet occulteur est vide. Veuillez dessiner un " "polygone !" @@ -11450,15 +11539,17 @@ msgstr "" "etc." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "Un VisibilityEnable2D fonctionne mieux lorsqu'il est directement enfant du " "nÅ“ud racine de la scène." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "ARVRCamera doit avoir un nÅ“ud ARVROrigin comme parent" #: scene/3d/arvr_nodes.cpp @@ -11552,9 +11643,10 @@ msgstr "" "CollisionObject, comme Area, StaticBody, RigidBody, KinematicBody, etc." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Une CollisionShape nécessite une forme pour fonctionner. Créez une ressource " "de forme pour cette CollisionShape !" @@ -11592,6 +11684,10 @@ msgstr "" "Les GIProps ne sont pas supporter par le pilote de vidéos GLES2.\n" "A la place utilisez une BakedLightMap." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11640,9 +11736,10 @@ msgstr "" "nÅ“ud de type Path." #: scene/3d/path.cpp +#, fuzzy msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" "L'option ROTATION_ORIENTED de PathFollow nécessite l'activation de « Up " "Vector » dans la ressource Curve de son parent Path." @@ -11658,7 +11755,10 @@ msgstr "" "Modifiez la taille dans les formes de collision enfants à la place." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" "La propriété Path doit pointer vers un nÅ“ud Spatial valide pour fonctionner." @@ -11678,8 +11778,9 @@ msgstr "" "Modifiez les tailles dans les formes de collision enfants à la place." #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Une ressource de type SampleFrames doit être créée ou définie dans la " @@ -11694,8 +11795,10 @@ msgstr "" "l'utiliser comme enfant d'un VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment requiert une ressource de type Environment." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" #: scene/3d/world_environment.cpp msgid "" @@ -11734,7 +11837,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Rien n'est connecté à l'entrée « %s » du nÅ“ud « %s »." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +#, fuzzy +msgid "No root AnimationNode for the graph is set." msgstr "Un AnimationNode racine pour le graphique n'est pas défini." #: scene/animation/animation_tree.cpp @@ -11749,7 +11853,8 @@ msgstr "" "Le chemin défini pour AnimationPlayer ne mène pas à un nÅ“ud AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +#, fuzzy +msgid "The AnimationPlayer root node is not a valid node." msgstr "La racine AnimationPlayer n'est pas un nÅ“ud valide." #: scene/animation/animation_tree_player.cpp @@ -11782,8 +11887,7 @@ msgstr "Ajouter la couleur courante comme pré-réglage." msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "Le conteneur en lui-même ne sert à rien à moins qu'un script ne configure " "son comportement de placement de ses enfants.\n" @@ -11805,10 +11909,11 @@ msgid "Please Confirm..." msgstr "Veuillez confirmer…" #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Les pop-ups seront cachés par défaut jusqu'à ce que vous appelez une " "fonction popup() ou une des fonctions popup*(). Les rendre visibles pour " @@ -11816,13 +11921,15 @@ msgstr "" "l'exécution." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +#, fuzzy +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "Si exp_edit est vrai min_value doit être > 0." #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer est conçu pour fonctionner avec un unique nÅ“ud enfant de " @@ -11875,9 +11982,19 @@ msgid "Input" msgstr "Entrée" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "Source invalide pour la forme." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Source invalide pour la forme." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Source invalide pour la forme." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Affectation à la fonction." @@ -11894,6 +12011,64 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex." msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Dossier précédent" + +#~ msgid "Next Folder" +#~ msgstr "Dossier suivant" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Ouvrir l'éditeur suivant" + +#~ msgid "Reverse" +#~ msgstr "Inverser" + +#~ msgid "Mirror X" +#~ msgstr "Miroir X" + +#~ msgid "Mirror Y" +#~ msgstr "Miroir Y" + +#~ msgid "Generating solution..." +#~ msgstr "Génération de la solution en cours..." + +#~ msgid "Generating C# project..." +#~ msgstr "Création du projet C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "Impossible de créer la solution." + +#~ msgid "Failed to save solution." +#~ msgstr "Impossible de sauvegarder la solution." + +#~ msgid "Done" +#~ msgstr "Terminé" + +#~ msgid "Failed to create C# project." +#~ msgstr "Impossible de créer le projet C#." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "À propos du support C#" + +#~ msgid "Create C# solution" +#~ msgstr "Créer la solution C#" + +#~ msgid "Builds" +#~ msgstr "Constructions" + +#~ msgid "Build Project" +#~ msgstr "Compiler le projet" + +#~ msgid "View log" +#~ msgstr "Voir les fichiers log" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment requiert une ressource de type Environment." + #~ msgid "Enabled Classes" #~ msgstr "Classes activées" diff --git a/editor/translations/he.po b/editor/translations/he.po index 747a45b6b2..e5c3c37588 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -142,6 +142,31 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "×©×™× ×•×™ זמן פריי×-מפתח ×× ×™×ž×¦×™×”" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "×©×™× ×•×™ ×ž×™×§×•× ×× ×™×ž×¦×™×”" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "×©×™× ×•×™ ×ž×™×§×•× ×× ×™×ž×¦×™×”" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "×©×™× ×•×™ ערך ×§×™×¤×¨×™×™× ×× ×™×ž×¦×™×”" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "×©×™× ×•×™ ×ž×™×§×•× ×× ×™×ž×¦×™×”" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "×©× ×” ×ורך ×× ×™×ž×¦×™×”" @@ -660,6 +685,10 @@ msgstr "מעבר לשורה" msgid "Line Number:" msgstr "מספר השורה:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "×ין תוצ×ות" @@ -709,7 +738,7 @@ msgstr "להתרחק" msgid "Reset Zoom" msgstr "×יפוס התקריב" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "×זהרות" @@ -816,6 +845,11 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "×ותות:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -979,7 +1013,8 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "להסיר ×ת ×”×§×‘×¦×™× ×”× ×‘×—×¨×™× ×ž×”×ž×™×–×? (××™ ×פשר לשחזר)" #: editor/dependency_editor.cpp @@ -1158,7 +1193,6 @@ msgid "Success!" msgstr "הצלחה!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "×”×ª×§× ×”" @@ -1524,6 +1558,10 @@ msgstr "" msgid "Template file not found:" msgstr "קובץ ×”×ª×‘× ×™×ª ×œ× × ×ž×¦×:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1720,7 +1758,7 @@ msgstr "הצגה ×‘×ž× ×”×œ הקבצי×" msgid "New Folder..." msgstr "תיקייה חדשה…" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "×¨×¢× ×•×Ÿ" @@ -1771,7 +1809,7 @@ msgstr "התקדמות קדימה" msgid "Go Up" msgstr "עלייה למעלה" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "החלפת מצב תצוגה ×œ×§×‘×¦×™× ×ž×•×¡×ª×¨×™×" @@ -1797,27 +1835,32 @@ msgstr "העברת מועדף למטה" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "המישור הקוד×" +msgid "Go to previous folder." +msgstr "מעבר לתיקייה שמעל" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "יצירת תיקייה" +msgid "Go to next folder." +msgstr "מעבר לתיקייה שמעל" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "מעבר לתיקייה שמעל" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "חיפוש במחלקות" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "×œ× × ×™×ª×Ÿ ליצור תיקייה." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "החלפת מצב תצוגה ×œ×§×‘×¦×™× ×ž×•×¡×ª×¨×™×" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2525,6 +2568,11 @@ msgid "Go to previously opened scene." msgstr "מעבר ×œ×¡×¦× ×” ×©× ×¤×ª×—×” ×§×•×“× ×œ×›×Ÿ." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "העתקת × ×ª×™×‘" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "×”×œ×©×•× ×™×ª הב××”" @@ -2722,15 +2770,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "הגדרות עורך" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "פתיחת העורך הב×" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "×›× ×™×¡×” ×ל/יצי××” ממסך מל×" @@ -3057,6 +3096,11 @@ msgid "Calls" msgstr "קרי×ות" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "חברי×" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3686,6 +3730,7 @@ msgid "Nodes not in Group" msgstr "הוספה לקבוצה" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4766,6 +4811,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "×”×ª×§× ×”" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4795,7 +4845,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4809,8 +4858,9 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "" +#, fuzzy +msgid "Reverse sorting." +msgstr "מוגשת בקשה…" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4884,31 +4934,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "יצירת תיקייה" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "הסרת מפתחות שגויי×" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "יצירת תיקייה" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "הסרת מפתחות שגויי×" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6538,10 +6592,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "מחיקת × ×§×•×“×•×ª" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6847,7 +6910,12 @@ msgstr "×חורי" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "יישור ×¢× ×”×ª×¦×•×’×”" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "יישור ×¢× ×”×ª×¦×•×’×”" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7038,10 +7106,6 @@ msgid "Focus Selection" msgstr "בחירת מיקוד" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7627,14 +7691,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8060,6 +8116,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Vertex" msgstr "קודקודי×" @@ -8150,6 +8210,22 @@ msgid "Color uniform." msgstr "התמרה" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8157,10 +8233,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8250,7 +8360,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8258,7 +8368,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8270,7 +8380,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8287,7 +8397,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8356,11 +8466,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8376,7 +8486,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8404,11 +8514,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8449,11 +8559,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8463,7 +8577,7 @@ msgstr "התמרה" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8481,15 +8595,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8541,7 +8655,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8569,12 +8683,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8651,47 +8765,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9885,6 +9999,11 @@ msgstr "הרצת סקריפט" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "יצירת %s חדש" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "שמירת ×¡×¦× ×”" @@ -10103,7 +10222,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10161,7 +10280,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10566,54 +10685,6 @@ msgstr "בחירת מרחק:" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "הפתרון × ×•×¦×¨â€¦" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "× ×•×¦×¨ ×ž×™×–× C#‎…" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "יצירת הפתרון × ×›×©×œ×”." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "שמירת הפתרון × ×›×©×œ×”." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "בוצע" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "יצירת ×ž×™×–× C#‎ × ×›×©×œ×”." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "יצירת פתרון C#‎" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11201,7 +11272,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11250,7 +11321,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11260,7 +11331,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11337,12 +11408,13 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "ל־ARVRCamera חייב להיות מפרק ARVROrigin כהורה שלו" #: scene/3d/arvr_nodes.cpp @@ -11424,7 +11496,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11453,6 +11525,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11488,8 +11564,8 @@ msgstr "PathFollow2D עובד רק ×›×שר ×”×•× ×ž×•×’×“×¨ כצ××¦× ×©×œ מ #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11500,7 +11576,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11516,7 +11594,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11527,7 +11605,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11564,7 +11644,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11576,7 +11656,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11608,8 +11688,7 @@ msgstr "הוספת הצבע ×”× ×•×›×—×™ כערכה" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11629,18 +11708,18 @@ msgstr "× × ×œ×מת…" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11684,9 +11763,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "גודל הגופן שגוי." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "גודל הגופן שגוי." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "גודל הגופן שגוי." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11704,6 +11793,39 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "המישור הקוד×" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "יצירת תיקייה" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "פתיחת העורך הב×" + +#~ msgid "Generating solution..." +#~ msgstr "הפתרון × ×•×¦×¨â€¦" + +#~ msgid "Generating C# project..." +#~ msgstr "× ×•×¦×¨ ×ž×™×–× C#‎…" + +#~ msgid "Failed to create solution." +#~ msgstr "יצירת הפתרון × ×›×©×œ×”." + +#~ msgid "Failed to save solution." +#~ msgstr "שמירת הפתרון × ×›×©×œ×”." + +#~ msgid "Done" +#~ msgstr "בוצע" + +#~ msgid "Failed to create C# project." +#~ msgstr "יצירת ×ž×™×–× C#‎ × ×›×©×œ×”." + +#~ msgid "Create C# solution" +#~ msgstr "יצירת פתרון C#‎" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "חיפוש במחלקות" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 3e55d0a16f..8a8a3c28a5 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -34,7 +34,7 @@ msgstr "डीकोडिंग बाइटà¥à¤¸, या अमानà¥à¤¯ à #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "अà¤à¤¿à¤µà¥à¤¯à¤•à¥à¤¤à¤¿ में अमानà¥à¤¯ इनपà¥à¤Ÿ % i (पारित नहीं)" +msgstr "अà¤à¤¿à¤µà¥à¤¯à¤•à¥à¤¤à¤¿ में अमानà¥à¤¯ इनपà¥à¤Ÿ %i (पारित नहीं)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -58,7 +58,7 @@ msgstr "'%s' बनाने के लिठअवैध तरà¥à¤•" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "'% s ' को कॉल करने पर:" +msgstr "'%s ' को कॉल करने पर:" #: editor/animation_bezier_editor.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -136,6 +136,31 @@ msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ बà¥à¤²à¤¾à¤µà¤¾" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ निधि" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ बà¥à¤²à¤¾à¤µà¤¾" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ परिणत" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ मà¥à¤–à¥à¤¯-फ़à¥à¤°à¥‡à¤® मूलà¥à¤¯(Value) बदलें" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ बà¥à¤²à¤¾à¤µà¤¾" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "शबà¥à¤¦ बदलें मूलà¥à¤¯" @@ -636,6 +661,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -685,7 +714,7 @@ msgstr "छोटा करो" msgid "Reset Zoom" msgstr "रीसेट आकार" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -800,6 +829,11 @@ msgstr "जà¥à¤¡à¤¿à¤¯à¥‡" #: editor/connections_dialog.cpp #, fuzzy +msgid "Signal:" +msgstr "संकेत" + +#: editor/connections_dialog.cpp +#, fuzzy msgid "Connect '%s' to '%s'" msgstr "जà¥à¤¡à¤¿à¤¯à¥‡ '%s' to '%s'" @@ -975,7 +1009,8 @@ msgid "Owners Of:" msgstr "के सà¥à¤µà¤¾à¤®à¥€:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "परियोजना से चयनित फ़ाइलें निकालें? (कोई पूरà¥à¤µà¤µà¤¤ नहीं)" #: editor/dependency_editor.cpp @@ -1165,7 +1200,6 @@ msgid "Success!" msgstr "सफलता!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "इंसà¥à¤Ÿà¥‰à¤²" @@ -1530,6 +1564,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1707,7 +1745,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1758,7 +1796,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1783,23 +1821,28 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "खोज कर:" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2485,6 +2528,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "सà¤à¥€ खंड" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2677,14 +2725,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2998,6 +3038,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "परिवरà¥à¤¤à¤¨ वकà¥à¤° चयन" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3612,6 +3657,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4658,6 +4704,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "इंसà¥à¤Ÿà¥‰à¤²" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4686,7 +4737,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4700,7 +4750,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4775,31 +4825,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "à¤à¤• नया बनाà¤à¤‚" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "मिटाना" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "à¤à¤• नया बनाà¤à¤‚" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "मिटाना" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6387,10 +6441,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "à¤à¤• नया बनाà¤à¤‚" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6677,7 +6740,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6862,10 +6929,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7440,14 +7503,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7851,6 +7906,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7938,6 +7997,22 @@ msgid "Color uniform." msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ परिणत" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7945,10 +8020,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8037,7 +8146,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8045,7 +8154,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8057,7 +8166,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8074,7 +8183,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8143,11 +8252,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8163,7 +8272,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8191,11 +8300,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8236,11 +8345,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8250,7 +8363,7 @@ msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8268,15 +8381,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8328,7 +8441,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8356,12 +8469,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8438,47 +8551,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9639,6 +9752,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "à¤à¤• नया बनाà¤à¤‚" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9847,7 +9965,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9903,7 +10021,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10306,55 +10424,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10936,7 +11005,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10985,7 +11054,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10995,7 +11064,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11071,12 +11140,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11155,7 +11224,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11184,6 +11253,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11218,8 +11291,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11230,7 +11303,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11246,7 +11321,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11257,7 +11332,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11294,7 +11371,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "जà¥à¤¡à¤¿à¤¯à¥‡ '%s' to '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11306,7 +11383,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11337,8 +11414,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11358,18 +11434,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11413,9 +11489,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "गलत फॉणà¥à¤Ÿ का आकार |" + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "गलत फॉणà¥à¤Ÿ का आकार |" +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "गलत फॉणà¥à¤Ÿ का आकार |" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11432,6 +11518,10 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" + #~ msgid "Line:" #~ msgstr "रेखा:" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 232c2d1e4d..606f7b021f 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -613,6 +633,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -662,7 +686,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -766,6 +790,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -924,7 +952,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1100,7 +1128,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1459,6 +1486,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1629,7 +1660,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1680,7 +1711,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1705,23 +1736,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2396,6 +2431,10 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2587,14 +2626,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2909,6 +2940,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3504,6 +3539,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4529,6 +4565,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4557,7 +4597,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4571,7 +4610,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4646,31 +4685,32 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Pomakni Bezier ToÄke" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6234,10 +6274,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6523,7 +6571,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6708,10 +6760,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7272,14 +7320,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7661,6 +7701,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7745,6 +7789,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7752,10 +7812,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7844,7 +7938,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7852,7 +7946,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7864,7 +7958,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7881,7 +7975,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7950,11 +8044,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7970,7 +8064,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7998,11 +8092,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8042,11 +8136,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8055,7 +8153,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8073,15 +8171,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8130,7 +8228,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8158,12 +8256,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8240,47 +8338,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9431,6 +9529,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9635,7 +9737,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9690,7 +9792,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10090,54 +10192,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10714,7 +10768,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10763,7 +10817,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10773,7 +10827,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10849,12 +10903,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10933,7 +10987,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10962,6 +11016,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -10996,8 +11054,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11008,7 +11066,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11024,7 +11084,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11035,7 +11095,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11070,7 +11132,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11082,7 +11144,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11113,8 +11175,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11134,18 +11195,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11188,9 +11249,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index d4429e1631..ac339ff977 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -6,14 +6,15 @@ # Nagy Lajos <neutron9707@gmail.com>, 2017. # Sandor Domokos <sandor.domokos@gmail.com>, 2017-2018. # Varga Dániel <danikah.danikah@gmail.com>, 2016-2018. -# Gabor Csordas <gaborcsordas@yahoo.com>, 2018. +# Gabor Csordas <gaborcsordas@yahoo.com>, 2018, 2019. # Tusa Gamer <tusagamer@mailinator.com>, 2018. +# Máté Lugosi <mate.lugosi@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2018-12-29 12:09+0000\n" -"Last-Translator: Tusa Gamer <tusagamer@mailinator.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: Gabor Csordas <gaborcsordas@yahoo.com>\n" "Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/" "godot/hu/>\n" "Language: hu\n" @@ -21,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.4-dev\n" +"X-Generator: Weblate 3.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -45,15 +46,15 @@ msgstr "self nem használható, mert a példány null (nincs átadva)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "" +msgstr "Érvénytelen operandus a %s, %s és %s operátorokhoz." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "" +msgstr "Érvénytelen %s tÃpusú index a %s alap tÃpushoz." #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "" +msgstr "Érvénytelen nevezett index '%s' %s alaptÃpushoz" #: core/math/expression.cpp #, fuzzy @@ -63,7 +64,7 @@ msgstr "" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "" +msgstr "'%s' hÃvásánál:" #: editor/animation_bezier_editor.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -72,21 +73,19 @@ msgstr "Ingyenes" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "Kiegyensúlyozott" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Mirror" -msgstr "Hiba!" +msgstr "Tükör" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" msgstr "IdÅ‘:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Value:" -msgstr "Új név:" +msgstr "Érték:" #: editor/animation_bezier_editor.cpp #, fuzzy @@ -94,24 +93,20 @@ msgid "Insert Key Here" msgstr "Kulcs Beszúrása" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Duplicate Selected Key(s)" -msgstr "Kiválasztás megkettÅ‘zés" +msgstr "Kiválasztott elem(ek) megkettÅ‘zése" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Delete Selected Key(s)" -msgstr "Törli a kiválasztott fájlokat?" +msgstr "Kiválasztott kulcsok törlése" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Add Bezier Point" -msgstr "Pont hozzáadása" +msgstr "Bezier pont hozzáadása" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Move Bezier Points" -msgstr "Pont Mozgatása" +msgstr "Bezier pont Mozgatása" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -119,7 +114,7 @@ msgstr "Animáció kulcsok megkettÅ‘zése" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "Animáció kulcs törlés" +msgstr "Animáció kulcs törlése" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" @@ -143,17 +138,43 @@ msgstr "Animáció hÃvás változtatás" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animáció kulcsképkocka idÅ‘ változtatás" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animáció átmenet változtatása" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animáció transzformáció változtatás" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animáció kulcsképkocka érték változtatás" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animáció hÃvás változtatás" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Animáció Nevének Megváltoztatása:" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "Animációs ciklus változtatása" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Property Track" -msgstr "" +msgstr "Tulajdonság Követés" #: editor/animation_track_editor.cpp #, fuzzy @@ -178,14 +199,12 @@ msgid "Animation Playback Track" msgstr "Animáció lejátszásának leállÃtása. (S)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "Animáció hossza (másodpercben)." +msgstr "Animáció hossza (képkockákban)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" -msgstr "Animáció hossza (másodpercben)." +msgstr "Animáció hossza (másodpercben)" #: editor/animation_track_editor.cpp #, fuzzy @@ -200,7 +219,7 @@ msgstr "Animáció nagyÃtás." #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" -msgstr "" +msgstr "Funkciók:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" @@ -225,9 +244,8 @@ msgid "Update Mode (How this property is set)" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Interpolation Mode" -msgstr "Animáció Node" +msgstr "Interpoláció mód" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" @@ -661,6 +679,10 @@ msgstr "Sorra Ugrás" msgid "Line Number:" msgstr "Sor Száma:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Nincs Találat" @@ -710,7 +732,7 @@ msgstr "KicsinyÃtés" msgid "Reset Zoom" msgstr "NagyÃtás VisszaállÃtása" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -823,6 +845,11 @@ msgid "Connect" msgstr "Csatlakoztatás" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Jelzések:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "'%s' Csatlakoztatása '%s'-hez" @@ -993,7 +1020,8 @@ msgid "Owners Of:" msgstr "Tulajdonosai:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "EltávolÃtja a kiválasztott fájlokat a projektbÅ‘l? (nem visszavonható)" #: editor/dependency_editor.cpp @@ -1178,7 +1206,6 @@ msgid "Success!" msgstr "Siker!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "TelepÃtés" @@ -1545,6 +1572,10 @@ msgstr "" msgid "Template file not found:" msgstr "Sablon fájl nem található:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1742,7 +1773,7 @@ msgstr "Mutat FájlkezelÅ‘ben" msgid "New Folder..." msgstr "Új Mappa..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "FrissÃtés" @@ -1793,7 +1824,7 @@ msgstr "Ugrás ElÅ‘re" msgid "Go Up" msgstr "Ugrás Fel" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Rejtett Fájlok MegjelenÃtése" @@ -1819,27 +1850,32 @@ msgstr "Kedvenc Lefelé Mozgatása" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "ElÅ‘zÅ‘ SÃk" +msgid "Go to previous folder." +msgstr "Ugrás a szülÅ‘mappába" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Mappa Létrehozása" +msgid "Go to next folder." +msgstr "Ugrás a szülÅ‘mappába" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Ugrás a szülÅ‘mappába" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Osztályok Keresése" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Nem sikerült létrehozni a mappát." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Rejtett Fájlok MegjelenÃtése" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2603,6 +2639,11 @@ msgid "Go to previously opened scene." msgstr "Ugrás az elÅ‘zÅ‘leg megnyitott jelenetre." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Útvonal másolása" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "KövetkezÅ‘ fül" @@ -2818,15 +2859,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "SzerkesztÅ‘ BeállÃtások" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "KövetkezÅ‘ SzerkesztÅ‘ Megnyitása" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Teljes KépernyÅ‘" @@ -3154,6 +3186,11 @@ msgid "Calls" msgstr "HÃvások" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Tagok" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3794,6 +3831,7 @@ msgid "Nodes not in Group" msgstr "Hozzáadás Csoporthoz" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4889,6 +4927,11 @@ msgid "Idle" msgstr "Tétlen" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "TelepÃtés" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Újra" @@ -4919,7 +4962,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Mind" @@ -4933,8 +4975,9 @@ msgid "Sort:" msgstr "Rendezés:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Visszafele" +#, fuzzy +msgid "Reverse sorting." +msgstr "Lekérdezés..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -5017,31 +5060,38 @@ msgid "Rotation Step:" msgstr "Forgatási Léptetés:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "FüggÅ‘leges vezetÅ‘vonal mozgatása" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Új függÅ‘leges vezetÅ‘vonal létrehozása" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "FüggÅ‘leges vezetÅ‘vonal eltávolÃtása" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "VÃzszintes vezetÅ‘vonal mozgatása" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Új vÃzszintes vezetÅ‘vonal létrehozása" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "VÃzszintes vezetÅ‘vonal eltávolÃtása" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Új vÃzszintes és függÅ‘leges vezetÅ‘vonalak létrehozása" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6704,10 +6754,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Pontok Törlése" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -7012,7 +7071,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7199,10 +7262,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7794,14 +7853,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8235,6 +8286,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8326,6 +8381,22 @@ msgid "Color uniform." msgstr "Animáció transzformáció változtatás" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8333,10 +8404,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "Vec állandó változtatás" @@ -8429,7 +8534,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8437,7 +8542,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8449,7 +8554,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8466,7 +8571,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8535,11 +8640,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8555,7 +8660,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8583,11 +8688,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8629,11 +8734,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8643,7 +8752,7 @@ msgstr "Sokszög Létrehozása" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8661,15 +8770,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8722,7 +8831,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8750,12 +8859,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8834,47 +8943,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10066,6 +10175,11 @@ msgstr "Szkript Futtatása" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Új %s Létrehozása" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Scene mentés" @@ -10284,7 +10398,7 @@ msgid "Script is valid." msgstr "Az animációs fa érvényes." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10342,7 +10456,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10751,55 +10865,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Fájlok Megtekintése" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11393,7 +11458,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11442,7 +11507,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11452,7 +11517,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11528,12 +11593,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11612,7 +11677,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11641,6 +11706,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11675,8 +11744,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11687,7 +11756,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11703,7 +11774,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11714,7 +11785,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11752,7 +11825,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "'%s' Lecsatlakoztatása '%s'-ról" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11768,7 +11841,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Az animációs fa érvénytelen." #: scene/animation/animation_tree_player.cpp @@ -11799,8 +11872,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11820,18 +11892,18 @@ msgstr "Kérem ErÅ‘sÃtse Meg..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11880,9 +11952,19 @@ msgstr "Bemenet Hozzáadása" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Érvénytelen betűtÃpus méret." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Érvénytelen betűtÃpus méret." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Érvénytelen betűtÃpus méret." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11900,6 +11982,25 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "ElÅ‘zÅ‘ SÃk" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Mappa Létrehozása" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "KövetkezÅ‘ SzerkesztÅ‘ Megnyitása" + +#~ msgid "Reverse" +#~ msgstr "Visszafele" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Fájlok Megtekintése" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Osztályok Keresése" diff --git a/editor/translations/id.po b/editor/translations/id.po index c8a1573410..7048f501b5 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -19,12 +19,13 @@ # Guntur Sarwohadi <gsarwohadi@gmail.com>, 2019. # Alphin Albukhari <alphinalbukhari5@gmail.com>, 2019. # I Dewa Agung Adhinata <agungnata2003@gmail.com>, 2019. +# herri siagian <herry.it.2007@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:50+0000\n" -"Last-Translator: Reza Hidayat Bayu Prabowo <rh.bayu.prabowo@gmail.com>\n" +"PO-Revision-Date: 2019-07-19 13:42+0000\n" +"Last-Translator: Sofyan Sugianto <sofyanartem@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -145,6 +146,31 @@ msgid "Anim Change Call" msgstr "Ubah Panggilan Anim" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Ubah Waktu Keyframe Animasi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Ubah Transisi Animasi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Ubah Transformasi Animasi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Ubah Nilai Keyframe Animasi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Ubah Panggilan Anim" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Ubah Panjang Animasi" @@ -467,9 +493,8 @@ msgid "Select All" msgstr "Pilih Semua" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "Metode Publik:" +msgstr "Pilih Tidak Ada" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -645,6 +670,10 @@ msgstr "Pergi ke Baris" msgid "Line Number:" msgstr "Nomor Baris:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Ditemukan %d kecocokan." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Tidak ada yang cocok" @@ -694,7 +723,7 @@ msgstr "Perkecil Pandangan" msgid "Reset Zoom" msgstr "Kebalikan Semula Pandangan" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Peringatan" @@ -800,6 +829,10 @@ msgid "Connect" msgstr "Menghubungkan" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Sinyal:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Sambungkan '%s' ke '%s'" @@ -962,9 +995,8 @@ msgid "Owners Of:" msgstr "Pemilik Dari:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "" -"Hapus file-file yang dipilih dari proyek? (tidak bisa dibatalkan / undo)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "Hapus berkas yang dipilih dari proyek? (tidak bisa dibatalkan)" #: editor/dependency_editor.cpp msgid "" @@ -1146,7 +1178,6 @@ msgid "Success!" msgstr "Sukses!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Pasang" @@ -1334,7 +1365,6 @@ msgid "Must not collide with an existing engine class name." msgstr "Tidak boleh sama dengan nama kelas engine yang sudah ada." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "Tidak boleh sama dengan nama tipe bawaan yang ada." @@ -1487,7 +1517,6 @@ msgstr "" "'Impor Lainnya 2' di Pengaturan Proyek." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'ETC' texture compression for the driver fallback " "to GLES2.\n" @@ -1495,8 +1524,9 @@ msgid "" "Enabled'." msgstr "" "Platform target membutuhkan kompressi tekstur 'ETC' untuk mengembalikan " -"driver ke GLES2. Aktifkan 'Impor Lainnya' di Pengaturan Proyek, atau matikan " -"'Driver Fallback Enabled'." +"driver ke GLES2. \n" +"Aktifkan 'Impor Lainnya' di Pengaturan Proyek, atau matikan 'Driver Fallback " +"Enabled'." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1514,6 +1544,10 @@ msgstr "Templat rilis kustom tidak ditemukan." msgid "Template file not found:" msgstr "Templat berkas tidak ditemukan:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "Pada ekspor 32-bit PCK yang ditanamkan tidak boleh lebih dari 4GiB." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "Penyunting 3D" @@ -1539,9 +1573,8 @@ msgid "Node Dock" msgstr "Dok Node" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Dok Berkas Sistem" +msgstr "Dok Impor dan Berkas Sistem" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1592,12 +1625,11 @@ msgid "File '%s' format is invalid, import aborted." msgstr "Format Berkas '%s' tidak valid, impor dibatalkan." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"Sudah ada profil '%s'. Remote profil ini terlebih dahulu sebelum mengimpor, " +"Sudah ada profil '%s'. Hapus profil ini terlebih dahulu sebelum mengimpor, " "impor dibatalkan." #: editor/editor_feature_profile.cpp @@ -1609,9 +1641,8 @@ msgid "Unset" msgstr "Tidak diatur" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Profil Sekarang" +msgstr "Profil Sekarang:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1633,9 +1664,8 @@ msgid "Export" msgstr "Ekspor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Profil yang Tersedia" +msgstr "Profil yang Tersedia:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1690,7 +1720,7 @@ msgstr "Tampilkan di Manajer Berkas" msgid "New Folder..." msgstr "Buat Direktori..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Segarkan" @@ -1741,7 +1771,7 @@ msgstr "Maju" msgid "Go Up" msgstr "Naik" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Beralih File Tersembunyi" @@ -1766,23 +1796,31 @@ msgid "Move Favorite Down" msgstr "Pindahkan Favorit Kebawah" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Direktori Sebelumnya" +#, fuzzy +msgid "Go to previous folder." +msgstr "Pergi ke direktori atasnya." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Folder Berikutnya" +#, fuzzy +msgid "Go to next folder." +msgstr "Pergi ke direktori atasnya." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Pergi ke direktori atasnya." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Cari berkas" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Hapus favorit direktori saat ini." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Beralih visibilitas berkas yang tersembunyi." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2026,7 +2064,7 @@ msgstr "Bersihkan Luaran" #: editor/editor_node.cpp msgid "Project export failed with error code %d." -msgstr "Ekspor proyek gagal dengan kode kesalahan% d." +msgstr "Ekspor proyek gagal dengan kode kesalahan %d." #: editor/editor_node.cpp msgid "Imported resources can't be saved." @@ -2513,6 +2551,11 @@ msgid "Go to previously opened scene." msgstr "Pergi ke skena yang sebelumnya dibuka." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Salin Lokasi" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Tab selanjutnya" @@ -2715,32 +2758,20 @@ msgid "Editor Layout" msgstr "Tata Letak Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Jadikan Skena Dasar" +msgstr "Ambil Tangkapan Layar" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Buka Penyunting Direktori Data/Pengaturan" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Buka Penyunting Selanjutnya" +msgstr "Screenshot disimpan di folder Editor Data/Settings" #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Mode Layar Penuh" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Beralih Mode Split" +msgstr "Jungkitkan Konsol Sistem" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2849,19 +2880,16 @@ msgid "Spins when the editor window redraws." msgstr "Putar ketika jendela penyunting digambar ulang." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Lanjut" +msgstr "Perbarui Terus-menerus" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Perbarui Perubahan" +msgstr "Perbarui Saat Berubah" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Nonaktifkan Perbaruan Spinner" +msgstr "Sembunyikan Spinner Pembaruan" #: editor/editor_node.cpp msgid "FileSystem" @@ -3056,6 +3084,11 @@ msgid "Calls" msgstr "Panggil" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Sunting tema..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Nyala" @@ -3572,9 +3605,8 @@ msgid "Re-Scan Filesystem" msgstr "Pindai Ulang Berkas Sistem" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Toggle Split Mode" -msgstr "Beralih Mode Split" +msgstr "Jungkitkan Mode Split" #: editor/filesystem_dock.cpp msgid "Search files" @@ -3621,7 +3653,6 @@ msgid "Filters:" msgstr "Filter:" #: editor/find_in_files.cpp -#, fuzzy msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." @@ -3643,58 +3674,49 @@ msgid "Cancel" msgstr "Batal" #: editor/find_in_files.cpp -#, fuzzy msgid "Find: " -msgstr "Cari" +msgstr "Cari: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace: " -msgstr "Ganti" +msgstr "Ganti: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace all (no undo)" -msgstr "Ganti Semua" +msgstr "Ganti Semua (tidak bisa dikembalikan)" #: editor/find_in_files.cpp -#, fuzzy msgid "Searching..." -msgstr "Menyimpan..." +msgstr "Mencari..." #: editor/find_in_files.cpp -#, fuzzy msgid "Search complete" -msgstr "Mencari Teks" +msgstr "Pencarian selesai" #: editor/groups_editor.cpp -#, fuzzy msgid "Group name already exists." -msgstr "KESALAHAN: Nama animasi sudah ada!" +msgstr "Nama grup sudah ada." #: editor/groups_editor.cpp -#, fuzzy msgid "Invalid group name." -msgstr "Nama tidak sah." +msgstr "Nama grup tidak valid." #: editor/groups_editor.cpp editor/node_dock.cpp msgid "Groups" msgstr "Kelompok" #: editor/groups_editor.cpp -#, fuzzy msgid "Nodes not in Group" -msgstr "Tambahkan ke Grup" +msgstr "Node tidak dalam Grup" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp -#, fuzzy +#: editor/scene_tree_editor.cpp msgid "Filter nodes" -msgstr "Filter:" +msgstr "Saring node" #: editor/groups_editor.cpp -#, fuzzy msgid "Nodes in Group" -msgstr "Tambahkan ke Grup" +msgstr "Node dalam Grup" #: editor/groups_editor.cpp msgid "Add to Group" @@ -3705,9 +3727,8 @@ msgid "Remove from Group" msgstr "Hapus dari Grup" #: editor/groups_editor.cpp -#, fuzzy msgid "Manage Groups" -msgstr "Grup" +msgstr "Kelola Grup" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -3815,9 +3836,8 @@ msgid "Save scenes, re-import and restart" msgstr "Simpan skena, impor ulang, dan mulai ulang" #: editor/import_dock.cpp -#, fuzzy msgid "Changing the type of an imported file requires editor restart." -msgstr "Mengubah driver video harus memulai ulang editor." +msgstr "Mengubah jenis berkas yang diimpor butuh menyalakan ulang penyunting." #: editor/import_dock.cpp msgid "" @@ -3831,9 +3851,8 @@ msgid "Failed to load resource." msgstr "Gagal memuat resource." #: editor/inspector_dock.cpp -#, fuzzy msgid "Expand All Properties" -msgstr "Perluas semua properti" +msgstr "Perluas Semua Properti" #: editor/inspector_dock.cpp #, fuzzy @@ -3854,9 +3873,8 @@ msgid "Paste Params" msgstr "Tempel Parameter" #: editor/inspector_dock.cpp -#, fuzzy msgid "Edit Resource Clipboard" -msgstr "KESALAHAN: Tidak ada aset animasi di clipboard!" +msgstr "Sunting PapanKlip SumberDaya" #: editor/inspector_dock.cpp msgid "Copy Resource" @@ -3903,9 +3921,8 @@ msgid "Object properties." msgstr "Properti Objek." #: editor/inspector_dock.cpp -#, fuzzy msgid "Filter properties" -msgstr "Filter:" +msgstr "Saring properti" #: editor/inspector_dock.cpp msgid "Changes may be lost!" @@ -3920,19 +3937,16 @@ msgid "Select a Node to edit Signals and Groups." msgstr "Pilih sebuah node untuk menyunting Sinyal dan Grup." #: editor/plugin_config_dialog.cpp -#, fuzzy msgid "Edit a Plugin" -msgstr "Sunting Bidang" +msgstr "Sunting Plugin" #: editor/plugin_config_dialog.cpp -#, fuzzy msgid "Create a Plugin" -msgstr "Buat Subskribsi" +msgstr "Buat Plugin" #: editor/plugin_config_dialog.cpp -#, fuzzy msgid "Plugin Name:" -msgstr "Pengaya" +msgstr "Nama Plugin:" #: editor/plugin_config_dialog.cpp msgid "Subfolder:" @@ -3943,9 +3957,8 @@ msgid "Language:" msgstr "Bahasa:" #: editor/plugin_config_dialog.cpp -#, fuzzy msgid "Script Name:" -msgstr "Nama Projek:" +msgstr "Nama Skrip:" #: editor/plugin_config_dialog.cpp msgid "Activate now?" @@ -3953,53 +3966,45 @@ msgstr "Aktifkan sekarang?" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Polygon" -msgstr "Buat Bidang" +msgstr "Buat Poligon" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Create points." -msgstr "Hapus Titik" +msgstr "Buat titik." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "" "Edit points.\n" "LMB: Move Point\n" "RMB: Erase Point" msgstr "" -"Sunting bidang yang ada:\n" -"LMB: Pindahkan Titik.\n" -"Ctrl+LMB: Pecah Segmen.\n" -"RMB: Hapus Titik." +"Sunting titik.\n" +"LMB: Pindahkan Titik\n" +"RMB: Hapus Titik" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Erase points." -msgstr "Beri Skala Seleksi" +msgstr "Hapus titik." #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Edit Polygon" -msgstr "Sunting Bidang" +msgstr "Sunting Poligon" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Insert Point" msgstr "Tambah Titik" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Edit Polygon (Remove Point)" -msgstr "Sunting Bidang (Hapus Titik)" +msgstr "Sunting Poligon (Hapus Titik)" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Remove Polygon And Point" -msgstr "Hapus Bidang dan Titik" +msgstr "Hapus Poligon dan Titik" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4013,25 +4018,21 @@ msgstr "Tambah Animasi" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Load..." -msgstr "Muat" +msgstr "Muat..." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Move Node Point" -msgstr "Hapus Sinyal" +msgstr "Pindahkan Titik Node" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Limits" -msgstr "Ubah Waktu Blend" +msgstr "Ubah Batas BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Labels" -msgstr "Ubah Waktu Blend" +msgstr "Ubah Label BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4041,20 +4042,17 @@ msgstr "Node tipe ini tidak dapat digunakan. Hanya node utama yang diijinkan." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Node Point" -msgstr "Tambahkan Node" +msgstr "Tambah Titik Node" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Animation Point" -msgstr "Tambah Animasi" +msgstr "Tambah Titik Animasi" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Remove BlendSpace1D Point" -msgstr "Hapus Bidang dan Titik" +msgstr "Hapus Titik BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Move BlendSpace1D Node Point" @@ -4096,39 +4094,32 @@ msgstr "Titik" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Open Animation Node" -msgstr "Nama Animasi Baru:" +msgstr "Buka Node Animasi" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "KESALAHAN: Nama animasi sudah ada!" +msgstr "Segitiga sudah ada." #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Triangle" -msgstr "Tambahkan Variabel" +msgstr "Tambah Segitiga" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Limits" -msgstr "Ubah Waktu Blend" +msgstr "Ubah Batas BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Labels" -msgstr "Ubah Waktu Blend" +msgstr "Ubah Label BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Point" -msgstr "Hapus Bidang dan Titik" +msgstr "Hapus Titik BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Triangle" -msgstr "Hapus Variabel" +msgstr "Hapus Segitiga BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." @@ -4139,9 +4130,8 @@ msgid "No triangles exist, so no blending can take place." msgstr "Tidak ada segi tiga, pembauran tidak di terapkan." #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Toggle Auto Triangles" -msgstr "Beralih AutoLoad Globals" +msgstr "Jungkitkan Segitiga Otomatis" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Create triangles by connecting points." @@ -4161,30 +4151,26 @@ msgid "Blend:" msgstr "Campur:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Parameter Changed" -msgstr "Menyimpan perubahan-perubahan lokal..." +msgstr "Parameter Berubah" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp -#, fuzzy msgid "Edit Filters" -msgstr "Sunting Filter" +msgstr "Sunting Penyaring" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Output node can't be added to the blend tree." msgstr "Node keluaran tidak bisa ditambahkan ke pohon campur." #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Add Node to BlendTree" -msgstr "Tambahkan Node (Node-node) dari Tree" +msgstr "Tambah Node ke BlendTree" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node Moved" -msgstr "Nama Node:" +msgstr "Node Dipindahkan" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Unable to connect, port may be in use or connection may be invalid." @@ -4193,26 +4179,22 @@ msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Nodes Connected" -msgstr "Terhubung" +msgstr "Node Terhubung" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Nodes Disconnected" -msgstr "Terputus" +msgstr "Node Terputus" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Set Animation" -msgstr "Animasi" +msgstr "Atur Animasi" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Node" -msgstr "Metode Publik:" +msgstr "Hapus Node" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/scene_tree_dock.cpp @@ -4220,14 +4202,12 @@ msgid "Delete Node(s)" msgstr "Hapus Node" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Toggle Filter On/Off" -msgstr "Alihkan track ini ke nyala/mati." +msgstr "Jungkitkan Penyaring Nyala/Mati" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Change Filter" -msgstr "Ganti Ukuran Kamera" +msgstr "Ganti Penyaring" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." @@ -4250,31 +4230,26 @@ msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Renamed" -msgstr "Nama Node:" +msgstr "Node Telah Diubah Namanya" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Node..." -msgstr "Tambahkan Node" +msgstr "Tambah Node..." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "Edit Filtered Tracks:" -msgstr "Sunting Filter" +msgstr "Sunting Trek yang Disaring:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Enable Filtering" msgstr "Aktifkan penyaringan" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Toggle Autoplay" -msgstr "Kondisikan Putar Otomatis" +msgstr "Jungkitkan Putar Otomatis" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" @@ -4298,14 +4273,12 @@ msgid "Remove Animation" msgstr "Hapus Animasi" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Invalid animation name!" -msgstr "KESALAHAN: Nama animasi tidak valid!" +msgstr "Nama animasi tidak valid!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Animation name already exists!" -msgstr "KESALAHAN: Nama animasi sudah ada!" +msgstr "Nama animasi sudah ada!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -4329,37 +4302,30 @@ msgid "Duplicate Animation" msgstr "Gandakan Animasi" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to copy!" -msgstr "KESALAHAN: Tidak ada animasi untuk disalin!" +msgstr "Tidak ada animasi untuk disalin!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation resource on clipboard!" -msgstr "KESALAHAN: Tidak ada aset animasi di clipboard!" +msgstr "Tidak ada aset animasi di papan klip!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Pasted Animation" -msgstr "Animasi Ditempel" +msgstr "Animasi yang Direkatkan" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Paste Animation" -msgstr "Tempelkan Animasi" +msgstr "Rekatkan Animasi" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to edit!" -msgstr "KESALAHAN: Tidak ada animasi untuk disunting!" +msgstr "Tidak ada animasi untuk disunting!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Play selected animation backwards from current pos. (A)" msgstr "Mainkan mundur animasi terpilih dari lokasi sekarang. (A)" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Mainkan mundur animasi terpilih dari akhir. (Shift+A)" @@ -4380,9 +4346,8 @@ msgid "Animation position (in seconds)." msgstr "Posisi Animasi (dalam detik)." #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Scale animation playback globally for the node." -msgstr "Skalakan playback animasi secara global untuk node ini." +msgstr "Skalakan pemutaran animasi secara global untuk node ini." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" @@ -4394,21 +4359,18 @@ msgid "Animation" msgstr "Animasi" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Edit Transitions..." -msgstr "Transisi" +msgstr "Sunting Transisi..." #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Open in Inspector" -msgstr "Buka dalam Penyunting" +msgstr "Buka dalam Inspektur" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." msgstr "Tampilkan daftar animasi dalam pemutar animasi." #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Autoplay on Load" msgstr "Putar Otomatis saat Dimuat" @@ -4417,19 +4379,16 @@ msgid "Enable Onion Skinning" msgstr "Aktifkan Bayang-bayang" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Onion Skinning Options" -msgstr "Onion Skinning" +msgstr "Opsi Onion Skinning" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Directions" -msgstr "Deskripsi:" +msgstr "Arah" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Past" -msgstr "Tempel" +msgstr "Sebelum" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Future" @@ -4496,14 +4455,12 @@ msgid "Cross-Animation Blend Times" msgstr "Waktu Berbaur Animasi-silang" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Move Node" -msgstr "Salin Resource" +msgstr "Pindahkan Node" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Add Transition" -msgstr "Transisi" +msgstr "Tambah Transisi" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4535,19 +4492,16 @@ msgid "Start and end nodes are needed for a sub-transition." msgstr "Node awal dan akhir dibutuhkan untuk sub-transisi." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "No playback resource set at path: %s." -msgstr "Tidak didalam path resource." +msgstr "Tidak ada aset playback yang diatur di lokasi: %s." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Removed" -msgstr "Dihapus:" +msgstr "Node Dihapus" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition Removed" -msgstr "Node Transisi" +msgstr "Transisi Dihapus" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set Start Node (Autoplay)" @@ -4564,19 +4518,16 @@ msgstr "" "Shift+LMB untuk membuat sambungan." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Create new nodes." -msgstr "Buat Baru %s" +msgstr "Buat node baru." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Connect nodes." -msgstr "Sambungkan Ke Node:" +msgstr "Hubungkan node." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Remove selected node or transition." -msgstr "Hapus track yang dipilih." +msgstr "Hapus node atau transisi terpilih." #: editor/plugins/animation_state_machine_editor.cpp msgid "Toggle autoplay this animation on start, restart or seek to zero." @@ -4587,9 +4538,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "Terapkan akhir pada animasi. Berguna untuk sub-transisi." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition: " -msgstr "Transisi" +msgstr "Transisi: " #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -4723,23 +4673,20 @@ msgid "Import Animations..." msgstr "Impor Animasi..." #: editor/plugins/animation_tree_player_editor_plugin.cpp -#, fuzzy msgid "Edit Node Filters" -msgstr "Sunting Filter Node" +msgstr "Sunting Penyaring Node" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Filters..." msgstr "Penyaring..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Contents:" -msgstr "Konstanta:" +msgstr "Konten:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "View Files" -msgstr "File:" +msgstr "Tampilkan Berkas" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve hostname:" @@ -4750,12 +4697,10 @@ msgid "Connection error, please try again." msgstr "Gangguan koneksi, silakan coba lagi." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Can't connect to host:" -msgstr "Tidak bisa terhubung ke host:" +msgstr "Tidak dapat terhubung ke host:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "No response from host:" msgstr "Tidak ada respon dari host:" @@ -4808,6 +4753,11 @@ msgid "Idle" msgstr "Menganggur" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Pasang" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Coba Lagi" @@ -4820,14 +4770,12 @@ msgid "Download for this asset is already in progress!" msgstr "Unduhan untuk aset ini sedang diproses!" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "First" -msgstr "pertama" +msgstr "Pertama" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Previous" -msgstr "Tab sebelumnya" +msgstr "Sebelum" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Next" @@ -4838,7 +4786,6 @@ msgid "Last" msgstr "Terakhir" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Semua" @@ -4852,8 +4799,9 @@ msgid "Sort:" msgstr "Sortir:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Terbalik" +#, fuzzy +msgid "Reverse sorting." +msgstr "Melakukan permintaan..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4933,65 +4881,63 @@ msgid "Rotation Step:" msgstr "Jangkah Perputaran:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Pindahkan garis-bantu vertikal" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new vertical guide" -msgstr "Buat Subskribsi" +msgid "Create Vertical Guide" +msgstr "Buat panduan vertikal baru" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove vertical guide" -msgstr "Hapus Variabel" +msgid "Remove Vertical Guide" +msgstr "Hapus panduan vertikal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Pindahkan garis-bantu horisontal" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new horizontal guide" -msgstr "Buat Subskribsi" +msgid "Create Horizontal Guide" +msgstr "Buat panduan horizontal baru" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove horizontal guide" -msgstr "Hapus Tombol-tombol yang tidak sah" +msgid "Remove Horizontal Guide" +msgstr "Hapus panduan horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Buat garis-bantu vertikal dan horisontal baru" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move pivot" -msgstr "Hapus Sinyal" +msgstr "Pindahkan poros" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate CanvasItem" -msgstr "Sunting CanvasItem" +msgstr "Putar CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move anchor" msgstr "Pindahkan jangkar" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Resize CanvasItem" -msgstr "Sunting CanvasItem" +msgstr "Ubah Ukuran CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale CanvasItem" -msgstr "Sunting CanvasItem" +msgstr "Skalakan CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem" -msgstr "Sunting CanvasItem" +msgstr "Pindahkan CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5027,36 +4973,31 @@ msgstr "Ubah Jangkar-jangkar" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected" -msgstr "Semua pilihan" +msgstr "Kunci yang Dipilih" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected" -msgstr "Hapus yang Dipilih" +msgstr "Lepas Kunci yang Dipilih" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected" -msgstr "Hapus Pilihan" +msgstr "Kelompokkan yang Dipilih" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected" -msgstr "Hapus Pilihan" +msgstr "Keluarkan yang dipilih dari Grup" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" msgstr "Tempel Pose" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "Buat Tulang Kustom(satu/lebih) dari Node(satu/lebih)" +msgstr "Buat Tulang Kustom dari Node" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" @@ -5081,9 +5022,8 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Reset" -msgstr "Perkecil Pandangan" +msgstr "Reset Perbesaran" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Select Mode" @@ -5115,9 +5055,8 @@ msgid "Rotate Mode" msgstr "Mode Putar" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale Mode" -msgstr "Beralih Mode" +msgstr "Mode Skala" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5137,9 +5076,8 @@ msgid "Pan Mode" msgstr "Mode Geser Pandangan" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle snapping." -msgstr "Beralih Breakpoint" +msgstr "Jungkitkan Pengancingan." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Snap" @@ -5150,9 +5088,8 @@ msgid "Snapping Options" msgstr "Opsi-opsi Snap" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Grid" -msgstr "Snap ke kotak-kotak" +msgstr "Kancing ke Kisi" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" @@ -5172,39 +5109,32 @@ msgid "Use Pixel Snap" msgstr "Gunakan Snap Piksel" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Smart Snapping" -msgstr "Snap pintar" +msgstr "Pengancingan Pintar" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Parent" -msgstr "Snap ke orang-tua" +msgstr "Kancingkan ke Orangtuanya" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" -msgstr "Snap ke jangkar node" +msgstr "Kancing ke Jangkar Node" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" -msgstr "Snap ke sisi-sisi node" +msgstr "Kancing ke Tepi Node" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" -msgstr "Snap ke tengah node" +msgstr "Kancing ke Tengah Node" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" -msgstr "Snape ke node-node lain" +msgstr "Kancing ke Node Lain" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Guides" -msgstr "Snape ke garis-bantu" +msgstr "Kancing ke Panduan" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5227,9 +5157,8 @@ msgid "Restores the object's children's ability to be selected." msgstr "Jadikan anak-anak object dapat di seleksi kembali." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Skeleton Options" -msgstr "Singleton" +msgstr "Opsi Pertulangan" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" @@ -5302,9 +5231,8 @@ msgid "Scale mask for inserting keys." msgstr "Masker skala untuk menyisipkan key." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Insert keys (based on mask)." -msgstr "Sisipkan Key Anim" +msgstr "Sisipkan Kunci (berdasarkan mask)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5320,9 +5248,8 @@ msgstr "" "Key harus disisipkan secara manual untuk pertama kali." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Auto Insert Key" -msgstr "Sisipkan Key Anim" +msgstr "Otomatis Sisipkan Kunci" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5358,7 +5285,6 @@ msgid "Adding %s..." msgstr "Menambahkan %s..." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Cannot instantiate multiple nodes without root." msgstr "Tidak dapat menginstansiasi beberapa node tanpa root." @@ -5373,9 +5299,8 @@ msgid "Error instancing scene from %s" msgstr "Gagal meng-instance skena dari %s" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Default Type" -msgstr "Ubah Tipe Nilai Array" +msgstr "Ubah Tipe Baku" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5386,21 +5311,18 @@ msgstr "" "Seret & lepas + Alt : Ubah tipe node" #: editor/plugins/collision_polygon_editor_plugin.cpp -#, fuzzy msgid "Create Polygon3D" -msgstr "Buat Bidang" +msgstr "Buat Polygon3D" #: editor/plugins/collision_polygon_editor_plugin.cpp -#, fuzzy msgid "Edit Poly" -msgstr "Sunting Bidang" +msgstr "Sunting Poligon" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly (Remove Point)" msgstr "Sunting Bidang (Hapus Titik)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp -#, fuzzy msgid "Set Handle" msgstr "Atur Pegangan" @@ -5423,9 +5345,8 @@ msgstr "Muat Masker Emisi" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Mulai Ulang:" +msgstr "Mulai Ulang" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5459,9 +5380,8 @@ msgid "Emission Colors" msgstr "Warna Emisi" #: editor/plugins/cpu_particles_editor_plugin.cpp -#, fuzzy msgid "CPUParticles" -msgstr "Partikel" +msgstr "Partikel(CPU)" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -5506,41 +5426,34 @@ msgid "Load Curve Preset" msgstr "Muat Preset Kurva" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add Point" -msgstr "Tambahkan Sinyal" +msgstr "Tambah Titik" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Point" -msgstr "Hapus Sinyal" +msgstr "Hapus Titik" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left Linear" -msgstr "Linier" +msgstr "Linier ke Kiri" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right Linear" -msgstr "Tampilan Kanan." +msgstr "Linier ke Kanan" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Preset" -msgstr "Muat Galat" +msgstr "Muat Preset" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Curve Point" -msgstr "Hapus Sinyal" +msgstr "Hapus Titik Kurva" #: editor/plugins/curve_editor_plugin.cpp msgid "Toggle Curve Linear Tangent" msgstr "Beralih Kurva Linear Tangen" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Hold Shift to edit tangents individually" msgstr "Tahan Shift untuk menyunting tangen kurva satu-persatu" @@ -5550,7 +5463,7 @@ msgstr "" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" -msgstr "" +msgstr "Gradasi Disunting" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -5561,7 +5474,6 @@ msgid "Items" msgstr "Item" #: editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "Item List Editor" msgstr "Penyunting Daftar Item" @@ -5579,7 +5491,7 @@ msgstr "Buat Badan Trimesh Statis" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Convex Body" -msgstr "" +msgstr "Buat Bodi Cembung Statis" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" @@ -5594,9 +5506,8 @@ msgid "Failed creating shapes!" msgstr "Gagal membuat bentuk!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Convex Shape(s)" -msgstr "Buat Baru %s" +msgstr "Buat Bentuk Cembung" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" @@ -5612,7 +5523,7 @@ msgstr "UV Unwrap gagal, mesh mungkin tidak bermacam-macam?" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "No mesh to debug." -msgstr "" +msgstr "Tidak ada mesh untuk diawakutu." #: editor/plugins/mesh_instance_editor_plugin.cpp #: editor/plugins/sprite_editor_plugin.cpp @@ -5625,7 +5536,7 @@ msgstr "MeshInstance tidak memiliki Mesh!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh has not surface to create outlines from!" -msgstr "" +msgstr "Mesh belum muncul untuk membuat garis tepi darinya!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" @@ -5636,13 +5547,13 @@ msgid "Could not create outline!" msgstr "Tidak dapat membuat garis!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Outline" -msgstr "Buat Garis" +msgstr "Buat Garis Tepi" #: editor/plugins/mesh_instance_editor_plugin.cpp +#, fuzzy msgid "Mesh" -msgstr "" +msgstr "Jala" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -5663,14 +5574,12 @@ msgid "Create Outline Mesh..." msgstr "Buat Garis Mesh..." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "View UV1" -msgstr "File:" +msgstr "Tampilkan UV1" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "View UV2" -msgstr "File:" +msgstr "Tampilkan UV2" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Unwrap UV2 for Lightmap/AO" @@ -5750,15 +5659,15 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Couldn't map area." -msgstr "" +msgstr "Tidak dapat memetakan area." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Source Mesh:" -msgstr "" +msgstr "Pilih Mesh Sumber:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Target Surface:" -msgstr "" +msgstr "Pilih Target Permukaan:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate Surface" @@ -5778,31 +5687,31 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" -msgstr "" +msgstr "Sumbu-X" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Y-Axis" -msgstr "" +msgstr "Sumbu-Y" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Z-Axis" -msgstr "" +msgstr "Sumbu-Z" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh Up Axis:" -msgstr "" +msgstr "Sumbu Atas Mesh:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Rotation:" -msgstr "" +msgstr "Perputaran Acak:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Tilt:" -msgstr "" +msgstr "Kemiringan Acak:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Scale:" -msgstr "" +msgstr "Skala Acak:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate" @@ -5811,169 +5720,167 @@ msgstr "" #: editor/plugins/navigation_polygon_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Navigation Polygon" -msgstr "" +msgstr "Buat Poligon Navigasi" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles" -msgstr "Sambungkan Ke Node:" +msgstr "Konversikan menjadi CPUParticles" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generating Visibility Rect" -msgstr "" +msgstr "Menghasilkan Kotak Penampakan" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generate Visibility Rect" -msgstr "" +msgstr "Buatkan Kotak Penampakan" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" -msgstr "" +msgstr "Hanya dapat mengatur titik ke dalam material proses ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Generation Time (sec):" -msgstr "" +msgstr "Waktu Pembuatan (detik):" #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" -msgstr "" +msgstr "Bidang tidak memiliki area!" #: editor/plugins/particles_editor_plugin.cpp msgid "No faces!" -msgstr "" +msgstr "Tidak ada bidang!" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." -msgstr "" +msgstr "Node tidak mengandung geometri." #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry (faces)." -msgstr "" +msgstr "Node tidak mengandung geometri (bidang)." #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emitter" -msgstr "" +msgstr "Buat Pengemisi" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Points:" -msgstr "" +msgstr "Titik Emisi:" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points" -msgstr "" +msgstr "Titik Permukaan" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "Titik+Normal Permukaan (Diarahkan)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" -msgstr "" +msgstr "Volume" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Source: " -msgstr "" +msgstr "Sumber Emisi: " #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" +msgstr "Pemroses material atau jenis 'ParticlesMaterial' dibutuhkan." #: editor/plugins/particles_editor_plugin.cpp msgid "Generating AABB" -msgstr "" +msgstr "Membuat AABB" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate Visibility AABB" -msgstr "" +msgstr "Buat Penampakan AABB" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate AABB" -msgstr "" +msgstr "Buat AABB" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" -msgstr "" +msgstr "Hapus Titik dari Kurva" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Out-Control from Curve" -msgstr "" +msgstr "Hapus Kontrol-Luar dari Kurva" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove In-Control from Curve" -msgstr "" +msgstr "Hapus Kontrol-Dalam dari Kurva" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point to Curve" -msgstr "" +msgstr "Tambah Titik ke Kurva" #: editor/plugins/path_2d_editor_plugin.cpp -#, fuzzy msgid "Split Curve" -msgstr "Sunting Kurva Node" +msgstr "Pisahkan Kurva" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Point in Curve" -msgstr "" +msgstr "Geser Titik dalam Kurva" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move In-Control in Curve" -msgstr "" +msgstr "Geser Kontrol-Dalam dalam Kurva" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Out-Control in Curve" -msgstr "" +msgstr "Geser Kontrol-Luar dalam Kurva" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Select Points" -msgstr "" +msgstr "Pilih Titik" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Shift+Drag: Select Control Points" -msgstr "" +msgstr "Shift+Seret: Pilih Titik Kontrol" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Click: Add Point" -msgstr "" +msgstr "Klik: Tambah Titik" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Left Click: Split Segment (in curve)" -msgstr "" +msgstr "Klik Kiri: Pisahkan Segmen (dalam Kurva)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Right Click: Delete Point" -msgstr "" +msgstr "Klik Kanan: Hapus Titik" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Select Control Points (Shift+Drag)" -msgstr "" +msgstr "Pilih Titik Kontrol (Shift+Seret)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point (in empty space)" -msgstr "" +msgstr "Tambah Titik (dalam ruang kosong)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Delete Point" -msgstr "" +msgstr "Hapus Titik" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Close Curve" -msgstr "" +msgstr "Tutup Kurva" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp msgid "Options" -msgstr "" +msgstr "Opsi" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -5987,257 +5894,245 @@ msgstr "" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" -msgstr "" +msgstr "Titik #" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Point Position" -msgstr "Hapus Sinyal" +msgstr "Atur Posisi Titik Kurva" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve In Position" -msgstr "Hapus Sinyal" +msgstr "Atur Posisi Kurva Dalam" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Set Curve Out Position" -msgstr "Hapus Sinyal" +msgstr "Atur Posisi Kurva Luar" #: editor/plugins/path_editor_plugin.cpp msgid "Split Path" -msgstr "" +msgstr "Pisahkan Tapak" #: editor/plugins/path_editor_plugin.cpp msgid "Remove Path Point" -msgstr "" +msgstr "Hapus Titik Tapak" #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Remove Out-Control Point" -msgstr "Hapus Autoload" +msgstr "Hapus Titik Kontrol-Luar" #: editor/plugins/path_editor_plugin.cpp msgid "Remove In-Control Point" -msgstr "" +msgstr "Hapus Titik Kontrol-Dalam" #: editor/plugins/path_editor_plugin.cpp msgid "Split Segment (in curve)" -msgstr "" +msgstr "Pisahkan Segmen (dalam kurva)" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" -msgstr "Hapus Sinyal" +msgstr "Geser Persendian" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "The skeleton property of the Polygon2D does not point to a Skeleton2D node" -msgstr "" +msgstr "Properti pertulangan dari Polygon2D tidak mengarah ke node Skeleton2D" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Sync Bones" -msgstr "" +msgstr "Sinkronkan Pertulangan" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "No texture in this polygon.\n" "Set a texture to be able to edit UV." msgstr "" +"Tidak ada tekstur dalam poligon ini.\n" +"Atur tekstur supaya bisa menyunting UV-nya." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" -msgstr "" +msgstr "Buat Peta UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "Polygon 2D has internal vertices, so it can no longer be edited in the " "viewport." msgstr "" +"Polygon2D memiliki verteks internal, jadi tidak bisa disunting lagi di dalam " +"viewport." #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Polygon & UV" -msgstr "Buat Bidang" +msgstr "Buat Poligon & UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Internal Vertex" -msgstr "Buat Subskribsi" +msgstr "Buat Verteks Internal" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Internal Vertex" -msgstr "Hapus item" +msgstr "Hapus Verteks Internal" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Invalid Polygon (need 3 different vertices)" -msgstr "" +msgstr "Poligon tidak valid (butuh 3 verteks yang berbeda)" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Add Custom Polygon" -msgstr "Sunting Bidang" +msgstr "Tambah Poligon Kustom" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Custom Polygon" -msgstr "Hapus Bidang dan Titik" +msgstr "Hapus Poligon Kustom" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform UV Map" -msgstr "" +msgstr "Transformasikan Peta UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Transform Polygon" -msgstr "Buat Bidang" +msgstr "Transformasikan Poligon" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint Bone Weights" -msgstr "" +msgstr "Gambar Pembobotan Tulang" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Open Polygon 2D UV editor." -msgstr "Penyunting UV Poligon 2D" +msgstr "Buka Penyunting UV Poligon 2D." #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Polygon 2D UV Editor" msgstr "Penyunting UV Poligon 2D" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV" -msgstr "" +msgstr "UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Points" msgstr "Titik" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Polygons" -msgstr "Sunting Bidang" +msgstr "Poligon" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Bones" -msgstr "" +msgstr "Tulang" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Move Points" -msgstr "Hapus Sinyal" +msgstr "Geser Titik" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" -msgstr "" +msgstr "Ctrl: Putar" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" -msgstr "" +msgstr "Shift: Geser Semua" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift+Ctrl: Scale" -msgstr "" +msgstr "Shift+Ctrl: Skala" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Move Polygon" -msgstr "" +msgstr "Geser Poligon" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Rotate Polygon" -msgstr "" +msgstr "Putar Poligon" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Scale Polygon" -msgstr "" +msgstr "Skalakan Poligon" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." -msgstr "" +msgstr "Buat poligon kustom. Mengaktifkan perenderan poligon kustom." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "Remove a custom polygon. If none remain, custom polygon rendering is " "disabled." msgstr "" +"Hapus poligon kustom. Jika tidak tersisa, perenderan poligon kustom " +"dinonaktifkan." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint weights with specified intensity." -msgstr "" +msgstr "Gambar pembobotan dengan intensitas yang ditentukan." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Unpaint weights with specified intensity." -msgstr "" +msgstr "Hapus pembobotan dengan intensitas yang ditentukan." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" -msgstr "" +msgstr "Radius:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon->UV" -msgstr "" +msgstr "Poligon->UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV->Polygon" -msgstr "" +msgstr "UV->Poligon" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" -msgstr "" +msgstr "Bersihkan UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Settings" -msgstr "Pengaturan Editor" +msgstr "Pengaturan Kisi" #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap" -msgstr "" +msgstr "Pengancingan" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "" +msgstr "Aktifkan Pengancingan" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "" +msgstr "Kisi" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Configure Grid:" -msgstr "Atur Snap" +msgstr "Konfigurasikan Kisi:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset X:" -msgstr "" +msgstr "Ofset X Kisi:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset Y:" -msgstr "" +msgstr "Ofset Y Kisi:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step X:" -msgstr "" +msgstr "Jarak X Kisi:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step Y:" -msgstr "" +msgstr "Jarak Y Kisi:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Sync Bones to Polygon" -msgstr "" +msgstr "Sinkronkan Tulang ke Poligon" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" -msgstr "" +msgstr "KESALAHAN: Tidak dapat memuat sumber daya!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Add Resource" -msgstr "" +msgstr "Tambah Sumber Daya" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Rename Resource" @@ -6258,7 +6153,6 @@ msgstr "Tempel Resource" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Instance:" msgstr "Instansi:" @@ -6270,7 +6164,6 @@ msgstr "Jenis:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp -#, fuzzy msgid "Open in Editor" msgstr "Buka dalam Penyunting" @@ -6279,9 +6172,8 @@ msgid "Load Resource" msgstr "Muat Sumber Daya" #: editor/plugins/resource_preloader_editor_plugin.cpp -#, fuzzy msgid "ResourcePreloader" -msgstr "Resource" +msgstr "PreloaderSumberDaya" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" @@ -6300,59 +6192,48 @@ msgid "Close and save changes?" msgstr "Tutup dan simpan perubahan?" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error writing TextFile:" -msgstr "Error menyimpan TileSet!" +msgstr "Galat saat menulis TextFile:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error: could not load file." -msgstr "Tidak dapat membuat folder." +msgstr "Galat: tidak dapat memuat berkas." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error could not load file." -msgstr "Tidak dapat membuat folder." +msgstr "Galat tidak dapat memuat berkas." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error saving file!" -msgstr "Error menyimpan TileSet!" +msgstr "Galat saat menyimpan berkas!" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error while saving theme." -msgstr "Error saat menyimpan." +msgstr "Galat saat menyimpan tema." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Saving" -msgstr "Galat saat memindahkan:" +msgstr "Galat Menyimpan" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." -msgstr "Galat saat mengimpor:" +msgstr "Galat saat mengimpor tema." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" -msgstr "Galat saat mengimpor:" +msgstr "Galat saat mengimpor" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New TextFile..." -msgstr "Buat Direktori..." +msgstr "Berkas Teks Baru..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open File" -msgstr "Buka sebuah File" +msgstr "Buka Berkas" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Save File As..." -msgstr "Simpan Sebagai..." +msgstr "Simpan Berkas Sebagai..." #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme" @@ -6380,23 +6261,20 @@ msgid "Find Next" msgstr "Pencarian Selanjutnya" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Filter:" +msgstr "Penyaring Skrip" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Beralih penyortiran alfabetis dari daftar fungsi." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Filter:" +msgstr "Penyaring fungsi" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort" -msgstr "Sortir:" +msgstr "Urutkan" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp @@ -6423,9 +6301,8 @@ msgid "File" msgstr "Berkas" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open..." -msgstr "Buka" +msgstr "Buka..." #: editor/plugins/script_editor_plugin.cpp msgid "Save All" @@ -6433,27 +6310,24 @@ msgstr "Simpan Semua" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "" +msgstr "Muat Ulang Skrip secara Halus" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Copy Script Path" -msgstr "Salin Resource" +msgstr "Salin Lokasi Skrip" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "History Previous" -msgstr "Tab sebelumnya" +msgstr "Riwayat Sebelumnya" #: editor/plugins/script_editor_plugin.cpp msgid "History Next" -msgstr "" +msgstr "Riwayat Selanjutnya" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme" -msgstr "Simpan Tema" +msgstr "Tema" #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme..." @@ -6480,167 +6354,167 @@ msgid "Run" msgstr "Jalankan" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Toggle Scripts Panel" -msgstr "Beralih Favorit" +msgstr "Jungkitkan Panel Skrip" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" -msgstr "" +msgstr "Langkahi" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "" +msgstr "Masuki" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" -msgstr "" +msgstr "Putuskan" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp msgid "Continue" -msgstr "" +msgstr "Lanjutkan" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "" +msgstr "Biarkan Pengawakutu Terbuka" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Debug with External Editor" -msgstr "Debug menggunakan penyunting eksternal" +msgstr "Awakutu menggunakan Penyunting Eksternal" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open Godot online documentation." -msgstr "Buka baru-baru ini" +msgstr "Buka dokumentasi daring Godot." #: editor/plugins/script_editor_plugin.cpp msgid "Request Docs" -msgstr "" +msgstr "Minta Dokumentasi" #: editor/plugins/script_editor_plugin.cpp msgid "Help improve the Godot documentation by giving feedback." -msgstr "" +msgstr "Bantu tingkatkan dokumentasi Godot dengan memberikan tanggapan." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "" +msgstr "Cari dokumentasi referensi." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." msgstr "Ke dokumen yang disunting sebelumnya." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Go to next edited document." -msgstr "Ke dokumen yang disunting selanjutnya." +msgstr "Pergi ke dokumen yang disunting selanjutnya." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "Berlainan" +msgstr "Abaikan" #: editor/plugins/script_editor_plugin.cpp 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?:" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Reload" -msgstr "" +msgstr "Muat Ulang" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "Simpan Ulang" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "" +msgstr "Pengawakutu" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Search Results" -msgstr "Mencari Bantuan" +msgstr "Hasil Pencarian" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Connections to method:" -msgstr "Sambungkan Ke Node:" +msgstr "Hubungan dengan fungsi:" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Source" -msgstr "Resource" +msgstr "Sumber" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" -msgstr "Sinyal-sinyal" +msgstr "Sinyal" #: editor/plugins/script_text_editor.cpp msgid "Target" -msgstr "" +msgstr "Target" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." -msgstr "Memutuskan '%s' dari '%s'" +msgstr "" +"Tidak ditemukan fungsi '%s' yang dihubungkan untuk sinyal '%s' dari node " +"'%s' ke node '%s'." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Line" -msgstr "Baris:" +msgstr "Baris" #: editor/plugins/script_text_editor.cpp msgid "(ignore)" -msgstr "" +msgstr "(abaikan)" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function" -msgstr "Tambahkan Fungsi" +msgstr "Pergi ke Fungsi" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." -msgstr "" +msgstr "Hanya sumber daya dari berkas sistem yang dapat dihapus." #: editor/plugins/script_text_editor.cpp msgid "Lookup Symbol" -msgstr "" +msgstr "Simbol Pencarian" #: editor/plugins/script_text_editor.cpp msgid "Pick Color" -msgstr "" +msgstr "Pilih Warna" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Convert Case" -msgstr "" +msgstr "Konversikan Pengkapitalan" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "Huruf Besar" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "Huruf Kecil" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Capitalize" -msgstr "" +msgstr "Kapitalisasi" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Syntax Highlighter" -msgstr "" +msgstr "Penyorot Sintaks" + +#: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Pergi Ke" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" -msgstr "" +msgstr "Bilah Marka" + +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Breakpoint" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -6648,58 +6522,52 @@ msgid "Cut" msgstr "Potong" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Delete Line" -msgstr "Hapus" +msgstr "Hapus Baris" #: editor/plugins/script_text_editor.cpp msgid "Indent Left" -msgstr "" +msgstr "Indentasi Kiri" #: editor/plugins/script_text_editor.cpp msgid "Indent Right" -msgstr "" +msgstr "Indentasi Kanan" #: editor/plugins/script_text_editor.cpp msgid "Toggle Comment" -msgstr "" +msgstr "Jungkitkan Komentar" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Toggle Bookmark" -msgstr "Mode Layar Penuh" +msgstr "Jungkitkan Markah Buku" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Bookmark" -msgstr "Lanjut ke Langkah Berikutnya" +msgstr "Pergi ke Markah Buku Berikutnya" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Bookmark" -msgstr "Ke dokumen yang disunting sebelumnya." +msgstr "Pergi ke Markah Buku Sebelumnya" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Remove All Bookmarks" -msgstr "Hapus Pilihan" +msgstr "Hapus Semua Markah Buku" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Fold/Unfold Line" -msgstr "Pergi ke Baris" +msgstr "Lipat/Bentangkan Baris" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "Lipat Semua Baris" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "Bentangkan Semua Baris" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" -msgstr "" +msgstr "Duplikat ke Bawah" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" @@ -6707,21 +6575,19 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" -msgstr "" +msgstr "Hapus Spasi di Belakang" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert Indent to Spaces" -msgstr "Sambungkan Ke Node:" +msgstr "Konversikan Indentasi ke Spasi" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Convert Indent to Tabs" -msgstr "Sambungkan Ke Node:" +msgstr "Konversikan Indentasi ke Tab" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "" +msgstr "Indentasi Otomatis" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -6730,46 +6596,43 @@ msgstr "Beralih Breakpoint" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "" +msgstr "Hapus Semua Titik Jeda" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Breakpoint" -msgstr "Lanjut ke Langkah Berikutnya" +msgstr "Pergi ke Langkah Jeda Berikutnya" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Breakpoint" -msgstr "Ke dokumen yang disunting sebelumnya." +msgstr "Pergi ke Langkah Jeda Sebelumnya" #: editor/plugins/script_text_editor.cpp msgid "Find Previous" -msgstr "" +msgstr "Cari Sebelumnya" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Find in Files..." -msgstr "Saring berkas..." +msgstr "Cari Dalam Berkas..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Function..." -msgstr "Hapus Fungsi" +msgstr "Pergi ke Fungsi..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Line..." -msgstr "Pergi ke Baris" +msgstr "Pergi ke Baris..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" -msgstr "" +msgstr "Bantuan Kontekstual" #: editor/plugins/shader_editor_plugin.cpp msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" +"Shader ini telah dimodifikasi dalam diska.\n" +"Aksi apa yang harus diambil?" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" @@ -6948,7 +6811,12 @@ msgstr "Belakang" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Tampilan Kanan." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Tampilan Kanan." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7142,10 +7010,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "Semua pilihan" @@ -7742,14 +7606,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8185,6 +8041,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8278,6 +8138,22 @@ msgid "Color uniform." msgstr "Ubah Transformasi Animasi" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8285,10 +8161,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8379,7 +8289,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8387,7 +8297,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8399,7 +8309,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8416,7 +8326,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8485,11 +8395,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8505,7 +8415,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8533,11 +8443,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8578,12 +8488,18 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." -msgstr "" +#, fuzzy +msgid "Cubic texture uniform lookup." +msgstr "Format Tekstur" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup." +msgstr "Format Tekstur" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "Format Tekstur" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8593,7 +8509,7 @@ msgstr "Buat Bidang" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8611,15 +8527,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8671,7 +8587,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8699,12 +8615,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8781,47 +8697,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10041,6 +9957,11 @@ msgid "Extend Script" msgstr "Buka Cepat Script..." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Buat Baru %s" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Jadikan Skena Dasar" @@ -10266,7 +10187,7 @@ msgid "Script is valid." msgstr "Pohon animasi valid." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10327,7 +10248,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10753,60 +10674,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "Gagal memuat resource." - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "Gagal memuat resource." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create C# project." -msgstr "Gagal memuat resource." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "Buat Subskribsi" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "Proyek" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "File:" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11431,8 +11298,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Sebuah resource SpriteFrames seharusnya diciptakan atau diatur dalam " @@ -11496,8 +11364,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "Sebuah tekstur dengan bentuk cahaya harus disuplai ke properti 'texture'." @@ -11510,7 +11379,8 @@ msgstr "" "berpengaruh." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" "Polygon occluder untuk occluder ini kosong. Mohon gambar dulu sebuah polygon!" @@ -11600,15 +11470,16 @@ msgstr "" "untuk memberikan mereka sebuah bentuk." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D bekerja dengan sangat baik ketika digunakan dengan " "menyunting skena dasar secara langsung sebagai parent." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11693,9 +11564,10 @@ msgstr "" "bentuk." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Sebuah bentuk harus disediakan untuk CollisionShape untuk fungsi. Mohon " "ciptakan sebuah resource bentuk untuk itu!" @@ -11726,6 +11598,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11767,8 +11643,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11780,7 +11656,9 @@ msgstr "" #: scene/3d/remote_transform.cpp #, fuzzy -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" "Properti path harus menunjuk ke sebuah node Particles2D yang sah agar " "bekerja." @@ -11797,8 +11675,9 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Sebuah resource SpriteFrames harus diciptakan atau diatur didalam properti " @@ -11811,7 +11690,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11851,7 +11732,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Memutuskan '%s' dari '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +#, fuzzy +msgid "No root AnimationNode for the graph is set." msgstr "Akar AnimationNode untuk grafik belum diatur." #: scene/animation/animation_tree.cpp @@ -11867,7 +11749,8 @@ msgstr "" "AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +#, fuzzy +msgid "The AnimationPlayer root node is not a valid node." msgstr "Akar AnimationPlayer bukanlah node yang valid." #: scene/animation/animation_tree_player.cpp @@ -11900,8 +11783,7 @@ msgstr "Tambahkan warna yang sekarang sebagai preset" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "Container dengan dirinya sendiri tidak berguna kecuali ada skrip yang " "mengkonfigurasi perilaku penempatan anak-anaknya.\n" @@ -11923,10 +11805,11 @@ msgid "Please Confirm..." msgstr "Mohon konfirmasi..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Popup-popup akan disembunyikan secara default kecuali anda memanggil fungsi " "popup() atau salah satu dari semua fungsi popup*() yang ada. Membuat mereka " @@ -11934,13 +11817,15 @@ msgstr "" "game dijalankan." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +#, fuzzy +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "jika exp_edit adalah true min_value seharusnya > 0." #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer dimaksudkan untuk bekerja dengan kontrol anak tunggal.\n" @@ -11995,9 +11880,19 @@ msgstr "Masukan" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Ukuran font tidak sah." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Ukuran font tidak sah." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Ukuran font tidak sah." + #: servers/visual/shader_language.cpp #, fuzzy msgid "Assignment to function." @@ -12017,6 +11912,45 @@ msgstr "Variasi hanya bisa ditetapkan dalam fungsi vertex." msgid "Constants cannot be modified." msgstr "Konstanta tidak dapat dimodifikasi." +#~ msgid "Previous Folder" +#~ msgstr "Direktori Sebelumnya" + +#~ msgid "Next Folder" +#~ msgstr "Folder Berikutnya" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Buka Screenshoots secara otomatis" + +#~ msgid "Open in an external image editor." +#~ msgstr "Buka di pengolah gambar lainnya" + +#~ msgid "Reverse" +#~ msgstr "Terbalik" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "Gagal memuat resource." + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "Gagal memuat resource." + +#, fuzzy +#~ msgid "Failed to create C# project." +#~ msgstr "Gagal memuat resource." + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "Buat Subskribsi" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "Proyek" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "File:" + #~ msgid "Enabled Classes" #~ msgstr "Kelas yang Diaktifkan" diff --git a/editor/translations/is.po b/editor/translations/is.po index 98063e6482..98d0678673 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -134,6 +134,31 @@ msgid "Anim Change Call" msgstr "Útkall breyting sÃmtal" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim breyta lyklagrind tÃmi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim breyting umskipti" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Breyta umbreytingu" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim breyta lyklagrind gildi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Útkall breyting sÃmtal" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -637,6 +662,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -686,7 +715,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -789,6 +818,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -948,7 +981,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1125,7 +1158,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1484,6 +1516,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1657,7 +1693,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1708,7 +1744,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1733,23 +1769,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2426,6 +2466,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Fjarlægja val" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2617,14 +2662,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2939,6 +2976,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Breyta:" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3535,6 +3577,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4571,6 +4614,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4599,7 +4646,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4613,7 +4659,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4688,31 +4734,33 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Fjarlægja val" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Fjarlægja val" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6281,10 +6329,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6570,7 +6626,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6755,10 +6815,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7328,14 +7384,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7731,6 +7779,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7816,6 +7868,22 @@ msgid "Color uniform." msgstr "Breyta umbreytingu" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7823,10 +7891,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7916,7 +8018,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7924,7 +8026,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7936,7 +8038,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7953,7 +8055,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8022,11 +8124,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8042,7 +8144,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8070,11 +8172,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8115,11 +8217,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8128,7 +8234,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8146,15 +8252,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8203,7 +8309,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8231,12 +8337,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8313,47 +8419,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9511,6 +9617,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9714,7 +9824,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9769,7 +9879,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10172,54 +10282,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10796,7 +10858,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10845,7 +10907,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10855,7 +10917,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10931,12 +10993,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11015,7 +11077,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11044,6 +11106,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11078,8 +11144,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11090,7 +11156,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11106,7 +11174,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11117,7 +11185,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11152,7 +11222,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11164,7 +11234,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11195,8 +11265,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11216,18 +11285,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11270,9 +11339,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 94b2c13192..9773fd2a13 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -35,12 +35,16 @@ # Marco <rodomar705@gmail.com>, 2019. # Davide Giuliano <davidegiuliano00@gmail.com>, 2019. # Stefano Merazzi <asso99@hotmail.com>, 2019. +# Sinapse X <sinapsex13@gmail.com>, 2019. +# Micila Micillotto <micillotto@gmail.com>, 2019. +# Mirko Soppelsa <miknsop@gmail.com>, 2019. +# No <kingofwizards.kw7@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:50+0000\n" -"Last-Translator: Marco <rodomar705@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: No <kingofwizards.kw7@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -161,6 +165,31 @@ msgid "Anim Change Call" msgstr "Cambia chiamata animazione" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Cambia Tempo Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Cambia transizione dell'animazione" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Cambia trasformazione dell'animazione" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Cambia valore fotogramma chiave dell'animazione" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Cambia chiamata animazione" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Cambia lunghezza dell'animazione" @@ -661,6 +690,10 @@ msgstr "Va' alla linea" msgid "Line Number:" msgstr "Numero linea:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Trovata/e %d corrispondenza/e." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Nessuna corrispondenza" @@ -710,7 +743,7 @@ msgstr "Rimpicciolisci" msgid "Reset Zoom" msgstr "Azzera ingrandimento" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Avvertenze" @@ -817,6 +850,10 @@ msgid "Connect" msgstr "Connetti" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Segnale:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Connetti '%s' a '%s'" @@ -979,8 +1016,8 @@ msgid "Owners Of:" msgstr "Proprietari di:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "Rimuovi i file selezionati dal progetto? (non annullabile)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "Rimuovere i file selezionati dal progetto? (Non può essere annullato)" #: editor/dependency_editor.cpp msgid "" @@ -998,7 +1035,7 @@ msgstr "Impossibile rimuovere:" #: editor/dependency_editor.cpp msgid "Error loading:" -msgstr "Errore in caricamento:" +msgstr "Errore di caricamento:" #: editor/dependency_editor.cpp msgid "Load failed due to missing dependencies:" @@ -1162,7 +1199,6 @@ msgid "Success!" msgstr "Successo!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Installa" @@ -1351,7 +1387,6 @@ msgstr "" "Non deve essere in conflitto con un nome di una classe esistente dell'engine." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "Non deve essere in conflitto con un nome di tipo built-in esistente." @@ -1532,6 +1567,11 @@ msgstr "Modello di release personalizzato non trovato." msgid "Template file not found:" msgstr "Modello non trovato:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"Su export di 32-bit il PCK integrato non può essere più grande di 4 GiB." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "Editor 3D" @@ -1549,7 +1589,6 @@ msgid "Scene Tree Editing" msgstr "Editor delle scene" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Dock" msgstr "Importa" @@ -1558,9 +1597,8 @@ msgid "Node Dock" msgstr "Nodo" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Filesystem" +msgstr "Filesystem e dock di importazione" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1611,7 +1649,6 @@ msgid "File '%s' format is invalid, import aborted." msgstr "Il formato del file '%s' non è valido, importazione annullata." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." @@ -1628,9 +1665,8 @@ msgid "Unset" msgstr "Disattiva" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Profilo attuale" +msgstr "Profilo corrente:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1652,9 +1688,8 @@ msgid "Export" msgstr "Esporta" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Profili disponibili" +msgstr "Profili disponibili:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1709,7 +1744,7 @@ msgstr "Mostra nel gestore file" msgid "New Folder..." msgstr "Nuova cartella..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Aggiorna" @@ -1760,7 +1795,7 @@ msgstr "Va' avanti" msgid "Go Up" msgstr "Va' su" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Attiva/disattiva file nascosti" @@ -1785,23 +1820,31 @@ msgid "Move Favorite Down" msgstr "Sposta preferito in giù" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Cartella precedente" +#, fuzzy +msgid "Go to previous folder." +msgstr "Va' alla cartella superiore." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Cartella successiva" +#, fuzzy +msgid "Go to next folder." +msgstr "Va' alla cartella superiore." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Va' alla cartella superiore." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Cerca file" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Aggiungi/rimuovi cartella attuale dai preferiti." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Attiva/disattiva visibilità dei file nascosti." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2542,6 +2585,10 @@ msgid "Go to previously opened scene." msgstr "Vai alla scena precedentemente aperta." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Copia Testo" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Scheda successiva" @@ -2595,7 +2642,7 @@ msgstr "Libreria delle Mesh..." #: editor/editor_node.cpp msgid "TileSet..." -msgstr "TileSet..." +msgstr "TileSet…" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -2633,7 +2680,7 @@ msgstr "Apri la cartella del progetto" #: editor/editor_node.cpp msgid "Install Android Build Template" -msgstr "" +msgstr "Installa Android Build Template" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2744,32 +2791,21 @@ msgid "Editor Layout" msgstr "Layout dell'editor" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Rendi Scena Radice" +msgstr "Acquisisci screenshot" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Apri cartella dati/impostazioni editor" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Apri l'Editor successivo" +"Gli screenshot vengono memorizzati nella cartella Data/Settings dell'editor." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Abilita/Disabilita modalità a schermo intero" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Abilita CanvasItem Visibile" +msgstr "Abilita/Disabilita la console di sistema" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2784,9 +2820,8 @@ msgid "Open Editor Settings Folder" msgstr "Apri cartella impostazioni editor" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features" -msgstr "Gestisci template d'esportazione" +msgstr "Gestisci le funzionalità dell'editor" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" @@ -2879,17 +2914,14 @@ msgid "Spins when the editor window redraws." msgstr "Gira quando la finestra dell'editor viene ridisegnata." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Continuo" +msgstr "Aggiorna continuamente" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Aggiorna cambiamenti" +msgstr "Aggiorna quando modificato" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" msgstr "Disabilita l'icona girevole di aggiornamento" @@ -2920,21 +2952,21 @@ msgstr "Non salvare" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"Modello build di Android non è presente, si prega di installare i modelli " +"rilevanti." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Templates" -msgstr "Gestisci template d'esportazione" +msgstr "Gestisci i template d'esportazione" #: editor/editor_node.cpp -#, fuzzy msgid "" "This will install the Android project for custom builds.\n" "Note that, in order to use it, it needs to be enabled per export preset." msgstr "" -"Questo installerà il progetto Android per builds personalizzate.\n" -"Nota bene: per essere usato, deve essere abilitato secondo l'esportazione " -"del preset." +"Questo installerà il progetto Android per build personalizzate.\n" +"Nota bene: per essere usato, deve essere abilitato per l'esportazione del " +"preset." #: editor/editor_node.cpp msgid "" @@ -2942,6 +2974,9 @@ msgid "" "Remove the \"build\" directory manually before attempting this operation " "again." msgstr "" +"Android build template è già installato e non sarà sovrascritto.\n" +"Rimuovi la cartella \"build\" manualmente prima di ritentare questa " +"operazione." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3086,6 +3121,11 @@ msgid "Calls" msgstr "Chiamate" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Modifica Tema" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "On" @@ -3414,9 +3454,8 @@ msgid "SSL Handshake Error" msgstr "Errore nell'Handshake SSL" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uncompressing Android Build Sources" -msgstr "Estrazione asset" +msgstr "Decomprimendo Android Build Sources" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -3524,7 +3563,6 @@ msgid "Duplicating folder:" msgstr "Duplicando cartella:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Inherited Scene" msgstr "Nuova scena ereditata" @@ -3602,9 +3640,8 @@ msgid "Re-Scan Filesystem" msgstr "Re-Scan Filesystem" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Toggle Split Mode" -msgstr "Attiva/disattiva la modalità split" +msgstr "Attiva/disattiva la modalità Split" #: editor/filesystem_dock.cpp msgid "Search files" @@ -3708,6 +3745,7 @@ msgid "Nodes not in Group" msgstr "Nodi non in Gruppo" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtra nodi" @@ -3822,7 +3860,7 @@ msgstr "Importa Come:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset..." -msgstr "Preset..." +msgstr "Preset…" #: editor/import_dock.cpp msgid "Reimport" @@ -4246,7 +4284,6 @@ msgid "Edit Filtered Tracks:" msgstr "Modifica Tracce Filtrate:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Enable Filtering" msgstr "Abilita filtraggio" @@ -4383,9 +4420,8 @@ msgid "Enable Onion Skinning" msgstr "Abilita l'Onion Skinning" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Onion Skinning Options" -msgstr "Onion Skinning" +msgstr "Opzioni dell'onion skinning" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" @@ -4760,6 +4796,10 @@ msgid "Idle" msgstr "Inattivo" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Installa..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Riprova" @@ -4788,7 +4828,6 @@ msgid "Last" msgstr "Ultimo" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Tutti" @@ -4802,8 +4841,9 @@ msgid "Sort:" msgstr "Ordina:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Inverti" +#, fuzzy +msgid "Reverse sorting." +msgstr "Richiedendo..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4885,32 +4925,32 @@ msgid "Rotation Step:" msgstr "Step Rotazione:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "Muovi guida verticale" +msgid "Move Vertical Guide" +msgstr "Muovi Guida Verticale" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "Crea nuova guida verticale" +msgid "Create Vertical Guide" +msgstr "Crea Guida Verticale" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "Rimuovi guida verticale" +msgid "Remove Vertical Guide" +msgstr "Rimuovi Guida Verticale" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "Sposta guida orizzontale" +msgid "Move Horizontal Guide" +msgstr "Sposta Guida Orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "Crea nuova guida orizzontale" +msgid "Create Horizontal Guide" +msgstr "Crea Guida Orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "Rimuovi guida orizzontale" +msgid "Remove Horizontal Guide" +msgstr "Rimuovi Guida Orizzontale" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "Crea nuove guide orizzontali e verticali" +msgid "Create Horizontal and Vertical Guides" +msgstr "Crea Guide Orizzontali e Verticali" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -4949,13 +4989,12 @@ msgid "Presets for the anchors and margins values of a Control node." msgstr "Preset per i valori di ancoraggio e margini di un nodo Control." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" -"Quando è attivo, il movimento dei nodi di Controllo cambia le loro ancore " -"invece dei loro margini." +"Quando attivato, muovere i nodi Control cambia le loro ancore invece dei " +"loro margini." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -4971,9 +5010,8 @@ msgstr "Cambia Ancore" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected" -msgstr "Strumento Seleziona" +msgstr "Blocca selezionato" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -4987,9 +5025,8 @@ msgstr "Gruppo Selezionato" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected" -msgstr "Copia Selezione" +msgstr "Rimuovi selezionati dal gruppo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" @@ -5000,9 +5037,8 @@ msgid "Create Custom Bone(s) from Node(s)" msgstr "Crea Ossa personalizzate a partire da uno o più Nodi" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "Pulisci Posa" +msgstr "Rimuovi ossa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -5090,7 +5126,6 @@ msgid "Snapping Options" msgstr "Opzioni di Snapping" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Grid" msgstr "Snap alla griglia" @@ -5112,39 +5147,32 @@ msgid "Use Pixel Snap" msgstr "Usa Pixel Snap" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Smart Snapping" msgstr "Snapping intelligente" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Parent" -msgstr "Snap su Genitore" +msgstr "Snap al Genitore" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" -msgstr "Snap su ancora nodo" +msgstr "Snap ad ancora del nodo" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" msgstr "Snap sui lati del nodo" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" msgstr "Snap al centro del nodo" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" msgstr "Snap ad altri nodi" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Guides" -msgstr "Snap sulle guide" +msgstr "Snap alle guide" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5225,14 +5253,12 @@ msgid "Frame Selection" msgstr "Selezione Frame" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Preview Canvas Scale" -msgstr "Anteprima Atlas" +msgstr "Anteprima dimensione canvas" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Translation mask for inserting keys." -msgstr "Maschera di traduzione per inserimento chiavi" +msgstr "Maschera di traduzione per inserimento chiavi." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation mask for inserting keys." @@ -5253,6 +5279,11 @@ msgid "" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." msgstr "" +"Inserimento automatico di chiavi quando gli oggetti sono traslati, ruotati o " +"ridimensionati (basato sulla maschera).\n" +"Le chiavi sono soltanto aggiunte su tracciati già esistenti, nessun " +"tracciato nuovo verrà creato.\n" +"Le chiavi devono essere inserite manualmente per la prima volta." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Auto Insert Key" @@ -5279,9 +5310,8 @@ msgid "Divide grid step by 2" msgstr "Dividi per 2 il passo della griglia" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Pan View" -msgstr "Vista dal Retro" +msgstr "Vista panoramica" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -5306,7 +5336,6 @@ msgid "Error instancing scene from %s" msgstr "Errore istanziamento scena da %s" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Change Default Type" msgstr "Cambia tipo di default" @@ -5353,9 +5382,8 @@ msgstr "Carica Maschera Emissione" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Riavvia Ora" +msgstr "Ricomincia" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5435,17 +5463,14 @@ msgid "Load Curve Preset" msgstr "Carica Preset Curve" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add Point" msgstr "Aggiungi punto" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Point" msgstr "Rimuovi punto" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left Linear" msgstr "Lineare sinistra" @@ -5454,7 +5479,6 @@ msgid "Right Linear" msgstr "Lineare destra" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Preset" msgstr "Carica preset" @@ -5577,9 +5601,8 @@ msgid "Create Trimesh Collision Sibling" msgstr "Crea Fratello di Collisione Trimesh" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Convex Collision Sibling(s)" -msgstr "Crea Fratello di Collisione Convessa" +msgstr "Crea Fratello(i) di Collisione Convessa" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -5898,12 +5921,12 @@ msgstr "Opzioni" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Mirror Handle Angles" -msgstr "" +msgstr "Specchia maniglie angolari" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Mirror Handle Lengths" -msgstr "" +msgstr "Specchia lunghezza maniglie" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" @@ -5942,7 +5965,6 @@ msgid "Split Segment (in curve)" msgstr "Spezza Segmento (in curva)" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" msgstr "Sposta articolazione" @@ -6078,9 +6100,8 @@ msgstr "" "personalizzato dei poligoni è disabilitato." #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Paint weights with specified intensity." -msgstr "Colora i pesi con le intensità specificate." +msgstr "Colora i pesi con l'intensità specificata." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Unpaint weights with specified intensity." @@ -6278,18 +6299,16 @@ msgid "Find Next" msgstr "Trova Successivo" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Filtra proprietà " +msgstr "Filtra script" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Ordina in ordine alfabetico la lista dei metodi." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Modalità di filtro:" +msgstr "Modalità di filtraggio" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6403,7 +6422,7 @@ msgstr "Debug con Editor Esterno" #: editor/plugins/script_editor_plugin.cpp msgid "Open Godot online documentation." -msgstr "Apri la documentazione online di Godot" +msgstr "Apri la documentazione online di Godot." #: editor/plugins/script_editor_plugin.cpp msgid "Request Docs" @@ -6522,10 +6541,18 @@ msgid "Syntax Highlighter" msgstr "Evidenziatore di Sintassi" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Vai a" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "Segnalibri" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Punti di rottura" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6662,7 +6689,7 @@ msgstr "Imposta Ossa in Posizione di Riposo" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" -msgstr "Skeleton2D" +msgstr "Scheletro2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Make Rest Pose (From Bones)" @@ -6813,9 +6840,15 @@ msgid "Rear" msgstr "Retro" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Allinea alla Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Allinea Selezione Con Vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Nessun genitore del quale istanziare un figlio." @@ -6930,15 +6963,14 @@ msgid "Select Mode (Q)" msgstr "Modalità di Selezione (Q)" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Drag: Rotate\n" "Alt+Drag: Move\n" "Alt+RMB: Depth list selection" msgstr "" "Trascina: Ruota\n" -"Alt+Trascina: Muovi\n" -"Alt+PDM: Selezione Lista Profondità " +"Alt+Trascina: Sposta\n" +"Alt+RMB: Selezione Lista Profondità " #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -6989,7 +7021,6 @@ msgid "Right View" msgstr "Vista Destra" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Switch Perspective/Orthogonal View" msgstr "Cambia tra Vista Prospettiva/Ortogonale" @@ -7006,10 +7037,6 @@ msgid "Focus Selection" msgstr "Centra a Selezione" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Allinea Selezione Con Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Strumento Seleziona" @@ -7035,7 +7062,6 @@ msgid "Transform" msgstr "Trasforma" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Object to Floor" msgstr "Posa l'oggetto sul suolo" @@ -7149,9 +7175,8 @@ msgid "Nameless gizmo" msgstr "Gizmo senza nome" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Create Mesh2D" -msgstr "Crea Mesh 2D" +msgstr "Crea Mesh2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Polygon2D" @@ -7180,9 +7205,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Geometria non valida, impossibile sostituirla con una mesh." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to Mesh2D" -msgstr "Converti in Mesh 2D" +msgstr "Converti in Mesh2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -7575,14 +7599,6 @@ msgid "Transpose" msgstr "Trasponi" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Specchia X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Specchia Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "Disabilita Autotile" @@ -7607,27 +7623,22 @@ msgid "Pick Tile" msgstr "Preleva Tile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Left" msgstr "Ruota a sinistra" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Right" msgstr "Ruota a destra" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Horizontally" -msgstr "Ribalta in orizzontale" +msgstr "Ribalta orizzontalmente" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Vertically" -msgstr "Ribalta in verticale" +msgstr "Ribalta verticalmente" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Clear Transform" msgstr "Cancella la trasformazione" @@ -7664,9 +7675,8 @@ msgid "Select the previous shape, subtile, or Tile." msgstr "Seleziona la precedente forma, sottotile, o Tile." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Region Mode" -msgstr "Modalità esecuzione:" +msgstr "Modalità regione" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Collision Mode" @@ -7987,6 +7997,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Tipo di Input Visual Shader Cambiato" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(Solo GLES3)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vertice" @@ -8008,7 +8022,7 @@ msgstr "Colora funzione." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." -msgstr "" +msgstr "Operatore colore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Grayscale function." @@ -8035,280 +8049,334 @@ msgid "Darken operator." msgstr "Operatore Darken." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Difference operator." -msgstr "Solo le Differenze" +msgstr "Operatore \"differenza\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "" +msgstr "Operatore schivata." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "HardLight operator" -msgstr "" +msgstr "Operatore HardLight" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." -msgstr "" +msgstr "Operatore \"schiarischi\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." -msgstr "" +msgstr "Operatore overlay." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Screen operator." -msgstr "" +msgstr "Operatore schermo." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "" +msgstr "Operatore SoftLight." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color constant." -msgstr "Costante" +msgstr "Costante di colore." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color uniform." -msgstr "Cancella la trasformazione" +msgstr "Uniforme di colore." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Ritorna il risultato booleano del confronto di %s tra due parametri." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "Uguale (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "Maggiore Di (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "Maggiore o Uguale (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." msgstr "" +"Ritorna un vettore associato se gli scalari di quello fornito sono uguali, " +"maggiori o minori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns an associated vector if the provided boolean value is true or false." +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" +"Ritorna il risultato booleano del confronto tra INF e un parametro scalare." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." msgstr "" +"Ritorna il risultato booleano del confronto tra NaN e un parametro scalare." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "Minore Di (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "Minore o Uguale (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy +msgid "Not Equal (!=)" +msgstr "Non Uguale (!=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided boolean value is true or false." +msgstr "" +"Ritorna un vettore associato se il valore booleano fornito è vero o falso." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Ritorna il risultato booleano del confronto tra due parametri." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"Ritorna il risultato booleano del confronto tra INF (o NaN) e un parametro " +"scalare." + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." -msgstr "Cambia Costante Vett." +msgstr "Costante booleana." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." -msgstr "" +msgstr "Uniforme booleana." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for all shader modes." -msgstr "" +msgstr "Parametro di input '%s' per tutte le modalità shader." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "Snap su Genitore" +msgstr "Parametro di input." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "" +msgstr "Parametro di input '%s' per le modalità shader vertex e fragment." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "" +msgstr "Parametro di input '%s' per le modalità shader fragment e light." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." -msgstr "" +msgstr "Parametro di input '%s' per la modalità shader fragment." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for light shader mode." -msgstr "" +msgstr "Parametro di input '%s' per la modalità shader light." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "Parametro di input '%s' per la modalità shader vertex." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "" +msgstr "Parametro di input '%s' per la modalità shader vertex e fragment." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar function." -msgstr "Cambia Funzione Scalare" +msgstr "Funzione scalare." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar operator." -msgstr "Cambia Operatore Scalare" +msgstr "Operatore scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." -msgstr "" +msgstr "La costante E (2.718282). Rappresenta la base del logaritmo naturale." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "La costante Epsilon (0.00001). Il numero scalare più piccolo." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "La costante Phi (1.618034). Il rapporto aureo." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "La costante Pi/4 (0.785398 radianti), o 45 gradi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "La costante Pi/2 (1.570796 radianti), o 90 gradi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "La costante Pi (3.141593 radianti), o 180 gradi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "La costante Tau (6.283185 radianti), o 360 gradi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." -msgstr "" +msgstr "La costante Sqrt2 (1.414214). La radice quadrata di 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "" +msgstr "Ritorna il valore assoluto del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." -msgstr "" +msgstr "Ritorna l'arco-coseno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "" +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "Ritorna l'inversa del coseno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." -msgstr "" +msgstr "Ritorna l'arco-seno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "" +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "Ritorna l'inversa del seno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." -msgstr "" +msgstr "Ritorna l'arco-tangente del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameters." -msgstr "" +msgstr "Ritorna l'arco-tangente dei parametri." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "" +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "Ritorna l'inversa della tangente iperbolica del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." msgstr "" +"Trova il numero intero più vicino che sia maggiore o uguale al parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." -msgstr "" +msgstr "Vincola un valore tra due altri valori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." -msgstr "" +msgstr "Ritorna il coseno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "" +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "Ritorna il coseno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "" +msgstr "Converte una quantità di radianti in gradi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." -msgstr "" +msgstr "Esponenziale in base e." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 Exponential." -msgstr "" +msgstr "Esponenziale in base 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." msgstr "" +"Trova il numero intero più vicino che sia minore o uguale al parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "Calcola la parte frazionaria dell'argomento." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." -msgstr "" +msgstr "Ritorna l'inversa della radice quadrata del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." -msgstr "" +msgstr "Logaritmo naturale." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 logarithm." -msgstr "" +msgstr "Logaritmo in base 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "Ritorna il maggiore di due valori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "Ritorna il minore di due valori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "" +msgstr "Interpolazione lineare tra due scalari." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "Ritorna il valore opposto del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" -msgstr "" +msgstr "1.0 - scalare" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." msgstr "" +"Ritorna il valore del primo parametro elevato alla potenza del secondo." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "Converte una quantità in gradi in radianti." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" -msgstr "" +msgstr "1.0 / scalare" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "" +msgid "Finds the nearest integer to the parameter." +msgstr "Trova il numero intero più vicino al parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "" +msgid "Finds the nearest even integer to the parameter." +msgstr "Trova il numero intero pari più vicino al parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "Blocca il valore tra 0.0 ed 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "Estrae il segno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "Ritorna il seno del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "" +msgid "Returns the hyperbolic sine of the parameter." +msgstr "Ritorna il seno iperbolico del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "Ritorna la radice quadrata del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8318,6 +8386,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Ritorna 0.0 se 'x' è più piccolo di 'edge0', o 1.0 se 'x' è più largo di " +"'edge1'. Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 " +"usando i polinomi di Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8325,75 +8398,80 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Step function( scalar(edge), scalar(x) ).\n" +"\n" +"Ritorna 0.0 se 'x' è più piccolo di 'edge', altrimenti 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "Ritorna la tangente del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "" +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "Ritorna la tangente iperbolica del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "" +msgid "Finds the truncated value of the parameter." +msgstr "Trova il valore troncato del parametro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." -msgstr "" +msgstr "Aggiunge scalare allo scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "Divide lo scalare per scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "Moltiplica lo scalare per scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." -msgstr "" +msgstr "Ritorna il resto dei due scalari." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." -msgstr "" +msgstr "Sottrae scalare dallo scalare." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar constant." -msgstr "Cambia Costante Scalare" +msgstr "Costante scalare." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar uniform." -msgstr "Cambia Uniforme Scalare" +msgstr "Uniforme scalare." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "Esegue la ricerca di texture cubiche." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." -msgstr "" +msgstr "Esegue la ricerca di texture." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." -msgstr "Cambia Uniforme Texture" +msgid "Cubic texture uniform lookup." +msgstr "Controllo dinamico dell'uniforme della texture cubica." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." -msgstr "Cambia Uniforme Texture" +msgid "2D texture uniform lookup." +msgstr "Controllo dinamico dell'uniforme della texture 2D." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy +msgid "2D texture uniform lookup with triplanar." +msgstr "Controllo dinamico dell'uniforme della texture cubica con triplanar." + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." -msgstr "Finestra di Transform..." +msgstr "Funzione di trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8401,112 +8479,125 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" +"Calcola il prodotto esterno di una coppia di vettori.\n" +"\n" +"OuterProduct considera il primo parametro 'c' come un vettore colonna " +"(matrice con una colonna) ed il secondo, 'r', come un vettore riga (matrice " +"con una riga) ed esegue una moltiplicazione algebrica lineare di matrici 'c " +"* r', creando una matrice i cui numeri di righe sono il numero di componenti " +"di 'c' e le cui colonne sono il numero di componenti in 'r'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." -msgstr "" +msgstr "Compone la trasformazione da quattro vettori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes transform to four vectors." -msgstr "" +msgstr "Scompone la trasformazione in quattro vettori." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "" +msgid "Calculates the determinant of a transform." +msgstr "Calcola il determinante di una trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "" +msgid "Calculates the inverse of a transform." +msgstr "Calcola l'inverso di una trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "" +msgid "Calculates the transpose of a transform." +msgstr "Calcola la trasposizione di una trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." -msgstr "" +msgstr "Moltiplica la trasformazione per la trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by transform." -msgstr "" +msgstr "Moltiplica il vettore per la trasformazione." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "Transform Abortito." +msgstr "Costante transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "Transform Abortito." +msgstr "Uniforme transform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Assegnazione alla funzione." +msgstr "Funzione vettore." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector operator." -msgstr "Cambia Operatore Vett." +msgstr "Operatore vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." -msgstr "" +msgstr "Compone il vettore da tre scalari." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes vector to three scalars." -msgstr "" +msgstr "Scompone il vettore a tre scalari." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "" +msgstr "Calcola il prodotto incrociato di due vettori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "" +msgstr "Ritorna la distanza tra due punti." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." -msgstr "" +msgstr "Calcola il prodotto scalare di due vettori." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" +"Ritorna un vettore che punta nella stessa direzione di quello di " +"riferimento. La funzione ha tre vettori parametro: N, il vettore da " +"orientare; I, il vettore incidente; ed Nref, il vettore di riferimento. Se " +"il prodotto scalare di I ed Nref è minore di zero, il valore di ritorno è N. " +"Altrimenti il ritorno sarà -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." -msgstr "" +msgstr "Calcola la lunghezza di un vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors." -msgstr "" +msgstr "Interpolazione lineare tra due vettori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." -msgstr "" +msgstr "Calcola il prodotto di normalizzazione del vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - vector" -msgstr "" +msgstr "1.0 - vettore" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / vector" -msgstr "" +msgstr "1.0 / vettore" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" +"Ritorna un vettore che punta nella direzione della riflessione ( a : vettore " +"incidente, b : vettore normale )." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." -msgstr "" +#, fuzzy +msgid "Returns the vector that points in the direction of refraction." +msgstr "Ritorna un vettore che punta nella direzione della refrazione." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8516,6 +8607,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" +"\n" +"Ritorna 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è maggiore di 'edge1'. " +"Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 usando i " +"polinomiali di Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8525,6 +8621,11 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" +"\n" +"Ritorna 0.0 se 'x' è minore di 'edge0', ed 1.0 se 'x' è maggiore di 'edge1'. " +"Altrimenti, il valore di ritorno è interpolato tra 0.0 ed 1.0 usando i " +"polinomiali di Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8532,6 +8633,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Step function( vector(edge), vector(x) ).\n" +"\n" +"Ritorna 0.0 se 'x' è minore di 'edge', altrimenti 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8539,36 +8643,37 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Step function( scalar(edge), vector(x) ).\n" +"\n" +"Ritorna 0.0 se 'x' è minore di 'edge', altrimenti 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." -msgstr "" +msgstr "Aggiunge un vettore al vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "" +msgstr "Divide vettore per vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." -msgstr "" +msgstr "Moltiplica vettore per vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two vectors." -msgstr "" +msgstr "Ritorna il resto dei due vettori." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts vector from vector." -msgstr "" +msgstr "Sottrae vettore dal vettore." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector constant." -msgstr "Cambia Costante Vett." +msgstr "Costante vettore." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "Assegnazione all'uniforme." +msgstr "Uniforme vettore." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8576,56 +8681,83 @@ msgid "" "output ports. This is a direct injection of code into the vertex/fragment/" "light function, do not use it to write the function declarations inside." msgstr "" +"Una espressione del Custom Godot Shader Language, con quantità " +"personalizzabile di porte input ed output. Questa è una iniezione diretta di " +"codice nella funzione vertex/fragment/light. Non usarla per scrivere le " +"dichiarazione della funzione all'interno." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns falloff based on the dot product of surface normal and view " "direction of camera (pass associated inputs to it)." msgstr "" +"Ritorna il decadimento in base al prodotto scalare della normale della " +"superfice e direzione della telecamera (passa gli input associati ad essa)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "" +#, fuzzy +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(solo GLES3) (Solo modalità Fragment/Light) Fuzione derivata scalare." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +#, fuzzy +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" +"(solo GLES3) (Solo modalità Fragment/Light) Fuzione derivata vettoriale." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" +"(solo GLES3) (Solo modalità Fragment/Light) (Vettore) Derivata in 'x' usando " +"la differenziazione locale." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" +"(solo GLES3) (Solo modalità Fragment/Light) (Scalare) Derivata in 'x' usando " +"la differeziazione locale." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" +"(solo GLES3) (soltanto modalità Fragment/Light) (Vettore) Derivata in 'y' " +"usando la differenziazione locale." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" +"(solo GLES3) (soltanto modalità Fragment/Light) (Scalare) Derivata in 'y' " +"usando la differenziazione locale." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(solo GLES3) (soltanto modalità Fragment/Light) (Vettore) Somma delle " +"derivate assolute in 'x' ed 'y'." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(solo GLES3) (soltanto modalità Fragment/Light) (Scalare) Somma delle " +"derivate assolute in 'x' ed 'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -8968,7 +9100,6 @@ msgid "Are you sure to open more than one project?" msgstr "Sei sicuro di voler aprire più di un progetto?" #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file does not specify the version of Godot " "through which it was created.\n" @@ -8991,7 +9122,6 @@ msgstr "" "precedenti del motore." #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file was generated by an older engine " "version, and needs to be converted for this version:\n" @@ -9003,8 +9133,7 @@ msgid "" "engine anymore." msgstr "" "Il seguente file delle impostazioni del progetto è stato generato da una " -"versione precedente del motore e deve essere convertito per questa " -"versione:\n" +"versione precedente del motore e deve essere convertito a questa versione:\n" "\n" "%s\n" "\n" @@ -9021,14 +9150,13 @@ msgstr "" "del motore, le cui impostazioni non sono compatibili con questa versione." #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" "Non è possibile eseguire il progetto: nessuna scena principale definita.\n" -"Si prega di modificare il progetto e impostare la scena principale in " +"Si prega di modificare il progetto e di impostare la scena principale in " "\"Impostazioni Progetto\" nella categoria \"Applicazione\"." #: editor/project_manager.cpp @@ -9040,36 +9168,32 @@ msgstr "" "Per favore modifica il progetto per azionare l'importo iniziale." #: editor/project_manager.cpp -#, fuzzy msgid "Are you sure to run %d projects at once?" -msgstr "Sei sicuro di voler eseguire più di un progetto?" +msgstr "Sei sicuro di voler eseguire %d progetti contemporaneamente?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." msgstr "" -"Rimuovere progetto dalla lista? (I contenuti della cartella non saranno " -"modificati)" +"Rimuovere %d progetti dalla lista?\n" +"I contenuti delle cartelle di progetto non saranno modificati." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." msgstr "" -"Rimuovere progetto dalla lista? (I contenuti della cartella non saranno " -"modificati)" +"Rimuovere questo progetto dalla lista?\n" +"I contenuti della cartella di progetto non saranno modificati." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list? (Folders contents will not be " "modified)" msgstr "" -"Rimuovere progetto dalla lista? (I contenuti della cartella non saranno " -"modificati)" +"Rimuovere tutti i progetti mancanti dalla lista?\n" +"(Il contenuto delle cartelle di progetto non saranno modificati)" #: editor/project_manager.cpp msgid "" @@ -9081,11 +9205,13 @@ msgstr "" "gestore dei progetti sarà avviato." #: editor/project_manager.cpp -#, fuzzy msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." -msgstr "Stai per esaminare %s cartelle per progetti Godot esistenti. Confermi?" +msgstr "" +"Sei sicuro di voler scannerizzare %s cartelle per progetti Godot già " +"esistenti?\n" +"Per questo potrebbe volerci un pò." #: editor/project_manager.cpp msgid "Project Manager" @@ -9108,9 +9234,8 @@ msgid "New Project" msgstr "Nuovo Progetto" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Rimuovi punto" +msgstr "Rimuovi mancante" #: editor/project_manager.cpp msgid "Templates" @@ -9129,13 +9254,12 @@ msgid "Can't run project" msgstr "Impossibile eseguire il progetto" #: editor/project_manager.cpp -#, fuzzy msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" -"Al momento non hai alcun progetto.\n" -"Ti piacerebbe esplorare gli esempi ufficiali nella Libreria delle Risorse?" +"Al momento non hai nessun progetto.\n" +"Ti piacerebbe esplorare gli esempi ufficiali nella libreria degli Asset?" #: editor/project_settings_editor.cpp msgid "Key " @@ -9162,9 +9286,8 @@ msgstr "" "'\\' oppure '\"'" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "L'Azione '%s' esiste già !" +msgstr "Un'azione col nome '%s' è già esistente." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -9172,7 +9295,7 @@ msgstr "Rinomina Evento di Azione Input" #: editor/project_settings_editor.cpp msgid "Change Action deadzone" -msgstr "" +msgstr "Cambia la zona morta d'azione" #: editor/project_settings_editor.cpp msgid "Add Input Action Event" @@ -9364,11 +9487,11 @@ msgstr "Rimuovi Opzione di Remap Rimorse" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter" -msgstr "" +msgstr "Filtro lingue modificato" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "" +msgstr "Modalità filtro lingue modificata" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" @@ -9383,9 +9506,8 @@ msgid "Override For..." msgstr "Sovrascrivi Per..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -#, fuzzy msgid "The editor must be restarted for changes to take effect." -msgstr "Per rendere effettive le modifiche è necessario un riavvio dell'editor" +msgstr "Per rendere effettive le modifiche, l'editor deve essere riavviato." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -9401,7 +9523,7 @@ msgstr "Azione" #: editor/project_settings_editor.cpp msgid "Deadzone" -msgstr "" +msgstr "Zona morta" #: editor/project_settings_editor.cpp msgid "Device:" @@ -9441,15 +9563,13 @@ msgstr "Locale" #: editor/project_settings_editor.cpp msgid "Locales Filter" -msgstr "" +msgstr "Filtro lingue" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" msgstr "Mostra tutte le lingue" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" msgstr "Mostra solo le lingue selezionate" @@ -9538,7 +9658,6 @@ msgid "Suffix" msgstr "Suffisso" #: editor/rename_dialog.cpp -#, fuzzy msgid "Advanced Options" msgstr "Opzioni avanzate" @@ -9801,9 +9920,8 @@ msgid "User Interface" msgstr "Interfaccia Utente" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" -msgstr "Elimina Nodo" +msgstr "Altro nodo" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -9846,7 +9964,6 @@ msgid "Clear Inheritance" msgstr "Liberare ereditarietà " #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" msgstr "Apri la documentazione" @@ -9855,9 +9972,8 @@ msgid "Add Child Node" msgstr "Aggiungi Nodo Figlio" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "Comprimi Tutto" +msgstr "Espandi/Collassa tutto" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9868,6 +9984,11 @@ msgid "Extend Script" msgstr "Estendi Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Reparent Nodo" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Rendi Scena Radice" @@ -9888,9 +10009,8 @@ msgid "Delete (No Confirm)" msgstr "Elimina (Senza Conferma)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Aggiungi/Crea un Nuovo Nodo" +msgstr "Aggiungi/Crea un Nuovo Nodo." #: editor/scene_tree_dock.cpp msgid "" @@ -9925,19 +10045,16 @@ msgid "Toggle Visible" msgstr "Attiva/Disattiva Visibilità " #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Unlock Node" -msgstr "Seleziona Nodo" +msgstr "Sblocca nodo" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Button Group" -msgstr "Pulsante 7" +msgstr "Gruppo pulsanti" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "(Connecting From)" -msgstr "Errore di Connessione" +msgstr "(Collegamento da)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" @@ -9968,9 +10085,8 @@ msgstr "" "Fai click per mostrare il dock gruppi." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "Apri Script" +msgstr "Apri script:" #: editor/scene_tree_editor.cpp msgid "" @@ -9997,6 +10113,8 @@ msgid "" "AnimationPlayer is pinned.\n" "Click to unpin." msgstr "" +"AnimationPlayer è bloccato.\n" +"Fare clic per sbloccare." #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" @@ -10019,39 +10137,32 @@ msgid "Select a Node" msgstr "Scegli un Nodo" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "Percorso vuoto" +msgstr "Il percorso è vuoto." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "Il nome del file è vuoto" +msgstr "Il nome del file è vuoto." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is not local." -msgstr "Percorso non locale" +msgstr "Percorso non locale." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid base path." -msgstr "Percorso di base invalido" +msgstr "Percorso di base non valido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "A directory with the same name exists." -msgstr "Una cartella con lo stesso nome esiste già " +msgstr "Esiste già una directory con lo stesso nome." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid extension." -msgstr "Estensione Invalida" +msgstr "Estensione non valida." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Wrong extension chosen." -msgstr "Estensione scelta errata" +msgstr "Selezionata estensione errata." #: editor/script_create_dialog.cpp msgid "Error loading template '%s'" @@ -10070,52 +10181,45 @@ msgid "N/A" msgstr "N/A" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" -msgstr "Apri Script/Scegli Posizione" +msgstr "Apri Script / Scegli Posizione" #: editor/script_create_dialog.cpp msgid "Open Script" msgstr "Apri Script" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, it will be reused." -msgstr "Il file esiste, sarà riutilizzato" +msgstr "Il file è già esistente, quindi, verrà riutilizzato." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." -msgstr "Nome classe invalido" +msgstr "Nome classe non valido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path." -msgstr "Nome genitore ereditato o percorso invalido" +msgstr "Nome o percorso genitore ereditato non valido." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script is valid." -msgstr "Script valido" +msgstr "Lo script è valido." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "Consentiti: a-z, A-Z, 0-9 e _" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in script (into scene file)." -msgstr "Script built-in (nel file scena)" +msgstr "Script incorporato (nel file della scena)." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "Crea nuovo file script" +msgstr "Verrà creato un nuovo file di script." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "Carica file script esistente" +msgstr "Caricherà un file di script esistente." #: editor/script_create_dialog.cpp msgid "Language" @@ -10157,7 +10261,7 @@ msgstr "Analisi dello stack" msgid "Pick one or more items from the list to display the graph." msgstr "Scegli uno o più oggetti dalla lista per mostrare il grafico." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Errori" @@ -10247,7 +10351,7 @@ msgstr "Imposta da Tree" #: editor/script_editor_debugger.cpp msgid "Export measures as CSV" -msgstr "" +msgstr "Esporta misure in formato CSV" #: editor/settings_config_dialog.cpp msgid "Erase Shortcut" @@ -10287,7 +10391,7 @@ msgstr "Cambia dimensione Telecamera" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" -msgstr "" +msgstr "Cambia notificatore AABB" #: editor/spatial_editor_gizmos.cpp msgid "Change Particles AABB" @@ -10379,12 +10483,11 @@ msgstr "GDNativeLibrary" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" -msgstr "" +msgstr "Singleton GDNative abilitato" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Disabled GDNative Singleton" -msgstr "Disabilita l'icona girevole di aggiornamento" +msgstr "Singleton GDNative disabilitato" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Library" @@ -10472,9 +10575,8 @@ msgid "GridMap Fill Selection" msgstr "GridMap Riempi Selezione" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paste Selection" -msgstr "GridMap Elimina Selezione" +msgstr "Sezione GridMap incolla" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -10560,57 +10662,9 @@ msgstr "Scegli la Distanza:" msgid "Class name can't be a reserved keyword" msgstr "Il nome della classe non può essere una parola chiave riservata" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Generando la soluzione..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Genero progetto in C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Impossibile creare la soluzione." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Impossibile salvare la soluzione." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Fatto" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "Impossibile creare il progetto C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Riguardo il supporto in C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Crea la soluzione C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Compilazioni" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Compila Progetto" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Visualizza log" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" -msgstr "" +msgstr "Fine dell'analisi dell’eccezione interna dello stack" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" @@ -10901,9 +10955,8 @@ msgid "Available Nodes:" msgstr "Nodi Disponibili:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Select or create a function to edit its graph." -msgstr "Seleziona o crea una funzione per modificare il grafico" +msgstr "Seleziona o crea una funzione per modificarne il grafico." #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -11044,15 +11097,21 @@ msgstr "" #: platform/android/export/export.cpp msgid "Custom build requires a valid Android SDK path in Editor Settings." msgstr "" +"Le build personalizzate richiedono un percorso per un Android SDK valido " +"nelle impostazioni dell'editor." #: platform/android/export/export.cpp msgid "Invalid Android SDK path for custom build in Editor Settings." msgstr "" +"Percorso per Android SDK per build personalizzata nelle impostazioni " +"dell'editor non è valido." #: platform/android/export/export.cpp msgid "" "Android project is not installed for compiling. Install from Editor menu." msgstr "" +"Android Project non è installato per la compilazione. Installalo dal menu " +"Editor." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -11067,6 +11126,9 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" +"Tentativo di costruire da un template build personalizzato, ma nesuna " +"informazione sulla sua versione esiste. Perfavore, reinstallalo dal menu " +"'Progetto'." #: platform/android/export/export.cpp msgid "" @@ -11075,20 +11137,28 @@ msgid "" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" +"Versione build di Android non coerente:\n" +" Template installato: %s\n" +" Versione Godot: %s\n" +"Perfavore, reinstalla il build template di Android dal menu 'Progetto'." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "" +msgstr "Compilazione di un progetto 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 "" +"Costruzione del progetto Android fallita, controlla l'output per vedere gli " +"errori.\n" +"In alternativa, visita docs.godotengine.org per la documentazione della " +"build Android." #: platform/android/export/export.cpp msgid "No build apk generated at: " -msgstr "" +msgstr "Nessun apk build generato a: " #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -11223,11 +11293,11 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Una risorsa SpriteFrames deve essere creata o impostata nella proprietà " -"'Frames' affinché AnimatedSprite mostri i frame." +"\"Frames\" in modo da far mostrare i frame dal nodo AnimatedSprite." #: scene/2d/canvas_modulate.cpp msgid "" @@ -11293,11 +11363,11 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" -"Una texture con la forma della luce deve essere fornita nella proprietà " -"'texture'." +"Una texture con una forma della luce deve essere fornita alla proprietà " +"\"Texture\"." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -11307,10 +11377,9 @@ msgstr "" "l'occlusore abbia effetto." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" -"Il poligono di occlusione per questo occlusore è vuoto. Per favore disegna " -"un poligono!" +"Il poligono per questo occluder è vuoto. Perfavore, disegna un poligono." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11401,61 +11470,54 @@ msgstr "" "Skeleton2D e impostane una." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D serve a fornire una forma di collisione ad un nodo derivato " -"di CollisionObject2D. Si prega di utilizzarlo solamente come figlio di " -"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. in modo da dargli " -"una forma." +"TileMap con Use Parent abilitato richiede un genitore CollisionObject2D per " +"dargli forma. Perfavore, usalo come figlio di Area2D, StaticBody2D, " +"RigidBody2D, KinematicBody2D, etc. per dargli una forma." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D funziona al meglio quando usato direttamente come " -"genitore con il root della scena modificata." +"VisibilityEnabler2D funziona meglio quando usato con il nodo principale " +"della scena ereditata direttamente come genitore." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera deve avere un nodo ARVROrigin come suo genitore" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera deve avere un nodo ARVROrigin come genitore." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRController must have an ARVROrigin node as its parent." -msgstr "ARVRController deve avere un nodo ARVROrigin come suo genitore" +msgstr "ARVRController deve avere un nodo ARVROrigin come genitore." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The controller ID must not be 0 or this controller won't be bound to an " "actual controller." msgstr "" -"L'id del controller non deve essere 0 o questo controller non sarà legato ad " -"un vero controller" +"L'id del controller non deve essere 0 o non verrà associato ad un controller " +"attuale." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "ARVRAnchor deve avere un nodo ARVROrigin come suo genitore" +msgstr "ARVRAnchor deve avere un nodo ARVROrigin come genitore." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The anchor ID must not be 0 or this anchor won't be bound to an actual " "anchor." msgstr "" -"L'id dell'ancora non deve essere 0 o questa ancora non sarà legata ad una " -"vera ancora" +"L'ID dell'ancora non deve essere 0 oppure non verrà associato ad un'ancora " +"attuale." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin necessita di un nodo figlio ARVRCamera" +msgstr "ARVROrigin richiede un nodo figlio di tipo ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "%d%%" @@ -11467,11 +11529,11 @@ msgstr "(Tempo Rimanente: %d:%02d s)" #: scene/3d/baked_lightmap.cpp msgid "Plotting Meshes: " -msgstr "" +msgstr "Stampa Meshes: " #: scene/3d/baked_lightmap.cpp msgid "Plotting Lights:" -msgstr "" +msgstr "Stampando Luci:" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Finishing Plot" @@ -11479,7 +11541,7 @@ msgstr "Trama di Finitura" #: scene/3d/baked_lightmap.cpp msgid "Lighting Meshes: " -msgstr "" +msgstr "Illuminando Meshes: " #: scene/3d/collision_object.cpp msgid "" @@ -11520,33 +11582,34 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" -"Perché CollisionShape funzioni deve essere fornita una forma. Si prega di " -"creare una risorsa forma (shape)!" +"Una forma deve essere fornita per il CollisionShape per farlo funzionare. " +"Perfavore, creali una risorsa \"forma\"." #: scene/3d/collision_shape.cpp msgid "" "Plane shapes don't work well and will be removed in future versions. Please " "don't use them." msgstr "" +"Le forme planari non funzionano bene e verranno rimosse nelle versioni " +"future. Per favore, non usarle." #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." msgstr "Niente è visibile perché non è stata assegnata alcuna mesh." #: scene/3d/cpu_particles.cpp -#, fuzzy msgid "" "CPUParticles animation requires the usage of a SpatialMaterial whose " "Billboard Mode is set to \"Particle Billboard\"." msgstr "" -"L'animazione delle particelle richiede l'utilizzo di uno SpatialMaterial con " -"\"Billboard Particles\" abilitato." +"Le animazioni per CPUParticles richiedono l'uso di un SpatialMaterial la cui " +"modalità Billboard è impostata a \"Particle Billboard\"." #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" -msgstr "" +msgstr "Tracciando Meshes" #: scene/3d/gi_probe.cpp msgid "" @@ -11556,6 +11619,11 @@ msgstr "" "Le GIProbes non sono supportate dal driver video GLES2.\n" "In alternativa, usa una BakedLightmap." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" +"Un SpotLight con un angolo più ampio di 90 gradi non può proiettare ombre." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11586,26 +11654,24 @@ msgid "" msgstr "Nulla é visibile perché le mesh non sono state assegnate ai draw pass." #: scene/3d/particles.cpp -#, fuzzy msgid "" "Particles animation requires the usage of a SpatialMaterial whose Billboard " "Mode is set to \"Particle Billboard\"." msgstr "" -"L'animazione delle particelle richiede l'utilizzo di uno SpatialMaterial con " -"\"Billboard Particles\" abilitato." +"Le animazioni delle particelle richiedono l'uso di un SpatialMaterial la cui " +"modalità Billboard è impostata a \"Particle Billboard\"." #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." msgstr "PathFollow funziona solo se impostato come figlio di un nodo Path." #: scene/3d/path.cpp -#, fuzzy msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED richiede \"Up Vector\" abilitato nella risorsa " -"Path’s Curve del padre." +"Il flag ROTATION_ORIENTED di un PathFollow richiede \"Up Vector\" di essere " +"abilitato nella risorsa Curve del genitore Path." #: scene/3d/physics_body.cpp msgid "" @@ -11618,15 +11684,16 @@ msgstr "" "Modifica invece la dimensione in sagome di collisione figlie." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" -"La proprietà path deve puntare ad un nodo Spaziale (Spatial) valido per " -"poter funzionare." +"La proprietà \"Remove Path\" deve essere puntata su un Spatial o Spatial-" +"derived valido per funzionare." #: scene/3d/soft_body.cpp -#, fuzzy msgid "This body will be ignored until you set a mesh." -msgstr "Questo corpo verrà ignorato finché non imposti una mesh" +msgstr "Questo corpo verrà ignorato fino a quando non imposterai una mesh." #: scene/3d/soft_body.cpp msgid "" @@ -11640,11 +11707,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Una risorsa SpriteFrames deve essere creata o impostata nella proprietà " -"'Frames' affinché AnimatedSprite3D mostri i frame." +"\"Frames\" in modo da far mostrare i frame dall'AnimatedSprite3D." #: scene/3d/vehicle_body.cpp msgid "" @@ -11655,8 +11722,12 @@ msgstr "" "favore usalo come figlio di VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment ha bisogno di una risorsa Ambiente." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WordEnvironment richiede la sua proprietà \"Environment\" di contenere un " +"Environment per avere un effetto visibile." #: scene/3d/world_environment.cpp msgid "" @@ -11694,8 +11765,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Nulla collegato all'ingresso '%s' del nodo '%s'." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." -msgstr "Una radice AnimationNode per il grafico non è impostata." +msgid "No root AnimationNode for the graph is set." +msgstr "Non è stato impostato alcun AnimationNode root per il grafico." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." @@ -11709,8 +11780,8 @@ msgstr "" "AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "La radice di AnimationPlayer non è un nodo valido." +msgid "The AnimationPlayer root node is not a valid node." +msgstr "Il nodo root dell'AnimationPlayer non è valido." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11722,12 +11793,11 @@ msgstr "Scegliere un colore dallo schermo." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "Imbardata" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11738,23 +11808,22 @@ msgid "Add current color as a preset." msgstr "Aggiungi il colore corrente come preset." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" -"Il Contenitore da solo non serve a nessuno scopo a meno che uno script non " -"configuri il suo comportamento di posizionamento per i figli.\n" -"Se non avete intenzione di aggiungere uno script, utilizzate invece un " -"semplice nodo \"Controllo\"." +"Il Contanier da se non serve alcuna funzione affinché uno script non " +"configura il comportamento di posizione dei figli.\n" +"Se non intendi aggiungere uno script, usa un semplice nodo Control." #: scene/gui/control.cpp msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"Il tooltip non comparirà poiché il Mouse filter del control è impostato a " +"\"Ignore\". Per risolvere questo, impostalo a \"Stop\" o \"Pass\"." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11767,26 +11836,26 @@ msgstr "Per Favore Conferma..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" -"I popup saranno nascosti di default a meno che vengano chiamate la funzione " -"popup() o qualsiasi altra funzione popup*(). Renderli visibili per la " -"modifica nell'editor è okay, ma verranno nascosti una volta in esecuzione." +"I popup saranno nascosti per default affinché non chiami la funzione " +"popup(), oppure una delle funzioni popup*(). Farli diventare visibili per " +"modificarli va bene, ma scompariranno all'esecuzione." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "Se exp_edit è true min_value deve essere > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "Se \"Exp Edit\" è abilitato, \"Min Value\" deve essere maggiore di 0." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer é fatto per funzionare con un solo controllo figlio.\n" -"Usa un container come figlio (VBox,HBox,etc), o un Control impostando la " -"dimensione minima manualmente." +"ScrollContainer è inteso per funzionare con un singolo figlio di controllo.\n" +"Usa un container come figlio (VBox, HBox, ect.), oppure un nodo Control ed " +"imposta la dimensione minima personalizzata manualmente." #: scene/gui/tree.cpp msgid "(Other)" @@ -11833,9 +11902,18 @@ msgid "Input" msgstr "Ingresso" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "Fonte non valida per l'anteprima." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Sorgente non valida per la shader." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Sorgente non valida per la shader." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Assegnazione alla funzione." @@ -11845,13 +11923,72 @@ msgid "Assignment to uniform." msgstr "Assegnazione all'uniforme." #: servers/visual/shader_language.cpp -#, fuzzy msgid "Varyings can only be assigned in vertex function." -msgstr "Varyings può essere assegnato solo nella funzione del vertice." +msgstr "Varyings può essere assegnato soltanto nella funzione del vertice." #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Le constanti non possono essere modificate." + +#~ msgid "Previous Folder" +#~ msgstr "Cartella precedente" + +#~ msgid "Next Folder" +#~ msgstr "Cartella successiva" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Apri screenshots automaticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Apri in un editor di immagini esterno." + +#~ msgid "Reverse" +#~ msgstr "Inverti" + +#~ msgid "Mirror X" +#~ msgstr "Specchia X" + +#~ msgid "Mirror Y" +#~ msgstr "Specchia Y" + +#~ msgid "Generating solution..." +#~ msgstr "Generando la soluzione..." + +#~ msgid "Generating C# project..." +#~ msgstr "Genero progetto in C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "Impossibile creare la soluzione." + +#~ msgid "Failed to save solution." +#~ msgstr "Impossibile salvare la soluzione." + +#~ msgid "Done" +#~ msgstr "Fatto" + +#~ msgid "Failed to create C# project." +#~ msgstr "Impossibile creare il progetto C#." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "Riguardo il supporto in C#" + +#~ msgid "Create C# solution" +#~ msgstr "Crea la soluzione C#" + +#~ msgid "Builds" +#~ msgstr "Compilazioni" + +#~ msgid "Build Project" +#~ msgstr "Compila Progetto" + +#~ msgid "View log" +#~ msgstr "Visualizza log" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment ha bisogno di una risorsa Ambiente." #~ msgid "Enabled Classes" #~ msgstr "Classi abilitate" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index b3ac446b7f..689a7f3e2b 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -2,7 +2,7 @@ # Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. # Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) # This file is distributed under the same license as the Godot source code. -# akirakido <achts.y@gmail.com>, 2016-2017, 2018. +# akirakido <achts.y@gmail.com>, 2016-2017, 2018, 2019. # D_first <dntk.daisei@gmail.com>, 2017, 2018. # Daisuke Saito <d.saito@coriginate.com>, 2017, 2018. # h416 <shinichiro.hirama@gmail.com>, 2017. @@ -27,7 +27,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:49+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: John Smith <weblater_jp@susa.eek.jp>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -147,6 +147,31 @@ msgid "Anim Change Call" msgstr "アニメーション呼出ã—ã®å¤‰æ›´" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "アニメーションã‚ãƒ¼ãƒ•ãƒ¬ãƒ¼ãƒ ã®æ™‚間を変更" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’変更" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¹ãƒ•ォームを変更" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "アニメーションã‚ーフレームã®å€¤ã‚’変更" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "アニメーション呼出ã—ã®å¤‰æ›´" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "アニメーションã®é•·ã•を変更" @@ -477,9 +502,8 @@ msgid "Select All" msgstr "ã™ã¹ã¦é¸æŠž" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž" +msgstr "é¸æŠžè§£é™¤" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -491,9 +515,8 @@ msgstr "" "ノードã”ã¨ã«ãƒˆãƒ©ãƒƒã‚¯ã‚’グループ化ã™ã‚‹ã‹ã€ãƒ—レーンãªãƒªã‚¹ãƒˆã¨ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Snap:" -msgstr "スナップ" +msgstr "スナップ:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -658,6 +681,10 @@ msgstr "行ã«ç§»å‹•" msgid "Line Number:" msgstr "行番å·:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "ï¼…dä»¶ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "一致ãªã—" @@ -707,7 +734,7 @@ msgstr "ズームアウト" msgid "Reset Zoom" msgstr "ズームをリセット" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "è¦å‘Š" @@ -716,23 +743,20 @@ msgid "Line and column numbers." msgstr "行番å·ã¨åˆ—番å·ã€‚" #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "対象ノードã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼" +msgstr "対象ノードã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã—ã¦ãã ã•ã„。" #: editor/connections_dialog.cpp -#, fuzzy msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"対象メソッドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼æœ‰åйãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã™ã‚‹ã‹ã€å¯¾è±¡ãƒŽãƒ¼ãƒ‰ã«ã‚¹ã‚¯ãƒª" -"プトを添付ã—ã¦ãã ã•ã„。" +"対象ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。有効ãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã™ã‚‹ã‹ã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒŽãƒ¼ãƒ‰" +"ã«ã‚¹ã‚¯ãƒªãƒ—トをアタッãƒã—ã¦ãã ã•ã„。" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶š:" +msgstr "ノードã¸ã®æŽ¥ç¶š:" #: editor/connections_dialog.cpp msgid "Connect to Script:" @@ -743,9 +767,8 @@ msgid "From Signal:" msgstr "シグナルã‹ã‚‰:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Scene does not contain any script." -msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。" +msgstr "シーンã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -773,9 +796,8 @@ msgid "Extra Call Arguments:" msgstr "è¿½åŠ ã®å‘¼å‡ºã—引数:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "アニメーションã®ã‚ªãƒ—ション" +msgstr "高度ãªè¨å®š" #: editor/connections_dialog.cpp msgid "Deferred" @@ -795,9 +817,8 @@ msgid "Disconnects the signal after its first emission." msgstr "最åˆã®æ”¾å‡ºå¾Œã«ä¿¡å·ã‚’切æ–ã—ã¾ã™ã€‚" #: editor/connections_dialog.cpp -#, fuzzy msgid "Cannot connect signal" -msgstr "ã‚·ã‚°ãƒŠãƒ«ã®æŽ¥ç¶š: " +msgstr "ã‚·ã‚°ãƒŠãƒ«ã«æŽ¥ç¶šã§ãã¾ã›ã‚“" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -818,6 +839,10 @@ msgid "Connect" msgstr "接続" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "シグナル:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š" @@ -839,14 +864,12 @@ msgid "Disconnect" msgstr "切æ–" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect a Signal to a Method" -msgstr "ã‚·ã‚°ãƒŠãƒ«ã®æŽ¥ç¶š: " +msgstr "メソッドã«ã‚·ã‚°ãƒŠãƒ«ã‚’接続ã™ã‚‹" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "接続を編集: " +msgstr "接続を編集:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -984,8 +1007,8 @@ msgid "Owners Of:" msgstr "次ã®ã‚ªãƒ¼ãƒŠãƒ¼:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "é¸æŠžã—ãŸãƒ•ァイルをプãƒã‚¸ã‚§ã‚¯ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™ã‹ï¼Ÿï¼ˆã€Œå…ƒã«æˆ»ã™ã€ä¸å¯ï¼‰" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "é¸æŠžã—ãŸãƒ•ァイルをプãƒã‚¸ã‚§ã‚¯ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹?(å…ƒã«æˆ»ã›ã¾ã›ã‚“)" #: editor/dependency_editor.cpp msgid "" @@ -1029,9 +1052,8 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "%d 個ã®ã‚¢ã‚¤ãƒ†ãƒ を完全ã«å‰Šé™¤ã—ã¾ã™ã‹?ï¼ˆã€Œå…ƒã«æˆ»ã™ã€ä¸å¯!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "ä¾å˜é–¢ä¿‚" +msgstr "ä¾å˜é–¢ä¿‚を表示" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" @@ -1075,7 +1097,7 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆå‰µå§‹è€…" #: editor/editor_about.cpp msgid "Lead Developer" -msgstr "開発主任" +msgstr "開発リーダー" #: editor/editor_about.cpp msgid "Project Manager " @@ -1166,7 +1188,6 @@ msgid "Success!" msgstr "æˆåŠŸï¼" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "インストール" @@ -1350,19 +1371,16 @@ msgid "Valid characters:" msgstr "æœ‰åŠ¹ãªæ–‡å—:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing engine class name." -msgstr "無効ãªåå‰ã§ã™ã€‚æ—¢å˜ã®ã‚¨ãƒ³ã‚¸ãƒ³ã‚¯ãƒ©ã‚¹åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。" +msgstr "æ—¢å˜ã®ã‚¨ãƒ³ã‚¸ãƒ³ã‚¯ãƒ©ã‚¹åã¨é‡è¤‡ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "無効ãªåå‰ã§ã™ã€‚æ—¢å˜ã®çµ„è¾¼ã¿åž‹åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。" +msgstr "æ—¢å˜ã®çµ„è¾¼ã¿åž‹åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." -msgstr "無効ãªåå‰ã§ã™ã€‚æ—¢å˜ã®ã‚°ãƒãƒ¼ãƒãƒ«å®šæ•°åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。" +msgstr "æ—¢å˜ã®ã‚°ãƒãƒ¼ãƒãƒ«å®šæ•°åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。" #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." @@ -1397,9 +1415,8 @@ msgid "Rearrange Autoloads" msgstr "自動èªè¾¼ã¿ã®ä¸¦ã¹æ›¿ãˆ" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." -msgstr "無効ãªãƒ‘スã§ã™ã€‚" +msgstr "パスãŒç„¡åйã§ã™ã€‚" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp msgid "File does not exist." @@ -1452,9 +1469,8 @@ msgid "[unsaved]" msgstr "[未ä¿å˜]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "ã¯ã˜ã‚ã«ãƒ™ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„" +msgstr "ã¯ã˜ã‚ã«ãƒ™ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1537,44 +1553,42 @@ msgstr "カスタムリリーステンプレートãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" msgid "Template file not found:" msgstr "テンプレートファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"32ビットã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§ã¯ã€çµ„ã¿è¾¼ã¿PCKã¯4GiBã‚’è¶…ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" + #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "エディタ" +msgstr "3Dエディタ" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "スクリプトエディタを開ã" +msgstr "スクリプトエディタ" #: editor/editor_feature_profile.cpp msgid "Asset Library" msgstr "アセットライブラリ" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "シーンツリー(ノード):" +msgstr "シーンツリーã®ç·¨é›†" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Dock" -msgstr "インãƒãƒ¼ãƒˆ" +msgstr "インãƒãƒ¼ãƒˆãƒ‰ãƒƒã‚¯" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Node Dock" -msgstr "è¿½åŠ ã—ãŸã‚ーを移動" +msgstr "ノードドック" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "ファイルシステム" +msgstr "ファイルシステムã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒ‰ãƒƒã‚¯" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "ã™ã¹ã¦ç½®æ›ï¼ˆã€Œå…ƒã«æˆ»ã™ã€ä¸å¯ï¼‰" +msgstr "プãƒãƒ•ァイル '%s'を消去ã—ã¾ã™ã‹ï¼Ÿ(å…ƒã«æˆ»ã›ã¾ã›ã‚“)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1582,61 +1596,52 @@ msgstr "" "プãƒãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ‰åйãªãƒ•ァイルåã§ãªã‘れã°ãªã‚‰ãšã€ '.' ã‚’å«ã‚“ã§ã¯ã„ã‘ã¾ã›ã‚“" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." -msgstr "åŒåã®ãƒ•ァイルã¾ãŸã¯ãƒ•ォルダãŒã‚りã¾ã™ã€‚" +msgstr "ã“ã®åå‰ã®ãƒ—ãƒãƒ•ã‚¡ã‚¤ãƒ«ã¯æ—¢ã«å˜åœ¨ã—ã¾ã™ã€‚" #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" msgstr "(エディタ無効ã€ãƒ—ãƒãƒ‘ティ無効)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Properties Disabled)" -msgstr "プãƒãƒ‘ティã®ã¿" +msgstr "(プãƒãƒ‘ティ無効)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Editor Disabled)" -msgstr "無効" +msgstr "(エディタ無効)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "クラスã®èª¬æ˜Žï¼š" +msgstr "クラスオプション:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "次ã®ã‚¨ãƒ‡ã‚£ã‚¿ã‚’é–‹ã" +msgstr "コンテã‚ストエディタを有効ã«ã™ã‚‹" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Properties:" -msgstr "プãƒãƒ‘ティ:" +msgstr "プãƒãƒ‘ティを有効ã«ã™ã‚‹:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Features:" -msgstr "テクスãƒãƒ£" +msgstr "機能を有効ã«ã™ã‚‹:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Classes:" -msgstr "ã‚¯ãƒ©ã‚¹ã®æ¤œç´¢" +msgstr "クラスを有効ã«ã™ã‚‹:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." msgstr "ファイル '%s' ã®ãƒ•ォーマットãŒç„¡åйã§ã™ã€‚インãƒãƒ¼ãƒˆãŒä¸æ¢ã•れã¾ã—ãŸã€‚" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"プãƒãƒ•ァイル '%s' ã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™ã€‚インãƒãƒ¼ãƒˆå‰ã«æœ€åˆã«ãƒªãƒ¢ãƒ¼ãƒˆã§å®Ÿè¡Œã™ã‚‹" -"ã¨ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã¯ä¸æ¢ã•れã¾ã™ã€‚" +"プãƒãƒ•ァイル '%s' ã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™ã€‚インãƒãƒ¼ãƒˆã™ã‚‹å‰ã«å‰Šé™¤ã—ã¦ãã ã•ã„。イ" +"ンãƒãƒ¼ãƒˆã¯ä¸æ¢ã•れã¾ã—ãŸã€‚" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1648,14 +1653,12 @@ msgid "Unset" msgstr "未è¨å®š" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³:" +msgstr "ç¾åœ¨ã®ãƒ—ãƒãƒ•ァイル:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Make Current" -msgstr "ç¾åœ¨:" +msgstr "最新ã«ã™ã‚‹" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1673,9 +1676,8 @@ msgid "Export" msgstr "エクスãƒãƒ¼ãƒˆ" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "利用å¯èƒ½ãªãƒŽãƒ¼ãƒ‰:" +msgstr "利用å¯èƒ½ãªãƒ—ãƒãƒ•ァイル:" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1693,9 +1695,8 @@ msgid "Erase Profile" msgstr "タイルマップを消去" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Profile(s)" -msgstr "インãƒãƒ¼ãƒˆã•れãŸãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ" +msgstr "プãƒãƒ•ァイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1736,7 +1737,7 @@ msgstr "ファイルマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§è¡¨ç¤º" msgid "New Folder..." msgstr "æ–°è¦ãƒ•ォルダ..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "å†èªè¾¼" @@ -1787,7 +1788,7 @@ msgstr "進む" msgid "Go Up" msgstr "上ã¸" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "éš ã—ファイルã®åˆ‡ã‚Šæ›¿ãˆ" @@ -1813,27 +1814,31 @@ msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’下ã¸" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "å‰ã®åºŠé¢" +msgid "Go to previous folder." +msgstr "親フォルダã¸ç§»å‹•ã™ã‚‹ã€‚" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "次ã®åºŠé¢" +msgid "Go to next folder." +msgstr "親フォルダã¸ç§»å‹•ã™ã‚‹ã€‚" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Go to parent folder." -msgstr "親フォルダã¸" +msgstr "親フォルダã¸ç§»å‹•ã™ã‚‹ã€‚" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ファイル検索" #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "éš ã—ファイルã®åˆ‡ã‚Šæ›¿ãˆ" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2218,7 +2223,6 @@ msgstr "" "ントをãŠèªã¿ãã ã•ã„。" #: editor/editor_node.cpp -#, fuzzy msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." @@ -2235,7 +2239,6 @@ msgstr "" "を変更ã—ã€å†åº¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„。" #: editor/editor_node.cpp -#, fuzzy msgid "" "This scene was imported, so changes to it won't be kept.\n" "Instancing it or inheriting will allow making changes to it.\n" @@ -2243,12 +2246,11 @@ msgid "" "understand this workflow." msgstr "" "ã“ã®ã‚·ãƒ¼ãƒ³ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸã‚‚ã®ã§ã€å¤‰æ›´ã¯ä¿æŒã•れã¾ã›ã‚“。\n" -"インスタンス化ã‹ç¶™æ‰¿ã™ã‚‹ã¨ã€å¤‰æ›´ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚\n" -"ã“ã®ãƒ¯ãƒ¼ã‚¯ãƒ•ãƒãƒ¼ã‚’よりよãç†è§£ã™ã‚‹ãŸã‚ã«ã€ã‚·ãƒ¼ãƒ³ã®èªã¿è¾¼ã¿ã«é–¢é€£ã™ã‚‹ãƒ‰ã‚ュメ" -"ントをãŠèªã¿ãã ã•ã„。" +"インスタンス化もã—ãã¯ç¶™æ‰¿ã™ã‚‹ã¨ã€å¤‰æ›´ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚\n" +"ã“ã®ãƒ¯ãƒ¼ã‚¯ãƒ•ãƒãƒ¼ã‚’よりよãç†è§£ã™ã‚‹ãŸã‚ã«ã€ã‚·ãƒ¼ãƒ³ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«é–¢é€£ã™ã‚‹ãƒ‰ã‚ュ" +"メントをãŠèªã¿ãã ã•ã„。" #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object, so changes to it won't be kept.\n" "Please read the documentation relevant to debugging to better understand " @@ -2570,6 +2572,10 @@ msgid "Go to previously opened scene." msgstr "以å‰ã«é–‹ã„ãŸã‚·ãƒ¼ãƒ³ã«ç§»å‹•ã™ã‚‹ã€‚" #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "テã‚ストをコピー" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "次ã®ã‚¿ãƒ–" @@ -2771,32 +2777,20 @@ msgid "Editor Layout" msgstr "エディタレイアウト" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "シーンをルートã«ã™ã‚‹" +msgstr "スクリーンショットを撮る" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "エディタã®ãƒ‡ãƒ¼ã‚¿ãƒ»è¨å®šãƒ•ォルダを開ã" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "次ã®ã‚¨ãƒ‡ã‚£ã‚¿ã‚’é–‹ã" +msgstr "スクリーンショットã¯Editor Data / Settingsフォルダã«ä¿å˜ã•れã¦ã„ã¾ã™ã€‚" #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "フルスクリーン切り替ãˆ" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "分割モード切り替ãˆ" +msgstr "システムコンソールã®åˆ‡ã‚Šæ›¿ãˆ" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2906,19 +2900,16 @@ msgid "Spins when the editor window redraws." msgstr "エディタ ウィンドウã®å†æç”»æ™‚ã«ã‚¹ãƒ”ンã—ã¾ã™ã€‚" #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "継続的" +msgstr "ç¶™ç¶šçš„ã«æ›´æ–°" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" msgstr "å¤‰æ›´æ™‚ã«æ›´æ–°" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "アップデートスピナーを無効化" +msgstr "アップデートスピナーをéžè¡¨ç¤º" #: editor/editor_node.cpp msgid "FileSystem" @@ -3115,6 +3106,11 @@ msgid "Calls" msgstr "呼出ã—" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "テーマを編集..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "オン" @@ -3463,7 +3459,6 @@ msgid "Remove Template" msgstr "テンプレートを除去" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select Template File" msgstr "ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž" @@ -3526,9 +3521,8 @@ msgid "No name provided." msgstr "åå‰ãŒä»˜ã„ã¦ã„ã¾ã›ã‚“。" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Provided name contains invalid characters." -msgstr "åå‰ã«ä½¿ç”¨ã§ããªã„æ–‡å—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™" +msgstr "åå‰ã«ä½¿ç”¨ã§ããªã„æ–‡å—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚" #: editor/filesystem_dock.cpp msgid "Name contains invalid characters." @@ -3560,7 +3554,6 @@ msgid "New Inherited Scene" msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Open Scenes" msgstr "シーンを開ã" @@ -3569,12 +3562,10 @@ msgid "Instance" msgstr "インスタンス" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Add to Favorites" msgstr "ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ " #: editor/filesystem_dock.cpp -#, fuzzy msgid "Remove from Favorites" msgstr "ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰å‰Šé™¤" @@ -3743,6 +3734,7 @@ msgid "Nodes not in Group" msgstr "グループã«ãªã„ノード" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "フィルタノード" @@ -3864,9 +3856,8 @@ msgid "Reimport" msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" #: editor/import_dock.cpp -#, fuzzy msgid "Save scenes, re-import and restart" -msgstr "シーンをä¿å˜ã—ã€å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦å†èµ·å‹•" +msgstr "シーンをä¿å˜ã—ã¦ã€å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦å†èµ·å‹•ã—ã¦ãã ã•ã„" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -4136,9 +4127,8 @@ msgid "Open Animation Node" msgstr "アニメーションノードを開ã" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "ä¸‰è§’å½¢ãŒæ—¢ã«å˜åœ¨ã—ã¾ã™" +msgstr "ä¸‰è§’å½¢ãŒæ—¢ã«å˜åœ¨ã—ã¾ã™ã€‚" #: editor/plugins/animation_blend_space_2d_editor.cpp #, fuzzy @@ -4161,9 +4151,8 @@ msgid "Remove BlendSpace2D Point" msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Triangle" -msgstr "無効ãªã‚ーを削除" +msgstr "BlendSpace2D三角形を削除ã™ã‚‹" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." @@ -4243,7 +4232,6 @@ msgstr "æ–°è¦ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Node" msgstr "ノードを削除" @@ -4297,7 +4285,6 @@ msgid "Edit Filtered Tracks:" msgstr "フィルタリング済トラックã®ç·¨é›†:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Enable Filtering" msgstr "フィルタリングを有効化" @@ -4589,11 +4576,10 @@ msgid "Remove selected node or transition." msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã¾ãŸã¯ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’除去。" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Toggle autoplay this animation on start, restart or seek to zero." msgstr "" -"ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®è‡ªå‹•å†ç”Ÿã‚’ã€ã‚¹ã‚¿ãƒ¼ãƒˆã€ãƒªã‚¹ã‚¿ãƒ¼ãƒˆã€ã‚¼ãƒã«ã‚·ãƒ¼ã‚¯ã«åˆ‡ã‚Šæ›¿ãˆ" -"る。" +"ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®è‡ªå‹•å†ç”Ÿã®é–‹å§‹ã€å†èµ·å‹•ã€ã¾ãŸã¯ã‚¼ãƒã¸ã®ã‚·ãƒ¼ã‚¯ã‚’切り替ãˆã¾" +"ã™ã€‚" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set the end animation. This is useful for sub-transitions." @@ -4816,6 +4802,10 @@ msgid "Idle" msgstr "待機" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "インストール..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "å†è©¦è¡Œ" @@ -4844,7 +4834,6 @@ msgid "Last" msgstr "最後" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "ã™ã¹ã¦" @@ -4858,8 +4847,8 @@ msgid "Sort:" msgstr "ソート:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "逆" +msgid "Reverse sorting." +msgstr "é€†é †ã‚½ãƒ¼ãƒˆã€‚" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4940,31 +4929,31 @@ msgid "Rotation Step:" msgstr "回転ã®ã‚¹ãƒ†ãƒƒãƒ—:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "垂直ガイドを移動" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "垂直ガイドを作æˆ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "垂直ガイドを削除" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "水平ガイドを移動" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "水平ガイドを作æˆ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "水平ガイドを削除" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "水平垂直ガイドを作æˆ" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4984,9 +4973,8 @@ msgid "Resize CanvasItem" msgstr "CanvasItemをリサイズ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale CanvasItem" -msgstr "ã‚ャンãƒã‚¹ã‚¢ã‚¤ãƒ†ãƒ ã®ç·¨é›†" +msgstr "ã‚ャンãƒã‚¹ã‚¢ã‚¤ãƒ†ãƒ ã®æ‹¡å¤§/縮å°" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move CanvasItem" @@ -5025,41 +5013,35 @@ msgstr "アンカーを変更" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected" -msgstr "é¸æŠžãƒ„ãƒ¼ãƒ«" +msgstr "é¸æŠžã‚’ãƒãƒƒã‚¯" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected" -msgstr "é¸æŠžæ¸ˆã¿ã‚’削除" +msgstr "é¸æŠžã‚’è§£é™¤" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected" -msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除" +msgstr "é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected" -msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除" +msgstr "グループ解除" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" msgstr "ãƒãƒ¼ã‚ºã‚’貼り付ã‘" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "メッシュã‹ã‚‰æ”¾å‡ºç‚¹ã‚’生æˆ" +msgstr "ノードã‹ã‚‰ã‚«ã‚¹ã‚¿ãƒ ボーンを作æˆ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "ãƒãƒ¼ã‚ºã‚’クリアã™ã‚‹" +msgstr "ボーンをクリアã™ã‚‹" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -5094,10 +5076,10 @@ msgid "Alt+Drag: Move" msgstr "Alt+ドラッグ: 移動" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." msgstr "" -"vã‚ーを押ã™ã¨ãƒ”ボットã®å¤‰æ›´ã€'Shift+v' ã§ãƒ”ボットをドラッグ(移動ä¸ã§ã‚‚)" +"ピボットを変更ã™ã‚‹ã«ã¯ 'v' ã€ãƒ”ボットをドラッグã™ã‚‹ã«ã¯ 'Shift+v' を押ã—ã¾ã™" +"(移動ä¸)。" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5105,9 +5087,8 @@ msgid "Alt+RMB: Depth list selection" msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: デプス(深ã•)リストã®é¸æŠž" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Mode" -msgstr "è¿½åŠ ã—ãŸã‚ーを移動" +msgstr "移動モード" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate Mode" @@ -5147,7 +5128,6 @@ msgid "Snapping Options" msgstr "スナッピングオプション" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Grid" msgstr "グリッドã«ã‚¹ãƒŠãƒƒãƒ—" @@ -5169,37 +5149,30 @@ msgid "Use Pixel Snap" msgstr "ピクセルスナップを使用" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Smart Snapping" msgstr "スマートスナップ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Parent" msgstr "親ã«ã‚¹ãƒŠãƒƒãƒ—" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" msgstr "ノードアンカーã«ã‚¹ãƒŠãƒƒãƒ—" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" msgstr "ノードå´é¢ã«ã‚¹ãƒŠãƒƒãƒ—" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" msgstr "ノードã®ä¸å¿ƒã«ã‚¹ãƒŠãƒƒãƒ—" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" msgstr "ä»–ã®ãƒŽãƒ¼ãƒ‰ã«ã‚¹ãƒŠãƒƒãƒ—" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Guides" msgstr "ガイドã«ã‚¹ãƒŠãƒƒãƒ—" @@ -5274,14 +5247,12 @@ msgid "Show Group And Lock Icons" msgstr "グループアイコンã¨ãƒãƒƒã‚¯ã‚¢ã‚¤ã‚³ãƒ³ã‚’表示" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Selection" -msgstr "é¸æŠžå¯¾è±¡ã‚’ä¸å¤®ã«" +msgstr "ã‚»ãƒ³ã‚¿ãƒ¼é¸æŠž" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Frame Selection" -msgstr "é¸æŠžå¯¾è±¡ã‚’ãƒ•ãƒ¬ãƒ¼ãƒ ã®ä¸å¤®ã«" +msgstr "ãƒ•ãƒ¬ãƒ¼ãƒ é¸æŠž" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -5366,9 +5337,8 @@ msgstr "ノードを生æˆ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Error instancing scene from %s" -msgstr "%sシーンã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–エラー" +msgstr "%sã‹ã‚‰ã‚·ãƒ¼ãƒ³ã‚’インスタンス化処ç†ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5396,7 +5366,6 @@ msgid "Edit Poly (Remove Point)" msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(点を除去)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp -#, fuzzy msgid "Set Handle" msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" @@ -5420,9 +5389,8 @@ msgstr "発光(Emission)マスクをèªã¿è¾¼ã‚€" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "今ã™ãå†èµ·å‹•" +msgstr "å†èµ·å‹•" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5448,9 +5416,8 @@ msgstr "発光(Emission)マスク" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Capture from Pixel" -msgstr "ピクセルã‹ã‚‰å–å¾—" +msgstr "ピクセルã‹ã‚‰ã‚ャプãƒãƒ£" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5472,12 +5439,10 @@ msgid "Create Emission Points From Node" msgstr "ノードã‹ã‚‰æ”¾å‡ºç‚¹ã‚’生æˆ" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 0" msgstr "フラット0" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 1" msgstr "フラット1" @@ -5527,9 +5492,8 @@ msgid "Right Linear" msgstr "å³å´é¢å›³" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Preset" -msgstr "åˆæœŸè¨å®šå€¤ã‚’èªã¿è¾¼ã‚€" +msgstr "プリセットをèªã¿è¾¼ã‚€" #: editor/plugins/curve_editor_plugin.cpp msgid "Remove Curve Point" @@ -5576,9 +5540,8 @@ msgid "Create Static Trimesh Body" msgstr "スタティック(ä¸å¤‰ï¼‰ä¸‰è§’形メッシュ ボディを作æˆ" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Static Convex Body" -msgstr "スタティック(ä¸å¤‰ï¼‰å‡¸çŠ¶ãƒœãƒ‡ã‚£ã‚’ç”Ÿæˆ" +msgstr "é™çš„凸状ボディを生æˆ" #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -5595,9 +5558,8 @@ msgid "Failed creating shapes!" msgstr "図形ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Convex Shape(s)" -msgstr "凸状シェイプを生æˆ" +msgstr "凸状シェイプを作æˆ" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" @@ -5646,9 +5608,8 @@ msgid "Mesh" msgstr "メッシュ" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Trimesh Static Body" -msgstr "スタティック(ä¸å¤‰ï¼‰ä¸‰è§’形メッシュ ボディを作æˆ" +msgstr "é™çš„三角形メッシュボディを作æˆ" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Collision Sibling" @@ -5799,7 +5760,6 @@ msgid "Mesh Up Axis:" msgstr "メッシュã®ã‚¢ãƒƒãƒ—軸:" #: editor/plugins/multimesh_editor_plugin.cpp -#, fuzzy msgid "Random Rotation:" msgstr "ランダムãªå›žè»¢:" @@ -5840,7 +5800,7 @@ msgstr "å¯è¦–性ã®çŸ©å½¢ã‚’生æˆ" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Can only set point into a ParticlesMaterial process material" -msgstr "" +msgstr "ParticlesMaterialプãƒã‚»ã‚¹ãƒžãƒ†ãƒªã‚¢ãƒ«ã«ã®ã¿ç‚¹ã‚’è¨å®šã§ãã¾ã™" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -5848,7 +5808,6 @@ msgid "Generation Time (sec):" msgstr "ç”Ÿæˆæ™‚é–“ (ç§’):" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Faces contain no area!" msgstr "é¢ã«ã‚¨ãƒªã‚¢ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“!" @@ -5878,9 +5837,8 @@ msgid "Surface Points" msgstr "表é¢ã®ç‚¹" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points+Normal (Directed)" -msgstr "サーフェスãƒã‚¤ãƒ³ãƒˆï¼‹Normalï¼ˆæŒ‡å‘æ€§ï¼‰" +msgstr "サーフェスãƒã‚¤ãƒ³ãƒˆï¼‹Normal(æŒ‡å‘æ€§)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" @@ -5924,9 +5882,8 @@ msgstr "In-ãƒãƒ³ãƒ‰ãƒ«ã‚’曲線ã‹ã‚‰é™¤åŽ»" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Add Point to Curve" -msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’曲線ã«è¿½åŠ " +msgstr "点を曲線ã«è¿½åŠ " #: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy @@ -5955,9 +5912,8 @@ msgstr "ç‚¹ã‚’é¸æŠž" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp -#, fuzzy msgid "Shift+Drag: Select Control Points" -msgstr "Shift+ドラッグ:コントãƒãƒ¼ãƒ«ãƒã‚¤ãƒ³ãƒˆã‚’é¸æŠž" +msgstr "Shift + ドラッグ:コントãƒãƒ¼ãƒ«ãƒã‚¤ãƒ³ãƒˆã‚’é¸æŠž" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -6270,9 +6226,8 @@ msgid "Delete Resource" msgstr "リソースを削除" #: editor/plugins/resource_preloader_editor_plugin.cpp -#, fuzzy msgid "Resource clipboard is empty!" -msgstr "リソースã®ã‚¯ãƒªãƒƒãƒ—ボードã¯ç©ºã§ã™!" +msgstr "リソースクリップボードãŒç©ºã§ã™!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Paste Resource" @@ -6286,9 +6241,8 @@ msgstr "インスタンス:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Type:" -msgstr "åž‹(Type):" +msgstr "åž‹:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp @@ -6329,9 +6283,8 @@ msgid "Error: could not load file." msgstr "エラー: ファイルをèªã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error could not load file." -msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" +msgstr "エラー:ファイルをèªã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving file!" @@ -6397,18 +6350,16 @@ msgid "Find Next" msgstr "次を検索" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "フィルタプãƒãƒ‘ティ" +msgstr "フィルタスクリプト" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "メソッドリストã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆé †ã‚½ãƒ¼ãƒˆã‚’åˆ‡ã‚Šæ›¿ãˆã‚‹ã€‚" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "フィルターモード:" +msgstr "フィルタメソッド" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6588,7 +6539,6 @@ msgid "Source" msgstr "ソース:" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" msgstr "シグナル" @@ -6649,10 +6599,18 @@ msgid "Syntax Highlighter" msgstr "シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆ" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "ブックマーク" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "ブレークãƒã‚¤ãƒ³ãƒˆ" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6957,9 +6915,14 @@ msgstr "後é¢" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "シーンビューã«ã‚«ãƒ¡ãƒ©ã‚’åˆã‚ã›ã‚‹ï¼ˆAlign With View)" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "é¸æŠžã‚’ãƒ“ãƒ¥ãƒ¼ã«æ•´åˆ—" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp #, fuzzy msgid "No parent to instance a child at." @@ -7153,10 +7116,6 @@ msgid "Focus Selection" msgstr "é¸æŠžã«ãƒ•ォーカス" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "é¸æŠžã‚’ãƒ“ãƒ¥ãƒ¼ã«æ•´åˆ—" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "é¸æŠžãƒ„ãƒ¼ãƒ«" @@ -7758,9 +7717,8 @@ msgid "Erase TileMap" msgstr "タイルマップを消去" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Find Tile" -msgstr "タイルを探ã™" +msgstr "タイルを検索ã™ã‚‹" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -7768,14 +7726,6 @@ msgid "Transpose" msgstr "転置" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "ミラーX" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "ミラーY" - -#: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Disable Autotile" msgstr "自動スライス" @@ -7881,9 +7831,8 @@ msgid "Navigation Mode" msgstr "ナビゲーションメッシュを生æˆ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "回転モード" +msgstr "ビットマスクモード" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -7891,9 +7840,8 @@ msgid "Priority Mode" msgstr "エクスãƒãƒ¼ãƒˆã®ãƒ¢ãƒ¼ãƒ‰:" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "パンモード" +msgstr "アイコンモード" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -7924,7 +7872,7 @@ msgstr "æ–°è¦ãƒãƒªã‚´ãƒ³ã‚’生æˆã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." -msgstr "" +msgstr "é ˜åŸŸRect内ã«ãƒãƒªã‚´ãƒ³ã‚’ä¿æŒã—ã¾ã™ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." @@ -8197,12 +8145,10 @@ msgid "Add Node to Visual Shader" msgstr "シェーダー" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" msgstr "ノードを複製" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Nodes" msgstr "ノードを削除" @@ -8211,13 +8157,16 @@ msgid "Visual Shader Input Type Changed" msgstr "ビジュアルシェーダã®å…¥åŠ›ã‚¿ã‚¤ãƒ—ãŒå¤‰æ›´ã•れã¾ã—ãŸ" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(GLES3ã®ã¿)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "é ‚ç‚¹" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Fragment" -msgstr "引数:" +msgstr "フラグメント" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8271,7 +8220,7 @@ msgstr "差分ã®ã¿" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "" +msgstr "Dodge演算å。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "HardLight operator" @@ -8304,6 +8253,22 @@ msgid "Color uniform." msgstr "トランスフォーム" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "2ã¤ã®ãƒ‘ラメータ間㮠%s 比較ã®ãƒ–ãƒ¼ãƒ«çµæžœã‚’è¿”ã—ã¾ã™ã€‚" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "ç‰ã—ã„(==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "より大ãã„(>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "より大ãã„ã‹ç‰ã—ã„(>=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8313,11 +8278,45 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "INFã¨ã‚¹ã‚«ãƒ©ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã®æ¯”較ã®çµæžœã‚’ブール値ã§è¿”ã—ã¾ã™ã€‚" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "NaNã¨ã‚¹ã‚«ãƒ©ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã®æ¯”較ã®çµæžœã‚’ブール値ã§è¿”ã—ã¾ã™ã€‚" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "よりå°ã•ã„(<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "ãれ以下(<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "ç‰ã—ããªã„(!=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" "指定ã•れãŸãƒ–ール値ãŒtrueã¾ãŸã¯falseã®å ´åˆã€é–¢é€£ä»˜ã‘られãŸãƒ™ã‚¯ãƒˆãƒ«ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "2ã¤ã®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿é–“ã®æ¯”較ã®çµæžœã‚’ブール値ã§è¿”ã—ã¾ã™ã€‚" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "INF(ã¾ãŸã¯NaN)ã¨ã‚¹ã‚«ãƒ©ãƒ‘ラメータã¨ã®æ¯”較ã®ãƒ–ãƒ¼ãƒ«çµæžœã‚’è¿”ã—ã¾ã™ã€‚" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "ベクトル定数を変更" @@ -8353,7 +8352,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "é ‚ç‚¹ã‚·ã‚§ãƒ¼ãƒ€ãƒ¢ãƒ¼ãƒ‰ã® '%s' 入力パラメータ。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." @@ -8371,31 +8370,31 @@ msgstr "スカラ演算åを変更" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." -msgstr "" +msgstr "ãƒã‚¤ãƒ”ア数(2.718282)。自然対数ã®ãƒ™ãƒ¼ã‚¹ã‚’表ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "Î¥(イプシãƒãƒ³)定数(0.00001)。å¯èƒ½ãªæœ€å°ã®ã‚¹ã‚«ãƒ©ãƒ¼æ•°ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "Φ(ファイ)定数 (1.618034)。黄金比。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "Î (パイ)/4定数 (0.785398) ã¾ãŸã¯45度。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "Î (パイ)/2 定数(1.570796)ã¾ãŸã¯90度。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "Î (パイ)定数(3.141593)ã¾ãŸã¯180度。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "Τ(タウ)定数(6.283185)ã¾ãŸã¯360度。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." @@ -8410,16 +8409,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "パラメータã®é€†ã‚³ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "(GLES3ã®ã¿)パラメータã®åŒæ›²ç·šé€†ã‚³ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "パラメータã®é€†åŒæ›²ç·šä½™å¼¦ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "パラメータã®é€†ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "(GLES3ã®ã¿)パラメータã®åŒæ›²ç·šé€†ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "パラメータã®åŒæ›²ç·šé€†ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8430,8 +8429,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "複数パラメータã®é€†ã‚¿ãƒ³ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "(GLES3ã®ã¿)パラメータã®åŒæ›²ç·šé€†ã‚¿ãƒ³ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿”ã—ã¾ã™ã€‚" +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "パラメータã®åŒæ›²ç·šé€†ã‚¿ãƒ³ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8447,8 +8446,8 @@ msgid "Returns the cosine of the parameter." msgstr "パラメータã®ã‚³ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "(GLES3ã®ã¿)パラメータã®åŒæ›²ç·šã‚³ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "パラメータã®åŒæ›²ç·šã‚³ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8516,12 +8515,12 @@ msgid "1.0 / scalar" msgstr "1.0 / スカラー" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "(GLES3ã®ã¿)ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã«æœ€ã‚‚è¿‘ã„æ•´æ•°ã‚’検索ã—ã¾ã™ã€‚" +msgid "Finds the nearest integer to the parameter." +msgstr "ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã«æœ€ã‚‚è¿‘ã„æ•´æ•°ã‚’検索ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "(GLES3ã®ã¿)ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã«æœ€ã‚‚è¿‘ã„å¶æ•°ã®æ•´æ•°ã‚’検索ã—ã¾ã™ã€‚" +msgid "Finds the nearest even integer to the parameter." +msgstr "ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã«æœ€ã‚‚è¿‘ã„å¶æ•°ã®æ•´æ•°ã‚’検索ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8536,8 +8535,8 @@ msgid "Returns the sine of the parameter." msgstr "パラメータã®ç¬¦å·ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "(GLES3ã®ã¿)パラメータã®åŒæ›²ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" +msgid "Returns the hyperbolic sine of the parameter." +msgstr "パラメータã®åŒæ›²ã‚µã‚¤ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8572,12 +8571,12 @@ msgid "Returns the tangent of the parameter." msgstr "パラメータã®ã‚¿ãƒ³ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "(GLES3ã®ã¿)パラメータã®åŒæ›²ã‚¿ãƒ³ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿”ã—ã¾ã™ã€‚" +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "パラメータã®åŒæ›²ã‚¿ãƒ³ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "(GLES3ã®ã¿)パラメータã®ãƒˆãƒ©ãƒ³ã‚±ãƒ¼ãƒˆã•れãŸå€¤ã‚’検索ã—ã¾ã™ã€‚" +msgid "Finds the truncated value of the parameter." +msgstr "パラメータã®ãƒˆãƒ©ãƒ³ã‚±ãƒ¼ãƒˆã•れãŸå€¤ã‚’検索ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8619,12 +8618,17 @@ msgstr "テクスãƒãƒ£ãƒ»ãƒ«ãƒƒã‚¯ã‚¢ãƒƒãƒ—を実行ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "テクスãƒãƒ£Uniformを変更" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "テクスãƒãƒ£Uniformを変更" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup with triplanar." msgstr "テクスãƒãƒ£Uniformを変更" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8633,8 +8637,9 @@ msgid "Transform function." msgstr "トランスフォームã®ãƒ€ã‚¤ã‚¢ãƒã‚°..." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8658,16 +8663,16 @@ msgid "Decomposes transform to four vectors." msgstr "変æ›ã‚’4ã¤ã®ãƒ™ã‚¯ãƒˆãƒ«ã«åˆ†è§£ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "(GLES3ã®ã¿)変æ›ã®è¡Œåˆ—å¼ã‚’計算ã—ã¾ã™ã€‚" +msgid "Calculates the determinant of a transform." +msgstr "変æ›ã®è¡Œåˆ—å¼ã‚’計算ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "(GLES3ã®ã¿)変æ›ã®é€†é–¢æ•°ã‚’計算ã—ã¾ã™ã€‚" +msgid "Calculates the inverse of a transform." +msgstr "変æ›ã®é€†è¡Œåˆ—を計算ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "(GLES3ã®ã¿)変æ›ã®è»¢ç½®ã‚’計算ã—ã¾ã™ã€‚" +msgid "Calculates the transpose of a transform." +msgstr "変æ›ã®è»¢ç½®ã‚’計算ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8718,8 +8723,9 @@ msgid "Calculates the dot product of two vectors." msgstr "2ã¤ã®ãƒ™ã‚¯ãƒˆãƒ«ã®å†…ç©ã‚’計算ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8750,13 +8756,14 @@ msgid "1.0 / vector" msgstr "1.0 / ベクトル" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "åå°„ã®æ–¹å‘(a:入射ベクトルã€b:法線ベクトル)を指ã™ãƒ™ã‚¯ãƒˆãƒ«ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "å±ˆæŠ˜ã®æ–¹å‘を指ã™ãƒ™ã‚¯ãƒˆãƒ«ã‚’è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8856,60 +8863,58 @@ msgstr "" "è¿”ã—ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "(GLES3ã®ã¿)(フラグメント/ライトモードã®ã¿)スカラー導関数。" +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(フラグメント/ライトモードã®ã¿)スカラー導関数。" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "(GLES3ã®ã¿)(フラグメント/ライトモードã®ã¿)ベクトル導関数。" +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(フラグメント/ライトモードã®ã¿)ベクトル導関数。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" -"(GLES3ã®ã¿)(フラグメント/ライトモードã®ã¿)(ベクトル)ãƒãƒ¼ã‚«ãƒ«å·®åˆ†ã‚’使用ã—㦠" -"'x' ã§å¾®åˆ†ã—ã¾ã™ã€‚" +"(フラグメント/ライトモードã®ã¿)(ベクトル)ãƒãƒ¼ã‚«ãƒ«å·®åˆ†ã‚’使用ã—㦠'x' ã§å¾®åˆ†ã—" +"ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" -"(GLES3ã®ã¿)(フラグメント/ライトモードã®ã¿)(スカラー)ãƒãƒ¼ã‚«ãƒ«å·®åˆ†ã‚’使用ã—㦠" -"'x' ã§å¾®åˆ†ã—ã¾ã™ã€‚" +"(フラグメント/ライトモードã®ã¿)(スカラー)ãƒãƒ¼ã‚«ãƒ«å·®åˆ†ã‚’使用ã—㦠'x' ã§å¾®åˆ†ã—" +"ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" -"(GLES3ã®ã¿)(フラグメント/ライトモードã®ã¿)(ベクトル)ãƒãƒ¼ã‚«ãƒ«å·®åˆ†ã‚’使用ã—㦠" -"'y' ã§å¾®åˆ†ã—ã¾ã™ã€‚" +"(フラグメント/ライトモードã®ã¿)(ベクトル)ãƒãƒ¼ã‚«ãƒ«å·®åˆ†ã‚’使用ã—㦠'y' ã§å¾®åˆ†ã—" +"ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" -"(GLES3ã®ã¿)(フラグメント/ライトモードã®ã¿)(スカラー)ãƒãƒ¼ã‚«ãƒ«å·®åˆ†ã‚’使用ã—㦠" -"'y' ã§å¾®åˆ†ã—ã¾ã™ã€‚" +"(フラグメント/ライトモードã®ã¿)(スカラー)ãƒãƒ¼ã‚«ãƒ«å·®åˆ†ã‚’使用ã—㦠'y' ã§å¾®åˆ†ã—" +"ã¾ã™ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" -"(GLES3ã®ã¿)(フラグメント/ライトモードã®ã¿)(ベクトル) 'x' 㨠'y' ã®çµ¶å¯¾å°Žé–¢æ•°" -"ã®åˆè¨ˆã€‚" +"(フラグメント/ライトモードã®ã¿)(ベクトル) 'x' 㨠'y' ã®çµ¶å¯¾å°Žé–¢æ•°ã®åˆè¨ˆã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" -"(GLES3ã®ã¿)(フラグメント/ライトモードã®ã¿)(スカラー) 'x' 㨠'y' ã®çµ¶å¯¾å°Žé–¢æ•°" -"ã®åˆè¨ˆã€‚" +"(フラグメント/ライトモードã®ã¿)(スカラー) 'x' 㨠'y' ã®çµ¶å¯¾å°Žé–¢æ•°ã®åˆè¨ˆã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9283,7 +9288,6 @@ msgstr "" "è¦å‘Š: プãƒã‚¸ã‚§ã‚¯ãƒˆã¯æ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§é–‹ãã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚" #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file was generated by an older engine " "version, and needs to be converted for this version:\n" @@ -9417,7 +9421,6 @@ msgid "Can't run project" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’実行ã§ãã¾ã›ã‚“" #: editor/project_manager.cpp -#, fuzzy msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" @@ -9457,7 +9460,6 @@ msgid "An action with the name '%s' already exists." msgstr "アクション'%s'ã¯æ—¢ã«ã‚りã¾ã™!" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Rename Input Action Event" msgstr "入力アクションイベントã®åå‰ã‚’変更ã™ã‚‹" @@ -9914,7 +9916,7 @@ msgstr "å„ノードã®ã‚«ã‚¦ãƒ³ã‚¿ã®å¢—分é‡" #: editor/rename_dialog.cpp msgid "Padding" -msgstr "" +msgstr "パディング" #: editor/rename_dialog.cpp msgid "" @@ -10038,9 +10040,8 @@ msgid "This operation can't be done on the tree root." msgstr "ã“ã®å‡¦ç†ã¯ãƒ„リーã®ãƒ«ãƒ¼ãƒˆã§ã¯ã§ãã¾ã›ã‚“." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Move Node In Parent" -msgstr "親ã®ãƒŽãƒ¼ãƒ‰ã‚’移動" +msgstr "ノードを親ã«ç§»å‹•" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10178,7 +10179,6 @@ msgid "Clear Inheritance" msgstr "継承をクリア" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" msgstr "ドã‚ュメントを開ã" @@ -10187,9 +10187,8 @@ msgid "Add Child Node" msgstr "åãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ " #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "ã™ã¹ã¦æŠ˜ã‚ŠãŸãŸã‚€" +msgstr "ã™ã¹ã¦å±•é–‹/折りãŸãŸã¿" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10201,6 +10200,11 @@ msgid "Extend Script" msgstr "スクリプトを拡張" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "親ノードを変更" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "シーンをルートã«ã™ã‚‹" @@ -10221,9 +10225,8 @@ msgid "Delete (No Confirm)" msgstr "削除 (確èªãªã—)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "æ–°ã—ã„ãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ /生æˆ" +msgstr "æ–°ã—ã„ãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ /作æˆã™ã‚‹ã€‚" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10441,7 +10444,8 @@ msgid "Script is valid." msgstr "æ£å½“ãªã‚¹ã‚¯ãƒªãƒ—ト" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "使用å¯èƒ½: a-z, A-Z, 0-9 㨠_" #: editor/script_create_dialog.cpp @@ -10450,14 +10454,12 @@ msgid "Built-in script (into scene file)." msgstr "組ã¿è¾¼ã¿ã‚¹ã‚¯ãƒªãƒ—ト(シーンファイルã®ï¼‰" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—トファイルを作æˆ" +msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—トファイルを作æˆã€‚" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "æ—¢å˜ã®ã‚¹ã‚¯ãƒªãƒ—トファイルをèªã¿è¾¼ã‚€" +msgstr "æ—¢å˜ã®ã‚¹ã‚¯ãƒªãƒ—トファイルをèªã¿è¾¼ã‚€ã€‚" #: editor/script_create_dialog.cpp msgid "Language" @@ -10500,7 +10502,7 @@ msgstr "スタックトレース" msgid "Pick one or more items from the list to display the graph." msgstr "グラフを表示ã™ã‚‹ã«ã¯ã€ãƒªã‚¹ãƒˆã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ä»¥ä¸Šé¸ã‚“ã§ãã ã•ã„。" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "エラー" @@ -10518,9 +10520,8 @@ msgid "Inspect Previous Instance" msgstr "å‰ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å†…容を確èª" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Inspect Next Instance" -msgstr "次ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å†…容を確èª" +msgstr "次ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’確èªã™ã‚‹" #: editor/script_editor_debugger.cpp msgid "Stack Frames" @@ -10663,9 +10664,8 @@ msgid "Change Capsule Shape Radius" msgstr "カプセル形状ã®åŠå¾„変更" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Change Capsule Shape Height" -msgstr "カプセル形状ã®é«˜ã•変更" +msgstr "カプセル形状ã®é«˜ã•を変更ã™ã‚‹" #: editor/spatial_editor_gizmos.cpp #, fuzzy @@ -10901,15 +10901,15 @@ msgstr "Ctrl: 回転" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate X" -msgstr "" +msgstr "X軸ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’逆回転ã•ã›ã‚‹" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Y" -msgstr "" +msgstr "Y軸ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’逆回転ã•ã›ã‚‹" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Back Rotate Z" -msgstr "" +msgstr "Z軸ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’逆回転ã•ã›ã‚‹" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cursor Clear Rotation" @@ -10937,56 +10937,6 @@ msgstr "インスタンス:" msgid "Class name can't be a reserved keyword" msgstr "クラスåを予約ã‚ーワードã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Generating solution..." -msgstr "八分木テクスãƒãƒ£ã‚’生æˆ" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "C#プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’生æˆã—ã¦ã„ã¾ã™â€¦" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "アウトラインを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ!" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "ソリューションã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "完了" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "C#プãƒã‚¸ã‚§ã‚¯ãƒˆã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "C#ã®ã‚µãƒãƒ¼ãƒˆã«ã¤ã„ã¦" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "C#ソリューションを生æˆ" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "ビルド" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’ビルド" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "ãƒã‚°ã‚’表示" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "内部例外スタックトレースã®çµ‚了" @@ -11310,9 +11260,8 @@ msgid "Available Nodes:" msgstr "利用å¯èƒ½ãªãƒŽãƒ¼ãƒ‰:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Select or create a function to edit its graph." -msgstr "グラフを編集ã™ã‚‹é–¢æ•°ã‚’é¸æŠžã¾ãŸã¯ç”Ÿæˆ" +msgstr "グラフを編集ã™ã‚‹é–¢æ•°ã‚’é¸æŠžã¾ãŸã¯ä½œæˆã—ã¾ã™ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -11639,8 +11588,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "䏿£ãªã‚¹ãƒ—ラッシュスクリーンイメージ(縦横620x300ã§ãªã„ã¨ã„ã‘ã¾ã›ã‚“)" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "SpriteFrames リソースを作æˆã¾ãŸã¯ AnimatedSprite フレームを表示ã™ã‚‹ãŸã‚ã«ã¯ " @@ -11711,8 +11661,9 @@ msgstr "" "CanvasItemMaterialを使用ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "å…‰ã®å½¢çжã¨ãƒ†ã‚¯ã‚¹ãƒãƒ£ã¯ã€'texture'プãƒãƒ‘ãƒ†ã‚£ã«æŒ‡å®šã—ã¾ã™ã€‚" @@ -11724,7 +11675,8 @@ msgstr "" "ã™ã€‚" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "ã“ã®é®è”½ã®ã‚ªã‚¯ãƒ«ãƒ¼ãƒ€ ãƒãƒªã‚´ãƒ³ãŒç©ºã§ã™ã€‚多角形をæç”»ã—ã¦ãã ã•ã„!" #: scene/2d/navigation_polygon.cpp @@ -11828,15 +11780,15 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D ã¯ã€è¦ªã¨ã—ã¦ç›´æŽ¥ç·¨é›†ã•れãŸã‚·ãƒ¼ãƒ³ã®ãƒ«ãƒ¼ãƒˆã‚’使用ã™ã‚‹å ´åˆã«æœ€" "é©ã§ã™ã€‚" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCameraã¯ARVROriginãƒŽãƒ¼ãƒ‰ã‚’è¦ªã«æŒã¤å¿…è¦ãŒã‚りã¾ã™" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCameraã¯ARVROriginãƒŽãƒ¼ãƒ‰ã‚’è¦ªã«æŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚" #: scene/3d/arvr_nodes.cpp #, fuzzy @@ -11934,9 +11886,10 @@ msgstr "" "åã¨ã—ã¦ãれを使用ã—ã¦ãã ã•ã„。" #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "関数㮠CollisionShape ã®å½¢çŠ¶ã‚’æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ãれã®ãŸã‚ã®ã‚·ã‚§ã‚¤ãƒ—リ" "ソースを作æˆã—ã¦ãã ã•ã„!" @@ -11963,9 +11916,8 @@ msgstr "" "定ã•れã¦ã„ã‚‹SpatialMaterialを使用ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Plotting Meshes" -msgstr "イメージをé…ç½®(Blit)" +msgstr "メッシュã®ãƒ—ãƒãƒƒãƒˆ" #: scene/3d/gi_probe.cpp msgid "" @@ -11975,6 +11927,10 @@ msgstr "" "GIProbesã¯GLES2ビデオドライãƒã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。\n" "代ã‚りã«BakedLightmapを使用ã—ã¦ãã ã•ã„。" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "90度を超ãˆã‚‹è§’度ã®ã‚¹ãƒãƒƒãƒˆãƒ©ã‚¤ãƒˆã¯ã€ã‚·ãƒ£ãƒ‰ã‚¦ã‚’投影ã§ãã¾ã›ã‚“。" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -12018,9 +11974,10 @@ msgid "PathFollow only works when set as a child of a Path node." msgstr "PathFollow ã¯ã€Path ノードã®åã¨ã—ã¦è¨å®šã•れã¦ã„ã‚‹å ´åˆã®ã¿å‹•作ã—ã¾ã™ã€‚" #: scene/3d/path.cpp +#, fuzzy msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" "PathFollow ROTATION_ORIENTEDã§ã¯ã€è¦ªãƒ‘スã®Curveリソース㧠\"Up Vector\"を有効" "ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" @@ -12037,7 +11994,9 @@ msgstr "" #: scene/3d/remote_transform.cpp #, fuzzy -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" "Path プãƒãƒ‘ティã¯ã€å‹•作ã™ã‚‹ã‚ˆã†ã«æœ‰åŠ¹ãª Particles2D ノードを示ã™å¿…è¦ãŒã‚りã¾" "ã™ã€‚" @@ -12057,8 +12016,9 @@ msgstr "" "代ã‚りã«ã€åã®è¡çªã‚·ã‚§ã‚¤ãƒ—ã®ã‚µã‚¤ã‚ºã‚’変更ã—ã¦ãã ã•ã„。" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "SpriteFrames リソースを作æˆã¾ãŸã¯ AnimatedSprite3D フレームを表示ã™ã‚‹ãŸã‚ã«" @@ -12073,8 +12033,10 @@ msgstr "" "VehicleBodyã®åã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„。" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironmentã«ã¯EnvironmentリソースãŒå¿…è¦ã§ã™ã€‚" +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" #: scene/3d/world_environment.cpp #, fuzzy @@ -12115,7 +12077,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +#, fuzzy +msgid "No root AnimationNode for the graph is set." msgstr "グラフã®ãƒ«ãƒ¼ãƒˆAnimationNodeãŒè¨å®šã•れã¦ã„ã¾ã›ã‚“。" #: scene/animation/animation_tree.cpp @@ -12129,7 +12092,7 @@ msgstr "AnimationPlayerã«è¨å®šã•れãŸãƒ‘スã‹ã‚‰AnimationPlayerノード㌠#: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "アニメーションツリーã«å•題ãŒã‚りã¾ã™." #: scene/animation/animation_tree_player.cpp @@ -12164,8 +12127,7 @@ msgstr "ç¾åœ¨ã®è‰²ã‚’プリセットã¨ã—ã¦è¿½åŠ " msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "コンテナ自体ã¯ã€ã‚¹ã‚¯ãƒªãƒ—トã§åã®é…置動作をè¨å®šã—ãªã„é™ã‚Šã€ä½•ã®å½¹å‰²ã‚‚æžœãŸã—ã¾" "ã›ã‚“。\n" @@ -12187,23 +12149,26 @@ msgid "Please Confirm..." msgstr "確èª..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "ãƒãƒƒãƒ—アップã¯ã€popup() ã¾ãŸã¯ popup*() 関数ã®ã„ãšã‚Œã‹ã‚’呼ã³å‡ºã™å ´åˆã‚’除ãã€" "既定ã§ã¯éžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚編集ã®ãŸã‚ã«ãれらをå¯è¦–化ã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€å½¼" "らã¯å®Ÿè¡Œæ™‚ã«éžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +#, fuzzy +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "exp_edit ãŒtrueã®å ´åˆã€min_value ã¯0より大ãã„å¿…è¦ãŒã‚りã¾ã™ã€‚" #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainerã¯å˜ä¸€ã®åコントãƒãƒ¼ãƒ«ã§å‹•作ã™ã‚‹ã‚ˆã†ã«æ„図ã•れã¦ã„ã¾ã™ã€‚コンテ" @@ -12257,9 +12222,17 @@ msgid "Input" msgstr "入力" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "プレビューã®ã‚½ãƒ¼ã‚¹ãŒç„¡åйã§ã™ã€‚" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "無効ãªã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ã®ã‚½ãƒ¼ã‚¹ã§ã™ã€‚" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "ãã®ã‚¿ã‚¤ãƒ—ã®æ¯”較関数ã¯ç„¡åйã§ã™ã€‚" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "関数ã¸ã®å‰²ã‚Šå½“ã¦ã€‚" @@ -12277,6 +12250,69 @@ msgstr "Varyingã¯é ‚点関数ã«ã®ã¿å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" msgid "Constants cannot be modified." msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。" +#~ msgid "Previous Folder" +#~ msgstr "å‰ã®ãƒ•ォルダ" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "次ã®åºŠé¢" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "スクリーンショットを自動的ã«é–‹ã" + +#~ msgid "Open in an external image editor." +#~ msgstr "外部ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚¨ãƒ‡ã‚£ã‚¿ã§é–‹ãã¾ã™ã€‚" + +#~ msgid "Reverse" +#~ msgstr "逆" + +#~ msgid "Mirror X" +#~ msgstr "ミラーX" + +#~ msgid "Mirror Y" +#~ msgstr "ミラーY" + +#, fuzzy +#~ msgid "Generating solution..." +#~ msgstr "八分木テクスãƒãƒ£ã‚’生æˆ" + +#~ msgid "Generating C# project..." +#~ msgstr "C#プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’生æˆã—ã¦ã„ã¾ã™â€¦" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "アウトラインを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ!" + +#~ msgid "Failed to save solution." +#~ msgstr "ソリューションã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" + +#~ msgid "Done" +#~ msgstr "完了" + +#~ msgid "Failed to create C# project." +#~ msgstr "C#プãƒã‚¸ã‚§ã‚¯ãƒˆã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚" + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "C#ã®ã‚µãƒãƒ¼ãƒˆã«ã¤ã„ã¦" + +#~ msgid "Create C# solution" +#~ msgstr "C#ソリューションを生æˆ" + +#~ msgid "Builds" +#~ msgstr "ビルド" + +#~ msgid "Build Project" +#~ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’ビルド" + +#~ msgid "View log" +#~ msgstr "ãƒã‚°ã‚’表示" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironmentã«ã¯EnvironmentリソースãŒå¿…è¦ã§ã™ã€‚" + #, fuzzy #~ msgid "Enabled Classes" #~ msgstr "ã‚¯ãƒ©ã‚¹ã®æ¤œç´¢" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index d4451b86c6..f6dc4ca514 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -134,6 +134,31 @@ msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ძáƒáƒ®áƒ˜áƒšáƒ˜áƒ¡ ცვლილებá #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბური კáƒáƒ“რის დრáƒáƒ˜áƒ¡ ცვლილებáƒ" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ დáƒáƒ›áƒáƒ›áƒ•ლáƒáƒ‘ის შეცვლáƒ" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ დáƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ცვლილებáƒ" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბური კáƒáƒ“რის მნიშვნელáƒáƒ‘ის ცვლილებáƒ" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ძáƒáƒ®áƒ˜áƒšáƒ˜áƒ¡ ცვლილებáƒ" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "áƒáƒœáƒ˜áƒ› სიგრძის შეცვლáƒ" @@ -653,6 +678,10 @@ msgstr "ხáƒáƒ–ზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ" msgid "Line Number:" msgstr "ხáƒáƒ–ის ნáƒáƒ›áƒ”რი:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "áƒáƒ áƒáƒ სებáƒáƒ‘ს ტáƒáƒšáƒ˜" @@ -702,7 +731,7 @@ msgstr "ზუმის დáƒáƒžáƒáƒ¢áƒáƒ áƒáƒ•ებáƒ" msgid "Reset Zoom" msgstr "ზუმის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ–ე დáƒáƒ§áƒ”ნებáƒ" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -814,6 +843,11 @@ msgid "Connect" msgstr "დáƒáƒ™áƒáƒ•შირებáƒ" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "სიგნáƒáƒšáƒ”ბი" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "'%s' დრ'%s' დáƒáƒ™áƒáƒ•შირებáƒ" @@ -982,7 +1016,8 @@ msgid "Owners Of:" msgstr "მფლáƒáƒ‘ელები:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "მáƒáƒ•áƒáƒ¨áƒáƒ áƒáƒ— მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ”ბი პრáƒáƒ”ქტიდáƒáƒœ? (უკáƒáƒœ დáƒáƒ‘რუნებრშეუძლებელიáƒ)" #: editor/dependency_editor.cpp @@ -1167,7 +1202,6 @@ msgid "Success!" msgstr "წáƒáƒ მáƒáƒ¢áƒ”ბáƒ!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "დáƒáƒ§áƒ”ნებáƒ" @@ -1527,6 +1561,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1708,7 +1746,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1759,7 +1797,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1784,23 +1822,30 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "წინáƒáƒ›áƒ“ებáƒáƒ ე ნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "მáƒáƒ›áƒ“ევნრნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ძებნáƒ:" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2489,6 +2534,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მáƒáƒ¨áƒáƒ ებáƒ" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2681,14 +2731,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3003,6 +3045,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მრუდის ცვლილებáƒ" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3613,6 +3660,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4661,6 +4709,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "დáƒáƒ§áƒ”ნებáƒ" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4689,7 +4742,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4703,7 +4755,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4778,31 +4830,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "შექმნáƒ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი გáƒáƒ¡áƒáƒ¦áƒ”ბების მáƒáƒ¨áƒáƒ ებáƒ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "კვáƒáƒœáƒ«áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი გáƒáƒ¡áƒáƒ¦áƒ”ბების მáƒáƒ¨áƒáƒ ებáƒ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6396,10 +6452,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "შექმნáƒ" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6691,7 +6756,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6876,10 +6945,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7455,14 +7520,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7868,6 +7925,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7958,6 +8019,22 @@ msgid "Color uniform." msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ დáƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ცვლილებáƒ" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7965,10 +8042,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8058,7 +8169,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8066,7 +8177,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8078,7 +8189,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8095,7 +8206,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8164,11 +8275,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8184,7 +8295,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8212,11 +8323,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8257,11 +8368,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8271,7 +8386,7 @@ msgstr "შექმნáƒ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8289,15 +8404,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8349,7 +8464,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8377,12 +8492,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8459,47 +8574,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9660,6 +9775,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "áƒáƒ®áƒáƒšáƒ˜ %s შექმნáƒ" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9870,7 +9990,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9926,7 +10046,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10329,54 +10449,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10960,7 +11032,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11009,7 +11081,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11019,7 +11091,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11095,12 +11167,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11179,7 +11251,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11208,6 +11280,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11242,8 +11318,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11254,7 +11330,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11270,7 +11348,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11281,7 +11359,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11319,7 +11399,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "'%s' დრ'%s' შáƒáƒ ის კáƒáƒ•შირის გáƒáƒ¬áƒ§áƒ•ეტáƒ" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11332,7 +11412,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11363,8 +11443,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11384,18 +11463,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11439,9 +11518,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 388ca02bfa..374d996926 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:51+0000\n" +"PO-Revision-Date: 2019-07-21 11:06+0000\n" "Last-Translator: ì†¡íƒœì„ <xotjq237@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" @@ -32,13 +32,13 @@ msgstr "" #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "" -"convert()하기 위한 ì¸ìˆ˜ íƒ€ìž…ì´ ìœ íš¨í•˜ì§€ 않습니다, TYPE_* ìƒìˆ˜ë¥¼ 사용하세요." +"convert()하기 위한 ì¸ìˆ˜ íƒ€ìž…ì´ ì˜¬ë°”ë¥´ì§€ 않습니다, TYPE_* ìƒìˆ˜ë¥¼ 사용하세요." #: 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" @@ -50,19 +50,19 @@ msgstr "ì¸ìŠ¤í„´ìŠ¤ê°€ 비어있기 ë•Œë¬¸ì— Self를 ì‚¬ìš©í• ìˆ˜ ì—†ìŠµë‹ˆë‹ #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "ì—°ì‚°ìž %s, %s ê·¸ë¦¬ê³ %sì˜ ì—°ì‚° 대ìƒì´ ìœ íš¨í•˜ì§€ 않습니다." +msgstr "ì—°ì‚°ìž %s, %s ê·¸ë¦¬ê³ %sì˜ ì—°ì‚° 대ìƒì´ 올바르지 않습니다." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "ë² ì´ìФ 타입 %sì— ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ë±ìФ 타입 %s" +msgstr "ë² ì´ìФ 타입 %sì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ì¸ë±ìФ 타입 %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "ë² ì´ìФ 타입 %sì— ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ë±ìФ ì´ë¦„ %s" +msgstr "ë² ì´ìФ 타입 %sì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ì¸ë±ìФ ì´ë¦„ %s" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "'%s'ì„(를) êµ¬ì„±í•˜ê¸°ì— ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ìˆ˜" +msgstr "'%s'ì„(를) êµ¬ì„±í•˜ê¸°ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ì¸ìˆ˜" #: core/math/expression.cpp msgid "On call to '%s':" @@ -138,6 +138,31 @@ msgid "Anim Change Call" msgstr "ì• ë‹ˆë©”ì´ì…˜ 호출 변경" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "ì• ë‹ˆë©”ì´ì…˜ í‚¤í”„ë ˆìž„ 시간 변경" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "ì• ë‹ˆë©”ì´ì…˜ ì „í™˜ 변경" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 변형 변경" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "ì• ë‹ˆë©”ì´ì…˜ í‚¤í”„ë ˆìž„ ê°’ 변경" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 호출 변경" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "ì• ë‹ˆë©”ì´ì…˜ ê¸¸ì´ ë³€ê²½" @@ -380,7 +405,7 @@ msgstr "ë² ì§€ì–´ 트랙 추가" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "트랙 경로가 ìœ íš¨í•˜ì§€ 않습니다, 키를 추가하실 수 없습니다." +msgstr "트랙 경로가 올바르지 않습니다, 키를 ì¶”ê°€í• ìˆ˜ 없습니다." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" @@ -396,7 +421,7 @@ msgstr "트랙 키 추가" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "트랙 경로가 ìœ íš¨í•˜ì§€ 않습니다, 메서드 키를 추가하실 수 없습니다." +msgstr "트랙 경로가 올바르지 않습니다, 메서드 키를 ì¶”ê°€í• ìˆ˜ 없습니다." #: editor/animation_track_editor.cpp msgid "Add Method Track Key" @@ -567,7 +592,7 @@ msgstr "최ì í™”" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í‚¤ ì‚ì œ" +msgstr "올바르지 ì•Šì€ í‚¤ ì‚ì œ" #: editor/animation_track_editor.cpp msgid "Remove unresolved and empty tracks" @@ -634,13 +659,17 @@ msgstr "ë¼ì¸ìœ¼ë¡œ ì´ë™" msgid "Line Number:" msgstr "ë¼ì¸ 번호:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "%d 개가 ì¼ì¹˜í•©ë‹ˆë‹¤." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "ì¼ì¹˜ ê²°ê³¼ ì—†ìŒ" #: editor/code_editor.cpp msgid "Replaced %d occurrence(s)." -msgstr "%d 회 êµì²´ë¨." +msgstr "%d ê°œì˜ ë°œìƒì„ êµì²´í–ˆìŠµë‹ˆë‹¤." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -683,7 +712,7 @@ msgstr "축소" msgid "Reset Zoom" msgstr "줌 리셋" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "ê²½ê³ " @@ -700,7 +729,7 @@ msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"ëŒ€ìƒ ë©”ì„œë“œë¥¼ ì°¾ì„ ìˆ˜ 없습니다! ìœ íš¨í•œ 메서드를 ì§€ì •í•˜ê±°ë‚˜, ëŒ€ìƒ ë…¸ë“œì— ìŠ¤í¬" +"ëŒ€ìƒ ë©”ì„œë“œë¥¼ ì°¾ì„ ìˆ˜ 없습니다! 올바른 메서드를 ì§€ì •í•˜ê±°ë‚˜, ëŒ€ìƒ ë…¸ë“œì— ìŠ¤í¬" "립트를 ë¶™ì´ì„¸ìš”." #: editor/connections_dialog.cpp @@ -788,6 +817,10 @@ msgid "Connect" msgstr "ì—°ê²°" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "시그ë„:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "'%s'ì„(를) '%s'ì— ì—°ê²°" @@ -929,7 +962,7 @@ msgstr "깨진 종ì†ì„± ìˆ˜ì •" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "ì¢…ì† ê´€ê³„ ì—디터" +msgstr "ì¢…ì† ê´€ê³„ 편집기" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" @@ -950,8 +983,8 @@ msgid "Owners Of:" msgstr "ì†Œìœ ìž:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "프로ì 트ì—서 ì„ íƒëœ 파ì¼ë“¤ì„ ì‚ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? (ë˜ëŒë¦¬ê¸° 불가)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "프로ì 트ì—서 ì„ íƒí•œ 파ì¼ì„ ì‚ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? (ë˜ëŒë¦¬ê¸° 불가)" #: editor/dependency_editor.cpp msgid "" @@ -1119,7 +1152,7 @@ msgstr "패키지 파ì¼ì„ 여는 ë° ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. zip 형ì‹ì #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "ì—ì…‹ ì••ì¶•í•´ì œ" +msgstr "ì• ì…‹ ì••ì¶•í•´ì œ" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package installed successfully!" @@ -1131,7 +1164,6 @@ msgid "Success!" msgstr "성공!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "설치" @@ -1308,20 +1340,19 @@ msgstr "새로운 버스 ë ˆì´ì•„ì›ƒì„ ë§Œë“니다." #: editor/editor_autoload_settings.cpp msgid "Invalid name." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ì´ë¦„." +msgstr "올바르지 ì•Šì€ ì´ë¦„." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" -msgstr "ìœ íš¨í•œ 문ìž:" +msgstr "올바른 문ìž:" #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing engine class name." msgstr "ì—”ì§„ì— ì¡´ìž¬í•˜ëŠ” í´ëž˜ìФ ì´ë¦„ê³¼ ì¶©ëŒí•˜ì§€ 않아야 합니다." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "내장 타입 ì´ë¦„ê³¼ ì¶©ëŒí•˜ì§€ 않아야 합니다." +msgstr "기존 내장 타입 ì´ë¦„ê³¼ ì¶©ëŒí•˜ì§€ 않아야 합니다." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." @@ -1499,17 +1530,23 @@ msgstr "커스텀 릴리즈 í…œí”Œë¦¿ì„ ì°¾ì„ ìˆ˜ 없습니다." msgid "Template file not found:" msgstr "í…œí”Œë¦¿ì„ ì°¾ì„ ìˆ˜ 없습니다:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"32 비트 환경ì—서 ë‚´ìž¥ëœ PCK를 ë‚´ë³´ë‚´ë ¤ë©´ 4 GiB(기가 ì´ì§„ ë°”ì´íЏ)보다 작아야 " +"합니다." + #: editor/editor_feature_profile.cpp msgid "3D Editor" -msgstr "3D ì—디터" +msgstr "3D 편집기" #: editor/editor_feature_profile.cpp msgid "Script Editor" -msgstr "스í¬ë¦½íЏ ì—디터" +msgstr "스í¬ë¦½íЏ 편집기" #: editor/editor_feature_profile.cpp msgid "Asset Library" -msgstr "ì—ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬" +msgstr "ì• ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" @@ -1524,9 +1561,8 @@ msgid "Node Dock" msgstr "노드 ë…" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "íŒŒì¼ ì‹œìŠ¤í…œ ë…" +msgstr "íŒŒì¼ ì‹œìŠ¤í…œê³¼ ê°€ì ¸ì˜¤ê¸° ë…" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1542,7 +1578,7 @@ msgstr "ì´ ì´ë¦„ì„ ê°€ì§„ í”„ë¡œí•„ì´ ì´ë¯¸ 존재합니다." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "(ì—디터 비활성화ë¨, ì†ì„± 비활성화ë¨)" +msgstr "(편집기 비활성화ë¨, ì†ì„± 비활성화ë¨)" #: editor/editor_feature_profile.cpp msgid "(Properties Disabled)" @@ -1550,7 +1586,7 @@ msgstr "(ì†ì„± 비활성화ë¨)" #: editor/editor_feature_profile.cpp msgid "(Editor Disabled)" -msgstr "(ì—디터 비활성화ë¨)" +msgstr "(편집기 비활성화ë¨)" #: editor/editor_feature_profile.cpp msgid "Class Options:" @@ -1558,7 +1594,7 @@ msgstr "í´ëž˜ìФ 옵션:" #: editor/editor_feature_profile.cpp msgid "Enable Contextual Editor" -msgstr "컨í…스트 ì—디터 활성화" +msgstr "컨í…스트 편집기 활성화" #: editor/editor_feature_profile.cpp msgid "Enabled Properties:" @@ -1577,13 +1613,12 @@ msgid "File '%s' format is invalid, import aborted." msgstr "íŒŒì¼ '%s' 형ì‹ì´ 올바르지 않습니다, ê°€ì ¸ì˜¤ê¸°ê°€ 중단ë˜ì—ˆìŠµë‹ˆë‹¤." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"프로필 '%s'ì´(ê°€) ì´ë¯¸ 존재함니다. ê°€ì ¸ì˜¤ê¸° ì „ì— ë¨¼ì € í”„ë¡œí•„ì„ ì›ê²©ìœ¼ë¡œ 하세" -"ìš”, ê°€ì ¸ì˜¤ê¸°ê°€ 중단ë˜ì—ˆìŠµë‹ˆë‹¤." +"프로필 '%s'ì´(ê°€) ì´ë¯¸ 존재합니다. ê°€ì ¸ì˜¤ê¸° ì „ì— ì•žì˜ ê²ƒì„ ì‚ì œí•˜ì„¸ìš”, ê°€ì ¸ì˜¤" +"기가 중단ë˜ì—ˆìŠµë‹ˆë‹¤." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." @@ -1594,9 +1629,8 @@ msgid "Unset" msgstr "ë¹„ì„¤ì •" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "현재 프로필" +msgstr "현재 프로필:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1618,9 +1652,8 @@ msgid "Export" msgstr "내보내기" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "사용 가능한 프로필" +msgstr "사용 가능한 프로필:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1644,7 +1677,7 @@ msgstr "프로필 내보내기" #: editor/editor_feature_profile.cpp msgid "Manage Editor Feature Profiles" -msgstr "ì—디터 기능 프로필 관리" +msgstr "편집기 기능 프로필 관리" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1675,7 +1708,7 @@ msgstr "íŒŒì¼ íƒìƒ‰ê¸°ì—서 보기" msgid "New Folder..." msgstr "새 í´ë”..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "ìƒˆë¡œê³ ì¹¨" @@ -1726,7 +1759,7 @@ msgstr "앞으로 가기" msgid "Go Up" msgstr "위로 가기" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "숨김 íŒŒì¼ í† ê¸€" @@ -1751,23 +1784,31 @@ msgid "Move Favorite Down" msgstr "ì¦ê²¨ì°¾ê¸° 아래로 ì´ë™" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "ì´ì „ í´ë”" +#, fuzzy +msgid "Go to previous folder." +msgstr "부모 í´ë”로 ì´ë™í•©ë‹ˆë‹¤." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "ë‹¤ìŒ í´ë”" +#, fuzzy +msgid "Go to next folder." +msgstr "부모 í´ë”로 ì´ë™í•©ë‹ˆë‹¤." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "부모 í´ë”로 ì´ë™í•©ë‹ˆë‹¤." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "íŒŒì¼ ê²€ìƒ‰" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "현재 í´ë”를 ì¦ê²¨ì°¾ê¸° (안) 합니다." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "숨김 íŒŒì¼ ê°€ì‹œì„± í† ê¸€í•˜ê¸°." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -1794,7 +1835,7 @@ msgstr "파ì¼:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Must use a valid extension." -msgstr "ìœ íš¨í•œ 확장ìžë¥¼ 사용해야 합니다." +msgstr "올바른 확장ìžë¥¼ 사용해야 합니다." #: editor/editor_file_system.cpp msgid "ScanSources" @@ -1810,7 +1851,7 @@ msgstr "" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "ì—ì…‹ (다시) ê°€ì ¸ì˜¤ê¸°" +msgstr "ì• ì…‹ (다시) ê°€ì ¸ì˜¤ê¸°" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" @@ -1874,7 +1915,7 @@ msgstr "ì´ë„˜ " #: editor/editor_help.cpp msgid "Constants" -msgstr "ìƒìˆ˜" +msgstr "ìƒìˆ˜(Constant)" #: editor/editor_help.cpp msgid "Constants:" @@ -2128,7 +2169,7 @@ msgstr "ë ˆì´ì•„웃 ì €ìž¥ ì‹œë„ ì¤‘ 오류!" #: editor/editor_node.cpp msgid "Default editor layout overridden." -msgstr "ì—디터 기본 ë ˆì´ì•„ì›ƒì´ ë³€ê²½ë˜ì—ˆìŠµë‹ˆë‹¤." +msgstr "편집기 기본 ë ˆì´ì•„ì›ƒì´ ë³€ê²½ë˜ì—ˆìŠµë‹ˆë‹¤." #: editor/editor_node.cpp msgid "Layout name not found!" @@ -2295,7 +2336,7 @@ msgstr "종료" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "ì—디터를 ì¢…ë£Œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?" +msgstr "편집기를 ì¢…ë£Œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/editor_node.cpp msgid "Open Project Manager?" @@ -2488,6 +2529,10 @@ msgid "Go to previously opened scene." msgstr "ì´ì „ì— ì—´ì—ˆë˜ ì”¬ìœ¼ë¡œ 가기." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "ë¬¸ìž ë³µì‚¬" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "ë‹¤ìŒ íƒ" @@ -2617,7 +2662,7 @@ msgid "" msgstr "" "ì´ ì˜µì…˜ì´ í™œì„±í™” ë˜ì–´ ìžˆì„ ê²½ìš°, 내보내기나 ë°°í¬ëŠ” ìµœì†Œí•œì˜ ì‹¤í–‰ 파ì¼ì„ ìƒì„±" "합니다.\n" -"íŒŒì¼ ì‹œìŠ¤í…œì€ ë„¤íŠ¸ì›Œí¬ë¥¼ 통해서 ì—디터 ìƒì˜ 프로ì 트가 ì œê³µí•©ë‹ˆë‹¤.\n" +"íŒŒì¼ ì‹œìŠ¤í…œì€ ë„¤íŠ¸ì›Œí¬ë¥¼ 통해서 편집기 ìƒì˜ 프로ì 트가 ì œê³µí•©ë‹ˆë‹¤.\n" "안드로ì´ë“œì˜ 경우, USB ì¼€ì´ë¸”ì„ ì‚¬ìš©í•˜ì—¬ ë°°í¬í• 경우 ë” ë¹ ë¥¸ í¼í¬ë¨¼ìŠ¤ë¥¼ ì œê³µ" "합니다. ì´ ì˜µì…˜ì€ í° ì„¤ì¹˜ ìš©ëŸ‰ì„ ìš”êµ¬í•˜ëŠ” ê²Œìž„ì˜ í…ŒìŠ¤íŠ¸ë¥¼ ë¹ ë¥´ê²Œ í• ìˆ˜ 있습니" "다." @@ -2657,7 +2702,7 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" -"ì´ ì˜µì…˜ì´ í™œì„±í™” ë˜ì–´ ìžˆì„ ê²½ìš°, ì—디터 ìƒì˜ ì”¬ì˜ ë³€ê²½ì‚¬í•ì´ ì‹¤í–‰ ì¤‘ì¸ ê²Œìž„" +"ì´ ì˜µì…˜ì´ í™œì„±í™” ë˜ì–´ ìžˆì„ ê²½ìš°, 편집기 ìƒì˜ ì”¬ì˜ ë³€ê²½ì‚¬í•ì´ ì‹¤í–‰ ì¤‘ì¸ ê²Œìž„" "ì— ë°˜ì˜ë©ë‹ˆë‹¤.\n" "ê¸°ê¸°ì— ì›ê²©ìœ¼ë¡œ 사용ë˜ëŠ” 경우, ë„¤íŠ¸ì›Œí¬ íŒŒì¼ ì‹œìŠ¤í…œê³¼ 함께하면 ë”ìš± 효과ì ìž…" "니다." @@ -2680,59 +2725,47 @@ msgstr "" #: editor/editor_node.cpp msgid "Editor" -msgstr "ì—디터" +msgstr "편집기" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "ì—디터 ì„¤ì •" +msgstr "편집기 ì„¤ì •" #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "ì—디터 ë ˆì´ì•„웃" +msgstr "편집기 ë ˆì´ì•„웃" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "씬 루트 만들기" +msgstr "스í¬ë¦°ìƒ· ì°ê¸°" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "ì—디터 ë°ì´í„°/ì„¤ì • í´ë” 열기" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "ë‹¤ìŒ ì—디터 열기" +msgstr "스í¬ë¦°ìƒ·ì´ Editor Data/Settings í´ë”ì— ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "ì „ì²´ 화면 í† ê¸€" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "CanvasItem ë³´ì´ê¸° í† ê¸€" +msgstr "시스템 콘솔 í† ê¸€" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" -msgstr "ì—디터 ë°ì´í„°/ì„¤ì • í´ë” 열기" +msgstr "편집기 ë°ì´í„°/ì„¤ì • í´ë” 열기" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "ì—디터 ë°ì´í„° í´ë” 열기" +msgstr "편집기 ë°ì´í„° í´ë” 열기" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" -msgstr "ì—디터 ì„¤ì • í´ë” 열기" +msgstr "편집기 ì„¤ì • í´ë” 열기" #: editor/editor_node.cpp msgid "Manage Editor Features" -msgstr "ì—디터 기능 관리" +msgstr "편집기 기능 관리" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" @@ -2813,7 +2846,7 @@ msgstr "커스텀 씬 실행" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "비디오 드ë¼ì´ë²„를 ë³€ê²½í•˜ë ¤ë©´ ì—디터를 다시 시작해야 합니다." +msgstr "비디오 드ë¼ì´ë²„를 ë³€ê²½í•˜ë ¤ë©´ 편집기를 다시 시작해야 합니다." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -2822,22 +2855,19 @@ msgstr "ì €ìž¥ & 다시 시작" #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -msgstr "ì—디터 윈ë„ìš°ê°€ 다시 ê·¸ë ¤ì§ˆ 때 íšŒì „í•©ë‹ˆë‹¤." +msgstr "편집기 ì°½ì´ ë‹¤ì‹œ ê·¸ë ¤ì§ˆ 때 íšŒì „í•©ë‹ˆë‹¤." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "ì—°ì†ì " +msgstr "ì§€ì†ì ì—…ë°ì´íЏ" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "변경사í•ë§Œ ì—…ë°ì´íЏ" +msgstr "변경ë 때 ì—…ë°ì´íЏ" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "ì—…ë°ì´íЏ 스피너 비활성화" +msgstr "ì—…ë°ì´íЏ 스피너 숨기기" #: editor/editor_node.cpp msgid "FileSystem" @@ -2927,27 +2957,27 @@ msgstr "ì„ íƒ" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "2D ì—디터 열기" +msgstr "2D 편집기 열기" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "3D ì—디터 열기" +msgstr "3D 편집기 열기" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "스í¬ë¦½íЏ ì—디터 열기" +msgstr "스í¬ë¦½íЏ 편집기 열기" #: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "ì—ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬ 열기" +msgstr "ì• ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬ 열기" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "ë‹¤ìŒ ì—디터 열기" +msgstr "ë‹¤ìŒ íŽ¸ì§‘ê¸° 열기" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "ì´ì „ ì—디터 열기" +msgstr "ì´ì „ 편집기 열기" #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" @@ -3032,6 +3062,11 @@ msgid "Calls" msgstr "호출" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "테마 편집" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "사용" @@ -3053,7 +3088,7 @@ msgstr "ì§€ì •í•˜ê¸°..." #: editor/editor_properties.cpp msgid "Invalid RID" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ RID" +msgstr "올바르지 ì•Šì€ RID" #: editor/editor_properties.cpp msgid "" @@ -3120,7 +3155,7 @@ msgstr "%s로 변환" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Open Editor" -msgstr "ì—디터 열기" +msgstr "편집기 열기" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Selected node is not a Viewport!" @@ -3238,7 +3273,7 @@ msgstr "내보내기 템플릿 zip 파ì¼ì„ ì—´ 수 없습니다." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates: %s." -msgstr "템플릿 ì•ˆì— version.txtê°€ ìœ íš¨í•˜ì§€ ì•Šì€ í˜•ì‹ìž…니다: %s." +msgstr "템플릿 안 version.txtê°€ 올바르지 ì•Šì€ í˜•ì‹ìž…니다: %s." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." @@ -3435,11 +3470,11 @@ msgstr "ì´ë¦„ì´ ì œê³µë˜ì§€ 않았습니다." #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters." -msgstr "ì œê³µëœ ì´ë¦„ì— ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžê°€ 있습니다." +msgstr "ì œê³µëœ ì´ë¦„ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ë¬¸ìžê°€ 있습니다." #: editor/filesystem_dock.cpp msgid "Name contains invalid characters." -msgstr "ì´ë¦„ì— ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžê°€ 있습니다." +msgstr "ì´ë¦„ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ë¬¸ìžê°€ 있습니다." #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." @@ -3644,6 +3679,7 @@ msgid "Nodes not in Group" msgstr "ê·¸ë£¹ì— ìžˆì§€ ì•Šì€ ë…¸ë“œ" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "노드 í•„í„°" @@ -3731,7 +3767,7 @@ msgstr "ê°€ì ¸ì˜¤ê¸° 후 ì‹¤í–‰í• ìŠ¤í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다:" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" msgstr "" -"ê°€ì ¸ì˜¤ê¸° 후 ì‹¤í–‰í• ìŠ¤í¬ë¦½íŠ¸ê°€ ìœ íš¨í•˜ì§€ 않거나 ê¹¨ì ¸ 있습니다 (콘솔 확ì¸):" +"ê°€ì ¸ì˜¤ê¸° 후 ì‹¤í–‰í• ìŠ¤í¬ë¦½íŠ¸ê°€ 올바르지 않거나 ê¹¨ì ¸ 있습니다 (콘솔 확ì¸):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" @@ -3771,13 +3807,13 @@ msgstr "씬 ì €ìž¥, 다시 ê°€ì ¸ì˜¤ê¸° ë° ë‹¤ì‹œ 시작" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." -msgstr "ê°€ì ¸ì˜¨ 파ì¼ì˜ íƒ€ìž…ì„ ë³€ê²½í•˜ë ¤ë©´ ì—디터를 다시 시작해야 합니다." +msgstr "ê°€ì ¸ì˜¨ 파ì¼ì˜ íƒ€ìž…ì„ ë³€ê²½í•˜ë ¤ë©´ 편집기를 다시 시작해야 합니다." #: editor/import_dock.cpp msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." msgstr "" -"ê²½ê³ : ì´ ë¦¬ì†ŒìŠ¤ë¥¼ 사용하는 ì—ì…‹ì´ ì¡´ìž¬í•©ë‹ˆë‹¤, ì—ì…‹ì„ ë¶ˆëŸ¬ì˜¤ì§€ ëª»í• ìˆ˜ 있습니" +"ê²½ê³ : ì´ ë¦¬ì†ŒìŠ¤ë¥¼ 사용하는 ì• ì…‹ì´ ì¡´ìž¬í•©ë‹ˆë‹¤, ì• ì…‹ì„ ë¶ˆëŸ¬ì˜¤ì§€ ëª»í• ìˆ˜ 있습니" "다." #: editor/inspector_dock.cpp @@ -4107,7 +4143,7 @@ msgstr "노드 ì´ë™ë¨" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Unable to connect, port may be in use or connection may be invalid." -msgstr "ì—°ê²°í• ìˆ˜ 없습니다, í¬íŠ¸ê°€ 사용 중ì´ê±°ë‚˜ ìœ íš¨í•˜ì§€ 않는 연결입니다." +msgstr "ì—°ê²°í• ìˆ˜ 없습니다, í¬íŠ¸ê°€ 사용 중ì´ê±°ë‚˜ 올바르지 않는 연결입니다." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -4148,7 +4184,7 @@ msgstr "ì„¤ì •í•œ ì• ë‹ˆë©”ì´ì…˜ í”Œë ˆì´ì–´ê°€ 없습니다, 트랙 ì´ë¦„ì„ #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Player path set is invalid, so unable to retrieve track names." msgstr "" -"ìœ íš¨í•˜ì§€ 않는 í”Œë ˆì´ì–´ 경로 ì„¤ì •ìž…ë‹ˆë‹¤, 트랙 ì´ë¦„ì„ ê²€ìƒ‰í• ìˆ˜ 없습니다." +"올바르지 않는 í”Œë ˆì´ì–´ 경로 ì„¤ì •ìž…ë‹ˆë‹¤, 트랙 ì´ë¦„ì„ ê²€ìƒ‰í• ìˆ˜ 없습니다." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -4156,7 +4192,7 @@ msgid "" "Animation player has no valid root node path, so unable to retrieve track " "names." msgstr "" -"ì• ë‹ˆë©”ì´ì…˜ í”Œë ˆì´ì–´ê°€ ìœ íš¨í•œ 루트 노드 경로를 ê°€ì§€ê³ ìžˆì§€ 않습니다, 트랙 ì´ë¦„" +"ì• ë‹ˆë©”ì´ì…˜ í”Œë ˆì´ì–´ê°€ 올바른 루트 노드 경로를 ê°€ì§€ê³ ìžˆì§€ 않습니다, 트랙 ì´ë¦„" "ì„ ê²€ìƒ‰í• ìˆ˜ 없습니다." #: editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -4205,7 +4241,7 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ ì‚ì œ" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Invalid animation name!" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„!" +msgstr "올바르지 ì•Šì€ ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation name already exists!" @@ -4559,11 +4595,11 @@ msgstr "ìž…ë ¥ ì‚ì œ" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Animation tree is valid." -msgstr "ì• ë‹ˆë©”ì´ì…˜ 트리가 ìœ íš¨í•©ë‹ˆë‹¤." +msgstr "ì• ë‹ˆë©”ì´ì…˜ 트리가 올바릅니다." #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Animation tree is invalid." -msgstr "ì• ë‹ˆë©”ì´ì…˜ 트리가 ìœ íš¨í•˜ì§€ 않습니다." +msgstr "ì• ë‹ˆë©”ì´ì…˜ 트리가 올바르지 않습니다." #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Animation Node" @@ -4663,7 +4699,7 @@ msgstr "sha256 해시 í™•ì¸ ì‹¤íŒ¨" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" -msgstr "ì—ì…‹ 다운로드 오류:" +msgstr "ì• ì…‹ 다운로드 오류:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Downloading (%s / %s)..." @@ -4686,6 +4722,10 @@ msgid "Idle" msgstr "대기" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "설치하기..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "다시 시ë„" @@ -4695,7 +4735,7 @@ msgstr "다운로드 오류" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" -msgstr "ì´ ì—ì…‹ì˜ ë‹¤ìš´ë¡œë“œê°€ ì´ë¯¸ 진행중입니다!" +msgstr "ì´ ì• ì…‹ì˜ ë‹¤ìš´ë¡œë“œê°€ ì´ë¯¸ 진행중입니다!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "First" @@ -4714,7 +4754,6 @@ msgid "Last" msgstr "ë으로" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "모ë‘" @@ -4728,8 +4767,8 @@ msgid "Sort:" msgstr "ì •ë ¬:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "뒤집기" +msgid "Reverse sorting." +msgstr "ì—순 ì •ë ¬." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4754,7 +4793,7 @@ msgstr "테스팅" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" -msgstr "ì—ì…‹ ZIP 파ì¼" +msgstr "ì• ì…‹ ZIP 파ì¼" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -4808,32 +4847,32 @@ msgid "Rotation Step:" msgstr "íšŒì „ 스í…:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "세로 ê°€ì´ë“œ ì´ë™" +msgid "Move Vertical Guide" +msgstr "ìˆ˜ì§ ê°€ì´ë“œ ì´ë™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "새로운 세로 ê°€ì´ë“œ 만들기" +msgid "Create Vertical Guide" +msgstr "ìˆ˜ì§ ê°€ì´ë“œ 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "세로 ê°€ì´ë“œ ì‚ì œ" +msgid "Remove Vertical Guide" +msgstr "ìˆ˜ì§ ê°€ì´ë“œ ì‚ì œ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "가로 ê°€ì´ë“œ ì´ë™" +msgid "Move Horizontal Guide" +msgstr "ìˆ˜í‰ ê°€ì´ë“œ ì´ë™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "새로운 가로 ê°€ì´ë“œ 만들기" +msgid "Create Horizontal Guide" +msgstr "ìˆ˜í‰ ê°€ì´ë“œ 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "가로 ê°€ì´ë“œ ì‚ì œ" +msgid "Remove Horizontal Guide" +msgstr "ìˆ˜í‰ ê°€ì´ë“œ ì‚ì œ" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "새 가로 세로 ê°€ì´ë“œ 만들기" +msgid "Create Horizontal and Vertical Guides" +msgstr "ìˆ˜í‰ ë° ìˆ˜ì§ ê°€ì´ë“œ 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -5255,9 +5294,8 @@ msgstr "ì—미션 ë§ˆìŠ¤í¬ ë¶ˆëŸ¬ì˜¤ê¸°" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "지금 재시작" +msgstr "다시 시작" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5386,7 +5424,7 @@ msgstr "í•목" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item List Editor" -msgstr "í•목 ëª©ë¡ ì—디터" +msgstr "í•목 ëª©ë¡ íŽ¸ì§‘ê¸°" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" @@ -5532,15 +5570,15 @@ msgstr "소스 메시가 ì§€ì •ë˜ì§€ 않았습니다 (ê·¸ë¦¬ê³ MultiMeshì— ë© #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." -msgstr "소스 메시가 ìœ íš¨í•˜ì§€ 않습니다 (ìœ íš¨í•˜ì§€ ì•Šì€ ê²½ë¡œ)." +msgstr "소스 메시가 올바르지 않습니다 (올바르지 ì•Šì€ ê²½ë¡œ)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (not a MeshInstance)." -msgstr "소스 메시가 ìœ íš¨í•˜ì§€ 않습니다 (MeshInstanceê°€ 아닙니다)." +msgstr "소스 메시가 올바르지 않습니다 (MeshInstanceê°€ 아닙니다)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (contains no Mesh resource)." -msgstr "소스 메시가 ìœ íš¨í•˜ì§€ 않습니다 (메시 리소스가 없습니다)." +msgstr "소스 메시가 올바르지 않습니다 (Mesh 리소스가 없습니다)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No surface source specified." @@ -5548,15 +5586,15 @@ msgstr "서피스 소스가 ì§€ì •ë˜ì§€ 않았습니다." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (invalid path)." -msgstr "서피스 소스가 ìœ íš¨í•˜ì§€ 않습니다 (ìœ íš¨í•˜ì§€ ì•Šì€ ê²½ë¡œ)." +msgstr "서피스 소스가 올바르지 않습니다 (올바르지 ì•Šì€ ê²½ë¡œ)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no geometry)." -msgstr "서피스 소스가 ìœ íš¨í•˜ì§€ 않습니다 (지오메트리 ì—†ìŒ)." +msgstr "서피스 소스가 올바르지 않습니다 (지오메트리 ì—†ìŒ)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no faces)." -msgstr "서피스 소스가 ìœ íš¨í•˜ì§€ 않습니다 (페ì´ìФ ì—†ìŒ)." +msgstr "서피스 소스가 올바르지 않습니다 (페ì´ìФ ì—†ìŒ)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Parent has no solid faces to populate." @@ -5880,7 +5918,7 @@ msgstr "ë‚´ë¶€ ê¼ì§“ì ì‚ì œ" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Invalid Polygon (need 3 different vertices)" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í´ë¦¬ê³¤ (3ê°œì˜ ë‹¤ë¥¸ ê¼ì§“ì ì´ í•„ìš”í•¨)" +msgstr "올바르지 ì•Šì€ í´ë¦¬ê³¤ (3ê°œì˜ ë‹¤ë¥¸ ê¼ì§“ì ì´ í•„ìš”í•¨)" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Add Custom Polygon" @@ -5904,11 +5942,11 @@ msgstr "본 무게 페ì¸íЏ" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Open Polygon 2D UV editor." -msgstr "í´ë¦¬ê³¤ 2D UV ì—디터 열기." +msgstr "í´ë¦¬ê³¤ 2D UV 편집기 열기." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon 2D UV Editor" -msgstr "í´ë¦¬ê³¤ 2D UV ì—디터" +msgstr "í´ë¦¬ê³¤ 2D UV 편집기" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV" @@ -6070,7 +6108,7 @@ msgstr "타입:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Open in Editor" -msgstr "ì—디터ì—서 열기" +msgstr "편집기ì—서 열기" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Load Resource" @@ -6086,7 +6124,7 @@ msgstr "AnimationTreeê°€ AnimationPlayer로 향하는 경로를 ê°€ì§€ê³ ìžˆì§€ #: editor/plugins/root_motion_editor_plugin.cpp msgid "Path to AnimationPlayer is invalid" -msgstr "AnimationPlayer로 향하는 경로가 ìœ íš¨í•˜ì§€ 않습니다" +msgstr "AnimationPlayer로 향하는 경로가 올바르지 않습니다" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Files" @@ -6166,18 +6204,16 @@ msgid "Find Next" msgstr "ë‹¤ìŒ ì°¾ê¸°" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "í•„í„° ì†ì„±" +msgstr "í•„í„° 스í¬ë¦½íЏ" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "메서드 목ë¡ì˜ ì‚¬ì „ ì‹ ì •ë ¬ì„ í‚¤ê±°ë‚˜ ë•니다." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "í•„í„° 모드:" +msgstr "í•„í„° 메서드" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6287,7 +6323,7 @@ msgstr "디버거 í•ìƒ ì—´ì–´ë†“ê¸°" #: editor/plugins/script_editor_plugin.cpp msgid "Debug with External Editor" -msgstr "외부 ì—디터로 디버깅" +msgstr "외부 편집기로 디버깅" #: editor/plugins/script_editor_plugin.cpp msgid "Open Godot online documentation." @@ -6411,10 +6447,18 @@ msgid "Syntax Highlighter" msgstr "구문 ê°•ì¡°" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "ì´ë™" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "ë¶ë§ˆí¬" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "중단ì " + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6703,9 +6747,15 @@ msgid "Rear" msgstr "ë’·ë©´" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "뷰와 ì •ë ¬" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "ì„ íƒ í•ëª©ì„ ë·°ì— ì •ë ¬" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "ì„ íƒëœ 부모 노드가 없어서 ìžì‹ë…¸ë“œë¥¼ ì¸ìŠ¤í„´ìŠ¤í• ìˆ˜ 없습니다." @@ -6799,7 +6849,7 @@ msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" -"ì°¸ê³ : FPS ê°’ì€ ì—ë””í„°ì˜ í”„ë ˆìž„ ì†ë„입니다.\n" +"ì°¸ê³ : FPS ê°’ì€ íŽ¸ì§‘ê¸°ì˜ í”„ë ˆìž„ ì†ë„입니다.\n" "게임 ë‚´ ì„±ëŠ¥ì„ ë³´ì¦í•˜ëŠ” 표시로 ë³¼ 수 없습니다." #: editor/plugins/spatial_editor_plugin.cpp @@ -6893,10 +6943,6 @@ msgid "Focus Selection" msgstr "ì„ íƒ í¬ì»¤ìФ" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "ì„ íƒ í•ëª©ì„ ë·°ì— ì •ë ¬" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "ì„ íƒ íˆ´" @@ -7301,11 +7347,11 @@ msgstr "빈 템플릿 만들기" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "빈 ì—디터 템플릿 만들기" +msgstr "빈 편집기 템플릿 만들기" #: editor/plugins/theme_editor_plugin.cpp msgid "Create From Current Editor Theme" -msgstr "현재 ì—디터 테마로부터 만들기" +msgstr "현재 편집기 테마로부터 만들기" #: editor/plugins/theme_editor_plugin.cpp msgid "Toggle Button" @@ -7457,14 +7503,6 @@ msgid "Transpose" msgstr "바꾸기" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Xì¶• 뒤집기" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Yì¶• 뒤집기" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "ì˜¤í† íƒ€ì¼ ë¹„í™œì„±í™”" @@ -7672,9 +7710,9 @@ msgid "" "bindings.\n" "Click on another Tile to edit it." msgstr "" -"ì‚¬ìš©í• ì„œë¸Œ 타ì¼ì„ ì•„ì´ì½˜ìœ¼ë¡œ ì„¤ì •í•˜ì„¸ìš”, ìœ íš¨í•˜ì§€ ì•Šì€ ìžë™ íƒ€ì¼ ë°”ì¸ë”©ì—ë„ " +"ì•„ì´ì½˜ìœ¼ë¡œ ì‚¬ìš©í• ì„œë¸Œ 타ì¼ì„ ì„¤ì •í•˜ì„¸ìš”, 올바르지 ì•Šì€ ìžë™ íƒ€ì¼ ë°”ì¸ë”©ì—ë„ " "사용ë©ë‹ˆë‹¤.\n" -"다른 타ì¼ì„ íŽ¸ì§‘í•˜ë ¤ë©´ í´ë¦." +"다른 타ì¼ì„ íŽ¸ì§‘í•˜ë ¤ë©´ í´ë¦í•˜ì„¸ìš”." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -7861,6 +7899,10 @@ msgid "Visual Shader Input Type Changed" msgstr "비주얼 ì…°ì´ë” ìž…ë ¥ 타입 변경ë¨" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(GLES3ë§Œ 가능)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "버í…스" @@ -7945,6 +7987,22 @@ msgid "Color uniform." msgstr "ìƒ‰ìƒ ìœ ë‹ˆí¼." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "ë‘ ë§¤ê°œë³€ìˆ˜ ì‚¬ì´ %s 비êµì˜ 불리언 ê²°ê³¼ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "같다 (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "보다 ë” í¬ë‹¤ (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "보다 í¬ê±°ë‚˜ 같다 (>=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7952,10 +8010,47 @@ msgstr "ì œê³µëœ ìŠ¤ì¹¼ë¼ê°€ 같거나, ë” í¬ê±°ë‚˜, ë” ìž‘ìœ¼ë©´ ê´€ë ¨ ë² #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "무한(INF)ê³¼ ìŠ¤ì¹¼ë¼ ë§¤ê°œë³€ìˆ˜ ì‚¬ì´ ë¹„êµì˜ 불리언 ê²°ê³¼ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" +"ìˆ«ìž ì•„ë‹˜(NaN)ê³¼ ìŠ¤ì¹¼ë¼ ë§¤ê°œë³€ìˆ˜ ì‚¬ì´ ë¹„êµì˜ 불리언 ê²°ê³¼ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "보다 ë” ìž‘ë‹¤ (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "보다 작거나 같다 (<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "같지 않다 (!=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "불리언 ê°’ì´ ì°¸ì´ê±°ë‚˜ ê±°ì§“ì´ë©´ ê´€ë ¨ 벡터를 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "ë‘ ë§¤ê°œë³€ìˆ˜ ì‚¬ì´ ë¹„êµì˜ 불리언 ê²°ê³¼ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"무한(INF) (ë˜ëŠ” ìˆ«ìž ì•„ë‹˜(NaN))ê³¼ ìŠ¤ì¹¼ë¼ ë§¤ê°œë³€ìˆ˜ ì‚¬ì´ ë¹„êµì˜ 불리언 ê²°ê³¼ ê°’" +"ì„ ë°˜í™˜í•©ë‹ˆë‹¤." + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "불리언 ìƒìˆ˜." @@ -7964,43 +8059,36 @@ msgid "Boolean uniform." msgstr "불리언 ìœ ë‹ˆí¼." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for all shader modes." -msgstr "ëª¨ë“ ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ 'uv' ìž…ë ¥ 매개변수." +msgstr "ëª¨ë“ ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." msgstr "ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "ê¼ì§“ì ê³¼ 프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ 'uv' ìž…ë ¥ 매개변수." +msgstr "ê¼ì§“ì ê³¼ 프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." -msgstr "ê¼ì§“ì ê³¼ 프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ 'view' ìž…ë ¥ 매개변수." +msgstr "ê¼ì§“ì ê³¼ 프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ 'side' ìž…ë ¥ 매개변수." +msgstr "프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "조명 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ 'diffuse' ìž…ë ¥ 매개변수." +msgstr "조명 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "ê¼ì§“ì ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ 'custom' ìž…ë ¥ 매개변수." +msgstr "ê¼ì§“ì ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "ê¼ì§“ì ê³¼ 프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ 'uv' ìž…ë ¥ 매개변수." +msgstr "ê¼ì§“ì ê³¼ 프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -8051,16 +8139,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì•„í¬ì½”ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "(GLES3ë§Œ 가능) ë§¤ê°œë³€ìˆ˜ì˜ ì—ìŒê³¡ì½”ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì—ìŒê³¡ì½”ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì•„í¬ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "(GLES3ë§Œ 가능) ë§¤ê°œë³€ìˆ˜ì˜ ì—ìŒê³¡ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì—ìŒê³¡ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8071,8 +8159,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "ë§¤ê°œë³€ìˆ˜ë“¤ì˜ ì•„í¬íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "(GLES3ë§Œ 가능) ë§¤ê°œë³€ìˆ˜ì˜ ì—ìŒê³¡íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì—ìŒê³¡íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8088,8 +8176,8 @@ msgid "Returns the cosine of the parameter." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì½”ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "(GLES3ë§Œ 가능) ë§¤ê°œë³€ìˆ˜ì˜ ìŒê³¡ì½”ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ìŒê³¡ì½”ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8157,12 +8245,12 @@ msgid "1.0 / scalar" msgstr "1.0 / 스칼ë¼" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "(GLES3ë§Œ 가능) 매개변수ì—서 가장 가까운 ì •ìˆ˜ë¥¼ 찾습니다." +msgid "Finds the nearest integer to the parameter." +msgstr "매개변수ì—서 가장 가까운 ì •ìˆ˜ë¥¼ 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "(GLES3ë§Œ 가능) 매개변수ì—서 가장 가까운 ì§ìˆ˜ ì •ìˆ˜ë¥¼ 찾습니다." +msgid "Finds the nearest even integer to the parameter." +msgstr "매개변수ì—서 가장 가까운 ì§ìˆ˜ ì •ìˆ˜ë¥¼ 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8177,8 +8265,8 @@ msgid "Returns the sine of the parameter." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "(GLES3ë§Œ 가능) ë§¤ê°œë³€ìˆ˜ì˜ ìŒê³¡ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." +msgid "Returns the hyperbolic sine of the parameter." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ìŒê³¡ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8212,12 +8300,12 @@ msgid "Returns the tangent of the parameter." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "(GLES3ë§Œ 가능) ë§¤ê°œë³€ìˆ˜ì˜ ìŒê³¡íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ìŒê³¡íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "(GLES3ë§Œ 가능) ë§¤ê°œë³€ìˆ˜ì˜ ì ˆì‚¬ ê°’ì„ ì°¾ìŠµë‹ˆë‹¤." +msgid "Finds the truncated value of the parameter." +msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì ˆì‚¬ëœ ê°’ì„ ì°¾ìŠµë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8256,12 +8344,16 @@ msgid "Perform the texture lookup." msgstr "í…ìŠ¤ì³ ë£©ì—…ì„ ìˆ˜í–‰í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." -msgstr "ì„¸ì œê³± í…ìŠ¤ì³ ìœ ë‹ˆí¼." +msgid "Cubic texture uniform lookup." +msgstr "ì„¸ì œê³± í…ìŠ¤ì³ ìœ ë‹ˆí¼ ë£©ì—…." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." +msgstr "2D í…ìŠ¤ì³ ìœ ë‹ˆí¼ ë£©ì—…." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." -msgstr "2D í…ìŠ¤ì³ ìœ ë‹ˆí¼." +msgid "2D texture uniform lookup with triplanar." +msgstr "Triplanarê°€ ì ìš©ëœ 2D í…ìŠ¤ì³ ìœ ë‹ˆí¼ ë£©ì—… ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." @@ -8269,7 +8361,7 @@ msgstr "변형 함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8277,7 +8369,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(GLES3ë§Œ 가능) 한 ìŒì˜ ë²¡í„°ì˜ ì™¸ì ì„ ê³„ì‚°í•©ë‹ˆë‹¤.\n" +"벡터 한 ìŒì˜ 외ì ì„ ê³„ì‚°í•©ë‹ˆë‹¤.\n" "\n" "OuterProduct는 첫 매개변수 'c'를 ì—´ 벡터로 취급합니다 (1열로 ì´ë£¨ì–´ì§„ í–‰ë ¬) " "ê·¸ë¦¬ê³ ë‘ ë²ˆì§¸ 매개변수 'r'ì„ í–‰ 벡터로 취급합니다 (1행으로 ì´ë£¨ì–´ì§„ í–‰ë ¬) ê·¸" @@ -8293,16 +8385,16 @@ msgid "Decomposes transform to four vectors." msgstr "ë³€í˜•ì„ 4ê°œì˜ ë²¡í„°ë¡œ 분해합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "(GLES3ë§Œ 가능) ë³€í˜•ì˜ í–‰ë ¬ì‹ì„ 계산합니다." +msgid "Calculates the determinant of a transform." +msgstr "ë³€í˜•ì˜ í–‰ë ¬ì‹ì„ 계산합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "(GLES3ë§Œ 가능) ë³€í˜•ì˜ ì—함수를 계산합니다." +msgid "Calculates the inverse of a transform." +msgstr "ë³€í˜•ì˜ ì—함수를 계산합니다." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "(GLES3ë§Œ 가능) ë³€í˜•ì˜ ì „ì¹˜ë¥¼ 계산합니다." +msgid "Calculates the transpose of a transform." +msgstr "ë³€í˜•ì˜ ì „ì¹˜ë¥¼ 계산합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8350,15 +8442,15 @@ msgstr "ë‘ ë²¡í„°ì˜ ìŠ¤ì¹¼ë¼ê³± ê°’ì„ ê³„ì‚°í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" -"참조 벡터와 ê°™ì€ ë°©í–¥ì„ ê°€ë¦¬í‚¤ëŠ” 벡터를 반환합니다. 함수ì—는 세 ê°œì˜ ë²¡í„° 매" +"ê°™ì€ ë°©í–¥ì„ ê°€ë¦¬í‚¤ëŠ” 벡터를 참조 벡터로 반환합니다. 함수ì—는 세 ê°œì˜ ë²¡í„° 매" "개변수가 있습니다 : ë°©í–¥ì„ ì§€ì •í•˜ëŠ” 벡터 N, ì¸ì‹œë˜íЏ 벡터 I, ê·¸ë¦¬ê³ ì°¸ì¡° 벡" -"í„° Nref. I와 Nrefì˜ ìŠ¤ì¹¼ë¼ê³± ê°’ì´ 0보다 작으면 ë°˜í™˜ê°’ì€ Nì´ ë©ë‹ˆë‹¤. ê·¸ë ‡ì§€ 않" -"으면 -Nì´ ë°˜í™˜ë©ë‹ˆë‹¤." +"í„° Nref. I와 Nrefì˜ ë‚´ì ê°’ì´ 0보다 작으면 ë°˜í™˜ê°’ì€ Nì´ ë©ë‹ˆë‹¤. ê·¸ë ‡ì§€ 않으" +"ë©´ -Nì´ ë°˜í™˜ë©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." @@ -8382,13 +8474,13 @@ msgstr "1.0 / 벡터" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" "반사 ë°©í–¥ì„ ê°€ë¦¬í‚¤ëŠ” 벡터를 반환합니다 (a : ì¸ì‹œë˜íЏ 벡터, b : 노멀 벡터)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "반사 ë°©í–¥ì„ ê°€ë¦¬í‚¤ëŠ” 벡터를 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8486,60 +8578,50 @@ msgstr "" "다 (í´ì˜¤í”„와 ê´€ë ¨ëœ ìž…ë ¥ì„ ì „ë‹¬í•¨)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "(GLES3ë§Œ 가능) (프래그먼트/조명 모드만 가능) ìŠ¤ì¹¼ë¼ ë¯¸ë¶„ 함수." +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(프래그먼트/조명 모드만 가능) ìŠ¤ì¹¼ë¼ ë¯¸ë¶„ 함수." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "(GLES3ë§Œ 가능) (프래그먼트/조명 모드만 가능) 벡터 미분 함수." +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(프래그먼트/조명 모드만 가능) 벡터 미분 함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." -msgstr "" -"(GLES3ë§Œ 가능) (프래그먼트/조명 모드만 가능) ì§€ì— ì°¨ë¶„ì„ ì´ìš©í•œ 'x'ì˜ (벡터) " -"ë„함수." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." +msgstr "(프래그먼트/조명 모드만 가능) ì§€ì— ì°¨ë¶„ì„ ì´ìš©í•œ 'x'ì˜ (벡터) ë„함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" -"(GLES3ë§Œ 가능) (프래그먼트/조명 모드만 가능) ì§€ì— ì°¨ë¶„ì„ ì´ìš©í•œ 'x'ì˜ (스칼" -"ë¼) ë„함수." +"(프래그먼트/조명 모드만 가능) ì§€ì— ì°¨ë¶„ì„ ì´ìš©í•œ 'x'ì˜ (스칼ë¼) ë„함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." -msgstr "" -"(GLES3ë§Œ 가능) (프래그먼트/조명 모드만 가능) ì§€ì— ì°¨ë¶„ì„ ì´ìš©í•œ 'y'ì˜ (벡터) " -"ë„함수." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." +msgstr "(프래그먼트/조명 모드만 가능) ì§€ì— ì°¨ë¶„ì„ ì´ìš©í•œ 'y'ì˜ (벡터) ë„함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" -"(GLES3ë§Œ 가능) (프래그먼트/조명 모드만 가능) ì§€ì— ì°¨ë¶„ì„ ì´ìš©í•œ 'y'ì˜ (스칼" -"ë¼) ë„함수." +"(프래그먼트/조명 모드만 가능) ì§€ì— ì°¨ë¶„ì„ ì´ìš©í•œ 'y'ì˜ (스칼ë¼) ë„함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." -msgstr "" -"(GLES3ë§Œ 가능) (프래그먼트/조명 모드만 가능) (벡터) 'x'와 'y'ì˜ ì ˆëŒ€ 미분 ê°’" -"ì˜ í•©." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "(프래그먼트/조명 모드만 가능) (벡터) 'x'와 'y'ì˜ ì ˆëŒ€ 미분 ê°’ì˜ í•©." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." -msgstr "" -"(GLES3ë§Œ 가능) (프래그먼트/조명 모드만 가능) (스칼ë¼) 'x'와 'y'ì˜ ì ˆëŒ€ 미분 " -"ê°’ì˜ í•©." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "(프래그먼트/조명 모드만 가능) (스칼ë¼) 'x'와 'y'ì˜ ì ˆëŒ€ 미분 ê°’ì˜ í•©." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -8719,7 +8801,8 @@ msgstr "경로가 존재하지 않습니다." #: editor/project_manager.cpp msgid "Invalid '.zip' project file, does not contain a 'project.godot' file." msgstr "" -"ìœ íš¨í•˜ì§€ ì•Šì€ '.zip' 프로ì 트 파ì¼, 'project.godot' 파ì¼ì„ í¬í•¨í•˜ì§€ 않ìŒ." +"올바르지 ì•Šì€ '.zip' 프로ì 트 파ì¼, 'project.godot' 파ì¼ì„ í¬í•¨í•˜ì§€ ì•Šê³ ìžˆìŠµ" +"니다." #: editor/project_manager.cpp msgid "Please choose an empty folder." @@ -8759,7 +8842,7 @@ msgstr "프로ì 트 ì´ë¦„ì„ ì •í•˜ëŠ” ê²ƒì„ ê¶Œí•©ë‹ˆë‹¤." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í”„ë¡œì 트 경로 (ë”ê°€ ë³€ê²½í•˜ì‹ ê±°ë¼ë„?)." +msgstr "올바르지 ì•Šì€ í”„ë¡œì 트 경로 (ë”ê°€ ë³€ê²½í•˜ì‹ ê±°ë¼ë„?)." #: editor/project_manager.cpp msgid "" @@ -8934,7 +9017,7 @@ msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" -"프로ì 트 실행 불가: ì—ì…‹ë“¤ì„ ê°€ì ¸ì™€ì•¼ 합니다.\n" +"프로ì 트 실행 불가: ì• ì…‹ë“¤ì„ ê°€ì ¸ì™€ì•¼ 합니다.\n" "프로ì 트를 편집하여 최초 ê°€ì ¸ì˜¤ê¸°ê°€ 실행ë˜ë„ë¡ í•˜ì„¸ìš”." #: editor/project_manager.cpp @@ -8971,7 +9054,7 @@ msgid "" "The interface will update after restarting the editor or project manager." msgstr "" "언어가 변경ë˜ì—ˆìŠµë‹ˆë‹¤.\n" -"ì¸í„°íŽ˜ì´ìŠ¤ëŠ” ì—디터나 프로ì 트 ë§¤ë‹ˆì €ë¥¼ ìž¬ì‹œìž‘í• ë•Œ ì—…ë°ì´íЏë©ë‹ˆë‹¤." +"ì¸í„°íŽ˜ì´ìŠ¤ëŠ” 편집기나 프로ì 트 ë§¤ë‹ˆì €ë¥¼ ìž¬ì‹œìž‘í• ë•Œ ì—…ë°ì´íЏë©ë‹ˆë‹¤." #: editor/project_manager.cpp msgid "" @@ -9027,7 +9110,7 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" "현재 프로ì 트가 í•˜ë‚˜ë„ ì—†ìŠµë‹ˆë‹¤.\n" -"ì—ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬ì—서 ê³µì‹ ì˜ˆì œ 프로ì 트를 ì°¾ì•„ë³´ì‹œê² ìŠµë‹ˆê¹Œ?" +"ì• ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬ì—서 ê³µì‹ ì˜ˆì œ 프로ì 트를 ì°¾ì•„ë³´ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/project_settings_editor.cpp msgid "Key " @@ -9050,7 +9133,7 @@ msgid "" "Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" msgstr "" -"ìœ íš¨í•˜ì§€ ì•Šì€ ì•¡ì…˜ ì´ë¦„. 공백ì´ê±°ë‚˜, '/' , ':', '=', '\\', '\"' 를 í¬í•¨í•˜ë©´ " +"올바르지 ì•Šì€ ì•¡ì…˜ ì´ë¦„. 공백ì´ê±°ë‚˜, '/' , ':', '=', '\\', '\"' 를 í¬í•¨í•˜ë©´ " "안 ë©ë‹ˆë‹¤" #: editor/project_settings_editor.cpp @@ -9275,7 +9358,7 @@ msgstr "ìž¬ì •ì˜..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "The editor must be restarted for changes to take effect." -msgstr "변경 사í•ì„ ì ìš©í•˜ë ¤ë©´ ì—디터를 다시 실행해야 합니다." +msgstr "변경 사í•ì„ ì ìš©í•˜ë ¤ë©´ 편집기를 다시 실행해야 합니다." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -9738,9 +9821,8 @@ msgid "Add Child Node" msgstr "ìžì‹ 노드 추가" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "ëª¨ë‘ ì ‘ê¸°" +msgstr "ëª¨ë‘ íŽ¼ì¹˜ê¸°/ì ‘ê¸°" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9748,7 +9830,12 @@ msgstr "타입 변경" #: editor/scene_tree_dock.cpp msgid "Extend Script" -msgstr "스í¬ë¦½íЏ 확장" +msgstr "스í¬ë¦½íЏ 펼치기" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "부모 노드 ìž¬ì§€ì •" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" @@ -9771,9 +9858,8 @@ msgid "Delete (No Confirm)" msgstr "ì‚ì œ (í™•ì¸ ì—†ìŒ)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "새 노드 추가/만들기" +msgstr "새 노드 추가/만들기." #: editor/scene_tree_dock.cpp msgid "" @@ -9880,7 +9966,7 @@ msgstr "" #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë…¸ë“œ ì´ë¦„입니다. 다ìŒì˜ 문ìžëŠ” 허용ë˜ì§€ 않습니다:" +msgstr "올바르지 ì•Šì€ ë…¸ë“œ ì´ë¦„입니다. 다ìŒì˜ 문ìžëŠ” 허용ë˜ì§€ 않습니다:" #: editor/scene_tree_editor.cpp msgid "Rename Node" @@ -9964,11 +10050,11 @@ msgstr "올바르지 ì•Šì€ ìƒì†ëœ 부모 ì´ë¦„ ë˜ëŠ” 경로." #: editor/script_create_dialog.cpp msgid "Script is valid." -msgstr "스í¬ë¦½íŠ¸ê°€ ìœ íš¨í•©ë‹ˆë‹¤." +msgstr "스í¬ë¦½íŠ¸ê°€ 올바릅니다." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "허용ë¨: a-z, A-z, 0-9 ê·¸ë¦¬ê³ _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "허용ë¨: a-z, A-z, 0-9 ê·¸ë¦¬ê³ ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -10022,7 +10108,7 @@ msgstr "ìŠ¤íƒ ì¶”ì " msgid "Pick one or more items from the list to display the graph." msgstr "목ë¡ì—서 한 ê°œ í˜¹ì€ ì—¬ëŸ¬ ê°œì˜ í•ëª©ì„ ì§‘ì–´ 그래프로 ë³´ì—¬ì¤ë‹ˆë‹¤." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "오류" @@ -10284,21 +10370,21 @@ msgstr "리소스 파ì¼ì— 기반하지 않ìŒ" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (missing @path)" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@path ì—†ìŒ)" +msgstr "올바르지 ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@path ì—†ìŒ)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (can't load script at @path)" msgstr "" -"ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@path ì—서 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 ì—†ìŒ)" +"올바르지 ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@path ì—서 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 ì—†ìŒ)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (invalid script at @path)" msgstr "" -"ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@pathì˜ ìŠ¤í¬ë¦½íŠ¸ê°€ ìœ íš¨í•˜ì§€ 않ìŒ)" +"올바르지 ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@pathì˜ ìŠ¤í¬ë¦½íŠ¸ê°€ 올바르지 않ìŒ)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary (invalid subclasses)" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary (서브í´ëž˜ìŠ¤ê°€ ìœ íš¨í•˜ì§€ 않ìŒ)" +msgstr "올바르지 ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary (하위 í´ëž˜ìŠ¤ê°€ 올바르지 않ìŒ)" #: modules/gdscript/gdscript_functions.cpp msgid "Object can't provide a length." @@ -10424,54 +10510,6 @@ msgstr "거리 ì„ íƒ:" msgid "Class name can't be a reserved keyword" msgstr "í´ëž˜ìФ ì´ë¦„ì€ í‚¤ì›Œë“œê°€ ë 수 없습니다" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "솔루션 ìƒì„± 중..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "C# 프로ì 트 ìƒì„± 중..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "솔루션 ìƒì„± 실패." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "솔루션 ì €ìž¥ 실패." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "완료" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "C# 프로ì 트 ìƒì„± 실패." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "모노" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "C# ì§€ì›ì— 대하여" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "C# 솔루션 만들기" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "빌드" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "프로ì 트 빌드" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "로그 보기" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "ë‚´ë¶€ 예외 ìŠ¤íƒ ì¶”ì ì˜ ë" @@ -10562,7 +10600,7 @@ msgstr "" #: modules/visual_script/visual_script.cpp msgid "Node returned an invalid sequence output: " -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ì‹œí€€ìŠ¤ ì¶œë ¥ì„ ë°˜í™˜í•œ 노드: " +msgstr "올바르지 ì•Šì€ ì‹œí€€ìŠ¤ ì¶œë ¥ì„ ë°˜í™˜í•œ 노드: " #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" @@ -10599,7 +10637,7 @@ msgstr "변수:" #: modules/visual_script/visual_script_editor.cpp msgid "Name is not a valid identifier:" -msgstr "ìœ íš¨í•œ ì‹ë³„ìžê°€ 아닌 ì´ë¦„:" +msgstr "ì´ë¦„ì´ ì˜¬ë°”ë¥¸ ì‹ë³„ìžê°€ 아닙니다:" #: modules/visual_script/visual_script_editor.cpp msgid "Name already in use by another func/var/signal:" @@ -10807,7 +10845,7 @@ msgstr "반복ìžê°€ ìœ íš¨í•˜ì§€ 않게 ë¨: " #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ë±ìФ ì†ì„±ëª…." +msgstr "올바르지 ì•Šì€ ì¸ë±ìФ ì†ì„±ëª…." #: modules/visual_script/visual_script_func_nodes.cpp msgid "Base object is not a Node!" @@ -10819,15 +10857,15 @@ msgstr "노드를 ì§€ì¹í•˜ëŠ” 경로가 아닙니다!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." -msgstr "노드 %s ì•ˆì— ì¸ë±ìФ ì†ì„± ì´ë¦„ '%s'ì€(는) ìœ íš¨í•˜ì§€ 않습니다." +msgstr "노드 %s ì•ˆì— ì¸ë±ìФ ì†ì„± ì´ë¦„ '%s'ì€(는) 올바르지 않습니다." #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " -msgstr ": ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ìˆ˜ 타입: " +msgstr ": 올바르지 ì•Šì€ ì¸ìˆ˜ 타입: " #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid arguments: " -msgstr ": ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ìˆ˜: " +msgstr ": 올바르지 ì•Šì€ ì¸ìˆ˜: " #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " @@ -10847,7 +10885,7 @@ msgid "" "Invalid return value from _step(), must be integer (seq out), or string " "(error)." msgstr "" -"_step()ìœ¼ë¡œë¶€í„°ì˜ ìœ íš¨í•˜ì§€ ì•Šì€ ë°˜í™˜ 값으로, integer (seq out), í˜¹ì€ string " +"_step()ìœ¼ë¡œë¶€í„°ì˜ ì˜¬ë°”ë¥´ì§€ ì•Šì€ ë°˜í™˜ 값으로, integer (seq out), í˜¹ì€ string " "(error)ê°€ 아니면 안ë©ë‹ˆë‹¤." #: modules/visual_script/visual_script_property_selector.cpp @@ -10889,39 +10927,39 @@ msgstr "패키지는 ì ì–´ë„ í•˜ë‚˜ì˜ '.' 분리 기호를 ê°–ê³ ìžˆì–´ì•¼ í #: platform/android/export/export.cpp msgid "ADB executable not configured in the Editor Settings." -msgstr "ADB 실행 파ì¼ì´ ì—디터 ì„¤ì •ì—서 구성ë˜ì§€ 않았습니다." +msgstr "ADB 실행 파ì¼ì´ 편집기 ì„¤ì •ì—서 구성ë˜ì§€ 않았습니다." #: platform/android/export/export.cpp msgid "OpenJDK jarsigner not configured in the Editor Settings." -msgstr "OpenJDK jarsignerê°€ ì—디터 ì„¤ì •ì—서 구성ë˜ì§€ 않았습니다." +msgstr "OpenJDK jarsignerê°€ 편집기 ì„¤ì •ì—서 구성ë˜ì§€ 않았습니다." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." -msgstr "Debug keystoreì´ ì—디터 ì„¤ì • ë˜ëŠ” 프리셋ì—서 구성ë˜ì§€ 않았습니다." +msgstr "Debug keystoreì´ íŽ¸ì§‘ê¸° ì„¤ì • ë˜ëŠ” 프리셋ì—서 구성ë˜ì§€ 않았습니다." #: platform/android/export/export.cpp msgid "Custom build requires a valid Android SDK path in Editor Settings." msgstr "" -"커스텀 빌드ì—는 ì—디터 ì„¤ì •ì—서 ìœ íš¨í•œ 안드로ì´ë“œ SDK 경로가 필요합니다." +"커스텀 빌드ì—는 편집기 ì„¤ì •ì—서 올바른 안드로ì´ë“œ SDK 경로가 필요합니다." #: platform/android/export/export.cpp msgid "Invalid Android SDK path for custom build in Editor Settings." -msgstr "ì—디터 ì„¤ì •ì—서 커스텀 ë¹Œë“œì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ì•ˆë“œë¡œì´ë“œ SDK 경로입니다." +msgstr "편집기 ì„¤ì •ì—서 커스텀 ë¹Œë“œì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ì•ˆë“œë¡œì´ë“œ SDK 경로입니다." #: platform/android/export/export.cpp msgid "" "Android project is not installed for compiling. Install from Editor menu." msgstr "" -"컴파ì¼ì„ 하기 위한 안드로ì´ë“œ 프로ì 트가 설치ë˜ì§€ 않았습니다. ì—디터 메뉴ì—" +"컴파ì¼ì„ 하기 위한 안드로ì´ë“œ 프로ì 트가 설치ë˜ì§€ 않았습니다. 편집기 메뉴ì—" "서 설치하세요." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." -msgstr "APK í™•ìž¥ì— ìœ íš¨í•˜ì§€ ì•Šì€ ê³µìš© 키입니다." +msgstr "APK í™•ìž¥ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ê³µìš© 키입니다." #: platform/android/export/export.cpp msgid "Invalid package name:" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ íŒ¨í‚¤ì§€ ì´ë¦„:" +msgstr "올바르지 ì•Šì€ íŒ¨í‚¤ì§€ ì´ë¦„:" #: platform/android/export/export.cpp msgid "" @@ -10990,7 +11028,7 @@ msgstr "ì•±ìŠ¤í† ì–´ 팀 IDê°€ ì§€ì •ë˜ì§€ 않았습니다 - 프로ì 트를 êµ #: platform/iphone/export/export.cpp msgid "Invalid Identifier:" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ì‹ë³„ìž:" +msgstr "올바르지 ì•Šì€ ì‹ë³„ìž:" #: platform/iphone/export/export.cpp msgid "Required icon is not specified in the preset." @@ -11014,7 +11052,7 @@ msgstr "내보내기 í…œí”Œë¦¿ì„ ì—´ 수 없습니다:" #: platform/javascript/export/export.cpp msgid "Invalid export template:" -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë‚´ë³´ë‚´ê¸° 템플릿:" +msgstr "올바르지 ì•Šì€ ë‚´ë³´ë‚´ê¸° 템플릿:" #: platform/javascript/export/export.cpp msgid "Could not read custom HTML shell:" @@ -11030,7 +11068,7 @@ msgstr "기본 부트 스플래시 ì´ë¯¸ì§€ 사용." #: platform/uwp/export/export.cpp msgid "Invalid package unique name." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ íŒ¨í‚¤ì§€ ê³ ìœ ì´ë¦„." +msgstr "올바르지 ì•Šì€ íŒ¨í‚¤ì§€ ê³ ìœ ì´ë¦„." #: platform/uwp/export/export.cpp msgid "Invalid product GUID." @@ -11046,40 +11084,40 @@ msgstr "ìœ ìš”í•˜ì§€ ì•Šì€ ë°°ê²½ 색ìƒ." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (50x50 ì´ì–´ì•¼ 합니다)." +msgstr "올바르지 ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (50x50 ì´ì–´ì•¼ 합니다)." #: platform/uwp/export/export.cpp msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (44x44 ì´ì–´ì•¼ 합니다)." +msgstr "올바르지 ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (44x44 ì´ì–´ì•¼ 합니다)." #: platform/uwp/export/export.cpp msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (71x71 ì´ì–´ì•¼ 합니다)." +msgstr "올바르지 ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (71x71 ì´ì–´ì•¼ 합니다)." #: platform/uwp/export/export.cpp msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (150x150 ì´ì–´ì•¼ 합니다)." +msgstr "올바르지 ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (150x150 ì´ì–´ì•¼ 합니다)." #: platform/uwp/export/export.cpp msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (310x310 ì´ì–´ì•¼ 합니다)." +msgstr "올바르지 ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (310x310 ì´ì–´ì•¼ 합니다)." #: platform/uwp/export/export.cpp msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (310x150 ì´ì–´ì•¼ 합니다)." +msgstr "올바르지 ì•Šì€ ë¡œê³ ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (310x150 ì´ì–´ì•¼ 합니다)." #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" -"ìœ íš¨í•˜ì§€ ì•Šì€ ìŠ¤í”Œëž˜ì‰¬ 스í¬ë¦° ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (620x300 ì´ì–´ì•¼ 합니다)." +"올바르지 ì•Šì€ ìŠ¤í”Œëž˜ì‹œ 스í¬ë¦° ì´ë¯¸ì§€ í¬ê¸°ìž…니다 (620x300 ì´ì–´ì•¼ 합니다)." #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" -"AnimatedSpriteì´ í”„ë ˆìž„ì„ ë³´ì—¬ì£¼ê¸° 위해서는 'Frames' ì†ì„±ì— SpriteFrames 리소" -"스 만들거나 ì§€ì •í•´ì•¼ 합니다." +"AnimatedSpriteì´ í”„ë ˆìž„ì„ ë³´ì—¬ì£¼ê¸° 위해서는 \"Frames\" ì†ì„±ì— SpriteFrames 리" +"소스를 만들거나 ì§€ì •í•´ì•¼ 합니다." #: scene/2d/canvas_modulate.cpp msgid "" @@ -11142,9 +11180,9 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." -msgstr "ë¼ì´íŠ¸ì˜ ëª¨ì–‘ì„ ë‚˜íƒ€ë‚´ëŠ” í…스ì³ë¥¼ 'texture' ì†ì„±ì— ì§€ì •í•´ì•¼í•©ë‹ˆë‹¤." +msgstr "ì¡°ëª…ì˜ ëª¨ì–‘ì„ ë‚˜íƒ€ë‚¼ í…스ì³ë¥¼ \"Texture\" ì†ì„±ì— ì§€ì •í•´ì•¼ 합니다." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -11153,8 +11191,8 @@ msgstr "" "Occluderê°€ ë™ìž‘하기 위해서는 Occluder í´ë¦¬ê³¤ì„ ì§€ì •í•˜ê±°ë‚˜ ê·¸ë ¤ì•¼ 합니다." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" -msgstr "Occluder í´ë¦¬ê³¤ì´ 비어있습니다. í´ë¦¬ê³¤ì„ 그리세요!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "Occluder í´ë¦¬ê³¤ì´ 비어있습니다. í´ë¦¬ê³¤ì„ 그리세요." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11220,7 +11258,7 @@ msgstr "" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." -msgstr "Path ì†ì„±ì€ ìœ íš¨í•œ Node2D 노드를 가리켜야 합니다." +msgstr "Path ì†ì„±ì€ 올바른 Node2D 노드를 가리켜야 합니다." #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." @@ -11238,27 +11276,26 @@ msgstr "" "ì„¤ì •í•˜ì„¸ìš”." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D는 CollisionObject2Dì— ì¶©ëŒ Shapeì„ ì§€ì •í•˜ê¸° 위해서만 사용ë©" -"니다. Area2D, StaticBody2D, RigidBody2D, KinematicBody2D ë“±ì˜ ìžì‹ 노드로 ì¶”" -"가하여 사용합니다." +"Use Parentê°€ 켜진 TileMapì€ í˜•íƒœë¥¼ 주기 위해 부모 CollisionObject2Dê°€ 필요합" +"니다. 형태를 주기 위해 Area2D, StaticBody2D, RigidBody2D, KinematicBody2D 등" +"ì˜ ìžì‹ 노드로 추가하여 사용합니다." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D는 편집 ì”¬ì˜ ë£¨íŠ¸ì˜ í•˜ìœ„ 노드로 ì¶”ê°€í• ë•Œ 가장 잘 ë™ìž‘합니" +"VisibilityEnabler2D는 편집 ì”¬ì˜ ë£¨íŠ¸ì˜ í•˜ìœ„ 노드로 ì¶”ê°€í• ë•Œ 가장 잘 ë™ìž‘합니" "다." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera는 반드시 ARVROrigin 노드를 부모로 ê°€ì§€ê³ ìžˆì–´ì•¼ 함" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera는 반드시 ARVROrigin 노드를 부모로 ê°€ì§€ê³ ìžˆì–´ì•¼ 합니다." #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -11347,10 +11384,10 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" -"CollisionShapeê°€ ê¸°ëŠ¥ì„ í•˜ê¸° 위해서는 Shapeì´ ì œê³µë˜ì–´ì•¼ 합니다. Shape 리소스" -"를 만드세요!" +"CollisionShapeê°€ ì œ ê¸°ëŠ¥ì„ í•˜ë ¤ë©´ Shapeê°€ ì œê³µë˜ì–´ì•¼ 합니다. Shape 리소스를 " +"만드세요." #: scene/3d/collision_shape.cpp msgid "" @@ -11384,6 +11421,10 @@ msgstr "" "GIProbe는 GLES2 비디오 드ë¼ì´ë²„ì—서 ì§€ì›í•˜ì§€ 않습니다.\n" "BakedLightmapì„ ì‚¬ìš©í•˜ì„¸ìš”." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "SpotLightì˜ ê°ë„를 90ë„ ì´ìƒìœ¼ë¡œ 잡게ë˜ë©´ 그림ìžë¥¼ 투ì˜í• 수 없습니다." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11427,11 +11468,11 @@ msgstr "PathFollow는 Path ë…¸ë“œì˜ ìžì‹ìœ¼ë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다. #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED는 부모 Pathì˜ Curve 리소스ì—서 \"Up Vector\"ê°€ " -"활성화ë˜ì–´ 있어야 합니다." +"PathFollowì˜ ROTATION_ORIENTED는 부모 Pathì˜ Curve 리소스ì—서 \"Up Vector" +"\"ê°€ 활성화ë˜ì–´ 있어야 합니다." #: scene/3d/physics_body.cpp msgid "" @@ -11444,8 +11485,12 @@ msgstr "" "ëŒ€ì‹ ìžì‹ ì¶©ëŒ í˜•íƒœì˜ í¬ê¸°ë¥¼ 변경해보세요." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." -msgstr "Path ì†ì„±ì€ ìœ íš¨í•œ Spatial 노드를 가리켜야 합니다." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." +msgstr "" +"\"Remote Path\" ì†ì„±ì€ 올바른 Spatial 노드, ë˜ëŠ” Spatial íŒŒìƒ ë…¸ë“œë¥¼ 가리켜" +"야 합니다." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -11462,11 +11507,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"AnimatedSprite3Dê°€ í”„ë ˆìž„ì„ ë³´ì—¬ì£¼ê¸° 위해서는 'Frames' ì†ì„±ì— SpriteFrames 리" -"소스 만들거나 ì§€ì •í•´ì•¼ 합니다." +"AnimatedSprite3Dê°€ í”„ë ˆìž„ì„ ë³´ì—¬ì£¼ê¸° 위해서는 \"Frames\" ì†ì„±ì— SpriteFrames " +"리소스 만들거나 ì§€ì •í•´ì•¼ 합니다." #: scene/3d/vehicle_body.cpp msgid "" @@ -11477,8 +11522,12 @@ msgstr "" "ì˜ ìžì‹ìœ¼ë¡œ 사용해주세요." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment는 Environment 리소스가 필요합니다." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WorldEnvironment는 ì‹œê° íš¨ê³¼ë¥¼ 위해 Environment를 갖는 \"Environment\" ì†ì„±" +"ì´ í•„ìš”í•©ë‹ˆë‹¤." #: scene/3d/world_environment.cpp msgid "" @@ -11503,19 +11552,19 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: '%s'" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." -msgstr "노드 '%s'ì—서, ìœ íš¨í•˜ì§€ ì•Šì€ ì• ë‹ˆë©”ì´ì…˜: '%s'." +msgstr "노드 '%s'ì—서, 올바르지 ì•Šì€ ì• ë‹ˆë©”ì´ì…˜: '%s'." #: scene/animation/animation_tree.cpp msgid "Invalid animation: '%s'." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ì• ë‹ˆë©”ì´ì…˜: '%s'." +msgstr "올바르지 ì•Šì€ ì• ë‹ˆë©”ì´ì…˜: '%s'." #: scene/animation/animation_tree.cpp msgid "Nothing connected to input '%s' of node '%s'." msgstr "노드 '%s'ì˜ '%s' ìž…ë ¥ì— ì•„ë¬´ê²ƒë„ ì—°ê²°ë˜ì§€ 않ìŒ." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." -msgstr "ê·¸ëž˜í”„ì˜ ë£¨íŠ¸ AnimationNodeê°€ ì„¤ì •ë˜ì§€ 않았습니다." +msgid "No root AnimationNode for the graph is set." +msgstr "그래프를 위한 루트 AnimationNodeê°€ ì„¤ì •ë˜ì§€ 않았습니다." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." @@ -11529,8 +11578,8 @@ msgstr "" "다." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "AnimationPlayer 루트가 ìœ íš¨í•œ 노드가 아닙니다." +msgid "The AnimationPlayer root node is not a valid node." +msgstr "AnimationPlayer 루트 노드가 올바른 노드가 아닙니다." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11543,12 +11592,11 @@ msgstr "화면ì—서 색ìƒì„ ì„ íƒí•˜ì„¸ìš”." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "ìš”" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11559,21 +11607,22 @@ msgid "Add current color as a preset." msgstr "현재 색ìƒì„ 프리셋으로 추가합니다." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" -"컨테ì´ë„ˆ ìžì²´ëŠ” ìžì‹ 배치 í–‰ë™ì„ 구성하는 스í¬ë¦½íЏ 외ì—는 목ì ì´ ì—†ìŠµë‹ˆë‹¤.\n" -"스í¬ë¦½íŠ¸ë¥¼ 추가하지 않는 경우, 순수한 'Control' 노드를 사용해주세요." +"Container ìžì²´ëŠ” ìžì‹ 배치 ìž‘ì—…ì„ êµ¬ì„±í•˜ëŠ” 스í¬ë¦½íЏ 외ì—는 목ì ì´ ì—†ìŠµë‹ˆë‹¤.\n" +"스í¬ë¦½íŠ¸ë¥¼ 추가하지 않는 경우, 순수한 Control 노드를 사용해주세요." #: scene/gui/control.cpp msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"Hint Tooltipì€ Controlì˜ Mouse Filterê°€ \"ignore\"로 ì„¤ì •ë˜ì–´ 있기 ë•Œë¬¸ì— ë³´" +"여지지 않습니다. í•´ê²°í•˜ë ¤ë©´, Mouse Filter를 \"Stop\"ì´ë‚˜ \"Pass\"로 ì„¤ì •í•˜ì„¸" +"ìš”." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11586,25 +11635,25 @@ msgstr "확ì¸í•´ì£¼ì„¸ìš”..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" -"Popupì€ popup() ë˜ëŠ” 기타 popup*() 함수를 호출하기 ì „ê¹Œì§€ëŠ” 기본ì 으로 숨겨집" -"니다. 편집하는 ë™ì•ˆ 보여지ë„ë¡ í• ìˆ˜ëŠ” 있으나, 실행 시ì—는 숨겨집니다." +"Popupì€ popup() ë˜ëŠ” 기타 popup*() 함수로 호출ë˜ê¸° ì „ê¹Œì§€ 기본ì 으로 숨어있습" +"니다. 편집하는 ë™ì•ˆ ë³´ì´ë„ë¡ í• ìˆ˜ëŠ” 있으나, 실행 시ì—는 ë³´ì´ì§€ 않습니다." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "exp_editì´ ì°¸ì´ë¼ë©´ min_value는 반드시 > 0 ì´ì–´ì•¼ 합니다." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "\"Exp Edit\"ì´ í™œì„±í™”ë˜ë©´, \"Min Value\"는 반드시 0보다 커야 합니다." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer는 ë‹¨ì¼ ìžì‹ ì»¨íŠ¸ë¡¤ì„ ìž‘ì—…í•˜ê¸° 위한 것입니다.\n" -"컨테ì´ë„ˆë¥¼ ìžì‹ (VBox,HBox,등)으로 사용하거나, Controlì„ ìˆ˜ë™ìœ¼ë¡œ ì§€ì •í•œ 최" -"소 수치로 ì„¤ì •í•´ì„œ 사용하세요." +"ScrollContainer는 ë‹¨ì¼ ìžì‹ Controlì„ ìž‘ì—…í•˜ê¸° 위한 것입니다.\n" +"컨테ì´ë„ˆë¥¼ ìžì‹ìœ¼ë¡œ 사용하거나 (VBox, HBox 등), Controlì„ ì‚¬ìš©í•´ ì†ìˆ˜ 최소 수" +"치를 ì„¤ì •í•˜ì„¸ìš”." #: scene/gui/tree.cpp msgid "(Other)" @@ -11644,15 +11693,23 @@ msgstr "í°íЏ 로딩 오류." #: scene/resources/dynamic_font.cpp msgid "Invalid font size." -msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í°íЏ í¬ê¸°." +msgstr "올바르지 ì•Šì€ í°íЏ í¬ê¸°." #: scene/resources/visual_shader.cpp msgid "Input" msgstr "ìž…ë ¥" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "ë¯¸ë¦¬ë³´ê¸°ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ì†ŒìŠ¤." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." -msgstr "ì…°ì´ë”ì— ìœ íš¨í•˜ì§€ ì•Šì€ ì†ŒìŠ¤." +msgstr "ì…°ì´ë”ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ì†ŒìŠ¤." + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "해당 íƒ€ìž…ì— ì˜¬ë°”ë¥´ì§€ ì•Šì€ ë¹„êµ í•¨ìˆ˜." #: servers/visual/shader_language.cpp msgid "Assignment to function." @@ -11670,6 +11727,66 @@ msgstr "Varyings는 ì˜¤ì§ ë²„í…스 함수ì—서만 ì§€ì •í• ìˆ˜ 있습니다. msgid "Constants cannot be modified." msgstr "ìƒìˆ˜ëŠ” ìˆ˜ì •í• ìˆ˜ 없습니다." +#~ msgid "Previous Folder" +#~ msgstr "ì´ì „ í´ë”" + +#~ msgid "Next Folder" +#~ msgstr "ë‹¤ìŒ í´ë”" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "스í¬ë¦°ìƒ· ìžë™ 열기" + +#~ msgid "Open in an external image editor." +#~ msgstr "외부 ì´ë¯¸ì§€ 편집기ì—서 열기." + +#~ msgid "Reverse" +#~ msgstr "뒤집기" + +#~ msgid "Mirror X" +#~ msgstr "Xì¶• 뒤집기" + +#~ msgid "Mirror Y" +#~ msgstr "Yì¶• 뒤집기" + +#~ msgid "Generating solution..." +#~ msgstr "솔루션 ìƒì„± 중..." + +#~ msgid "Generating C# project..." +#~ msgstr "C# 프로ì 트 ìƒì„± 중..." + +#~ msgid "Failed to create solution." +#~ msgstr "솔루션 ìƒì„± 실패." + +#~ msgid "Failed to save solution." +#~ msgstr "솔루션 ì €ìž¥ 실패." + +#~ msgid "Done" +#~ msgstr "완료" + +#~ msgid "Failed to create C# project." +#~ msgstr "C# 프로ì 트 ìƒì„± 실패." + +#~ msgid "Mono" +#~ msgstr "모노" + +#~ msgid "About C# support" +#~ msgstr "C# ì§€ì›ì— 대하여" + +#~ msgid "Create C# solution" +#~ msgstr "C# 솔루션 만들기" + +#~ msgid "Builds" +#~ msgstr "빌드" + +#~ msgid "Build Project" +#~ msgstr "프로ì 트 빌드" + +#~ msgid "View log" +#~ msgstr "로그 보기" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment는 Environment 리소스가 필요합니다." + #~ msgid "Enabled Classes" #~ msgstr "í™œì„±í™”ëœ í´ëž˜ìФ" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index a799b557a3..088260b86f 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -133,6 +133,31 @@ msgstr "Animacija: Pakeisti IÅ¡kvietimÄ…" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animacija: Pakeisti ReikÅ¡mÄ™" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animacija: Pakeisti PerÄ—jimÄ…" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animacija: Pakeisti TransformacijÄ…" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animacija: Pakeisti ReikÅ¡mÄ™" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animacija: Pakeisti IÅ¡kvietimÄ…" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Animacijos Nodas" @@ -638,6 +663,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -687,7 +716,7 @@ msgstr "Nutolinti" msgid "Reset Zoom" msgstr "Atstatyti PriartinimÄ…" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -797,6 +826,11 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signalai" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Prijungti '%s' prie '%s'" @@ -960,7 +994,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1136,7 +1170,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1496,6 +1529,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1682,7 +1719,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1733,7 +1770,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1759,24 +1796,28 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "Pasirinkite Nodus, kuriuos norite importuoti" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" +msgid "Go to next folder." msgstr "Pasirinkite Nodus, kuriuos norite importuoti" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2463,6 +2504,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Panaikinti pasirinkimÄ…" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2654,14 +2700,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2979,6 +3017,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Redaguoti Filtrus" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3595,6 +3638,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4652,6 +4696,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "(Ä®diegta)" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Bandyti iÅ¡ naujo" @@ -4681,7 +4730,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Visi" @@ -4695,7 +4743,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4770,31 +4818,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "Sukurti" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Panaikinti pasirinkimÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "Prijunkite prie Nodo:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Panaikinti pasirinkimÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6388,10 +6440,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Sukurti" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6678,7 +6739,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6864,10 +6929,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7445,14 +7506,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7863,6 +7916,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7951,6 +8008,22 @@ msgid "Color uniform." msgstr "Animacija: Pakeisti TransformacijÄ…" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7958,10 +8031,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8050,7 +8157,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8058,7 +8165,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8070,7 +8177,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8087,7 +8194,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8156,11 +8263,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8176,7 +8283,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8204,11 +8311,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8249,11 +8356,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8263,7 +8374,7 @@ msgstr "Keisti Poligono SkalÄ™" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8281,15 +8392,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8340,7 +8451,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8368,12 +8479,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8450,47 +8561,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9659,6 +9770,11 @@ msgid "Extend Script" msgstr "Atidaryti Skriptų Editorių" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Sukurti NaujÄ…" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9869,7 +9985,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9925,7 +10041,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10328,54 +10444,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10960,7 +11028,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11009,7 +11077,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11019,7 +11087,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11095,12 +11163,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11179,7 +11247,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11208,6 +11276,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11244,8 +11316,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11256,7 +11328,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11272,7 +11346,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11283,7 +11357,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11321,7 +11397,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Prijungti '%s' prie '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11335,7 +11411,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11366,8 +11442,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11387,18 +11462,18 @@ msgstr "PraÅ¡ome Patvirtinti..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11442,9 +11517,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Netinkamas Å¡rifto dydis." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Netinkamas Å¡rifto dydis." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Netinkamas Å¡rifto dydis." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index cce75dd34a..281cbf2c8d 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -131,6 +131,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp #, fuzzy msgid "Change Animation Length" msgstr "AnimÄciju Cilpa" @@ -636,6 +656,10 @@ msgstr "Doties uz Rindu" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -685,7 +709,7 @@ msgstr "AttÄlinÄt" msgid "Reset Zoom" msgstr "AtiestatÄ«t tÄlummaiņu" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -793,6 +817,11 @@ msgid "Connect" msgstr "Savienot" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "SignÄli" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Savienot '%s' pie '%s'" @@ -954,7 +983,7 @@ msgid "Owners Of:" msgstr "ĪpaÅ¡nieki:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1140,7 +1169,6 @@ msgid "Success!" msgstr "IzdevÄs!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "IeinstalÄ“t" @@ -1509,6 +1537,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1689,7 +1721,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1740,7 +1772,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1766,24 +1798,29 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "IzvÄ“lÄ“ties Å¡o Mapi" +msgid "Go to previous folder." +msgstr "Doties uz iepriekšējo soli" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "IzvÄ“lÄ“ties Å¡o Mapi" +msgid "Go to next folder." +msgstr "Doties uz nÄkamo soli" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "MeklÄ“t:" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2469,6 +2506,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Noņemt IzvÄ“lÄ“to" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2662,14 +2704,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2984,6 +3018,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Savieno SignÄlu:" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3593,6 +3632,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4638,6 +4678,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "IeinstalÄ“t" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4666,7 +4711,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4680,7 +4724,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4755,31 +4799,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "Izveidot" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Noņemt IzvÄ“lÄ“to" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "Izveidot Jaunu %s" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Noņemt IzvÄ“lÄ“to" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6370,10 +6418,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Izveidot" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6665,7 +6722,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6850,10 +6911,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7430,14 +7487,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7843,6 +7892,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7931,6 +7984,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7938,10 +8007,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8031,7 +8134,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8039,7 +8142,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8051,7 +8154,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8068,7 +8171,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8137,11 +8240,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8157,7 +8260,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8185,11 +8288,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8229,11 +8332,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8243,7 +8350,7 @@ msgstr "Izveidot" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8261,15 +8368,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8321,7 +8428,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8349,12 +8456,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8431,47 +8538,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9628,6 +9735,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Izveidot Jaunu %s" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9837,7 +9949,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9894,7 +10006,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10297,54 +10409,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10927,7 +10991,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10976,7 +11040,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10986,7 +11050,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11062,12 +11126,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11146,7 +11210,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11175,6 +11239,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11209,8 +11277,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11221,7 +11289,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11237,7 +11307,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11248,7 +11318,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11286,7 +11358,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Atvienot '%s' no '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11298,7 +11370,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11330,8 +11402,7 @@ msgstr "Pievienot paÅ¡reizÄ“jo krÄsu kÄ iepriekÅ¡noteiktu krÄsu" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11351,18 +11422,18 @@ msgstr "LÅ«dzu Apstipriniet..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11406,9 +11477,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "NederÄ«gs fonta izmÄ“rs." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "NederÄ«gs fonta izmÄ“rs." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "NederÄ«gs fonta izmÄ“rs." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11425,6 +11506,14 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "IzvÄ“lÄ“ties Å¡o Mapi" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "IzvÄ“lÄ“ties Å¡o Mapi" + #~ msgid "Delete selected files?" #~ msgstr "IzdzÄ“st izvÄ“lÄ“tos failus?" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 84d5742b21..8c135ea467 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -119,6 +119,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -602,6 +622,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -651,7 +675,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -754,6 +778,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -912,7 +940,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1088,7 +1116,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1447,6 +1474,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1617,7 +1648,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1668,7 +1699,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1693,23 +1724,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2384,6 +2419,10 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2575,14 +2614,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2896,6 +2927,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3491,6 +3526,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4516,6 +4552,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4544,7 +4584,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4558,7 +4597,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4633,31 +4672,31 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6216,10 +6255,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6505,7 +6552,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6690,10 +6741,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7254,14 +7301,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7639,6 +7678,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7723,6 +7766,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7730,10 +7789,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7822,7 +7915,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7830,7 +7923,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7842,7 +7935,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7859,7 +7952,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7928,11 +8021,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7948,7 +8041,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7976,11 +8069,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8020,11 +8113,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8033,7 +8130,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8051,15 +8148,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8108,7 +8205,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8136,12 +8233,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8218,47 +8315,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9409,6 +9506,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9611,7 +9712,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9666,7 +9767,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10066,54 +10167,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10690,7 +10743,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10739,7 +10792,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10749,7 +10802,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10825,12 +10878,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10909,7 +10962,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10938,6 +10991,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -10972,8 +11029,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -10984,7 +11041,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11000,7 +11059,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11011,7 +11070,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11046,7 +11107,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11058,7 +11119,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11089,8 +11150,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11110,18 +11170,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11164,9 +11224,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index b510dd739d..e5f1538050 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -610,6 +630,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -659,7 +683,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -762,6 +786,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -920,7 +948,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1096,7 +1124,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1455,6 +1482,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1625,7 +1656,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1676,7 +1707,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1701,23 +1732,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2392,6 +2427,10 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2583,14 +2622,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2904,6 +2935,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3499,6 +3534,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4524,6 +4560,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4552,7 +4592,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4566,7 +4605,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4641,31 +4680,31 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6224,10 +6263,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6513,7 +6560,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6698,10 +6749,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7262,14 +7309,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7647,6 +7686,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7731,6 +7774,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7738,10 +7797,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7830,7 +7923,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7838,7 +7931,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7850,7 +7943,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7867,7 +7960,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7936,11 +8029,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7956,7 +8049,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7984,11 +8077,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8028,11 +8121,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8041,7 +8138,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8059,15 +8156,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8116,7 +8213,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8144,12 +8241,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8226,47 +8323,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9417,6 +9514,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9619,7 +9720,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9674,7 +9775,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10074,54 +10175,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10698,7 +10751,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10747,7 +10800,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10757,7 +10810,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10833,12 +10886,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10917,7 +10970,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10946,6 +10999,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -10980,8 +11037,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -10992,7 +11049,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11008,7 +11067,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11019,7 +11078,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11054,7 +11115,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11066,7 +11127,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11097,8 +11158,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11118,18 +11178,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11172,9 +11232,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 9e9ed1379e..6134a44d66 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -132,6 +132,31 @@ msgid "Anim Change Call" msgstr "Anim Ubah Panggilan" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Ubah Masa Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Ubah Peralihan" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Ubah Penukaran" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Ubah Nilai Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Ubah Panggilan" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -625,6 +650,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -674,7 +703,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -777,6 +806,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -935,7 +968,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1111,7 +1144,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1470,6 +1502,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1641,7 +1677,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1692,7 +1728,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1717,23 +1753,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2409,6 +2449,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Semua Pilihan" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2600,14 +2645,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2921,6 +2958,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3516,6 +3557,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4549,6 +4591,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4577,7 +4623,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4591,7 +4636,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4666,31 +4711,32 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Buang Trek Anim" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6254,10 +6300,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6543,7 +6597,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6728,10 +6786,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7298,14 +7352,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7689,6 +7735,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7774,6 +7824,22 @@ msgid "Color uniform." msgstr "Anim Ubah Penukaran" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7781,10 +7847,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7873,7 +7973,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7881,7 +7981,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7893,7 +7993,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7910,7 +8010,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7979,11 +8079,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7999,7 +8099,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8027,11 +8127,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8072,11 +8172,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8085,7 +8189,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8103,15 +8207,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8160,7 +8264,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8188,12 +8292,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8270,47 +8374,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9464,6 +9568,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9666,7 +9774,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9721,7 +9829,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10124,54 +10232,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10748,7 +10808,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10797,7 +10857,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10807,7 +10867,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10883,12 +10943,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10967,7 +11027,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10996,6 +11056,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11030,8 +11094,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11042,7 +11106,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11058,7 +11124,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11069,7 +11135,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11104,7 +11172,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11116,7 +11184,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11147,8 +11215,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11168,18 +11235,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11222,9 +11289,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 5ffc9673fb..28e807a399 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -19,8 +19,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:51+0000\n" -"Last-Translator: Petter Reinholdtsen <pere-weblate@hungry.com>\n" +"PO-Revision-Date: 2019-07-29 19:21+0000\n" +"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n" "Language-Team: Norwegian BokmÃ¥l <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -50,24 +50,20 @@ msgid "self can't be used because instance is null (not passed)" msgstr "self kan ikke brukes siden instansen er lik null (ikke bestÃ¥tt)" #: core/math/expression.cpp -#, fuzzy msgid "Invalid operands to operator %s, %s and %s." -msgstr "Ugyldig indeks egenskap navn '%s' i node %s." +msgstr "Ugyldige argumenter til operator %s, %s og %s." #: core/math/expression.cpp -#, fuzzy msgid "Invalid index of type %s for base type %s" -msgstr "Ugyldig indeks egenskap navn '%s' i node %s." +msgstr "Ugyldig indeks av type %s for basistype %s" #: core/math/expression.cpp -#, fuzzy msgid "Invalid named index '%s' for base type %s" msgstr "Ugyldig navngitt indeks \"%s\" for grunntypen %s" #: core/math/expression.cpp -#, fuzzy msgid "Invalid arguments to construct '%s'" -msgstr ": Ugyldig argument av type: " +msgstr "Ugyldige argumenter for Ã¥ lage \"%s\"" #: core/math/expression.cpp msgid "On call to '%s':" @@ -91,14 +87,12 @@ msgid "Time:" msgstr "Tid:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Value:" -msgstr "Nytt navn:" +msgstr "Verdi:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "Sett inn Nøkkel" +msgstr "Sett inn nøkkel her" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" @@ -148,6 +142,31 @@ msgstr "Anim Forandre Kall" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Endre Nøkkelbildetid" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Forandre Overgang" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Forandre Omforming" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Endre Nøkkelbildeverdi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Forandre Kall" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Endre Animasjonsnavn:" @@ -680,6 +699,10 @@ msgstr "GÃ¥ til Linje" msgid "Line Number:" msgstr "Linjenummer:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Ingen Treff" @@ -729,7 +752,7 @@ msgstr "Zoom Ut" msgid "Reset Zoom" msgstr "Nullstill Zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Advarsler" @@ -841,6 +864,11 @@ msgid "Connect" msgstr "Koble Til" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signaler:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Koble '%s' til '%s'" @@ -1014,7 +1042,8 @@ msgid "Owners Of:" msgstr "Eiere Av:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Fjerne valgte filer fra prosjektet? (kan ikke angres)" #: editor/dependency_editor.cpp @@ -1201,7 +1230,6 @@ msgid "Success!" msgstr "Suksess!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Installer" @@ -1581,6 +1609,10 @@ msgstr "Tilpasset utgivelsesmal ikke funnet." msgid "Template file not found:" msgstr "Malfil ble ikke funnet:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1778,7 +1810,7 @@ msgstr "Vis I Filutforsker" msgid "New Folder..." msgstr "Ny Mappe..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Oppdater" @@ -1829,7 +1861,7 @@ msgstr "GÃ¥ framover" msgid "Go Up" msgstr "GÃ¥ oppover" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Veksle visning av skjulte filer" @@ -1855,27 +1887,30 @@ msgstr "Flytt Favoritt Nedover" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Forrige fane" +msgid "Go to previous folder." +msgstr "GÃ¥ til ovennevnt mappe." #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Lag mappe" +msgid "Go to next folder." +msgstr "GÃ¥ til ovennevnt mappe." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Go to parent folder." -msgstr "GÃ¥ til overnevnt mappe" +msgstr "GÃ¥ til ovennevnt mappe." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "(Un)favorite current folder." -msgstr "Kunne ikke opprette mappe." +msgid "Refresh files." +msgstr "Søk i klasser" #: editor/editor_file_dialog.cpp +msgid "(Un)favorite current folder." +msgstr "(Av)favoriser gjeldende mappe." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Veksle visning av skjulte filer" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2633,6 +2668,11 @@ msgid "Go to previously opened scene." msgstr "GÃ¥ til forrige Ã¥pne scene." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Kopier Sti" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Neste fane" @@ -2853,15 +2893,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Redigeringsverktøy-instillinger" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Ã…pne den neste Editoren" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Skru av/pÃ¥ Fullskjerm" @@ -3197,6 +3228,11 @@ msgid "Calls" msgstr "Ring" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Medlemmer" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "PÃ¥" @@ -3861,6 +3897,7 @@ msgid "Nodes not in Group" msgstr "Legg til i Gruppe" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" msgstr "Lim inn Noder" @@ -4976,6 +5013,11 @@ msgid "Idle" msgstr "Inaktiv" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Installer" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Prøv pÃ¥ nytt" @@ -5007,7 +5049,6 @@ msgid "Last" msgstr "Siste" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alle" @@ -5022,8 +5063,9 @@ msgid "Sort:" msgstr "Sorter:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Reverser" +#, fuzzy +msgid "Reverse sorting." +msgstr "Ber om..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -5097,31 +5139,38 @@ msgid "Rotation Step:" msgstr "Rotasjon Steg:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Flytt vertikal veileder" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Lag ny vertikal veileder" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Fjern vertikal veileder" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Flytt horisontal veileder" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Lag ny horisontal veileder" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Fjern horisontal veileder" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Lag ny horisontal og vertikal veileder" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6792,10 +6841,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Slett punkter" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -7102,7 +7160,12 @@ msgstr "Bak" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Høyrevisning" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Høyrevisning" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7293,10 +7356,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "Slett Valgte" @@ -7892,14 +7951,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Speil X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Speil Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8337,6 +8388,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8429,6 +8484,22 @@ msgid "Color uniform." msgstr "Anim Forandre Omforming" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8436,10 +8507,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8530,7 +8635,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8538,7 +8643,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8550,7 +8655,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8567,7 +8672,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8636,11 +8741,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8656,7 +8761,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8684,11 +8789,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8729,11 +8834,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8743,7 +8852,7 @@ msgstr "Lag Poly" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8761,15 +8870,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8821,7 +8930,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8849,12 +8958,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8931,47 +9040,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10183,6 +10292,11 @@ msgstr "Kjør Skript" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Lag ny %s" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Lagre Scene" @@ -10404,7 +10518,7 @@ msgid "Script is valid." msgstr "Animasjonstre er gyldig." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10463,7 +10577,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10879,62 +10993,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Generating solution..." -msgstr "Lager konturer..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "Kunne ikke lage omriss!" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "Kunne ikke laste ressurs." - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Done" -msgstr "Ferdig!" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create C# project." -msgstr "Kunne ikke laste ressurs." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "Lag Omriss" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "Prosjekt" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Vis Filer" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11543,7 +11601,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11592,7 +11650,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11602,7 +11660,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11678,12 +11736,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11762,7 +11820,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11791,6 +11849,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11825,8 +11887,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11837,7 +11899,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11853,7 +11917,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11864,7 +11928,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11902,7 +11968,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Koble '%s' fra '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11916,7 +11982,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Animasjonstre er ugyldig." #: scene/animation/animation_tree_player.cpp @@ -11947,8 +12013,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11968,18 +12033,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -12024,9 +12089,19 @@ msgstr "Legg til Input" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Ugyldig fontstørrelse." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Ugyldig fontstørrelse." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Ugyldig fontstørrelse." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -12041,7 +12116,60 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Konstanter kan ikke endres." + +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Forrige fane" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Lag mappe" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Ã…pne den neste Editoren" + +#~ msgid "Reverse" +#~ msgstr "Reverser" + +#~ msgid "Mirror X" +#~ msgstr "Speil X" + +#~ msgid "Mirror Y" +#~ msgstr "Speil Y" + +#, fuzzy +#~ msgid "Generating solution..." +#~ msgstr "Lager konturer..." + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "Kunne ikke lage omriss!" + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "Kunne ikke laste ressurs." + +#, fuzzy +#~ msgid "Done" +#~ msgstr "Ferdig!" + +#, fuzzy +#~ msgid "Failed to create C# project." +#~ msgstr "Kunne ikke laste ressurs." + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "Lag Omriss" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "Prosjekt" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Vis Filer" #, fuzzy #~ msgid "Enabled Classes" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 3a2df2aa72..67b9141d5b 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -161,6 +161,31 @@ msgid "Anim Change Call" msgstr "Anim Wijzig Aanroep" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Wijzig Keyframe Waarde" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Wijzig Overgang" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Wijzig Transform" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Wijzig Keyframe Waarde" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Wijzig Aanroep" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Verander Animatielengte" @@ -657,6 +682,10 @@ msgstr "Ga naar Regel" msgid "Line Number:" msgstr "Regelnummer:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Geen Overeenkomsten" @@ -706,7 +735,7 @@ msgstr "Uitzoomen" msgid "Reset Zoom" msgstr "Initialiseer Zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Waarschuwingen" @@ -819,6 +848,11 @@ msgid "Connect" msgstr "Verbinden" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signalen:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Verbind '%s' met '%s'" @@ -987,7 +1021,8 @@ msgid "Owners Of:" msgstr "Eigenaren Van:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" "Verwijder geselecteerde bestanden van het project? (Kan niet ongedaan " "worden.)" @@ -1173,7 +1208,6 @@ msgid "Success!" msgstr "Geslaagd!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Installeer" @@ -1543,6 +1577,10 @@ msgstr "Aangepast release pakket niet gevonden." msgid "Template file not found:" msgstr "Template bestand niet gevonden:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1740,7 +1778,7 @@ msgstr "Weergeven in Bestandsbeheer" msgid "New Folder..." msgstr "Nieuwe Map..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Verversen" @@ -1791,7 +1829,7 @@ msgstr "Ga Verder" msgid "Go Up" msgstr "Ga Omhoog" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Toggle Verborgen Bestanden" @@ -1816,25 +1854,32 @@ msgid "Move Favorite Down" msgstr "Verplaats Favoriet Naar Beneden" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Vorige Folder" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ga naar bovenliggende folder" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Volgende Folder" +#, fuzzy +msgid "Go to next folder." +msgstr "Ga naar bovenliggende folder" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Ga naar bovenliggende folder" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Zoek bestanden" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "(On)favoriet huidige map." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Toggle Verborgen Bestanden" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2582,6 +2627,11 @@ msgid "Go to previously opened scene." msgstr "Ga naar de vorige geopende scene." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Kopieer Pad" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Volgend tabblad" @@ -2800,15 +2850,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Open Editor Data/Instellingen Map" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Open de volgende Editor" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Schakel Volledig Scherm" @@ -3129,6 +3170,11 @@ msgid "Calls" msgstr "Aanroepen" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Bewerk Thema..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Aan" @@ -3760,6 +3806,7 @@ msgid "Nodes not in Group" msgstr "Knopen niet in de groep" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filter knopen" @@ -4843,6 +4890,11 @@ msgid "Idle" msgstr "Inactief" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Installeer" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Probeer opnieuw" @@ -4871,7 +4923,6 @@ msgid "Last" msgstr "Laatste" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alle" @@ -4885,8 +4936,9 @@ msgid "Sort:" msgstr "Sorteren:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Omkeren" +#, fuzzy +msgid "Reverse sorting." +msgstr "Opvragen..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4967,31 +5019,38 @@ msgid "Rotation Step:" msgstr "Rotatie Stap:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Verplaats vertical gids" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Maak nieuwe verticale gids" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Verwijder de verticale gids" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Verplaats de horizontale gids" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Maak nieuwe horizontale gids" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Verwijder de horizontale gids" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Maak nieuwe horizontale en verticale gidsen" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6679,10 +6738,19 @@ msgid "Syntax Highlighter" msgstr "Syntax Markeren" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Punten aanmaken." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6992,9 +7060,14 @@ msgstr "Achter" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Uitlijnen met zicht" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Arrangeer Selectie naar Aanzicht" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Geen ouder om kind aan te instantiëren." @@ -7190,10 +7263,6 @@ msgid "Focus Selection" msgstr "Focus Selectie" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Arrangeer Selectie naar Aanzicht" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Gereedschappen" @@ -7796,14 +7865,6 @@ msgid "Transpose" msgstr "Transponeren" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Spiegel X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Spiegel Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8252,6 +8313,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Visuele Shader Invoertype Gewijzigd" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Vertex" msgstr "Vertices" @@ -8346,6 +8411,22 @@ msgid "Color uniform." msgstr "Transform vrijmaken" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8353,10 +8434,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "Verander Vec Constante" @@ -8449,7 +8564,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8457,7 +8572,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8469,7 +8584,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8486,7 +8601,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8555,11 +8670,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8575,7 +8690,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8603,11 +8718,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8650,12 +8765,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "Verander Textuur Uniform" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "Verander Textuur Uniform" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup with triplanar." msgstr "Verander Textuur Uniform" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8665,7 +8785,7 @@ msgstr "Transformatie Dialoog..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8683,15 +8803,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8744,7 +8864,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8772,12 +8892,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8856,47 +8976,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10188,6 +10308,11 @@ msgstr "Omschrijving:" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Voeg nieuwe knooppunt aan" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Klinkt logisch!" @@ -10414,7 +10539,8 @@ msgid "Script is valid." msgstr "Script geldig" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "Toegestaan: a-z, A-Z, 0-9 en _" #: editor/script_create_dialog.cpp @@ -10473,7 +10599,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Fouten" @@ -10888,60 +11014,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "Mislukt om resource te laden." - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "Mislukt om resource te laden." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create C# project." -msgstr "Mislukt om resource te laden." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "Subscriptie Maken" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "Project" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Bekijk Bestanden" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11572,8 +11644,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Ongeldige afmetingen van splash screen afbeelding (moet 620×300 zijn)." #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Een SpriteFrames resource moet gemaakt of gekozen worden in de 'Frames' " @@ -11636,8 +11709,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "Een textuur met de vorm van het licht moet worden aangeboden in de 'texture' " @@ -11651,7 +11725,8 @@ msgstr "" "laten werken." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" "De occluder polygoon van deze occluder is leeg. Teken alsjeblieft een " "polygoon!" @@ -11740,15 +11815,16 @@ msgstr "" "geven." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D werkt het beste wanneer het gebruikt wordt met de " "aangepaste scene root direct als ouder." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11831,9 +11907,10 @@ msgstr "" "van Area, StaticBody, RigidBody, KinematicBody etc. om ze een vorm te geven." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Een vorm moet gegeven worden om CollisionShape te laten werken. Maak " "alsjeblieft een vorm resource voor deze!" @@ -11864,6 +11941,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11903,8 +11984,8 @@ msgstr "PathFollow2D werkt alleen wanneer het een kind van een Path2D node is." #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11915,7 +11996,10 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" "Pad eigenschap moet verwijzen naar een geldige Spatial node om te werken." @@ -11931,8 +12015,9 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Een SpriteFrames resource moet gemaakt of gegeven worden in de 'Frames' " @@ -11945,7 +12030,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11985,7 +12072,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Ontkoppel '%s' van '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -12000,7 +12087,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Animatie boom is ongeldig." #: scene/animation/animation_tree_player.cpp @@ -12033,8 +12120,7 @@ msgstr "Huidige kleur als een preset toevoegen" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -12052,23 +12138,24 @@ msgid "Please Confirm..." msgstr "Bevestig Alsjeblieft..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Standaard verbergen pop-ups zich tenzij je popup() aanroept of één van de " "popup*() functies. Ze zichtbaar maken om te bewerken is prima, maar ze " "zullen zich verbergen bij het uitvoeren." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -12118,9 +12205,19 @@ msgid "Input" msgstr "Invoer" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "Ongeldige bron voor shader." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Ongeldige bron voor shader." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Ongeldige bron voor shader." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -12137,6 +12234,49 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Vorige Folder" + +#~ msgid "Next Folder" +#~ msgstr "Volgende Folder" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Open de volgende Editor" + +#~ msgid "Reverse" +#~ msgstr "Omkeren" + +#~ msgid "Mirror X" +#~ msgstr "Spiegel X" + +#~ msgid "Mirror Y" +#~ msgstr "Spiegel Y" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "Mislukt om resource te laden." + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "Mislukt om resource te laden." + +#, fuzzy +#~ msgid "Failed to create C# project." +#~ msgstr "Mislukt om resource te laden." + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "Subscriptie Maken" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "Project" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Bekijk Bestanden" + #, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Zoek Klasses" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index b4a6a3d9cc..61af6ef9b8 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -34,11 +34,12 @@ # MichaÅ‚ Topa <moonchasered@gmail.com>, 2019. # PrzemysÅ‚aw Pierzga <przemyslawpierzga@gmail.com>, 2019. # Artur MaciÄ…g <arturmaciag@gmail.com>, 2019. +# RafaÅ‚ Wyszomirski <rawyszo@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:49+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -161,6 +162,31 @@ msgid "Anim Change Call" msgstr "Animacja - wywoÅ‚anie funkcji" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Zmiana czasu klatki kluczowej" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Zmiana przejÅ›cia" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Zmiana transformacji" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Zmiana wartoÅ›ci klatki kluczowej" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animacja - wywoÅ‚anie funkcji" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "ZmieÅ„ dÅ‚ugość animacji" @@ -483,7 +509,6 @@ msgid "Select All" msgstr "Zaznacz wszystko" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" msgstr "Wybierz wÄ™zeÅ‚" @@ -661,6 +686,10 @@ msgstr "Idź do lini" msgid "Line Number:" msgstr "Numer linii:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Znaleziono %d dopasowaÅ„." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Nie znaleziono" @@ -710,7 +739,7 @@ msgstr "Oddal" msgid "Reset Zoom" msgstr "Wyzeruj przybliżenie" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Ostrzeżenia" @@ -816,6 +845,10 @@ msgid "Connect" msgstr "Połącz" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "SygnaÅ‚:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Połącz \"%s\" z \"%s\"" @@ -978,8 +1011,8 @@ msgid "Owners Of:" msgstr "WÅ‚aÅ›ciciele:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "Usunąć wybrane pliki z projektu? (Nie można tego cofnąć)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "Usunąć wybrane pliki z projektu? (Nie można ich przywrócić)" #: editor/dependency_editor.cpp msgid "" @@ -1160,7 +1193,6 @@ msgid "Success!" msgstr "Sukces!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Zainstaluj" @@ -1348,7 +1380,6 @@ msgid "Must not collide with an existing engine class name." msgstr "Nie może kolidować z nazwÄ… istniejÄ…cej klasy silnika." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "Nie może kolidować z nazwÄ… istniejÄ…cego wbudowanego typu." @@ -1528,6 +1559,10 @@ msgstr "Nie znaleziono wÅ‚asnego szablonu wydania." msgid "Template file not found:" msgstr "Nie znaleziono pliku szablonu:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "W eksportach 32-bitowych dołączony PCK nie może być wiÄ™kszy niż 4 GiB." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "Edytor 3D" @@ -1553,9 +1588,8 @@ msgid "Node Dock" msgstr "Dok wÄ™zÅ‚a" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Dok systemu plików" +msgstr "Doki systemu plików i importowania" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1606,7 +1640,6 @@ msgid "File '%s' format is invalid, import aborted." msgstr "Format pliku \"%s\" jest nieprawidÅ‚owy, import przerwany." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." @@ -1622,9 +1655,8 @@ msgid "Unset" msgstr "Wymaż" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Bieżący profil" +msgstr "Bieżący profil:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1646,9 +1678,8 @@ msgid "Export" msgstr "Eksportuj" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "DostÄ™pne profile" +msgstr "DostÄ™pne profile:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1703,7 +1734,7 @@ msgstr "Pokaż w menedżerze plików" msgid "New Folder..." msgstr "Utwórz katalog..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "OdÅ›wież" @@ -1754,7 +1785,7 @@ msgstr "Dalej" msgid "Go Up" msgstr "W górÄ™" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Przełącz ukryte pliki" @@ -1779,23 +1810,31 @@ msgid "Move Favorite Down" msgstr "PrzesuÅ„ Ulubiony w dół" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Poprzedni folder" +#, fuzzy +msgid "Go to previous folder." +msgstr "Przejdź folder wyżej." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "NastÄ™pny folder" +#, fuzzy +msgid "Go to next folder." +msgstr "Przejdź folder wyżej." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Przejdź folder wyżej." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Przeszukaj pliki" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Dodaj/usuÅ„ aktualny folder z ulubionych." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Przełącz widoczność ukrytych plików." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2523,6 +2562,10 @@ msgid "Go to previously opened scene." msgstr "Wróć do poprzednio otwartej sceny." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Skopiuj tekst" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "NastÄ™pna zakÅ‚adka" @@ -2722,32 +2765,20 @@ msgid "Editor Layout" msgstr "UkÅ‚ad edytora" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "ZmieÅ„ na korzeÅ„ sceny" +msgstr "Zrób zrzut ekranu" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Otwórz folder ustawieÅ„/danych edytora" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Otwórz nastÄ™pny edytor" +msgstr "Zrzuty ekranu sÄ… przechowywane w folderze danych/ustawieÅ„ edytora." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "PeÅ‚ny ekran" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Przełącz widoczność CanvasItem" +msgstr "Przełącz systemowÄ… konsolÄ™" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2788,7 +2819,7 @@ msgstr "Dokumentacja online" #: editor/editor_node.cpp msgid "Q&A" -msgstr "Q&A" +msgstr "Pytania i odpowiedzi" #: editor/editor_node.cpp msgid "Issue Tracker" @@ -2856,19 +2887,16 @@ msgid "Spins when the editor window redraws." msgstr "Obraca siÄ™, gdy okno edytora jest przerysowywane." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "CiÄ…gÅ‚e" +msgstr "Aktualizuj ciÄ…gle" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "OdÅ›wież Zmiany" +msgstr "Aktualizuj przy zmianie" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Wyłącz wiatraczek aktualizacji" +msgstr "Ukryj wiatraczek aktualizacji" #: editor/editor_node.cpp msgid "FileSystem" @@ -3062,6 +3090,11 @@ msgid "Calls" msgstr "WywoÅ‚ania" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Edytuj motyw" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Włącz" @@ -3680,6 +3713,7 @@ msgid "Nodes not in Group" msgstr "WÄ™zÅ‚y nie w grupie" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtruj wÄ™zÅ‚y" @@ -4295,7 +4329,7 @@ msgstr "Brak animacji do edycji!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" -msgstr "Odtwórz zaznaczonÄ… animacjÄ™ od tyÅ‚u z aktualnej poz. (A)" +msgstr "Odtwórz zaznaczonÄ… animacjÄ™ od tyÅ‚u z aktualnej pozycji. (A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" @@ -4303,15 +4337,15 @@ msgstr "Odtwarzaj zaznaczonÄ… animacjÄ™ od koÅ„ca. (Shift+A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "Zatrzymaj animacjÄ™ (S)" +msgstr "Zatrzymaj animacjÄ™. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "Uruchom animacjÄ™ od poczÄ…tku (Shift+D)" +msgstr "Uruchom animacjÄ™ od poczÄ…tku. (Shift+D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "Uruchom animacjÄ™ od aktualnej pozycji (D)" +msgstr "Uruchom animacjÄ™ od aktualnej pozycji. (D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." @@ -4328,7 +4362,7 @@ msgstr "NarzÄ™dzia do animacji" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation" -msgstr "Animacje" +msgstr "Animacja" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -4729,6 +4763,10 @@ msgid "Idle" msgstr "Bezczynny" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Zainstaluj..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Ponów PróbÄ™" @@ -4757,7 +4795,6 @@ msgid "Last" msgstr "Koniec" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Wszystko" @@ -4771,8 +4808,8 @@ msgid "Sort:" msgstr "Sortuj:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Odwróć" +msgid "Reverse sorting." +msgstr "Odwróć sortowanie." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4853,32 +4890,32 @@ msgid "Rotation Step:" msgstr "Krok obrotu:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "PrzesuÅ„ PionowÄ… ProwadnicÄ™" +msgid "Move Vertical Guide" +msgstr "PrzesuÅ„ pionowÄ… prowadnicÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "Utwórz nowÄ… prowadnicÄ™ pionowÄ…" +msgid "Create Vertical Guide" +msgstr "Utwórz pionowÄ… prowadnicÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "UsuÅ„ prowadnicÄ™ pionowÄ…" +msgid "Remove Vertical Guide" +msgstr "UsuÅ„ pionowÄ… prowadnicÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "PrzesuÅ„ prowadnicÄ™ poziomÄ…" +msgid "Move Horizontal Guide" +msgstr "PrzesuÅ„ poziomÄ… prowadnicÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "Utwórz nowÄ… prowadnicÄ™ poziomÄ…" +msgid "Create Horizontal Guide" +msgstr "Utwórz poziomÄ… prowadnicÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "UsuÅ„ prowadnicÄ™ poziomÄ…" +msgid "Remove Horizontal Guide" +msgstr "UsuÅ„ poziomÄ… prowadnicÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "Utwórz nowe prowadnice: poziomÄ…Â oraz pionowÄ…" +msgid "Create Horizontal and Vertical Guides" +msgstr "Utwórz poziomÄ…Â i pionowÄ… prowadnicÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -5311,7 +5348,6 @@ msgstr "Wczytaj maskÄ™ emisji" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" msgstr "Uruchom ponownie" @@ -5344,7 +5380,7 @@ msgstr "Przechwytywanie z piksela" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Colors" -msgstr "Kolor emisji" +msgstr "Kolory emisji" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" @@ -5446,7 +5482,7 @@ msgstr "Edytor listy elementów" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" -msgstr "Stwórz Occluder Polygon" +msgstr "Utwórz wielokÄ…t przesÅ‚aniajÄ…cy" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" @@ -6222,18 +6258,16 @@ msgid "Find Next" msgstr "Znajdź nastÄ™pny" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Filtruj wÅ‚aÅ›ciwoÅ›ci" +msgstr "Filtruj skrypty" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Przełącz alfabetyczne sortowanie listy metod." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Tryb filtrowania:" +msgstr "Filtruj metody" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6452,7 +6486,7 @@ msgstr "Zmień wielkość liter" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Uppercase" -msgstr "Wielkie Litery" +msgstr "Wielkie litery" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Lowercase" @@ -6467,10 +6501,18 @@ msgid "Syntax Highlighter" msgstr "PodÅ›wietlacz skÅ‚adni" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Idź do" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "ZakÅ‚adki" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Punkty wstrzymania" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6758,9 +6800,15 @@ msgid "Rear" msgstr "TyÅ‚" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Dopasuj do widoku" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Dopasuj zaznaczenie do widoku" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Brak elementu nadrzÄ™dnego do stworzenia instancji." @@ -6948,10 +6996,6 @@ msgid "Focus Selection" msgstr "Wycentruj na zaznaczeniu" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Dopasuj zaznaczenie do widoku" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "NarzÄ™dzie wyboru" @@ -7513,14 +7557,6 @@ msgid "Transpose" msgstr "Transpozycja" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Odbij X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Odbij Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "Wyłącz autokafelki" @@ -7916,6 +7952,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Typ wejÅ›cia shadera wizualnego zmieniony" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(Tylko GLES3)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "WierzchoÅ‚ki" @@ -8000,6 +8040,22 @@ msgid "Color uniform." msgstr "Uniform koloru." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Zwraca wynik boolowski porównania %s pomiÄ™dzy dwoma parametrami." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "Równe (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "WiÄ™ksze niż (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "WiÄ™ksze lub równe (>=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8008,12 +8064,48 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "Zwraca wynik boolowski porównania pomiÄ™dzy INF i parametrem skalarnym." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "Zwraca wynik boolowski porównania pomiÄ™dzy NaN i parametrem skalarnym." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "Mniejsze niż (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "Mniejsze lub równe (<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "Nierówne (!=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" "Zwraca powiÄ…zany wektor, jeÅ›li podana wartość boolowska jest prawdziwa albo " "faÅ‚szywa." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Zwraca wynik boolowski porównania pomiÄ™dzy dwoma parametrami." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"Zwraca wynik boolowski porównania pomiÄ™dzy INF (lub NaN) i parametrem " +"skalarnym." + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "StaÅ‚a prawda/faÅ‚sz." @@ -8022,43 +8114,38 @@ msgid "Boolean uniform." msgstr "Uniform prawda/faÅ‚sz." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for all shader modes." -msgstr "Parametr wejÅ›ciowy \"uv\" dla wszystkich trybów shadera." +msgstr "Parametr wejÅ›ciowy \"%s\" dla wszystkich trybów shadera." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." msgstr "Parametr wejÅ›ciowy." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "Parametr wejÅ›ciowy \"uv\" dla wszystkich trybów shadera." +msgstr "" +"Parametr wejÅ›ciowy \"%s\" dla wierzchoÅ‚kowego i fragmentowego trybu shadera." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." -msgstr "Parametr wejÅ›ciowy \"uv\" dla wszystkich trybów shadera." +msgstr "Parametr wejÅ›ciowy \"%s\" dla dla fragmentowego i Å›wiatÅ‚owego shadera." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "Parametr wejÅ›ciowy \"uv\" dla wszystkich trybów shadera." +msgstr "Parametr wejÅ›ciowy \"%s\" dla fragmentowego trybu shadera." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "Parametr wejÅ›ciowy \"uv\" dla wszystkich trybów shadera." +msgstr "Parametr wejÅ›ciowy \"%s\" dla Å›wiatÅ‚owego trybu shadera." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "Parametr wejÅ›ciowy \"uv\" dla wszystkich trybów shadera." +msgstr "Parametr wejÅ›ciowy \"%s\" dla wierzchoÅ‚kowego trybu shadera." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "Parametr wejÅ›ciowy \"uv\" dla wszystkich trybów shadera." +msgstr "" +"Parametr wejÅ›ciowy \"%s\" dla wierzchoÅ‚kowego i fragmentowego trybu shadera." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -8109,16 +8196,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Zwraca arcus cosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Tylko GLES3) Zwraca odwrócony cosinus hiperboliczny parametru." +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "Zwraca odwrócony cosinus hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Zwraca arcus sinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "(Tylko GLES3) Zwraca odwrócony sinus hiperboliczny parametru." +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "Zwraca odwrócony sinus hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8129,8 +8216,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Zwraca arcus tangens parametrów." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Tylko GLES3) Zwraca odwrócony tangens hiperboliczny parametru." +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "Zwraca odwrócony tangens hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8146,8 +8233,8 @@ msgid "Returns the cosine of the parameter." msgstr "Zwraca cosinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "(Tylko GLES3) Zwraca cosinus hiperboliczny parametru." +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "Zwraca cosinus hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8163,11 +8250,11 @@ msgstr "Eksponenta o podstawie 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "" +msgstr "Znajduje najbliższÄ… liczbÄ™ caÅ‚kowitÄ… mniejszÄ… lub równÄ… parametrowi." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "Liczy uÅ‚amkowÄ… część argumentu." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." @@ -8175,72 +8262,72 @@ msgstr "Zwraca odwrotność pierwiastka kwadratowego z parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." -msgstr "" +msgstr "Logarytm naturalny." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 logarithm." -msgstr "" +msgstr "Logarytm o podstawie 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "Zwraca wiÄ™kszÄ… z dwóch wartoÅ›ci." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "Zwraca mniejszÄ… z dwóch wartoÅ›ci." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "" +msgstr "Interpolacja liniowa miÄ™dzy dwoma skalarami." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "Zwraca przeciwieÅ„stwo parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" -msgstr "" +msgstr "1.0 - skalar" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." -msgstr "" +msgstr "Zwraca wartość pierwszego parametru podniesionÄ… do potÄ™gi z drugiego." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "Konwertuje wartość ze stopni na radiany." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" -msgstr "" +msgstr "1.0 / skalar" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "" +msgid "Finds the nearest integer to the parameter." +msgstr "Znajduje najbliższÄ… parametrowi liczbÄ™ caÅ‚kowitÄ…." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "" +msgid "Finds the nearest even integer to the parameter." +msgstr "Znajduje najbliższÄ… parametrowi parzystÄ… liczbÄ™ caÅ‚kowitÄ…." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "Ogranicza wartość pomiÄ™dzy 0.0 i 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "WyciÄ…ga znak z parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "Zwraca sinus parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "" +msgid "Returns the hyperbolic sine of the parameter." +msgstr "Zwraca sinus hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "Zwraca pierwiastek kwadratowy parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8250,6 +8337,12 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"Funkcja gÅ‚adkiego przejÅ›cia( skalar(krawÄ™dź0), skalar(krawÄ™dź1), " +"skalar(x) ).\n" +"\n" +"Zwraca 0.0 jeÅ›li \"x\" jest mniejsze niż \"edge0\" i 1.0 jeÅ›li x jest " +"wiÄ™ksze niż \"edge1\". W innym przypadku, zwraca wartość interpolowanÄ… " +"pomiÄ™dzy 0.0 i 1.0 używajÄ…c wielomianów Hermite'a." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8257,74 +8350,77 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Funkcja przejÅ›cia( skalar(krawÄ™dź), skalar(x) ).\n" +"\n" +"Zwraca 0.0 jeÅ›li \"x\" jest mniejsze niż krawÄ™dź, w innym przypadku 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "Zwraca tangens parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "" +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "Zwraca tangens hiperboliczny parametru." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "" +msgid "Finds the truncated value of the parameter." +msgstr "Zwraca obciÄ™tÄ… wartość parametru." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." -msgstr "" +msgstr "Dodaje skalar do skalara." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "Dzieli skalar przez skalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "Mnoży skalar przez skalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." -msgstr "" +msgstr "Zwraca resztÄ™ z dwóch skalarów." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." -msgstr "" +msgstr "Odejmuje skalar od skalara." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar constant." -msgstr "ZmieÅ„ wartość staÅ‚ej skalarnej" +msgstr "StaÅ‚a skalarna." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar uniform." -msgstr "Wyczyść przeksztaÅ‚cenie" +msgstr "Uniform skalarny." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "Wykonaj podejrzenie tekstury kubicznej." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." -msgstr "" +msgstr "Wykonaj podejrzenie tekstury." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." -msgstr "" +msgid "Cubic texture uniform lookup." +msgstr "Podejrzenie uniformu tekstury kubicznej." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy -msgid "2D texture uniform." -msgstr "Tekstura 2D" +msgid "2D texture uniform lookup." +msgstr "Podejrzenie uniformu tekstury 2D." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." +msgstr "Podejrzenie uniformu tekstury 2D triplanarnej." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform function." -msgstr "Okno transformowania..." +msgstr "Funkcja transformacji." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8332,112 +8428,122 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" +"Oblicz iloczyn diadyczny pary wektorów.\n" +"\n" +"OuterProduct traktuje pierwszy parametr \"c\" jako kolumnowy wektor (macierz " +"z jednÄ… kolumnÄ…) i drugi parametr \"r\" jako rzÄ™dowy wektor (macierz z " +"jednym rzÄ™dem) i wykonuje mnożenie macierzy \"c * r\" dajÄ…c w wyniku " +"macierz, której ilość rzÄ™dów odpowiada iloÅ›ci komponentów w \"c\" oraz " +"której ilość kolumn to liczba komponentów w 'r'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." -msgstr "" +msgstr "SkÅ‚ada przeksztaÅ‚cenie z czterech wektorów." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes transform to four vectors." -msgstr "" +msgstr "RozkÅ‚ada przeksztaÅ‚cenie na cztery wektory." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "" +msgid "Calculates the determinant of a transform." +msgstr "Liczy wyznacznik przeksztaÅ‚cenia." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "" +msgid "Calculates the inverse of a transform." +msgstr "Liczy odwrotność przeksztaÅ‚cenia." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "" +msgid "Calculates the transpose of a transform." +msgstr "Liczy transpozycjÄ™ przeksztaÅ‚cenia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." -msgstr "" +msgstr "Mnoży przeksztaÅ‚cenie przez przeksztaÅ‚cenie." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by transform." -msgstr "" +msgstr "Mnoży wektor przez przeksztaÅ‚cenie." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "Transformacja Zaniechana." +msgstr "StaÅ‚a przeksztaÅ‚cenia." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "Transformacja Zaniechana." +msgstr "Uniform przeksztaÅ‚cenia." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "Przypisanie do funkcji." +msgstr "Funkcja wektorowa." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector operator." -msgstr "ZmieÅ„ operator Vec" +msgstr "Operator wektorowy." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." -msgstr "" +msgstr "SkÅ‚ada wektor z trzech skalarów." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes vector to three scalars." -msgstr "" +msgstr "RozkÅ‚ada wektor na trzy skalary." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "" +msgstr "Liczy iloczyn wektorowy dwóch wektorów." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "" +msgstr "Zwraca dystans pomiÄ™dzy dwoma punktami." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." -msgstr "" +msgstr "Liczy iloczyn skalarny dwóch wektorów." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." msgstr "" +"Zwraca wektor, który wskazuje ten sam kierunek co wektor odniesienia. " +"Funkcja posiada trzy parametry wektorowe: N, wektor do orientacji, I, wektor " +"padajÄ…cy i Nref, wektor odniesienia. Jeżeli iloczyn skalarny I i Nref jest " +"mniejszy od zera, zwracana jest wartość N. W przeciwnym razie zwracana jest " +"wartość -N." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." -msgstr "" +msgstr "Liczy dÅ‚ugość wektora." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors." -msgstr "" +msgstr "Liniowo interpoluje pomiÄ™dzy dwoma wektorami." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." -msgstr "" +msgstr "Liczy znormalizowany wektor." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - vector" -msgstr "" +msgstr "1.0 - wektor" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / vector" -msgstr "" +msgstr "1.0 / wektor" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" +"Zwraca wektor zwrócony w kierunku odbicia ( a : wektor padajÄ…cy, b : wektor " +"normalny )." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." -msgstr "" +msgid "Returns the vector that points in the direction of refraction." +msgstr "Zwraca wektor skierowany w kierunku zaÅ‚amania." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8447,6 +8553,12 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"Funkcja gÅ‚adkiego przejÅ›cia( wektor(krawÄ™dź0), wektor(krawÄ™dź1), " +"wektor(x) ).\n" +"\n" +"Zwraca 0.0 jeÅ›li \"x\" jest mniejsze niż \"edge0\" i 1.0 jeÅ›li x jest " +"wiÄ™ksze niż \"edge1\". W innym przypadku, zwraca wartość interpolowanÄ… " +"pomiÄ™dzy 0.0 i 1.0 używajÄ…c wielomianów Hermite'a." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8456,6 +8568,12 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"Funkcja gÅ‚adkiego przejÅ›cia( skalar(krawÄ™dź0), skalar(krawÄ™dź1), " +"wektor(x) ).\n" +"\n" +"Zwraca 0.0 jeÅ›li \"x\" jest mniejsze niż \"edge0\" i 1.0 jeÅ›li x jest " +"wiÄ™ksze niż \"edge1\". W innym przypadku, zwraca wartość interpolowanÄ… " +"pomiÄ™dzy 0.0 i 1.0 używajÄ…c wielomianów Hermite'a." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8463,6 +8581,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Funkcja przejÅ›cia( wektor(krawÄ™dź), wektor(x) ).\n" +"\n" +"Zwraca 0.0 jeÅ›li \"x\" jest mniejsze niż krawÄ™dź, w innym przypadku 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8470,36 +8591,37 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Funkcja przejÅ›cia( skalar(krawÄ™dź), wektor(x) ).\n" +"\n" +"Zwraca 0.0 jeÅ›li \"x\" jest mniejsze niż krawÄ™dź, w innym przypadku 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." -msgstr "" +msgstr "Dodaje wektor do wektora." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "" +msgstr "Dzieli wektor przez wektor." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." -msgstr "" +msgstr "Mnoży wektor przez wektor." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two vectors." -msgstr "" +msgstr "Zwraca resztÄ™ z dwóch wektorów." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts vector from vector." -msgstr "" +msgstr "Odejmuje wektor od wektora." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector constant." -msgstr "ZmieÅ„ stałą Vec" +msgstr "StaÅ‚a wektorowa." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "Przypisanie do uniformu." +msgstr "Uniform wektorowy." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8507,56 +8629,73 @@ msgid "" "output ports. This is a direct injection of code into the vertex/fragment/" "light function, do not use it to write the function declarations inside." msgstr "" +"WÅ‚asne wyrażenie w jÄ™zyku shaderów Godota, z wÅ‚asnÄ… iloÅ›ciÄ… portów wejÅ›cia i " +"wyjÅ›cia. To jest bezpoÅ›rednie wstrzykniÄ™cie kodu do funkcji wierzchoÅ‚ków/" +"fragmentów/Å›wiatÅ‚a, nie używaj tego do deklarowania tych funkcji w Å›rodku." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns falloff based on the dot product of surface normal and view " "direction of camera (pass associated inputs to it)." msgstr "" +"Zwraca spadek na podstawie iloczynu skalarnego normalnej powierzchni i " +"kierunku widoku kamery (podaj tu powiÄ…zane wejÅ›cie)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "" +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(Tylko tryb fragmentów/Å›wiatÅ‚a) Skalarna pochodna funkcji." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "" +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(Tylko tryb fragmentów/Å›wiatÅ‚a) Wektorowa pochodna funkcji." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" +"(Tylko tryb fragmentów/Å›wiatÅ‚a) (Wektor) Pochodna po \"x\" używajÄ…c lokalnej " +"zmiennoÅ›ci." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" +"(Tylko tryb fragmentów/Å›wiatÅ‚a) (Skalar) Pochodna po \"x\" używajÄ…c lokalnej " +"zmiennoÅ›ci." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" +"(Tylko tryb fragmentów/Å›wiatÅ‚a) (Wektor) Pochodna po \"y\" używajÄ…c lokalnej " +"zmiennoÅ›ci." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" +"(Tylko tryb fragmentów/Å›wiatÅ‚a) (Skalar) Pochodna po \"y\" używajÄ…c lokalnej " +"zmiennoÅ›ci." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(Tylko tryb fragmentów/Å›wiatÅ‚a) (Wektor) Suma bezwzglÄ™dnej pochodnej po \"x" +"\" i \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" +"(Tylko tryb fragmentów/Å›wiatÅ‚a) (Skalar) Suma bezwzglÄ™dnej pochodnej po \"x" +"\" i \"y\"." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -8676,7 +8815,7 @@ msgstr "Utwórz Å›cieżkÄ™" #: editor/project_export.cpp msgid "Features" -msgstr "Funkcje" +msgstr "FunkcjonalnoÅ›ci" #: editor/project_export.cpp msgid "Custom (comma-separated):" @@ -8898,7 +9037,6 @@ msgid "Are you sure to open more than one project?" msgstr "Czy jesteÅ› pewny że chcesz otworzyć wiÄ™cej niż jeden projekt?" #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file does not specify the version of Godot " "through which it was created.\n" @@ -8921,7 +9059,6 @@ msgstr "" "wczeÅ›niejszymi wersjami silnika." #: editor/project_manager.cpp -#, fuzzy msgid "" "The following project settings file was generated by an older engine " "version, and needs to be converted for this version:\n" @@ -8932,8 +9069,8 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" -"Podany plik ustawieÅ„ projektu zostaÅ‚ stworzony przez starszÄ… wersjÄ™ silnika " -"i musi zostać przekonwertowany do aktualnej wersji.\n" +"Podany plik ustawieÅ„ projektu zostaÅ‚ wygenerowany przez starszÄ… wersjÄ™ " +"silnika i musi zostać przekonwertowany do aktualnej wersji.\n" "\n" "%s\n" "\n" @@ -8950,14 +9087,14 @@ msgstr "" "kompatybilna z obecnÄ… wersjÄ…." #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" -"Nie zdefiniowano głównej sceny, chcesz jakÄ…Å› wybrać?\n" -"Można to później zmienić w \"Ustawienia projektu\" w kategorii \"aplikacja\"." +"Nie można uruchomić projektu: główna scena niezdefiniowana.\n" +"Edytuj projekt i zmieÅ„ głównÄ… scenÄ™ w Ustawieniach Projektu pod kategoriÄ… " +"\"Application\"." #: editor/project_manager.cpp msgid "" @@ -8968,48 +9105,49 @@ msgstr "" "Otwórz projekt w edytorze aby zaimportować zasoby." #: editor/project_manager.cpp -#, fuzzy msgid "Are you sure to run %d projects at once?" -msgstr "Czy jesteÅ› pewny że chcesz uruchomić wiÄ™cej niż jeden projekt?" +msgstr "Czy na pewno chcesz uruchomić %d projektów na raz?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." -msgstr "Usunąć projekt z listy? (Zawartość folderu nie zostanie zmodyfikowana)" +msgstr "" +"Usunąć %d projektów z listy?\n" +"Zawartość folderów projektów nie zostanie zmodyfikowana." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." -msgstr "Usunąć projekt z listy? (Zawartość folderu nie zostanie zmodyfikowana)" +msgstr "" +"Usunąć projekt z listy?\n" +"Zawartość folderu projektu nie zostanie zmodyfikowana." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list? (Folders contents will not be " "modified)" -msgstr "Usunąć projekt z listy? (Zawartość folderu nie zostanie zmodyfikowana)" +msgstr "" +"Usunąć wszystkie brakujÄ…ce projekty z listy? (Zawartość folderów nie " +"zostanie zmodyfikowana)" #: editor/project_manager.cpp -#, fuzzy msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." msgstr "" "JÄ™zyk zostaÅ‚ zmieniony.\n" -"Interfejs zaktualizuje siÄ™ gdy edytor lub menedżer projektu uruchomi siÄ™." +"Interfejs zaktualizuje siÄ™ po restarcie edytora lub menedżera projektów." #: editor/project_manager.cpp -#, fuzzy msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." msgstr "" -"Masz zamiar przeskanować %s folderów w poszukiwaniu projektów Godot. " -"Potwierdzasz?" +"Czy na pewno chcesz przeskanować %s folderów w poszukiwaniu istniejÄ…cych " +"projektów Godota?\n" +"To może chwilÄ™ zająć." #: editor/project_manager.cpp msgid "Project Manager" @@ -9032,9 +9170,8 @@ msgid "New Project" msgstr "Nowy projekt" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "UsuÅ„ punkt" +msgstr "UsuÅ„ brakujÄ…ce" #: editor/project_manager.cpp msgid "Templates" @@ -9053,13 +9190,12 @@ msgid "Can't run project" msgstr "Nie można uruchomić projektu" #: editor/project_manager.cpp -#, fuzzy msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" "Nie posiadasz obecnie żadnych projektów.\n" -"Czy chciaÅ‚byÅ› zobaczyć oficjalne przykÅ‚adowe projekty w bibliotece zasobów?" +"Czy chcesz zobaczyć oficjalne przykÅ‚adowe projekty w Bibliotece Zasobów?" #: editor/project_settings_editor.cpp msgid "Key " @@ -9086,9 +9222,8 @@ msgstr "" "\", \"\\\" lub \"" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "Akcja %s już istnieje!" +msgstr "Akcja o nazwie \"%s\" już istnieje." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -9307,9 +9442,8 @@ msgid "Override For..." msgstr "Nadpisz dla..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -#, fuzzy msgid "The editor must be restarted for changes to take effect." -msgstr "Edytor musi zostać zrestartowany, by zmiany miaÅ‚y efekt" +msgstr "Edytor musi zostać zrestartowany, by zmiany miaÅ‚y efekt." #: editor/project_settings_editor.cpp msgid "Input Map" @@ -9368,14 +9502,12 @@ msgid "Locales Filter" msgstr "Filtr ustawieÅ„ lokalizacji" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" -msgstr "Pokaż wszystkie lokalizacje" +msgstr "Pokaż wszystkie jÄ™zyki" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" -msgstr "Pokaż tylko wybrane lokalizacje" +msgstr "Pokaż tylko wybrane jÄ™zyki" #: editor/project_settings_editor.cpp msgid "Filter mode:" @@ -9463,7 +9595,6 @@ msgid "Suffix" msgstr "Przyrostek" #: editor/rename_dialog.cpp -#, fuzzy msgid "Advanced Options" msgstr "Opcje zaawansowane" @@ -9726,9 +9857,8 @@ msgid "User Interface" msgstr "Interfejs użytkownika" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" -msgstr "UsuÅ„ wÄ™zeÅ‚" +msgstr "Inny wÄ™zeÅ‚" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -9771,7 +9901,6 @@ msgid "Clear Inheritance" msgstr "Wyczyść dziedziczenie" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" msgstr "Otwórz dokumentacjÄ™" @@ -9780,9 +9909,8 @@ msgid "Add Child Node" msgstr "Dodaj wÄ™zeÅ‚" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "ZwiÅ„ wszystko" +msgstr "RozwiÅ„/zwiÅ„ wszystko" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9793,6 +9921,11 @@ msgid "Extend Script" msgstr "Rozszerz skrypt" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "ZmieÅ„ nadrzÄ™dny wÄ™zeÅ‚" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "ZmieÅ„ na korzeÅ„ sceny" @@ -9810,12 +9943,11 @@ msgstr "Skopiuj Å›cieżkÄ™ wÄ™zÅ‚a" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" -msgstr "UsuÅ„ (bez potwierdzenie)" +msgstr "UsuÅ„ (bez potwierdzenia)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Dodaj/Utwórz nowy wÄ™zeÅ‚" +msgstr "Dodaj/Utwórz nowy wÄ™zeÅ‚." #: editor/scene_tree_dock.cpp msgid "" @@ -9850,19 +9982,16 @@ msgid "Toggle Visible" msgstr "Przełącz widoczność" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Unlock Node" -msgstr "Wybierz wÄ™zeÅ‚" +msgstr "Odblokuj wÄ™zeÅ‚" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Button Group" -msgstr "Przycisk 7" +msgstr "Grupa przycisków" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "(Connecting From)" -msgstr "Błąd połączenia" +msgstr "(łączony teraz)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" @@ -9893,9 +10022,8 @@ msgstr "" "Kliknij, aby wyÅ›wietlić panel grup." #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "Otwórz skrypt" +msgstr "Otwórz skrypt:" #: editor/scene_tree_editor.cpp msgid "" @@ -9946,39 +10074,32 @@ msgid "Select a Node" msgstr "Wybierz wÄ™zeÅ‚" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "Åšcieżka jest pusta" +msgstr "Åšcieżka jest pusta." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "Nazwa pliku jest pusta" +msgstr "Nazwa pliku jest pusta." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is not local." -msgstr "Åšcieżka nie jest lokalna" +msgstr "Åšcieżka nie jest lokalna." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid base path." -msgstr "Niepoprawna Å›cieżka bazowa" +msgstr "Niepoprawna Å›cieżka bazowa." #: editor/script_create_dialog.cpp -#, fuzzy msgid "A directory with the same name exists." -msgstr "Katalog o tej nazwie już istnieje" +msgstr "Katalog o tej nazwie już istnieje." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid extension." -msgstr "Niepoprawne rozszerzenie" +msgstr "Niepoprawne rozszerzenie." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Wrong extension chosen." -msgstr "Wybrano błędne rozszeczenie" +msgstr "Wybrano błędne rozszerzenie." #: editor/script_create_dialog.cpp msgid "Error loading template '%s'" @@ -9997,52 +10118,44 @@ msgid "N/A" msgstr "N/A" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" -msgstr "Otwórz skrypt/Wybierz lokacjÄ™" +msgstr "Otwórz skrypt / Wybierz lokacjÄ™" #: editor/script_create_dialog.cpp msgid "Open Script" msgstr "Otwórz skrypt" #: editor/script_create_dialog.cpp -#, fuzzy msgid "File exists, it will be reused." -msgstr "Plik istnieje, zostanie nadpisany" +msgstr "Plik istnieje, zostanie użyty ponownie." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." -msgstr "Niepoprawna nazwa klasy" +msgstr "Niepoprawna nazwa klasy." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path." -msgstr "NieprawidÅ‚owa nazwa lub Å›cieżka klasy bazowej" +msgstr "NieprawidÅ‚owa nazwa lub Å›cieżka klasy bazowej." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script is valid." -msgstr "Skrypt prawidÅ‚owy" +msgstr "Skrypt jest prawidÅ‚owy." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "DostÄ™pne znaki: a-z, A-Z, 0-9 i _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "Dozwolone: a-z, A-Z, 0-9, _ i ." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Built-in script (into scene file)." -msgstr "Wbudowany skrypt (w plik sceny)" +msgstr "Wbudowany skrypt (w plik sceny)." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "Utwórz nowy plik skryptu" +msgstr "Utwórz nowy plik skryptu." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "Wczytaj istniejÄ…cy plik skryptu" +msgstr "Wczytaj istniejÄ…cy plik skryptu." #: editor/script_create_dialog.cpp msgid "Language" @@ -10084,7 +10197,7 @@ msgstr "Åšlad stosu" msgid "Pick one or more items from the list to display the graph." msgstr "Wybierz jeden lub wiÄ™cej elementów z listy by wyÅ›wietlić graf." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Błędy" @@ -10174,7 +10287,7 @@ msgstr "Ustaw z drzewa" #: editor/script_editor_debugger.cpp msgid "Export measures as CSV" -msgstr "" +msgstr "Eksportuj pomiary jako CSV" #: editor/settings_config_dialog.cpp msgid "Erase Shortcut" @@ -10306,12 +10419,11 @@ msgstr "GDNativeLibrary" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" -msgstr "" +msgstr "Włączony singleton GDNative" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Disabled GDNative Singleton" -msgstr "Wyłącz wiatraczek aktualizacji" +msgstr "Wyłączony singleton GDNative" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Library" @@ -10399,9 +10511,8 @@ msgid "GridMap Fill Selection" msgstr "GridMap WypeÅ‚nij zaznaczenie" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paste Selection" -msgstr "GridMap UsuÅ„ zaznaczenie" +msgstr "GridMap Wklej zaznaczenie" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -10487,54 +10598,6 @@ msgstr "Wybierz odlegÅ‚ość:" msgid "Class name can't be a reserved keyword" msgstr "Nazwa klasy nie może być sÅ‚owem zastrzeżonym" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Generowanie solucji..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Generowanie projektu C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Nie udaÅ‚o siÄ™ stworzyć solucji." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Nie udaÅ‚o siÄ™ zapisać solucji." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Gotowe" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "Nie udaÅ‚o siÄ™ utworzyć projektu jÄ™zyka C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "O wsparciu jÄ™zyka C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Utwórz solucjÄ™ C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Wydania" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Zbuduj projekt" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Pokaż logi" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Koniec Å›ladu stosu wewnÄ™trznego wyjÄ…tku" @@ -10828,9 +10891,8 @@ msgid "Available Nodes:" msgstr "DostÄ™pne wÄ™zÅ‚y:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Select or create a function to edit its graph." -msgstr "Wybierz lub utwórz funkcjÄ™, aby edytować wykres" +msgstr "Wybierz lub utwórz funkcjÄ™, aby edytować jej graf." #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" @@ -10966,15 +11028,20 @@ msgstr "" #: platform/android/export/export.cpp msgid "Custom build requires a valid Android SDK path in Editor Settings." msgstr "" +"WÅ‚asny build wymaga poprawnej Å›cieżki do SDK Androida w Ustawieniach Edytora." #: platform/android/export/export.cpp msgid "Invalid Android SDK path for custom build in Editor Settings." msgstr "" +"Niepoprawna Å›cieżka do SDK Androida dla wÅ‚asnego builda w Ustawieniach " +"Edytora." #: platform/android/export/export.cpp msgid "" "Android project is not installed for compiling. Install from Editor menu." msgstr "" +"Projekt Androida nie jest zainstalowany do kompilacji. Zainstaluj z menu " +"Edytor." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -10989,6 +11056,8 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" +"Próbowano zbudować z wÅ‚asnego szablonu, ale nie istnieje dla niego " +"informacja o wersji. Zainstaluj ponownie z menu \"Projekt\"." #: platform/android/export/export.cpp msgid "" @@ -10997,20 +11066,27 @@ msgid "" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" +"Niezgodna wersja buildu Androida:\n" +" Zainstalowany szablon: %s\n" +" Wersja Godota: %s\n" +"Zainstaluj ponownie szablon z menu \"Projekt\"." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "" +msgstr "Budowanie projektu Androida (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 "" +"Budowanie projektu Androida siÄ™ nie powiodÅ‚o, sprawdź wyjÅ›cie błędu.\n" +"Alternatywnie, odwiedź docs.godotengine.org po dokumentacjÄ™ budowania dla " +"Androida." #: platform/android/export/export.cpp msgid "No build apk generated at: " -msgstr "" +msgstr "Nie wygenerowano budowanego apk w: " #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -11135,11 +11211,11 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" -"Aby AnimatedSprite pokazywaÅ‚ poszczególne klatki, pole Frames musi zawierać " -"odpowiedni zasób SpriteFrames." +"WÅ‚aÅ›ciwość \"Frames\" musi zawierać odpowiedni zasób SpriteFrames, aby " +"AnimatedSprite wyÅ›wietlaÅ‚ klatki." #: scene/2d/canvas_modulate.cpp msgid "" @@ -11169,7 +11245,8 @@ msgid "" msgstr "" "CollisionPolygon2D sÅ‚uży jedynie do okreÅ›lenia ksztaÅ‚tu kolizji dla jednego " "z obiektów dziedziczÄ…cych z CollisionObject2D. Używaj go tylko jako dziecko " -"obiektów typu Area2D, StaticBody2D, RigidBody2D, KinematicBody2D itd." +"obiektów typu Area2D, StaticBody2D, RigidBody2D, KinematicBody2D itp. by " +"nadać im ksztaÅ‚t." #: scene/2d/collision_polygon_2d.cpp msgid "An empty CollisionPolygon2D has no effect on collision." @@ -11183,7 +11260,8 @@ msgid "" msgstr "" "CollisionShape2D sÅ‚uży jedynie do okreÅ›lenia ksztaÅ‚tu kolizji dla jednego z " "obiektów dziedziczÄ…cych z CollisionObject2D. Używaj go tylko jako dziecko " -"obiektów typu Area2D, StaticBody2D, RigidBody2D, KinematicBody2D itd." +"obiektów typu Area2D, StaticBody2D, RigidBody2D, KinematicBody2D itp. by " +"nadać im ksztaÅ‚t." #: scene/2d/collision_shape_2d.cpp msgid "" @@ -11203,21 +11281,23 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" -"Tekstura z ksztaÅ‚tem promieni Å›wiatÅ‚a musi być dodana do pola Tekstura." +"Tekstura z ksztaÅ‚tem promieni Å›wiatÅ‚a musi być dostarczona do wÅ‚aÅ›ciwoÅ›ci " +"\"Texture\"." #: scene/2d/light_occluder_2d.cpp msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." msgstr "" -"WielokÄ…t zasÅ‚aniajÄ…cy musi być ustawiony (lub narysowany) aby Occluder " -"zadziaÅ‚aÅ‚." +"WielokÄ…t przesÅ‚aniajÄ…cy musi być ustawiony (lub narysowany), aby ten " +"przesÅ‚aniacz zadziaÅ‚aÅ‚." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" -msgstr "Poligon zasÅ‚aniajÄ…cy jest pusty. ProszÄ™ narysować poligon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "" +"WielokÄ…t przesÅ‚aniajÄ…cy dla tego przesÅ‚aniacza jest pusty. Narysuj wielokÄ…t." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11304,32 +11384,30 @@ msgstr "" "i ustaw jÄ…." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D sÅ‚uży jedynie do okreÅ›lenia ksztaÅ‚tu kolizji dla jednego z " -"obiektów dziedziczÄ…cych z CollisionObject2D. Używaj go tylko jako dziecko " -"obiektów typu Area2D, StaticBody2D, RigidBody2D, KinematicBody2D itd." +"WÄ™zeÅ‚ TileMap z włączonym Use Parent potrzebuje nadrzÄ™dnego wÄ™zÅ‚a " +"CollisionObject2D, by dać mu ksztaÅ‚ty. Używaj go jako dziecko wÄ™złów Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D itp. by nadać im ksztaÅ‚t." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D dziaÅ‚a najlepiej, gdy jest bezpoÅ›rednio pod korzeniem " -"aktualnie edytowanej sceny." +"VisibilityEnabler2D dziaÅ‚a najlepiej, gdy jest użyty bezpoÅ›rednio pod " +"korzeniem aktualnie edytowanej sceny." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera musi dziedziczyć po węźle ARVROrigin" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera musi posiadać wÄ™zeÅ‚ ARVROrigin jako nadrzÄ™dny." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRController must have an ARVROrigin node as its parent." -msgstr "ARVRController musi posiadać wÄ™zeÅ‚ ARVROrigin jako nadrzÄ™dny" +msgstr "ARVRController musi posiadać wÄ™zeÅ‚ ARVROrigin jako nadrzÄ™dny." #: scene/3d/arvr_nodes.cpp msgid "" @@ -11340,23 +11418,20 @@ msgstr "" "przypisany do żadnego rzeczywistego kontrolera." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "ARVRAnchor musi posiadać wÄ™zeÅ‚ ARVROrigin jako nadrzÄ™dny" +msgstr "ARVRAnchor musi posiadać wÄ™zeÅ‚ ARVROrigin jako nadrzÄ™dny." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "" "The anchor ID must not be 0 or this anchor won't be bound to an actual " "anchor." msgstr "" "ID kotwicy nie może być 0, bo inaczej ta kotwica nie bÄ™dzie przypisana do " -"rzeczywistej kotwicy" +"rzeczywistej kotwicy." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin wymaga dziedziczÄ…cego po nim ARVRCamera" +msgstr "ARVROrigin wymaga wÄ™zÅ‚a potomnego typu ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "%d%%" @@ -11401,7 +11476,8 @@ msgid "" msgstr "" "CollisionPolygon sÅ‚uży jedynie do okreÅ›lenia ksztaÅ‚tu kolizji dla jednego z " "obiektów dziedziczÄ…cych z CollisionObject. Używaj go tylko jako dziecko " -"obiektów typu Area, StaticBody, RigidBody, KinematicBody itd." +"obiektów typu Area, StaticBody, RigidBody, KinematicBody itp. by nadać im " +"ksztaÅ‚t." #: scene/3d/collision_polygon.cpp msgid "An empty CollisionPolygon has no effect on collision." @@ -11415,15 +11491,15 @@ msgid "" msgstr "" "CollisionShape sÅ‚uży jedynie do okreÅ›lenia ksztaÅ‚tu kolizji dla jednego z " "wÄ™złów dziedziczÄ…cych z CollisionObject. Używaj go tylko jako dziecko wÄ™złów " -"typu Area, StaticBody, RigidBody, KinematicBody itd." +"typu Area, StaticBody, RigidBody, KinematicBody itp. by nadać im ksztaÅ‚t." #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" -"KsztaÅ‚t musi być okreÅ›lony dla CollisionShape, aby speÅ‚niaÅ‚ swoje zadanie. " -"Utwórz zasób typu CollisionShape w odpowiednim polu obiektu!" +"KsztaÅ‚t musi być zapewniony, aby CollisionShape zadziaÅ‚aÅ‚. Utwórz dla niego " +"zasób typu CollisionShape." #: scene/3d/collision_shape.cpp msgid "" @@ -11438,13 +11514,12 @@ msgid "Nothing is visible because no mesh has been assigned." msgstr "Nie zostaÅ‚a przypisana żadna siatka, wiÄ™c nic siÄ™ nie pojawi." #: scene/3d/cpu_particles.cpp -#, fuzzy msgid "" "CPUParticles animation requires the usage of a SpatialMaterial whose " "Billboard Mode is set to \"Particle Billboard\"." msgstr "" -"Animacja CPUParticles wymaga użycia SpatialMaterial z włączonym \"Billboard " -"Particles\"." +"Animacja CPUParticles wymaga użycia zasobu SpatialMaterial, którego " +"Billboard Mode jest ustawione na \"Particle Billboard\"." #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" @@ -11458,6 +11533,10 @@ msgstr "" "GIProbes nie sÄ… obsÅ‚ugiwane przez sterownik wideo GLES2.\n" "Zamiast tego użyj BakedLightmap." +#: 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." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11489,13 +11568,12 @@ msgstr "" "Nic nie jest widoczne, bo siatki nie zostaÅ‚y przypisane do kolejki rysowania." #: scene/3d/particles.cpp -#, fuzzy msgid "" "Particles animation requires the usage of a SpatialMaterial whose Billboard " "Mode is set to \"Particle Billboard\"." msgstr "" -"Animacja Particles wymaga użycia SpatialMaterial z włączonym \"Billboard " -"Particles\"." +"Animacja Particles wymaga użycia zasobu SpatialMaterial, którego Billboard " +"Mode jest ustawione na \"Particle Billboard\"." #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -11503,11 +11581,11 @@ msgstr "PathFollow dziaÅ‚a tylko, gdy jest wÄ™zÅ‚em podrzÄ™dnym Path." #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED wymaga włączonego \"Wektora w górÄ™\" w zasobie " -"Curve jego nadrzÄ™dnego wÄ™zÅ‚a Path." +"WÅ‚aÅ›ciwość ROTATION_ORIENTED wÄ™zÅ‚a PathFollow wymaga włączonego \"Up Vector" +"\" w zasobie Curve jego nadrzÄ™dnego wÄ™zÅ‚a Path." #: scene/3d/physics_body.cpp msgid "" @@ -11520,13 +11598,16 @@ msgstr "" "Zamiast tego, zmieÅ„ rozmiary ksztaÅ‚tów kolizji w wÄ™zÅ‚ach podrzÄ™dnych." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." -msgstr "Pole Path musi wskazywać na wÄ™zeÅ‚ Spatial." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." +msgstr "" +"WÅ‚aÅ›ciwość \"Remote Path\" musi wskazywać na poprawny wÄ™zeÅ‚ typu Spatial lub " +"pochodnego." #: scene/3d/soft_body.cpp -#, fuzzy msgid "This body will be ignored until you set a mesh." -msgstr "To ciaÅ‚o bÄ™dzie ignorowane, dopóki nie ustawisz siatki" +msgstr "To ciaÅ‚o bÄ™dzie ignorowane, dopóki nie ustawisz siatki." #: scene/3d/soft_body.cpp msgid "" @@ -11540,11 +11621,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Zasób SpriteFrames musi być ustawiony jako wartość wÅ‚aÅ›ciwoÅ›ci \"Frames\" " -"żeby AnimatedSprite3D wyÅ›wietlaÅ‚ klatki." +"WÅ‚aÅ›ciwość \"Frames\" musi zawierać odpowiedni zasób SpriteFrames, aby " +"AnimatedSprite3D wyÅ›wietlaÅ‚ klatki." #: scene/3d/vehicle_body.cpp msgid "" @@ -11555,8 +11636,12 @@ msgstr "" "dziedziczÄ…cego po VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment wymaga zasobu Environment." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WorldEnvironment wymaga, by jego wÅ‚aÅ›ciwość \"Environment\" posiadaÅ‚a zasób " +"Environment, by mieć widoczny efekt." #: scene/3d/world_environment.cpp msgid "" @@ -11594,8 +11679,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Nic nie podłączono do wejÅ›cia \"%s\" wÄ™zÅ‚a \"%s\"." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." -msgstr "KorzeÅ„ dla grafu AnimationNode nie jest ustawiony." +msgid "No root AnimationNode for the graph is set." +msgstr "Nie ustawiono korzenia AnimationNode dla grafu." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." @@ -11608,7 +11693,7 @@ msgstr "" "Åšcieżka do wÄ™zÅ‚a AnimationPlayer nie prowadzi do wÄ™zÅ‚a AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "KorzeÅ„ AnimationPlayer nie jest poprawnym wÄ™zÅ‚em." #: scene/animation/animation_tree_player.cpp @@ -11621,12 +11706,11 @@ msgstr "Pobierz kolor z ekranu." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "Odchylenie" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11637,23 +11721,22 @@ msgid "Add current color as a preset." msgstr "Dodaj bieżący kolor do zapisanych." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "Kontener sam w sobie nie speÅ‚nia żadnego celu, chyba że jakiÅ› skrypt " "konfiguruje sposób ustawiania jego podrzÄ™dnych wÄ™złów.\n" -"JeÅ›li nie zamierzasz dodać skryptu, zamiast tego użyj zwykÅ‚ego wÄ™zÅ‚a " -"\"Control\"." +"JeÅ›li nie zamierzasz dodać skryptu, zamiast tego użyj zwykÅ‚ego wÄ™zÅ‚a Control." #: scene/gui/control.cpp msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"Hint Tooltip nie zostanie pokazany, ponieważ Mouse Filter jest ustawione na " +"\"Ignore\". By to rozwiÄ…zać, ustaw Mouse Filter na \"Stop\" lub \"Pass\"." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11666,27 +11749,26 @@ msgstr "ProszÄ™ potwierdzić..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "WyskakujÄ…ce okna bÄ™dÄ… domyÅ›lnie ukryte dopóki nie wywoÅ‚asz popup() lub " -"dowolnej funkcji popup*(). Ustawienie ich jako widocznych jest przydatne do " -"edycji, ale zostanÄ… ukryte po uruchomieniu." +"dowolnej funkcji popup*(). Ustawienie ich jako widocznych do edycji jest w " +"porzÄ…dku, ale zostanÄ… ukryte po uruchomieniu." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "JeÅ›li exp_edit jest prawdziwe, min_value musi być > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "JeÅ›li \"Exp Edit\" jest włączone, \"Min Value\" musi być wiÄ™ksze od 0." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer jest zaprojektowany do dziaÅ‚ania z jednym dzieckiem klasy " -"Control.\n" -"Użyj kontenera jako dziecko (VBox,HBox,etc), lub wÄ™zÅ‚a klasy Control i ustaw " -"rÄ™cznie minimalny rozmiar." +"ScrollContainer jest zaprojektowany do dziaÅ‚ania z jednÄ… potomnÄ… kontrolkÄ….\n" +"Użyj kontenera jako dziecko (VBox, HBox, itp.) lub wÄ™zÅ‚a typu Control i " +"ustaw minimalny rozmiar rÄ™cznie." #: scene/gui/tree.cpp msgid "(Other)" @@ -11733,9 +11815,17 @@ msgid "Input" msgstr "WejÅ›cie" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "NieprawidÅ‚owe źródÅ‚o do podglÄ…du." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "NiewÅ‚aÅ›ciwe źródÅ‚o dla shadera." +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "NiewÅ‚aÅ›ciwa funkcja porównania dla tego typu." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Przypisanie do funkcji." @@ -11752,6 +11842,66 @@ 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 "Previous Folder" +#~ msgstr "Poprzedni folder" + +#~ msgid "Next Folder" +#~ msgstr "NastÄ™pny folder" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Automatycznie otwórz zrzuty ekranu" + +#~ msgid "Open in an external image editor." +#~ msgstr "Otwórz w zewnÄ™trznym edytorze obrazów." + +#~ msgid "Reverse" +#~ msgstr "Odwróć" + +#~ msgid "Mirror X" +#~ msgstr "Odbij X" + +#~ msgid "Mirror Y" +#~ msgstr "Odbij Y" + +#~ msgid "Generating solution..." +#~ msgstr "Generowanie solucji..." + +#~ msgid "Generating C# project..." +#~ msgstr "Generowanie projektu C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "Nie udaÅ‚o siÄ™ stworzyć solucji." + +#~ msgid "Failed to save solution." +#~ msgstr "Nie udaÅ‚o siÄ™ zapisać solucji." + +#~ msgid "Done" +#~ msgstr "Gotowe" + +#~ msgid "Failed to create C# project." +#~ msgstr "Nie udaÅ‚o siÄ™ utworzyć projektu jÄ™zyka C#." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "O wsparciu jÄ™zyka C#" + +#~ msgid "Create C# solution" +#~ msgstr "Utwórz solucjÄ™ C#" + +#~ msgid "Builds" +#~ msgstr "Wydania" + +#~ msgid "Build Project" +#~ msgstr "Zbuduj projekt" + +#~ msgid "View log" +#~ msgstr "Pokaż logi" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment wymaga zasobu Environment." + #~ msgid "Enabled Classes" #~ msgstr "Włączone klasy" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 28c15c05c0..1ab60028e0 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -143,6 +143,31 @@ msgid "Anim Change Call" msgstr "Change yer Anim Call" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Change yer Anim Value" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Change yer Anim Transition" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Change yer Anim Transform" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Change yer Anim Value" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Change yer Anim Call" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -636,6 +661,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -685,7 +714,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -792,6 +821,11 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Yer signals:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -954,7 +988,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1130,7 +1164,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1499,6 +1532,10 @@ msgstr "Yer fancy release package be nowhere." msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1682,7 +1719,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1733,7 +1770,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1759,24 +1796,28 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Slit th' Node" +msgid "Go to previous folder." +msgstr "Toggle ye Breakpoint" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Slit th' Node" +msgid "Go to next folder." +msgstr "Toggle ye Breakpoint" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2465,6 +2506,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Forge yer Node!" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2658,14 +2704,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2985,6 +3023,11 @@ msgid "Calls" msgstr "Call" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "th' Members:" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3602,6 +3645,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" msgstr "Paste yer Node" @@ -4659,6 +4703,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4687,7 +4735,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4701,7 +4748,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4776,33 +4823,37 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "" +#, fuzzy +msgid "Move Vertical Guide" +msgstr "Discharge ye' Variable" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "Discharge ye' Variable" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "Discharge ye' Variable" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "" +#, fuzzy +msgid "Move Horizontal Guide" +msgstr "Discharge ye' Variable" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "Discharge ye' Variable" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "Discharge ye' Variable" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6402,10 +6453,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Yar, Blow th' Selected Down!" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6703,7 +6763,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6889,10 +6953,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "Yar, Blow th' Selected Down!" @@ -7477,14 +7537,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7902,6 +7954,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7989,6 +8045,22 @@ msgid "Color uniform." msgstr "Change yer Anim Transform" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7996,10 +8068,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8088,7 +8194,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8096,7 +8202,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8108,7 +8214,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8125,7 +8231,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8194,11 +8300,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8214,7 +8320,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8242,11 +8348,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8287,11 +8393,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8300,7 +8410,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8318,15 +8428,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8376,7 +8486,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8404,12 +8514,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8486,47 +8596,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9694,6 +9804,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Yar, Blow th' Selected Down!" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9909,7 +10024,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9967,7 +10082,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10378,54 +10493,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11038,7 +11105,7 @@ msgstr "Yer splash screen image dimensions aint' 620x300!" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11087,7 +11154,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11097,7 +11164,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11173,12 +11240,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11257,7 +11324,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11286,6 +11353,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11320,8 +11391,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11332,7 +11403,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11348,7 +11421,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11359,7 +11432,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11395,7 +11470,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11407,7 +11482,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11438,8 +11513,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11459,18 +11533,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11514,9 +11588,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Yer Calligraphy be wrongly sized." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Yer Calligraphy be wrongly sized." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Yer Calligraphy be wrongly sized." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11534,6 +11618,14 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Slit th' Node" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Slit th' Node" + +#, fuzzy #~ msgid "Custom Node" #~ msgstr "Slit th' Node" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index e055eecf16..6648ae1f7e 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -63,12 +63,14 @@ # Esdras Tarsis <esdrastarsis@gmail.com>, 2019. # Douglas Fiedler <dognew@gmail.com>, 2019. # Rarysson Guilherme <r_guilherme12@hotmail.com>, 2019. +# Gustavo da Silva Santos <gustavo94.rb@gmail.com>, 2019. +# Rafael Roque <rafael.roquec@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2019-07-02 10:47+0000\n" -"Last-Translator: Rarysson Guilherme <r_guilherme12@hotmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: Rafael Roque <rafael.roquec@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -187,6 +189,31 @@ msgid "Anim Change Call" msgstr "Alterar Chamada da Anim" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Alterar Tempo de Quadro-Chave da Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Alterar Transição da Animação" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Alterar Transformação da Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Alterar Valor de Quadro-Chave da Anim" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Alterar Chamada da Anim" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Alterar Duração da Animação" @@ -687,6 +714,10 @@ msgstr "Ir para Linha" msgid "Line Number:" msgstr "Número da Linha:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "%d correspondência(s) encontrada(s)." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Sem Correspondências" @@ -736,7 +767,7 @@ msgstr "Reduzir" msgid "Reset Zoom" msgstr "Redefinir Ampliação" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Avisos" @@ -798,13 +829,12 @@ msgid "Extra Call Arguments:" msgstr "Argumentos de Chamada Extras:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "Opções avançadas" +msgstr "Avançado" #: editor/connections_dialog.cpp msgid "Deferred" -msgstr "Postergado" +msgstr "Diferido" #: editor/connections_dialog.cpp msgid "" @@ -843,6 +873,10 @@ msgid "Connect" msgstr "Conectar" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Sinal:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Conectar \"%s\" a \"%s\"" @@ -1005,7 +1039,7 @@ msgid "Owners Of:" msgstr "Donos De:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Remover arquivos selecionados do projeto? (irreversÃvel)" #: editor/dependency_editor.cpp @@ -1188,7 +1222,6 @@ msgid "Success!" msgstr "Sucesso!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Instalar" @@ -1376,9 +1409,8 @@ msgid "Must not collide with an existing engine class name." msgstr "Não é permitido utilizar nomes de classes da engine." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "Não é permitido utilizar nomes de tipos internos da engine." +msgstr "Não deve coincidir com um nome de tipo interno existente." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." @@ -1556,6 +1588,10 @@ msgstr "Template customizado de release não encontrado." msgid "Template file not found:" msgstr "Arquivo de modelo não encontrado:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "Em exportações de 32 bits, o PCK embutido não pode ser maior que 4GB." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "Editor 3D" @@ -1569,35 +1605,30 @@ msgid "Asset Library" msgstr "Biblioteca de Assets" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "Edição de Ãrvore de Cena" +msgstr "Edição da Ãrvore de Cena" #: editor/editor_feature_profile.cpp msgid "Import Dock" msgstr "Importar Dock" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Node Dock" -msgstr "Nó Movido" +msgstr "Dock de Nós" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Arquivos" +msgstr "Sistema de Arquivos e Importar Docks" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" msgstr "Apagar perfil '%s'? (sem desfazer)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile must be a valid filename and must not contain '.'" msgstr "O perfil precisa ser um nome de arquivo válido e não pode conter '.'" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." msgstr "Um perfil com esse nome já existe." @@ -1634,29 +1665,27 @@ msgid "Enabled Classes:" msgstr "Classes Ativadas:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "File '%s' format is invalid, import aborted." -msgstr "Arquivo com formato '%s' é inválido, importação abortada." +msgstr "O formato do arquivo '%s' é inválido, importação abortada." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"Perfil '%s' já existe. Remova-o antes de importar, importação interrompida." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." msgstr "Erro ao salvar perfil no caminho: '%s'." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Unset" -msgstr "Não definido" +msgstr "Desmontardo" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Perfil Atual" +msgstr "Perfil Atual:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1678,9 +1707,8 @@ msgid "Export" msgstr "Exportar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Perfis DisponÃveis" +msgstr "Perfis DisponÃveis:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1703,9 +1731,8 @@ msgid "Export Profile" msgstr "Exportar Perfil" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Manage Editor Feature Profiles" -msgstr "Gerenciar Modelos de Exportação" +msgstr "Gerenciar perfis de recurso do editor" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1736,7 +1763,7 @@ msgstr "Mostrar no Gerenciador de Arquivos" msgid "New Folder..." msgstr "Nova Pasta..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Atualizar" @@ -1787,7 +1814,7 @@ msgstr "Avançar" msgid "Go Up" msgstr "Acima" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Alternar Arquivos Ocultos" @@ -1812,25 +1839,32 @@ msgid "Move Favorite Down" msgstr "Mover Favorito Abaixo" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Pasta Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ir para diretório (pasta) pai." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Próxima Pasta" +#, fuzzy +msgid "Go to next folder." +msgstr "Ir para diretório (pasta) pai." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Ir para diretório (pasta) pai." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Pesquisar arquivos" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "(Des)favoritar pasta atual." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." -msgstr "Alternar Arquivos Ocultos" +msgid "Toggle the visibility of hidden files." +msgstr "Alternar visibilidade de arquivos ocultos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1867,6 +1901,8 @@ msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"Existem múltiplos importadores para diferentes tipos que apontam para o " +"arquivo %s, importação abortada" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -2560,6 +2596,10 @@ msgid "Go to previously opened scene." msgstr "Ir para cena aberta anteriormente." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Copiar Texto" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Próxima guia" @@ -2651,7 +2691,7 @@ msgstr "Abrir Pasta do Projeto" #: editor/editor_node.cpp msgid "Install Android Build Template" -msgstr "" +msgstr "Instalar o Modelo de Compilação do Android" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2762,32 +2802,20 @@ msgid "Editor Layout" msgstr "Layout do Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Fazer Raiz de Cena" +msgstr "Tirar Captura de Tela" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Abrir Editor/Configurações de Pasta" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Abrir o próximo Editor" +msgstr "Capturas de Telas ficam salvas na Pasta Editor Data/Settings." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Alternar Tela-Cheia" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Alternar CanvasItem VisÃvel" +msgstr "Alternar Console do Sistema" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2802,9 +2830,8 @@ msgid "Open Editor Settings Folder" msgstr "Abrir Configurações do Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features" -msgstr "Gerenciar Modelos de Exportação" +msgstr "Gerenciar Recursos do Editor" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" @@ -2829,7 +2856,7 @@ msgstr "Documentação Online" #: editor/editor_node.cpp msgid "Q&A" -msgstr "P&R" +msgstr "Perguntas & Respostas" #: editor/editor_node.cpp msgid "Issue Tracker" @@ -2897,19 +2924,16 @@ msgid "Spins when the editor window redraws." msgstr "Gira quando a janela do editor atualiza." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "ContÃnuo" +msgstr "Atualizar Continuamente" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Atualizar Alterações" +msgstr "Atualizar quando Alterado" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Desabilitar Spinner de Atualização" +msgstr "Ocultar Spinner de Atualização" #: editor/editor_node.cpp msgid "FileSystem" @@ -2938,6 +2962,8 @@ msgstr "Não Salvar" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"O modelo de compilação do Android não foi encontrado, por favor instale " +"modelos relevantes." #: editor/editor_node.cpp msgid "Manage Templates" @@ -2948,6 +2974,9 @@ msgid "" "This will install the Android project for custom builds.\n" "Note that, in order to use it, it needs to be enabled per export preset." msgstr "" +"Isso instalará o projeto Android para compilações personalizadas.\n" +"Note que, para usá-lo, ele precisa estar habilitado por predefinição de " +"exportação." #: editor/editor_node.cpp msgid "" @@ -2955,6 +2984,8 @@ msgid "" "Remove the \"build\" directory manually before attempting this operation " "again." msgstr "" +"O modelo de compilação do Android já está instalado e não será substituÃdo.\n" +"Remova a pasta \"build\" manualmente antes de tentar esta operação novamente." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3064,7 +3095,7 @@ msgstr "Medida:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "Tempo de Quadro (seg)" +msgstr "Tempo do Frame (seg)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" @@ -3072,11 +3103,11 @@ msgstr "Tempo Médio (seg)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "% de Quadro" +msgstr "Frame %" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "Quadro FÃsico %" +msgstr "Frame de FÃsica %" #: editor/editor_profiler.cpp msgid "Inclusive" @@ -3099,6 +3130,11 @@ msgid "Calls" msgstr "Chamadas" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Ativo" @@ -3428,9 +3464,8 @@ msgid "SSL Handshake Error" msgstr "Erro SSL Handshake" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uncompressing Android Build Sources" -msgstr "Descompactando Assets" +msgstr "Descompactando Fontes de Compilação do Android" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -3449,9 +3484,8 @@ msgid "Remove Template" msgstr "Remover Modelo" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select Template File" -msgstr "Selecione o arquivo de modelo" +msgstr "Selecionar o Arquivo de Modelo" #: editor/export_template_manager.cpp msgid "Export Template Manager" @@ -3615,9 +3649,8 @@ msgid "Re-Scan Filesystem" msgstr "Re-escanear Sistema de Arquivos" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Toggle Split Mode" -msgstr "Alternar modo" +msgstr "Alternar Modo Split" #: editor/filesystem_dock.cpp msgid "Search files" @@ -3664,12 +3697,11 @@ msgid "Filters:" msgstr "Filtros:" #: editor/find_in_files.cpp -#, fuzzy msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." msgstr "" -"Inclua os arquivos com as seguintes extensões. Adicione ou remova os " +"Inclui os arquivos com as seguintes extensões. Adicione ou remova os " "arquivos em ProjectSettings." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp @@ -3722,6 +3754,7 @@ msgid "Nodes not in Group" msgstr "Nós fora do Grupo" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtrar nós" @@ -4396,9 +4429,8 @@ msgid "Enable Onion Skinning" msgstr "Ativar Papel Vegetal" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Onion Skinning Options" -msgstr "Papel Vegetal" +msgstr "Opções do Onion Skinning" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" @@ -4773,6 +4805,10 @@ msgid "Idle" msgstr "Ocioso" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Instalar..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Tentar Novamente" @@ -4801,7 +4837,6 @@ msgid "Last" msgstr "Último" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Todos" @@ -4815,8 +4850,8 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Reverso" +msgid "Reverse sorting." +msgstr "Inverter ordenação." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4897,32 +4932,32 @@ msgid "Rotation Step:" msgstr "Passo de Rotação:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "Mover guia vertical" +msgid "Move Vertical Guide" +msgstr "Mover Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "Criar novo guia vertical" +msgid "Create Vertical Guide" +msgstr "Criar Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "Remover guia vertical" +msgid "Remove Vertical Guide" +msgstr "Remover Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "Mover guia horizontal" +msgid "Move Horizontal Guide" +msgstr "Mover Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "Criar novo guia horizontal" +msgid "Create Horizontal Guide" +msgstr "Criar Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "Remover guia horizontal" +msgid "Remove Horizontal Guide" +msgstr "Remover Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "Criar novos guias horizontais e verticais" +msgid "Create Horizontal and Vertical Guides" +msgstr "Criar Guias Horizontais e Verticais" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -4966,6 +5001,8 @@ msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" +"Quando ativo, os nós de Controle móveis mudam suas âncoras em vez de suas " +"margens." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -4981,15 +5018,13 @@ msgstr "Alterar Âncoras" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected" -msgstr "Fixar Selecionado" +msgstr "Fixar Seleção" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected" -msgstr "Destravar Selecionados" +msgstr "Destravar Selecionado" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5006,14 +5041,12 @@ msgid "Paste Pose" msgstr "Colar Pose" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "Criar esqueleto(s) customizado do(s) nó(s)" +msgstr "Criar esqueleto(s) customizado(s) do(s) nó(s)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "Limpar Pose" +msgstr "Limpar Esqueletos" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -5101,7 +5134,6 @@ msgid "Snapping Options" msgstr "Opções de agarramento" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Grid" msgstr "Encaixar na grade" @@ -5123,39 +5155,32 @@ msgid "Use Pixel Snap" msgstr "Usar Snap de Pixel" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Smart Snapping" msgstr "Encaixe inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Parent" -msgstr "Encaixar no pai" +msgstr "Encaixar no Pai" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" -msgstr "Encaixar na âncora do nó" +msgstr "Encaixar na Âncora do Nó" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" -msgstr "Encaixar nos lados do nó" +msgstr "Encaixar nos Lados do Nó" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" -msgstr "Encaixar no centro do nó" +msgstr "Encaixar no Centro do Nó" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" -msgstr "Encaixar em outros nós" +msgstr "Encaixar em Outros Nós" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Guides" -msgstr "Encaixar nas guias" +msgstr "Encaixar nas Guias" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5236,9 +5261,8 @@ msgid "Frame Selection" msgstr "Seleção de Quadros" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Preview Canvas Scale" -msgstr "Prever Atlas" +msgstr "Visualizar Canvas Scale" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -5294,9 +5318,8 @@ msgid "Divide grid step by 2" msgstr "Dividir o passo da grade por 2" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Pan View" -msgstr "Visão Traseira" +msgstr "Vista Panorâmica" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" @@ -5367,9 +5390,8 @@ msgstr "Carregar Máscara de Emissão" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Reiniciar Agora" +msgstr "Reiniciar" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5457,19 +5479,16 @@ msgid "Remove Point" msgstr "Remover Ponto" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left Linear" -msgstr "Linear esquerda" +msgstr "Linear Esquerda" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right Linear" -msgstr "Linear direita" +msgstr "Linear Direita" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Load Preset" -msgstr "Carregar definição" +msgstr "Carregar Predefinição" #: editor/plugins/curve_editor_plugin.cpp msgid "Remove Curve Point" @@ -5524,9 +5543,8 @@ msgid "This doesn't work on scene root!" msgstr "Não funciona na raiz da cena!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Trimesh Static Shape" -msgstr "Criar Forma Trimesh" +msgstr "Criar Forma Estática Trimesh" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Failed creating shapes!" @@ -5954,9 +5972,8 @@ msgid "Split Segment (in curve)" msgstr "Dividir Segmentos (na curva)" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" -msgstr "Mover junta" +msgstr "Mover Junta" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" @@ -6289,18 +6306,16 @@ msgid "Find Next" msgstr "Localizar próximo" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Filtrar propriedades" +msgstr "Filtrar scripts" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Alternar ordenação alfabética da lista de métodos." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Modo de filtragem:" +msgstr "Métodos de filtragem" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6483,12 +6498,9 @@ msgid "Target" msgstr "Destino" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." -msgstr "" -"Está faltando o método conectado '%s' do sinal '%s' do nó '%s' para o nó " -"'%s'." +msgstr "Falta método conectado '%s' para sinal '%s' do nó '%s' para nó '%s'." #: editor/plugins/script_text_editor.cpp msgid "Line" @@ -6535,10 +6547,18 @@ msgid "Syntax Highlighter" msgstr "Realce de sintaxe" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Ir Para" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#, fuzzy msgid "Bookmarks" -msgstr "Favoritos" +msgstr "Marcadores" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Pontos de interrupção(Breakpoints)" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -6562,24 +6582,20 @@ msgid "Toggle Comment" msgstr "Alternar Comentário" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Toggle Bookmark" -msgstr "Alternar Favoritos" +msgstr "Alternar Marcador" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Next Bookmark" -msgstr "Vá para o próximo ponto de interrupção" +msgstr "Ir para o Próximo Marcador" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Go to Previous Bookmark" -msgstr "Ir para ponto de interrupção anterior" +msgstr "Ir para o Marcador Anterior" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Remove All Bookmarks" -msgstr "Remover Todos os Itens" +msgstr "Remover Todos os Marcadores" #: editor/plugins/script_text_editor.cpp msgid "Fold/Unfold Line" @@ -6660,8 +6676,8 @@ msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" -"Os seguintes arquivos são mais recentes no disco.\n" -"Que ação deve ser tomada?:" +"Este shader foi modificado no disco.\n" +"Que ação deve ser tomada?" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" @@ -6832,9 +6848,15 @@ msgid "Rear" msgstr "Traseira" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinhar com a Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinhar Seleção com Visualização" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Sem pai onde instanciar um filho." @@ -7022,10 +7044,6 @@ msgid "Focus Selection" msgstr "Focar Seleção" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinhar Seleção com Visualização" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Ferramenta Selecionar" @@ -7241,21 +7259,20 @@ msgid "Settings:" msgstr "Configurações:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "No Frames Selected" -msgstr "Seleção de Quadros" +msgstr "Nenhum Frame Selecionado" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "Adicionar %d Quadro(s)" +msgstr "Adicionar %d Frame(s)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "Adicionar Quadro" +msgstr "Adicionar Frame" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "ERRO: Não foi possÃvel carregar recurso de quadro!" +msgstr "ERRO: Não foi possÃvel carregar o recurso de frame!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" @@ -7263,7 +7280,7 @@ msgstr "Recurso da área de transferência está vazio ou não é uma textura!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Paste Frame" -msgstr "Colar Quadro" +msgstr "Colar Frame" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" @@ -7295,7 +7312,7 @@ msgstr "Repetir" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames:" -msgstr "Quadros da Animação:" +msgstr "Frames da Animação:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add a Texture from File" @@ -7303,7 +7320,7 @@ msgstr "Adicionar Textura de um Arquivo" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "" +msgstr "Adicionar Frames de uma Sprite Sheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -7322,9 +7339,8 @@ msgid "Move (After)" msgstr "Mover (Depois)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" -msgstr "Pilha de Quadros" +msgstr "Selecionar Frames" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" @@ -7335,14 +7351,13 @@ msgid "Vertical:" msgstr "Vertical:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select/Clear All Frames" -msgstr "Selecionar Tudo" +msgstr "Selecionar/Deselecionar Todos os Frames" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy msgid "Create Frames from Sprite Sheet" -msgstr "Criar a partir de Cena" +msgstr "Criar Frames a partir da Planilha de Sprites" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" @@ -7414,9 +7429,8 @@ msgid "Remove All" msgstr "Remover Tudo" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "Editar tema..." +msgstr "Editar Tema" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." @@ -7443,23 +7457,20 @@ msgid "Create From Current Editor Theme" msgstr "Criar a Partir do Tema Atual do Editor" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Toggle Button" -msgstr "Botão do Mous" +msgstr "Alternar Botão" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Button" -msgstr "Botão do Meio" +msgstr "Botão Desativado" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" msgstr "Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Item" -msgstr "Desabilitado" +msgstr "Item Desativado" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" @@ -7479,21 +7490,19 @@ msgstr "Item Rádio Marcado" #: editor/plugins/theme_editor_plugin.cpp msgid "Named Sep." -msgstr "" +msgstr "Sep. Nomeado" #: editor/plugins/theme_editor_plugin.cpp msgid "Submenu" msgstr "Submenu" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Item 1" -msgstr "Item" +msgstr "Item 1" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Item 2" -msgstr "Item" +msgstr "Item 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" @@ -7504,9 +7513,8 @@ msgid "Many" msgstr "Muitas" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled LineEdit" -msgstr "Desabilitado" +msgstr "LineEdit Desativado" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" @@ -7521,9 +7529,8 @@ msgid "Tab 3" msgstr "Guia 3" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Editable Item" -msgstr "Filhos Editáveis" +msgstr "Item Editável" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" @@ -7599,22 +7606,12 @@ msgid "Transpose" msgstr "Transpor" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Espelhar X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Espelhar Y" - -#: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Disable Autotile" -msgstr "Autotiles" +msgstr "Desativar Autotile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Enable Priority" -msgstr "Editar prioridade da telha" +msgstr "Ativar Prioridade" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" @@ -7633,27 +7630,22 @@ msgid "Pick Tile" msgstr "Pegar Tile" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Left" msgstr "Rotacionar para a esquerda" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Right" msgstr "Rotacionar para a direita" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Horizontally" -msgstr "Girar horizontalmente" +msgstr "Inverter Horizontalmente" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Flip Vertically" -msgstr "Girar verticalmente" +msgstr "Inverter Verticalmente" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Clear Transform" msgstr "Limpar Transformação" @@ -7692,42 +7684,35 @@ msgstr "Selecione a forma, subtile ou tile anterior." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Region Mode" -msgstr "Modo de InÃcio:" +msgstr "Modo de Região" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision Mode" -msgstr "Modo de Interpolação" +msgstr "Modo de Colisão" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion Mode" -msgstr "Editar polÃgono de oclusão" +msgstr "Modo de Oclusão" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Mode" -msgstr "Criar Malha de Navegação" +msgstr "Modo de Navegação" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "Modo Rotacionar" +msgstr "Modo Bitmask" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority Mode" -msgstr "Modo de Exportação:" +msgstr "Modo de Prioridade" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "Modo Panorâmico" +msgstr "Modo de Ãcone" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Z Index Mode" -msgstr "Modo Panorâmico" +msgstr "Modo Ãndice Z" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." @@ -7817,8 +7802,9 @@ msgid "" "Shift+LMB: Set wildcard bit.\n" "Click on another Tile to edit it." msgstr "" -"LMB: ligar bit.\n" -"RMB: desligar bit.\n" +"BEM: ligar bit.\n" +"BDM: desligar bit.\n" +"Shift+BEM: Escolher wildcard.\n" "Clique em outro Mosaico para editá-lo." #: editor/plugins/tile_set_editor_plugin.cpp @@ -7932,33 +7918,28 @@ msgid "TileSet" msgstr "Conjunto de Telha" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input +" -msgstr "Adicionar Entrada" +msgstr "Adicionar Entrada +" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add output +" -msgstr "Adicionar Entrada" +msgstr "Adicionar saÃda +" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar" -msgstr "Escala:" +msgstr "Escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector" -msgstr "Inspetor" +msgstr "Vetor" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" msgstr "Booleano" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input port" -msgstr "Adicionar Entrada" +msgstr "Adicionar porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" @@ -7967,42 +7948,36 @@ msgstr "Adicionar porta de saÃda" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Change input port type" -msgstr "Mudar tipo padrão" +msgstr "Mudar tipo de porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Change output port type" -msgstr "Mudar tipo padrão" +msgstr "Mudar tipo de porta de saÃda" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port name" -msgstr "Alterar Nome da Entrada" +msgstr "Alterar nome da porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port name" -msgstr "Alterar Nome da Entrada" +msgstr "Alterar nome da porta de saÃda" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove input port" -msgstr "Remover ponto" +msgstr "Remover porta de entrada" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove output port" -msgstr "Remover ponto" +msgstr "Remover porta de saÃda" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set expression" -msgstr "Alterar Expressão" +msgstr "Definir expressão" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Resize VisualShader node" -msgstr "VisualShader" +msgstr "Redimensionar nó VisualShader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" @@ -8029,6 +8004,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Tipo de Entrada de Shader Visual Alterado" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(Apenas GLES3)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vértice" @@ -8043,21 +8022,19 @@ msgstr "Luz" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Create Shader Node" -msgstr "Criar Nó" +msgstr "Criar Nó Shader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color function." -msgstr "Ir para Função" +msgstr "Função cor." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." -msgstr "" +msgstr "Operador de cor." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." -msgstr "Fazer Função" +msgstr "Função Escala de Cinza." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." @@ -8068,125 +8045,180 @@ msgid "Converts RGB vector to HSV equivalent." msgstr "Converter vetor RGB para um HSV equivalente." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "Renomear Função" +msgstr "Função Sépia." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." -msgstr "" +msgstr "Operador de gravação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Darken operator." -msgstr "" +msgstr "Operador de escurecimento." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Difference operator." -msgstr "Apenas Diferenças" +msgstr "Operador de diferença." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "" +msgstr "Operador de desvio." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "HardLight operator" -msgstr "" +msgstr "Operador HardLight" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." -msgstr "" +msgstr "Operador de iluminação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." -msgstr "" +msgstr "Operador de sobreposição." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Screen operator." -msgstr "" +msgstr "Operador de tela." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "" +msgstr "Operador SoftLight." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Color constant." -msgstr "Constante" +msgstr "Cor constante." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Color uniform." -msgstr "Limpar Transformação" +msgstr "Cor uniforme." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Retorna o resultado booleano da comparação %s entre dois parâmetros." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "Igual (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "Maior Que (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "Maior ou Igual (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." msgstr "" -"Retorna um vetor associado se as escalares providas forem iguais, maiores ou " -"menores." +"Retorna um vetor associado se o escalar fornecido for igual, maior ou menor." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" +"Retorna o resultado booleano da comparação entre INF e o parâmetro escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" +"Retorna o resultado booleano da comparação entre NaN e um parâmetro escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "Menor Que (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "Menor ou Igual (<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "Diferente (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" -"Retorna um vetor associado se o valor do boolean fornecido for verdadeiro ou " +"Retorna um vetor associado se o valor lógico fornecido for verdadeiro ou " "falso." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Retorna o resultado booleano da comparação entre dois parâmetros." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"Retorna o resultado booleano da comparação entre INF (ou NaN) e um parâmetro " +"escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." -msgstr "Alterar Constante Vet" +msgstr "Constante booleana." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." -msgstr "" +msgstr "Booleano uniforme." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for all shader modes." -msgstr "" +msgstr "Parâmetro de entrada '%s' para todos os modos de sombreamento." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "Encaixar no pai" +msgstr "Parâmetro de entrada." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." msgstr "" +"Parâmetro de entrada '%s' para os modos de sombreamento de vértice e " +"fragmento." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." msgstr "" +"Parâmetro de entrada '%s' para os modos de sombreamento de fragmento e luz." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "" +msgstr "Parâmetro de entrada '%s' para o modo de sombreamento de fragmento." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "" +msgstr "Parâmetro de entrada '%s' para o modo de sombreamento de luz." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "Parâmetro de entrada '%s' para o modo de sombreamento de vértice." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." msgstr "" +"Parâmetro de entrada '%s' para o modo de sombreamento de vértice e fragmento." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar function." -msgstr "Alterar Função Escalar" +msgstr "Função escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar operator." -msgstr "Alterar Operador Escalar" +msgstr "Operador escalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." @@ -8229,16 +8261,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Retorna o arco-cosseno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Somente em GLES3) Retorna o coseno hiperbólico inverso do parâmetro." +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "Retorna o cosseno hiperbólico inverso do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Retorna o arco-seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "(Somente em GLES3) Retorna o seno hiperbólico inverso do parâmetro." +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "Retorna o seno hiperbólico inverso do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8249,37 +8281,33 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Retorna o arco-tangente dos parâmetros." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "" -"(Somente em GLES3) Retorna a tangente hiperbólica inversa do parâmetro." +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "Retorna a tangente hiperbólica inversa do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "Localiza o inteiro mais próximo que é maior ou igual ao parâmetro." +msgstr "Encontra o inteiro mais próximo que é maior ou igual ao parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." -msgstr "" +msgstr "Limita um valor para permanecer entre dois outros valores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." msgstr "Retorna o cosseno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "(Somente em GLES3) Retorna o coseno hiperbólico do parâmetro." +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "Retorna o cosseno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Converts a quantity in radians to degrees." -msgstr "Converte uma quantidade em radianos para graus." +msgstr "Converte um valor em radianos para graus." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Base-e Exponential." -msgstr "Exponencial de Base-e." +msgstr "Exponencial de Base e." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8291,8 +8319,9 @@ msgid "Finds the nearest integer less than or equal to the parameter." msgstr "Encontra o inteiro mais próximo que é menor ou igual ao parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "Calcula a parte decimal do argumento." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." @@ -8309,11 +8338,11 @@ msgstr "Logaritmo de Base-2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "Retorna o maior entre dois valores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "Retorna o menor entre dois valores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." @@ -8341,18 +8370,16 @@ msgid "1.0 / scalar" msgstr "1,0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "(Somente em GLES3) Encontra o inteiro mais próximo ao parâmetro." +msgid "Finds the nearest integer to the parameter." +msgstr "Encontra o inteiro mais próximo do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "(Somente em GLES3) Encontra o inteiro par mais próximo ao parâmetro." +msgid "Finds the nearest even integer to the parameter." +msgstr "Encontra o inteiro par mais próximo do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "Limita o valor entre 0.0 e 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." @@ -8363,14 +8390,15 @@ msgid "Returns the sine of the parameter." msgstr "Retorna o seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "(Somente em GLES3) Retorna o seno hiperbólico do parâmetro." +msgid "Returns the hyperbolic sine of the parameter." +msgstr "Retorna o seno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." msgstr "Retorna a raiz quadrada do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" "SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" "\n" @@ -8378,24 +8406,35 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"Função SmoothStep( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Retorna 0.0 se 'x' é menor que 'edge0' e 1.0 se 'x' é maior que 'edge1'. " +"Caso contrário o valor retornado é interpolado entre 0.0 e 1.0 utilizando " +"polinômios de Hermite." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" "Step function( scalar(edge), scalar(x) ).\n" "\n" "Returns 0.0 if 'x' is smaller then 'edge' and otherwise 1.0." msgstr "" +"Função Step( scalar(edge), scalar(x) ).\n" +"\n" +"Retorna 0.0 se 'x' é menor que 'edge' e 1.0 caso contrário." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." msgstr "Retorna a tangente do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +#, fuzzy +msgid "Returns the hyperbolic tangent of the parameter." msgstr "(Somente em GLES3) Retorna a tangente hiperbólica do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +#, fuzzy +msgid "Finds the truncated value of the parameter." msgstr "(Somente em GLES3) Encontra o valor truncado do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8434,8 +8473,9 @@ msgid "Scalar uniform." msgstr "Alterar Uniforme Escalar" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "Faça a pesquisa da textura cúbica." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." @@ -8443,12 +8483,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "Alterar Uniforme da Textura" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup." msgstr "Alterar Uniforme da Textura" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "Alterar Uniforme da Textura" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8458,7 +8503,7 @@ msgstr "Diálogo Transformação..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8477,17 +8522,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "(Somente em GLES3) Calcula o determinante da transform." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "(Somente em GLES3) Calcula a inversa da transform." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "(Somente em GLES3) Calcula a transposta da transform." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8541,8 +8586,9 @@ msgid "Calculates the dot product of two vectors." msgstr "Calcula o produto escalar de dois vetores." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8574,15 +8620,17 @@ msgid "1.0 / vector" msgstr "1,0 / vetor" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" "Retorna um vetor que aponta na direção da reflexão ( a: vetor incidente, b: " "vetor normal )." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +#, fuzzy +msgid "Returns the vector that points in the direction of refraction." msgstr "Retorna um vetor que aponta na direção da refração." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8661,47 +8709,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8733,7 +8781,7 @@ msgid "" "Failed to export the project for platform '%s'.\n" "Export templates seem to be missing or invalid." msgstr "" -"Falha ao exportar o projeto para a plataforma '% s'.\n" +"Falha ao exportar o projeto para a plataforma '%s'.\n" "Os modelos de exportação parecem estar ausentes ou inválidos." #: editor/project_export.cpp @@ -9940,6 +9988,11 @@ msgid "Extend Script" msgstr "Estender Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Reparentar Nó" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Fazer Raiz de Cena" @@ -10173,7 +10226,8 @@ msgid "Script is valid." msgstr "Script válido" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "Permitidos: a-z, A-Z, 0-9 e _" #: editor/script_create_dialog.cpp @@ -10231,7 +10285,7 @@ msgstr "Rastreamento de pilha" msgid "Pick one or more items from the list to display the graph." msgstr "Escolhe um ou mais itens da lista para mostrar o gráfico." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Erros" @@ -10636,54 +10690,6 @@ msgstr "Escolha uma Distância:" msgid "Class name can't be a reserved keyword" msgstr "Nome da classe não pode ser uma palavra reservada" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Gerando solução..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Gerando projeto C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Falha ao criar solução." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Falha ao salvar solução." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Pronto" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "Falha ao criar projeto C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Sobre o suporte ao C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Criar solução C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Compilações" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Compilar Projeto" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Ver registro" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fim da pilha de rastreamento de exceção interna" @@ -11283,8 +11289,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Dimensões inválidas da tela de abertura (deve ser 620x300)." #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Um recurso do tipo SpriteFrames deve ser criado ou definido na propriedade " @@ -11351,8 +11358,9 @@ msgstr "" "\"Animação de partÃculas\" ativada." #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "Uma textura com a forma da luz deve ser fornecida na propriedade \"textura\"." @@ -11365,7 +11373,8 @@ msgstr "" "oclusor tenha efeito." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" "O polÃgono para este oclusor está vazio. Por favor desenhe um polÃgono!" @@ -11466,15 +11475,17 @@ msgstr "" "StaticBody2D, RigidBody2D, KinematicBody2D, etc. para dá-los forma." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D funciona melhor quando usado como filho direto da raiz da " "cena atualmente editada." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "ARVRCamera deve ter um nó ARVROrigin como seu pai" #: scene/3d/arvr_nodes.cpp @@ -11570,9 +11581,10 @@ msgstr "" "RigidBody, KinematicBody, etc. para dá-los forma." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Uma forma deve ser fornecida para que o nó CollisionShape funcione. Por " "favor, crie um recurso de forma a ele!" @@ -11610,6 +11622,10 @@ msgstr "" "GIProbes não são suportados pelo driver de vÃdeo GLES2.\n" "Use um BakedLightmap em vez disso." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11654,9 +11670,10 @@ msgid "PathFollow only works when set as a child of a Path node." msgstr "PathFollow só funciona quando definido como filho de um nó Path." #: scene/3d/path.cpp +#, fuzzy msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" "PathFollow ROTATION_ORIENTED requer \"Up Vector\" habilitado no recurso " "Curva do Caminho pai." @@ -11672,7 +11689,10 @@ msgstr "" "Ao invés disso, altere o tamanho nas formas de colisão filhas." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "A propriedade Caminho deve apontar para um nó Spatial para funcionar." #: scene/3d/soft_body.cpp @@ -11691,8 +11711,9 @@ msgstr "" "Altere o tamanho em formas de colisão de crianças." #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Um recurso do tipo SpriteFrames deve ser criado ou definido na propriedade " @@ -11707,8 +11728,10 @@ msgstr "" "favor, use ele como um filho de um VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment precisa de um recurso Environment." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" #: scene/3d/world_environment.cpp msgid "" @@ -11746,7 +11769,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Nada está ligado à entrada '%s' do nó '%s'." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +#, fuzzy +msgid "No root AnimationNode for the graph is set." msgstr "Um AnimationNode raiz para o gráfico não está definido." #: scene/animation/animation_tree.cpp @@ -11761,7 +11785,8 @@ msgstr "" "AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +#, fuzzy +msgid "The AnimationPlayer root node is not a valid node." msgstr "AnimationPlayer root não é um nó válido." #: scene/animation/animation_tree_player.cpp @@ -11794,8 +11819,7 @@ msgstr "Adicionar cor atual como uma predefinição." msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "O contêiner por si só não serve para nada, a menos que um script configure " "seu comportamento de posicionamento de filhos.\n" @@ -11817,23 +11841,26 @@ msgid "Please Confirm..." msgstr "Confirme Por Favor..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Popups são ocultos por padrão a menos que você chame alguma das funções " "popup*(). Torná-los visÃveis para editar não causa problema, mas eles serão " "ocultados ao rodar a cena." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +#, fuzzy +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "Se exp_edit for true, min_value deverá ser> 0." #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "Um ScrollContainer foi feito para trabalhar com um componente filho único.\n" @@ -11885,9 +11912,19 @@ msgid "Input" msgstr "Entrada" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "Fonte inválida para o shader." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Fonte inválida para o shader." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Fonte inválida para o shader." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Atribuição à função." @@ -11904,6 +11941,66 @@ 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 "Previous Folder" +#~ msgstr "Pasta Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Próxima Pasta" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Abrir Capturas de Tela Automaticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Abrir em um editor de imagens externo." + +#~ msgid "Reverse" +#~ msgstr "Reverso" + +#~ msgid "Mirror X" +#~ msgstr "Espelhar X" + +#~ msgid "Mirror Y" +#~ msgstr "Espelhar Y" + +#~ msgid "Generating solution..." +#~ msgstr "Gerando solução..." + +#~ msgid "Generating C# project..." +#~ msgstr "Gerando projeto C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "Falha ao criar solução." + +#~ msgid "Failed to save solution." +#~ msgstr "Falha ao salvar solução." + +#~ msgid "Done" +#~ msgstr "Pronto" + +#~ msgid "Failed to create C# project." +#~ msgstr "Falha ao criar projeto C#." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "Sobre o suporte ao C#" + +#~ msgid "Create C# solution" +#~ msgstr "Criar solução C#" + +#~ msgid "Builds" +#~ msgstr "Compilações" + +#~ msgid "Build Project" +#~ msgstr "Compilar Projeto" + +#~ msgid "View log" +#~ msgstr "Ver registro" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment precisa de um recurso Environment." + #~ msgid "Enabled Classes" #~ msgstr "Classes Ativadas" diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index 76b1edfc3c..b223e41766 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:51+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: João Lopes <linux-man@hotmail.com>\n" "Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_PT/>\n" @@ -139,6 +139,31 @@ msgid "Anim Change Call" msgstr "Anim Mudar Chamada" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Mudar Tempo do Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Mudar Transição" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Mudar Transformação" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Mudar Valor do Keyframe" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Mudar Chamada" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Mudar Duração da Animação" @@ -463,9 +488,8 @@ msgid "Select All" msgstr "Selecionar tudo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "Selecionar Nó" +msgstr "Selecionar Nenhum" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -641,6 +665,10 @@ msgstr "Vai para linha" msgid "Line Number:" msgstr "Numero da linha:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Encontrada(s) %d correspondência(s)." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Sem combinações" @@ -690,7 +718,7 @@ msgstr "Zoom Out" msgid "Reset Zoom" msgstr "Repor Zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Avisos" @@ -797,6 +825,10 @@ msgid "Connect" msgstr "Ligar" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Sinal:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Ligar '%s' a '%s'" @@ -959,8 +991,8 @@ msgid "Owners Of:" msgstr "Proprietários de:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "Remover arquivos selecionados do Projeto? (sem desfazer)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "Remover arquivos selecionados do Projeto? (Sem desfazer)" #: editor/dependency_editor.cpp msgid "" @@ -1142,7 +1174,6 @@ msgid "Success!" msgstr "Sucesso!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Instalar" @@ -1330,7 +1361,6 @@ msgid "Must not collide with an existing engine class name." msgstr "Não pode coincidir com um nome de classe do motor já existente." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "Não pode coincidir com um nome de um tipo incorporado já existente." @@ -1511,6 +1541,11 @@ msgstr "Modelo de lançamento personalizado não encontrado." msgid "Template file not found:" msgstr "Ficheiro Modelo não encontrado:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"Em exportações de 32 bits o PCK incorporado não pode ser maior do que 4 GiB." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "Editor 3D" @@ -1536,9 +1571,8 @@ msgid "Node Dock" msgstr "Nó Doca" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Sistema de Ficheiros Doca" +msgstr "Sistema de Ficheiros e Docas de Importação" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1589,12 +1623,11 @@ msgid "File '%s' format is invalid, import aborted." msgstr "Formato do ficheiro '%s' é inválido, importação interrompida." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"Perfil '%s' já existe. Remova-o antes de importar. Importação abortada." +"Perfil '%s' já existe. Remova-o antes de importar, importação interrompida." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." @@ -1605,9 +1638,8 @@ msgid "Unset" msgstr "Desativar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Perfil Atual" +msgstr "Perfil atual:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1629,9 +1661,8 @@ msgid "Export" msgstr "Exportar" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Perfis disponÃveis" +msgstr "Perfis disponÃveis:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1686,7 +1717,7 @@ msgstr "Mostrar no Gestor de Ficheiros" msgid "New Folder..." msgstr "Nova Diretoria..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Atualizar" @@ -1737,7 +1768,7 @@ msgstr "Avançar" msgid "Go Up" msgstr "Subir" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Alternar Ficheiros escondidos" @@ -1762,23 +1793,31 @@ msgid "Move Favorite Down" msgstr "Mover Favorito para Baixo" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Pasta Anterior" +#, fuzzy +msgid "Go to previous folder." +msgstr "Ir para a pasta acima." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Próxima Pasta" +#, fuzzy +msgid "Go to next folder." +msgstr "Ir para a pasta acima." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Ir para a pasta acima." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Procurar ficheiros" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "(Não) tornar favorita atual pasta." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Alternar visibilidade de ficheiros escondidos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2510,6 +2549,10 @@ msgid "Go to previously opened scene." msgstr "Ir para Cena aberta anteriormente." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Copiar Texto" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Próxima guia" @@ -2711,32 +2754,21 @@ msgid "Editor Layout" msgstr "Apresentação do Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Tornar Nó Raiz" +msgstr "Captura do ecrã" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Abrir Pasta do Editor de Dados/Configurações" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Abrir o Editor seguinte" +"Capturas do ecrã são armazenadas na pasta Dados/Configurações do Editor." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Alternar Ecrã completo" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Alternar visibilidade do CanvasItem" +msgstr "Alternar Consola do Sistema" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2845,19 +2877,16 @@ msgid "Spins when the editor window redraws." msgstr "Roda quando a janela do editor atualiza." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "ContÃnuo" +msgstr "Atualização ContÃnua" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Atualizar Alterações" +msgstr "Atualizar quando há Alterações" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Desativar a roleta de atualização" +msgstr "Esconder Roleta de Atualização" #: editor/editor_node.cpp msgid "FileSystem" @@ -3051,6 +3080,11 @@ msgid "Calls" msgstr "Chamadas" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Editar Tema" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "On" @@ -3668,6 +3702,7 @@ msgid "Nodes not in Group" msgstr "Nós fora do Grupo" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtrar Nós" @@ -4712,6 +4747,10 @@ msgid "Idle" msgstr "Inativo" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Instalar..." + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Repetir" @@ -4740,7 +4779,6 @@ msgid "Last" msgstr "Último" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Todos" @@ -4754,8 +4792,8 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Inverter" +msgid "Reverse sorting." +msgstr "Inverter ordenação." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4834,32 +4872,32 @@ msgid "Rotation Step:" msgstr "Passo da rotação:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "Mover guia vertical" +msgid "Move Vertical Guide" +msgstr "Mover Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "Criar nova guia vertical" +msgid "Create Vertical Guide" +msgstr "Criar Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "Remover guia vertical" +msgid "Remove Vertical Guide" +msgstr "Remover Guia Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "Mover guia horizontal" +msgid "Move Horizontal Guide" +msgstr "Mover Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "Criar nova guia horizontal" +msgid "Create Horizontal Guide" +msgstr "Criar Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "Remover guia horizontal" +msgid "Remove Horizontal Guide" +msgstr "Remover Guia Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "Criar guias horizontal e vertical" +msgid "Create Horizontal and Vertical Guides" +msgstr "Criar Guias Horizontais e Verticais" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -5290,9 +5328,8 @@ msgstr "Carregar máscara de emissão" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Reiniciar agora" +msgstr "Reiniciar" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6201,18 +6238,16 @@ msgid "Find Next" msgstr "Localizar Seguinte" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Propriedades do Filtro" +msgstr "Scripts de filtro" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Alternar ordenação alfabética da lista de métodos." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Modo de filtro:" +msgstr "Métodos de filtro" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6444,10 +6479,18 @@ msgid "Syntax Highlighter" msgstr "Destaque de Sintaxe" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Ir Para" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "Marcadores" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Pontos de paragem" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6735,9 +6778,15 @@ msgid "Rear" msgstr "Trás" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "Alinhar com a Vista" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Alinhar seleção com vista" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Sem parente para criar instância de filho." @@ -6925,10 +6974,6 @@ msgid "Focus Selection" msgstr "Focar na seleção" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Alinhar seleção com vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Seleção de ferramenta" @@ -7489,14 +7534,6 @@ msgid "Transpose" msgstr "Transpor" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Espelho X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Espelho Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "Desativar Autotile" @@ -7892,6 +7929,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Alterado Tipo de Entrada do Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(Apenas GLES3)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Vértice" @@ -7976,6 +8017,22 @@ msgid "Color uniform." msgstr "Uniforme Cor." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Devolve o resultado lógico da comparação %s entre dois parâmetros." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "Igual (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "Maior Que (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "Maior ou Igual a (>=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7984,12 +8041,50 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" +"Devolve o resultado lógico da comparação entre INF e um parâmetro escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" +"Devolve o resultado lógico da comparação entre NaN e um parâmetro escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "Menor Que (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "Menor ou Igual a (<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "Diferente (!=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" "Devolve um vetor associado se o valor lógico fornecido for verdadeiro ou " "falso." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Devolve o resultado lógico da comparação entre dois parâmetros." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"Devolve o resultado lógico da comparação entre INF (ou NaN) e um parâmetro " +"escalar." + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "Constante Lógica." @@ -7998,43 +8093,36 @@ msgid "Boolean uniform." msgstr "Uniforme Lógico." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for all shader modes." -msgstr "parâmetro de entrada 'uv' para todos os modos shader." +msgstr "parâmetro de entrada '%s' para todos os modos shader." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." msgstr "Parâmetro de Entrada." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "parâmetro de entrada 'uv' para os modos shader vertex e fragment." +msgstr "parâmetro de entrada '%s' para os modos shader vertex e fragment." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." -msgstr "parâmetro de entrada 'view' para os modos shader fragment e light." +msgstr "parâmetro de entrada '%s' para os modos shader fragment e light." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "parâmetro de entrada 'side' para o modo shader fragment." +msgstr "parâmetro de entrada '%s' para o modo shader fragment." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "parâmetro de entrada 'diffuse' para o modo shader light." +msgstr "parâmetro de entrada '%s' para o modo shader light." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "parâmetro de entrada 'custom' para modo shader vertex." +msgstr "parâmetro de entrada '%s' para modo shader vertex." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "parâmetro de entrada 'uv' para os modos shader vertex e fragment." +msgstr "parâmetro de entrada '%s' para os modos shader vertex e fragment." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -8085,16 +8173,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Devolve o arco seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Apenas GLES3) Devolve o arco cosseno hiperbólico do parâmetro." +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "Devolve o arco cosseno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Devolve o arco seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "(Apenas GLES3) Devolve o arco seno hiperbólico do parâmetro." +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "Devolve o arco seno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8105,8 +8193,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Devolve o arco tangente do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Apenas GLES3) Devolve o arco tangente hiperbólico do parâmetro." +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "Devolve o arco tangente hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8122,8 +8210,8 @@ msgid "Returns the cosine of the parameter." msgstr "Devolve o cosseno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "(Apenas GLES3) Devolve o cosseno hiperbólico do parâmetro." +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "Devolve o cosseno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8191,12 +8279,12 @@ msgid "1.0 / scalar" msgstr "1.0 / escalar" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "(Apenas GLES3) Encontra o inteiro mais próximo do parâmetro." +msgid "Finds the nearest integer to the parameter." +msgstr "Encontra o inteiro mais próximo do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "(Apenas GLES3) Encontra o inteiro Ãmpar mais próximo do parâmetro." +msgid "Finds the nearest even integer to the parameter." +msgstr "Encontra o inteiro Ãmpar mais próximo do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8211,8 +8299,8 @@ msgid "Returns the sine of the parameter." msgstr "Devolve o seno do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "(Apenas GLES3) Devolve o seno hiperbólico do parâmetro." +msgid "Returns the hyperbolic sine of the parameter." +msgstr "Devolve o seno hiperbólico do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8247,12 +8335,12 @@ msgid "Returns the tangent of the parameter." msgstr "Devolve a tangente do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "(Apenas GLES3) Devolve a tangente hiperbólica do parâmetro." +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "Devolve a tangente hiperbólica do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "(Apenas GLES3) Encontra o valor truncado do parâmetro." +msgid "Finds the truncated value of the parameter." +msgstr "Encontra o valor truncado do parâmetro." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8291,12 +8379,16 @@ msgid "Perform the texture lookup." msgstr "Executa texture lookup." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." -msgstr "Uniforme Textura Cúbica." +msgid "Cubic texture uniform lookup." +msgstr "Consulta uniforme de textura cúbica." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." +msgstr "Consulta uniforme de textura 2D." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." -msgstr "Uniforme Textura 2D." +msgid "2D texture uniform lookup with triplanar." +msgstr "Consulta uniforme de textura 2D com triplanar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." @@ -8304,7 +8396,7 @@ msgstr "Função Transformação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8312,7 +8404,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(Apenas GLES3) Calcula o produto tensorial de um par de vetores.\n" +"Calcula o produto tensorial de um par de vetores.\n" "\n" "OuterProduct trata o primeiro parâmetro 'c' como um vetor coluna (matriz com " "uma coluna) e o segundo parâmetro 'r' como um vetor linha (matriz com uma " @@ -8329,16 +8421,16 @@ msgid "Decomposes transform to four vectors." msgstr "Decompõe transformação em quatro vetores." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "(Apenas GLES3) Calcula o determinante de uma transformação." +msgid "Calculates the determinant of a transform." +msgstr "Calcula o determinante de uma transformação." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "(Apenas GLES3) Calcula o inverso de uma transformação." +msgid "Calculates the inverse of a transform." +msgstr "Calcula o inverso de uma transformação." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "(Apenas GLES3) Calcula a transposta de uma transformação." +msgid "Calculates the transpose of a transform." +msgstr "Calcula a transposta de uma transformação." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8386,7 +8478,7 @@ msgstr "Calcula o produto escalar de dois vetores." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8418,14 +8510,14 @@ msgstr "1.0 / vetor" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" "Devolve um vetor que aponta na direção da reflexão ( a : vetor incidente, " "b : vetor normal )." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "Devolve um vetor que aponta na direção da refração." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8524,60 +8616,57 @@ msgstr "" "da câmara (passa entradas associadas)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "(Apenas GLES3) (apenas modo Fragment/Light) Função derivada escalar." +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(Apenas modo Fragment/Light) Função derivada escalar." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "(Apenas GLES3) (apenas modo Fragment/Light) Função derivada vetorial." +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(Apenas modo Fragment/Light) Função derivada vetorial." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." -msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) Derivação em 'x' usando " -"derivação local." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." +msgstr "(Apenas modo Fragment/Light) Derivada em 'x' usando derivação local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Escalar) Derivação em 'x' " -"usando derivação local." +"(Apenas modo Fragment/Light) (Escalar) Derivada em 'x' usando derivação " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Vetor) Derivação em 'y' usando " -"derivação local." +"(Apenas modo Fragment/Light) (Vetor) Derivada em 'y' usando derivação local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Escalar) Derivação em 'y' " -"usando derivação local." +"(Apenas modo Fragment/Light) (Escalar) Derivada em 'y' usando derivação " +"local." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Vetor) Soma das derivadas " -"absolutas em 'x' e 'y'." +"(Apenas modo Fragment/Light) (Vetor) Soma das derivadas absolutas em 'x' e " +"'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" -"(Apenas GLES3) (apenas modo Fragment/Light) (Escalar) Soma das derivadas " -"absolutas em 'x' e 'y'." +"(Apenas modo Fragment/Light) (Escalar) Soma das derivadas absolutas em 'x' e " +"'y'." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -9789,9 +9878,8 @@ msgid "Add Child Node" msgstr "Adicionar Nó filho" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "Colapsar Tudo" +msgstr "Expandir/Colapsar Tudo" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9802,6 +9890,11 @@ msgid "Extend Script" msgstr "Estender Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Recolocar Nó" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Tornar Nó Raiz" @@ -9822,9 +9915,8 @@ msgid "Delete (No Confirm)" msgstr "Apagar (sem confirmação)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Adicionar/criar novo Nó" +msgstr "Adicionar/Criar Novo Nó." #: editor/scene_tree_dock.cpp msgid "" @@ -10019,8 +10111,8 @@ msgid "Script is valid." msgstr "Script é válido." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "Permitido: a-z, A-Z, 0-9 e _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "Permitido: a-z, A-Z, 0-9, _ e ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -10074,7 +10166,7 @@ msgstr "Rastreamento de Pilha" msgid "Pick one or more items from the list to display the graph." msgstr "Escolha um ou mais itens da lista para exibir o gráfico." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Erros" @@ -10476,54 +10568,6 @@ msgstr "Distância de escolha:" msgid "Class name can't be a reserved keyword" msgstr "Nome de classe não pode ser uma palavra-chave reservada" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "A gerar soluções..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "A gerar projeto C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Falha ao criar solução." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Falha ao guardar solução." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Feito" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "Falha ao criar projeto C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Sobre o suporte C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Criar solução C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Builds" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Construir Projeto" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Ver log" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Fim do stack trace de exceção interna" @@ -11139,11 +11183,11 @@ msgstr "Dimensões inválidas da imagem do ecrã inicial (deve ser 620x300)." #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" -"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade " -"'Frames' para que AnimatedSprite mostre Frames." +"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade \"Frames" +"\" para que AnimatedSprite mostre frames." #: scene/2d/canvas_modulate.cpp msgid "" @@ -11207,11 +11251,11 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "Uma textura com a forma da luz tem de ser disponibilizada na Propriedade " -"'textura'." +"\"Textura\"." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -11221,8 +11265,8 @@ msgstr "" "efeito." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" -msgstr "O PolÃgono oclusor deste Oclusor está vazio. Desenhe um PolÃgono!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "O polÃgono oclusor deste oclusor está vazio. Desenhe um polÃgono." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11308,27 +11352,26 @@ msgid "" msgstr "Falta uma pose DESCANSO a este osso. Vá ao nó Skeleton2D e defina uma." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D serve apenas para fornecer uma forma de colisão a um Nó " -"derivado de CollisionObject2D. Use-o apenas como um filho de Area2D, " -"StaticBody2D, RigidBody2D, KinematicBody2D, etc. para lhes dar uma forma." +"TileMap com Usar Parente ativo precisa de um parente CollisionObject2D para " +"lhe dar formas. Use-o como um filho de Area2D, StaticBody2D, RigidBody2D, " +"KinematicBody2D, etc. para lhes dar uma forma." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" -"VisibilityEnable2D funciona melhor quando usado diretamente como parente na " +"VisibilityEnabler2D funciona melhor quando usado diretamente como parente na " "Cena raiz editada." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera precisa de um Nó ARVROrigin como parente" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera precisa de um Nó ARVROrigin como parente." #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -11420,10 +11463,10 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Uma forma tem de ser fornecida para CollisionShape funcionar. Crie um " -"recurso forma!" +"recurso forma." #: scene/3d/collision_shape.cpp msgid "" @@ -11457,6 +11500,10 @@ msgstr "" "Sondas GI não são suportadas pelo driver vÃdeo GLES2.\n" "Em vez disso, use um BakedLightmap." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "Uma SpotLight com ângulo superior a 90 graus não cria sombras." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11501,11 +11548,11 @@ msgstr "PathFollow apenas funciona quando definido como filho de um Nó Path." #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED requer \"Up Vector\" habilitado no recurso de " -"Curva do Caminho do seu pai." +"ROTATION_ORIENTED de PathFollow requer \"Up Vector\" habilitado no recurso " +"de Curva do Caminho do seu pai." #: scene/3d/physics_body.cpp msgid "" @@ -11518,10 +11565,12 @@ msgstr "" "Mude antes o tamanho das formas de colisão filhas." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" -"Para funcionar, a Propriedade Caminho tem de apontar para um Nó Spatial " -"válido." +"Para funcionar, a Propriedade \"Caminho Remoto\" tem de apontar para um Nó " +"Spatial válido ou seu derivado." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -11539,11 +11588,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade " -"'Frames' de forma a que AnimatedSprite3D mostre frames." +"Um recurso SpriteFrames tem de ser criado ou definido na Propriedade \"Frames" +"\" de forma a que AnimatedSprite3D mostre frames." #: scene/3d/vehicle_body.cpp msgid "" @@ -11554,8 +11603,12 @@ msgstr "" "filho de VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment precisa de um recurso Environment." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WorldEnvironment exige que a sua propriedade \"Ambiente\" contenha um " +"Ambiente para obter efeitos visÃveis." #: scene/3d/world_environment.cpp msgid "" @@ -11593,8 +11646,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Nada conectado à entrada '%s' do nó '%s'." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." -msgstr "Não foi definida um AnimationNode raiz para o gráfico." +msgid "No root AnimationNode for the graph is set." +msgstr "Não foi definida uma raÃz AnimationNode para o gráfico." #: scene/animation/animation_tree.cpp msgid "Path to an AnimationPlayer node containing animations is not set." @@ -11607,8 +11660,8 @@ msgstr "" "O caminho definido para AnimationPlayer não conduz a um nó AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "A raiz de AnimationPlayer não é um nó válido." +msgid "The AnimationPlayer root node is not a valid node." +msgstr "O Nó raiz de AnimationPlayer não é um Nó válido." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11620,12 +11673,11 @@ msgstr "Escolha uma cor do ecrã." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "Direção" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11636,23 +11688,23 @@ msgid "Add current color as a preset." msgstr "Adicionar cor atual como predefinição." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "Por si só um Contentor não tem utilidade, a não ser que um script configure " "a disposição dos seu filhos.\n" -"Se não pretende adicionar um script, será preferÃvel usar um simples Nó " -"'Control'." +"Se não pretende adicionar um script, use antes um simples Nó Control." #: scene/gui/control.cpp msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"A Etiqueta de Sugestão não será exibida porque o Filtro de Rato do controle " +"está definido como \"Ignorar\". Em alternativa, defina o Filtro de Rato para " +"\"Parar\" ou \"Passar\"." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11665,25 +11717,25 @@ msgstr "Confirme por favor..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Popups estão escondidas por defeito a não ser que chame popup() ou qualquer " -"das funções popup*(). Torná-las visÃveis para edição é aceitável, mas serão " -"escondidas na execução." +"das funções popup*(). Torná-las visÃveis para edição é aceitável, mas " +"estarão escondidas na execução." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "Se exp_edit é verdadeiro min_value tem de ser > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "Se \"Exp Edit\" está ativado, \"Min Value\" tem de ser maior que 0." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" -"ScrollContainer está destinado a funcionar com um único controlo filho.\n" -"Use um contentor como filho (VBox,HBox,etc), um um Control e defina o " +"ScrollContainer deve ser usado com um único controlo filho.\n" +"Use um contentor como filho (VBox, HBox, etc.), ou um Control e defina o " "tamanho mÃnimo manualmente." #: scene/gui/tree.cpp @@ -11731,9 +11783,17 @@ msgid "Input" msgstr "Entrada" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "Fonte inválida para previsualização." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Fonte inválida para Shader." +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "Função de comparação inválida para este tipo." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Atribuição a função." @@ -11750,6 +11810,66 @@ 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 "Previous Folder" +#~ msgstr "Pasta Anterior" + +#~ msgid "Next Folder" +#~ msgstr "Próxima Pasta" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Abrir Capturas do ecrã automaticamente" + +#~ msgid "Open in an external image editor." +#~ msgstr "Abrir num editor de imagem externo." + +#~ msgid "Reverse" +#~ msgstr "Inverter" + +#~ msgid "Mirror X" +#~ msgstr "Espelho X" + +#~ msgid "Mirror Y" +#~ msgstr "Espelho Y" + +#~ msgid "Generating solution..." +#~ msgstr "A gerar soluções..." + +#~ msgid "Generating C# project..." +#~ msgstr "A gerar projeto C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "Falha ao criar solução." + +#~ msgid "Failed to save solution." +#~ msgstr "Falha ao guardar solução." + +#~ msgid "Done" +#~ msgstr "Feito" + +#~ msgid "Failed to create C# project." +#~ msgstr "Falha ao criar projeto C#." + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "Sobre o suporte C#" + +#~ msgid "Create C# solution" +#~ msgstr "Criar solução C#" + +#~ msgid "Builds" +#~ msgstr "Builds" + +#~ msgid "Build Project" +#~ msgstr "Construir Projeto" + +#~ msgid "View log" +#~ msgstr "Ver log" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment precisa de um recurso Environment." + #~ msgid "Enabled Classes" #~ msgstr "Ativar Classes" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 3ed7b5d092..efb7ff3a4c 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -136,6 +136,31 @@ msgstr "Anim Schimbare apelare" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim SchimbaÈ›i Timpul Cadru Cheie" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim SchimbaÈ›i TranziÈ›ie" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Schimbare transformare" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Schimbare valoare cadre cheie" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Schimbare apelare" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Schimbă Numele AnimaÈ›iei:" @@ -654,6 +679,10 @@ msgstr "DuceÈ›i-vă la Linie" msgid "Line Number:" msgstr "Linia Numărul:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Nici o Potrivire" @@ -703,7 +732,7 @@ msgstr "Zoom-aÈ›i Afară" msgid "Reset Zoom" msgstr "ResetaÈ›i Zoom-area" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -816,6 +845,11 @@ msgid "Connect" msgstr "ConectaÈ›i" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Semnale:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "ConectaÈ›i '%s' la '%s'" @@ -987,7 +1021,8 @@ msgid "Owners Of:" msgstr "Stăpâni La:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "ȘtergeÈ›i fiÈ™ierele selectate din proiect? (fără anulare)" #: editor/dependency_editor.cpp @@ -1173,7 +1208,6 @@ msgid "Success!" msgstr "Succes!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "InstalaÈ›i" @@ -1544,6 +1578,10 @@ msgstr "" msgid "Template file not found:" msgstr "FiÈ™ierul È™ablon nu a fost găsit:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1742,7 +1780,7 @@ msgstr "ArătaÈ›i în Administratorul de FiÈ™iere" msgid "New Folder..." msgstr "Director Nou..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "ReîmprospătaÈ›i" @@ -1793,7 +1831,7 @@ msgstr "ÃŽnainte" msgid "Go Up" msgstr "Sus" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "ComutaÈ›i FiÈ™iere Ascunse" @@ -1819,27 +1857,32 @@ msgstr "DeplasaÈ›i Favorit Jos" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Fila anterioară" +msgid "Go to previous folder." +msgstr "AccesaÈ›i Directorul Părinte" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "CreaÈ›i Director" +msgid "Go to next folder." +msgstr "AccesaÈ›i Directorul Părinte" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "AccesaÈ›i Directorul Părinte" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Căutare Clase" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Directorul nu a putut fi creat." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "ComutaÈ›i FiÈ™iere Ascunse" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2597,6 +2640,11 @@ msgid "Go to previously opened scene." msgstr "Mergi la o scenă deschisă anterior." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "CopiaÅ£i Calea" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Fila următoare" @@ -2811,15 +2859,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Setări ale Editorului" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Deschide Editorul următor" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Comută în Ecran Complet" @@ -3146,6 +3185,11 @@ msgid "Calls" msgstr "Apeluri" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Membri" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3789,6 +3833,7 @@ msgid "Nodes not in Group" msgstr "Adaugă în Grup" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4881,6 +4926,11 @@ msgid "Idle" msgstr "Inactiv" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "InstalaÈ›i" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Reîncearcă" @@ -4912,7 +4962,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Toate" @@ -4926,8 +4975,9 @@ msgid "Sort:" msgstr "Sorare:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Revers" +#, fuzzy +msgid "Reverse sorting." +msgstr "Se Solicită..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -5008,31 +5058,38 @@ msgid "Rotation Step:" msgstr "Pas RotaÈ›ie:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Mută ghidul vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Creează un nou ghid vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Elimină ghidul vertical" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Mută ghidul orizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Creează un nou ghid orizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Elimină ghidul orizontal" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Creează ghizi noi orizontal È™i vertical" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6690,10 +6747,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Șterge puncte" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6993,7 +7059,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7182,10 +7252,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7776,14 +7842,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8214,6 +8272,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8305,6 +8367,22 @@ msgid "Color uniform." msgstr "Anim Schimbare transformare" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8312,10 +8390,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8407,7 +8519,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8415,7 +8527,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8427,7 +8539,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8444,7 +8556,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8513,11 +8625,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8533,7 +8645,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8561,11 +8673,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8606,11 +8718,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8620,7 +8736,7 @@ msgstr "Crează Poligon" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8638,15 +8754,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8698,7 +8814,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8726,12 +8842,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8808,47 +8924,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10044,6 +10160,11 @@ msgstr "Execută Scriptul" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "CreaÈ›i %s Nou" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Salvează Scena" @@ -10261,7 +10382,7 @@ msgid "Script is valid." msgstr "Arborele AnimaÈ›iei este valid." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10319,7 +10440,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10728,54 +10849,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "Vizualizează fiÈ™iere log" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11363,7 +11436,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11412,7 +11485,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11422,7 +11495,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11498,12 +11571,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11582,7 +11655,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11611,6 +11684,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11645,8 +11722,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11657,7 +11734,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11673,7 +11752,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11684,7 +11763,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11722,7 +11803,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "DeconectaÈ›i '%s' de la '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11736,7 +11817,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Arborele AnimaÈ›iei este nevalid." #: scene/animation/animation_tree_player.cpp @@ -11767,8 +11848,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11788,18 +11868,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11843,9 +11923,17 @@ msgid "Input" msgstr "Adaugă Intrare(Input)" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11863,6 +11951,24 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Fila anterioară" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "CreaÈ›i Director" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Deschide Editorul următor" + +#~ msgid "Reverse" +#~ msgstr "Revers" + +#~ msgid "View log" +#~ msgstr "Vizualizează fiÈ™iere log" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Căutare Clase" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index b83c56eff5..24fb5100bb 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -50,12 +50,15 @@ # Dark King <damir@t1c.ru>, 2019. # Teashrock <kajitsu22@gmail.com>, 2019. # Дмитрий Ефимов <daefimov@gmail.com>, 2019. +# Sergey <www.window1@mail.ru>, 2019. +# Vladislav <onion.ring@mail.ru>, 2019. +# knightpp <kotteam99@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:48+0000\n" -"Last-Translator: Дмитрий Ефимов <daefimov@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" +"Last-Translator: knightpp <kotteam99@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -124,9 +127,8 @@ msgid "Time:" msgstr "ВремÑ:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Value:" -msgstr "Значение" +msgstr "Значение:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" @@ -177,6 +179,31 @@ msgid "Anim Change Call" msgstr "Изменить вызов анимации" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Изменить Ð²Ñ€ÐµÐ¼Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð¾Ð³Ð¾ кадра" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Изменить переход" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Изменить положение" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Измененить значение ключевого кадра" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Изменить вызов анимации" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Изменить длину анимации" @@ -482,7 +509,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "Внимание: Редактирование импортированной анимации. " #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -502,9 +529,8 @@ msgid "Group tracks by node or display them as plain list." msgstr "Группировать треки по узлам или показывать их как проÑтой ÑпиÑок." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Snap:" -msgstr "ПривÑзка" +msgstr "ПривÑзка:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -668,6 +694,10 @@ msgstr "Перейти к Ñтроке" msgid "Line Number:" msgstr "Ðомер Ñтроки:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Ðайдено %d Ñовпадений." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Ðет Ñовпадений" @@ -717,7 +747,7 @@ msgstr "Отдалить" msgid "Reset Zoom" msgstr "СброÑить приближение" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "ПредупреждениÑ" @@ -726,9 +756,8 @@ msgid "Line and column numbers." msgstr "Ðомера Ñтрок и Ñтолбцов." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "Метод должен быть указан в целевом Узле!" +msgstr "Метод должен быть указан в целевом Узле. " #: editor/connections_dialog.cpp msgid "" @@ -739,9 +768,8 @@ msgstr "" "целевой узел." #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "ПриÑоединить к узлу:" +msgstr "ПриÑоединить к Узлу:" #: editor/connections_dialog.cpp msgid "Connect to Script:" @@ -753,9 +781,8 @@ msgid "From Signal:" msgstr "Сигналы:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Scene does not contain any script." -msgstr "Узел не Ñодержит геометрии." +msgstr "Узел не Ñодержит Ñкрипт." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -795,6 +822,8 @@ msgstr "Отложенное" msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" +"Откладывает Ñигнал, Ñ…Ñ€Ð°Ð½Ñ ÐµÐ³Ð¾ в очереди и выполнÑет его только в режиме " +"проÑтоÑ." #: editor/connections_dialog.cpp msgid "Oneshot" @@ -827,6 +856,11 @@ msgid "Connect" msgstr "ПриÑоединить" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Сигналы:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "ПриÑоединить '%s' к '%s'" @@ -848,14 +882,12 @@ msgid "Disconnect" msgstr "ОтÑоединить" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect a Signal to a Method" -msgstr "Подключить Ñигнал: " +msgstr "Подключить Сигнал к Методу: " #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "Редактировать Подключение: " +msgstr "Редактировать Подключение:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -931,22 +963,20 @@ msgid "Dependencies For:" msgstr "ЗавиÑимоÑти длÑ:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" "Сцена '%s' в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€ÑƒÐµÑ‚ÑÑ.\n" -"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ вÑтупÑÑ‚ в Ñилу без перезапуÑка." +"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу только поÑле перезапуÑка." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" -"РеÑурÑу '% s' иÑпользуетÑÑ.\n" -"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу поÑле перезапуÑка." +"РеÑÑƒÑ€Ñ '%s' иÑпользуетÑÑ.\n" +"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу только поÑле перезапуÑка." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -993,7 +1023,8 @@ msgid "Owners Of:" msgstr "Владельцы:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Удалить выбранный файл из проекта? (ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)" #: editor/dependency_editor.cpp @@ -1038,9 +1069,8 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "ÐавÑегда удалить %d Ñлемент(ов)? (ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "ЗавиÑимоÑти" +msgstr "Показать завиÑимоÑти" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" @@ -1176,7 +1206,6 @@ msgid "Success!" msgstr "УÑпех!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "УÑтановить" @@ -1303,7 +1332,7 @@ msgstr "Открыть раÑкладку звуковой шины" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "Файла '%s' не ÑущеÑтвует." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -1360,29 +1389,21 @@ msgid "Valid characters:" msgstr "ДопуÑтимые Ñимволы:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing engine class name." -msgstr "" -"ÐедопуÑтимое имÑ. Ðе должно конфликтовать Ñ ÑущеÑтвующим именем клаÑÑа " -"движка." +msgstr "Ðе должно конфликтовать Ñ ÑущеÑтвующим именем клаÑÑа движка." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "" -"ÐедопуÑтимое имÑ. Ðе должно конфликтовать Ñ ÑущеÑтвующим вÑтроенным именем " -"типа." +msgstr "Ðе должно конфликтовать Ñ ÑущеÑтвующим вÑтроенным именем типа." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." -msgstr "" -"ÐедопуÑтимое имÑ. Ðе должно конфликтовать Ñ ÑущеÑтвующим глобальным именем " -"конÑтанты." +msgstr "Ðе должно конфликтовать Ñ ÑущеÑтвующим глобальным именем конÑтанты." #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "Ключевое Ñлово Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать как Ð¸Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -1413,7 +1434,6 @@ msgid "Rearrange Autoloads" msgstr "ПереÑтановка автозагрузок" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." msgstr "ÐедопуÑтимый путь." @@ -1468,9 +1488,8 @@ msgid "[unsaved]" msgstr "[не Ñохранено]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "ПожалуйÑта, выберите базовый каталог" +msgstr "ПожалуйÑта, выберите базовый каталог." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1553,15 +1572,18 @@ msgstr "ПользовательÑкий релизный шаблон не на msgid "Template file not found:" msgstr "Файл шаблона не найден:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"Ðа 32-Ñ… битных ÑиÑтемах вÑтроенный PCK файл не может быть больше 4 Гбит." + #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "Редактор" +msgstr "3D Редактор" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "Открыть редактор Ñкриптов" +msgstr "Редактор Ñкриптов" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1596,25 +1618,26 @@ msgstr "Заменить вÑÑ‘ (без возможноÑти отмены)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" msgstr "" +"Ðазвание Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ быть корректным именем файла и не Ñодержать '.'" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." -msgstr "Файл или папка Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует." +msgstr "Профиль Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует." #: editor/editor_feature_profile.cpp +#, fuzzy msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(Редактор отключен, СвойÑтва отключены)" #: editor/editor_feature_profile.cpp #, fuzzy msgid "(Properties Disabled)" -msgstr "Только ÑвойÑтва" +msgstr "(СвойÑтва отключены)" #: editor/editor_feature_profile.cpp #, fuzzy msgid "(Editor Disabled)" -msgstr "Отключить обрезку" +msgstr "(Редактор отключен)" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1650,6 +1673,7 @@ msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"Профиль '%s' уже ÑущеÑтвует. Удалите его перед импортом, импорт отменен." #: editor/editor_feature_profile.cpp #, fuzzy @@ -1658,7 +1682,7 @@ msgstr "Ошибка при загрузке шаблона '%s'" #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "СброÑить" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1749,7 +1773,7 @@ msgstr "ПроÑмотреть в проводнике" msgid "New Folder..." msgstr "ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Обновить" @@ -1800,7 +1824,7 @@ msgstr "Вперёд" msgid "Go Up" msgstr "Вверх" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Скрыть файлы" @@ -1825,24 +1849,31 @@ msgid "Move Favorite Down" msgstr "ПеремеÑтить избранное вниз" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" +#, fuzzy +msgid "Go to previous folder." +msgstr "Перейти к родительÑкой папке." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" +#, fuzzy +msgid "Go to next folder." +msgstr "Перейти к родительÑкой папке." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Перейти к родительÑкой папке." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ПоиÑк файлов" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Добавить или удалить текущую папку из избранных." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Скрыть файлы" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2423,8 +2454,8 @@ msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." msgstr "" -"Ðевозможно загрузить Ñкрипт аддона из иÑточника: \"% s\". Ð’ коде еÑть " -"ошибка. ПожалуйÑта, проверьте ÑинтакÑиÑ." +"Ðевозможно загрузить Ñкрипт аддона из иÑточника: '%s' Ð’ коде еÑть ошибка. " +"ПожалуйÑта, проверьте ÑинтакÑиÑ." #: editor/editor_node.cpp msgid "" @@ -2526,7 +2557,7 @@ msgstr "Закрыть другие вкладки" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "Закрыть вкладки Ñправа" #: editor/editor_node.cpp #, fuzzy @@ -2574,6 +2605,11 @@ msgid "Go to previously opened scene." msgstr "Перейти к предыдущей открытой Ñцене." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Копировать путь" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°" @@ -2665,7 +2701,7 @@ msgstr "Открыть папку Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ проекта" #: editor/editor_node.cpp msgid "Install Android Build Template" -msgstr "" +msgstr "УÑтановить шаблон Ñборки Android" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2786,15 +2822,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Открыть папку Данные/ÐаÑтройки редактора" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Открыть Ñледующий редактор" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Переключить полноÑкранный режим" @@ -2952,6 +2979,8 @@ msgstr "Ðе ÑохранÑть" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." msgstr "" +"Шаблон Ñборки Android отÑутÑтвует, пожалуйÑта, уÑтановите ÑоответÑтвующие " +"шаблоны." #: editor/editor_node.cpp #, fuzzy @@ -3114,6 +3143,11 @@ msgid "Calls" msgstr "Вызовы" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Редактировать тему..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Вкл" @@ -3739,6 +3773,7 @@ msgid "Nodes not in Group" msgstr "Узлы не в Группе" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð²" @@ -4789,6 +4824,11 @@ msgid "Idle" msgstr "ПроÑтой" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "УÑтановить" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Повторить" @@ -4817,7 +4857,6 @@ msgid "Last" msgstr "ПоÑледнÑÑ" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Ð’Ñе" @@ -4831,8 +4870,9 @@ msgid "Sort:" msgstr "Сортировать:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Обратно" +#, fuzzy +msgid "Reverse sorting." +msgstr "Запрашиваю..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4912,31 +4952,38 @@ msgid "Rotation Step:" msgstr "Шаг поворота:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Перемещение вертикальной направлÑющей" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Создать вертикальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Убрать вертикальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "ПеремеÑтить горизонтальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Создать новую горизонтальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Удалить горизонтальную направлÑющую" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Создание новых горизонтальных и вертикальных направлÑющих" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6561,10 +6608,19 @@ msgid "Syntax Highlighter" msgstr "ПодÑветка СинтакÑиÑа" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Создать точки." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6860,9 +6916,14 @@ msgstr "Зад" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "ВыравнÑть Ñ Ð¾Ð±Ð»Ð°Ñтью проÑмотра" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "СовмеÑтить выбранное Ñ Ð²Ð¸Ð´Ð¾Ð¼" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Ðе выбран родитель Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ°." @@ -7053,10 +7114,6 @@ msgid "Focus Selection" msgstr "Показать выбранное" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "СовмеÑтить выбранное Ñ Ð²Ð¸Ð´Ð¾Ð¼" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "ИнÑтрумент выбора" @@ -7644,14 +7701,6 @@ msgid "Transpose" msgstr "ТранÑпонировать" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Зеркально по X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Зеркально по Y" - -#: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Disable Autotile" msgstr "Ðвтотайлы" @@ -8074,6 +8123,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Изменен тип ввода Визуального Шейдера" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Вершины" @@ -8165,6 +8218,22 @@ msgid "Color uniform." msgstr "ОчиÑтить преобразование" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8172,10 +8241,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "Изменить векторную конÑтанту" @@ -8268,7 +8371,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8276,7 +8379,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8288,7 +8391,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8305,7 +8408,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8374,11 +8477,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8394,7 +8497,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8422,11 +8525,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8469,12 +8572,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "Изменить текÑтурную единицу" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup." msgstr "Изменить текÑтурную единицу" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "Изменить текÑтурную единицу" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8484,7 +8592,7 @@ msgstr "Окно преобразованиÑ..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8502,15 +8610,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8563,7 +8671,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8591,12 +8699,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8675,47 +8783,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9958,6 +10066,11 @@ msgid "Extend Script" msgstr "РаÑширить Ñкрипт" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Переподчинить узел" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Создать корневой узел Ñцены" @@ -10191,7 +10304,8 @@ msgid "Script is valid." msgstr "Скрипт корректен" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "ДопуÑкаютÑÑ: a-z, A-Z, 0-9 и _" #: editor/script_create_dialog.cpp @@ -10250,7 +10364,7 @@ msgid "Pick one or more items from the list to display the graph." msgstr "" "Выбрать один или неÑколько Ñлементов из ÑпиÑка, чтобы отобразить график." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Ошибки" @@ -10653,54 +10767,6 @@ msgstr "РаÑÑтоÑние выбора:" msgid "Class name can't be a reserved keyword" msgstr "Ð˜Ð¼Ñ ÐºÐ»Ð°ÑÑа не может быть зарезервированным ключевым Ñловом" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Создание C# проекта..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Ðе удалоÑÑŒ Ñоздать решение." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Ðе удалоÑÑŒ Ñохранить решение." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Готово" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "Ðе удалоÑÑŒ Ñоздать C# проект." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Моно" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "О C# поддержке" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Создать C# решение" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "Билды" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Собрать проект" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "ПроÑмотр журнала" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Конец траÑÑировки внутреннего Ñтека иÑключений" @@ -11292,8 +11358,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Ðеверные размеры заÑтавки (должны быть 620x300)." #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Чтобы AnimatedSprite отображал кадры, пожалуйÑта уÑтановите или Ñоздайте " @@ -11361,8 +11428,9 @@ msgstr "" "включенной функцией \"Particles Animation\"." #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" "ТекÑтуры Ñ Ñ„Ð¾Ñ€Ð¼Ð¾Ð¹ Ñвета должны быть предоÑтавлены параметру \"texture\"." @@ -11375,7 +11443,8 @@ msgstr "" "чтобы работать." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" "ЗаÑлонÑющий полигон Ð´Ð»Ñ Ñтого окклюдера пуÑÑ‚. ПожалуйÑта, нариÑуйте полигон!" @@ -11479,15 +11548,17 @@ msgstr "" "им форму." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D работает наилучшим образом при иÑпользовании ÐºÐ¾Ñ€Ð½Ñ " "редактируемой Ñцены, как прÑмого родителÑ." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "ARVRCamera должна иметь узел ARVROrigin в качеÑтве предка" #: scene/3d/arvr_nodes.cpp @@ -11583,9 +11654,10 @@ msgstr "" "Area, StaticBody, RigidBody, KinematicBody и др. чтобы придать им форму." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Shape должен быть предуÑмотрен Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ CollisionShape. ПожалуйÑта, " "Ñоздайте shape-реÑÑƒÑ€Ñ Ð´Ð»Ñ Ñтого!" @@ -11623,6 +11695,10 @@ msgstr "" "GIProbes не поддерживаютÑÑ Ð²Ð¸Ð´ÐµÐ¾Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð¾Ð¼ GLES2.\n" "ВмеÑто Ñтого иÑпользуйте BakedLightmap." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11665,9 +11741,10 @@ msgid "PathFollow only works when set as a child of a Path node." msgstr "PathFollow работает только при еÑли она дочь узла Path." #: scene/3d/path.cpp +#, fuzzy msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" "PathFollow ROTATION_ORIENTED требует Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"Up Vector\" в " "родительÑком реÑурÑе Path's Curve." @@ -11683,7 +11760,10 @@ msgstr "" "Измените размер дочерней формы коллизии." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "СвойÑтво Path должно указывать на дейÑтвительный Spatial узел." #: scene/3d/soft_body.cpp @@ -11703,8 +11783,9 @@ msgstr "" "shapes)." #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "Чтобы AnimatedSprite3D отображал кадры, пожалуйÑта уÑтановите или Ñоздайте " @@ -11719,8 +11800,10 @@ msgstr "" "ребенка VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment необходим Environment реÑурÑ." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" #: scene/3d/world_environment.cpp msgid "" @@ -11758,7 +11841,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Ðичего не подключено к входу \"%s\" узла \"%s\"." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +#, fuzzy +msgid "No root AnimationNode for the graph is set." msgstr "Ðе задан корневой AnimationNode Ð´Ð»Ñ Ð³Ñ€Ð°Ñ„Ð°." #: scene/animation/animation_tree.cpp @@ -11770,7 +11854,8 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "Путь, заданный Ð´Ð»Ñ AnimationPlayer, не ведет к узлу AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +#, fuzzy +msgid "The AnimationPlayer root node is not a valid node." msgstr "Корневой Ñлемент AnimationPlayer недейÑтвительный." #: scene/animation/animation_tree_player.cpp @@ -11804,8 +11889,7 @@ msgstr "Добавить текущий цвет как преÑет" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "Контейнер Ñам по Ñебе не имеет ÑмыÑла, пока Ñкрипт не наÑтроит режим " "Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ детей.\n" @@ -11827,23 +11911,26 @@ msgid "Please Confirm..." msgstr "Подтверждение..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "ПоÑле запуÑка вÑплывающие окна по умолчанию Ñкрыты, Ð´Ð»Ñ Ð¸Ñ… Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ " "иÑпользуйте функцию popup() или любую из popup*(). Делать их видимыми Ð´Ð»Ñ " "Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - нормально, но они будут Ñкрыты при запуÑке." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +#, fuzzy +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "ЕÑли exp_edit равен true min_value должно быть > 0." #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer предназначен Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð¾Ð´Ð½Ð¸Ð¼ дочерним Ñлементом " @@ -11898,9 +11985,19 @@ msgid "Input" msgstr "Вход" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "ÐедейÑтвительный иÑточник шейдера." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "ÐедейÑтвительный иÑточник шейдера." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "ÐедейÑтвительный иÑточник шейдера." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "Ðазначение функции." @@ -11915,7 +12012,68 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть назначены только Ð #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "КонÑтанты не могут быть изменены." + +#~ msgid "Previous Folder" +#~ msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" + +#~ msgid "Next Folder" +#~ msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "ÐвтоматичеÑки открывать Ñкриншоты" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Открыть Ñледующий редактор" + +#~ msgid "Reverse" +#~ msgstr "Обратно" + +#~ msgid "Mirror X" +#~ msgstr "Зеркально по X" + +#~ msgid "Mirror Y" +#~ msgstr "Зеркально по Y" + +#~ msgid "Generating solution..." +#~ msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ..." + +#~ msgid "Generating C# project..." +#~ msgstr "Создание C# проекта..." + +#~ msgid "Failed to create solution." +#~ msgstr "Ðе удалоÑÑŒ Ñоздать решение." + +#~ msgid "Failed to save solution." +#~ msgstr "Ðе удалоÑÑŒ Ñохранить решение." + +#~ msgid "Done" +#~ msgstr "Готово" + +#~ msgid "Failed to create C# project." +#~ msgstr "Ðе удалоÑÑŒ Ñоздать C# проект." + +#~ msgid "Mono" +#~ msgstr "Моно" + +#~ msgid "About C# support" +#~ msgstr "О C# поддержке" + +#~ msgid "Create C# solution" +#~ msgstr "Создать C# решение" + +#~ msgid "Builds" +#~ msgstr "Билды" + +#~ msgid "Build Project" +#~ msgstr "Собрать проект" + +#~ msgid "View log" +#~ msgstr "ПроÑмотр журнала" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment необходим Environment реÑурÑ." #, fuzzy #~ msgid "Enabled Classes" diff --git a/editor/translations/si.po b/editor/translations/si.po index c4c0ab789a..68f2b09028 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -128,6 +128,31 @@ msgstr "Anim à¶šà·à¶¯à·€à·“ම් වෙනස් කරන්න" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim කීෆ්â€à¶»à·šà¶¸à·Š à¶šà·à¶½à¶º වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim සංක්රමණය වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim පරිවර්à¶à¶±à¶º වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim කීෆ්â€à¶»à·šà¶¸à·Š අගය වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim à¶šà·à¶¯à·€à·“ම් වෙනස් කරන්න" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "සජීවීකරණ පුනරà·à·€à¶»à·Šà¶®à¶±à¶º" @@ -625,6 +650,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -674,7 +703,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -778,6 +807,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -936,7 +969,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1112,7 +1145,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1471,6 +1503,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1641,7 +1677,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1692,7 +1728,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1717,23 +1753,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2408,6 +2448,10 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2599,14 +2643,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2921,6 +2957,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3516,6 +3556,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4547,6 +4588,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4575,7 +4620,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4589,7 +4633,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4664,31 +4708,33 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "à·ƒà·à¶¯à¶±à·Šà¶±" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "මෙම ලුහුබදින්න෠ඉවà¶à·Š කරන්න." #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6254,10 +6300,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6543,7 +6597,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6728,10 +6786,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7296,14 +7350,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7690,6 +7736,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7776,6 +7826,22 @@ msgid "Color uniform." msgstr "Anim පරිවර්à¶à¶±à¶º වෙනස් කරන්න" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7783,10 +7849,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7875,7 +7975,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7883,7 +7983,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7895,7 +7995,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7912,7 +8012,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7981,11 +8081,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8001,7 +8101,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8029,11 +8129,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8074,11 +8174,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8087,7 +8191,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8105,15 +8209,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8164,7 +8268,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8192,12 +8296,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8274,47 +8378,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9466,6 +9570,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9668,7 +9776,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9723,7 +9831,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10123,54 +10231,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10747,7 +10807,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10796,7 +10856,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10806,7 +10866,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10882,12 +10942,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10966,7 +11026,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10995,6 +11055,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11029,8 +11093,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11041,7 +11105,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11057,7 +11123,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11068,7 +11134,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11103,7 +11171,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11115,7 +11183,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11146,8 +11214,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11167,18 +11234,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11221,9 +11288,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index f693503c6d..bed5a879ef 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -134,6 +134,31 @@ msgid "Anim Change Call" msgstr "Animácia ZmeniÅ¥ Hovor" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animácia ZmeniÅ¥ Keyframe ÄŒas" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animácia zmeniÅ¥ prechod" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animácia zmeniÅ¥ prechod" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animácia ZmeniÅ¥ Keyframe Hodnotu" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animácia ZmeniÅ¥ Hovor" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "ZmeniÅ¥ Dĺžku Animácie" @@ -633,6 +658,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -682,7 +711,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -790,6 +819,11 @@ msgid "Connect" msgstr "PripojiÅ¥" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signály:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "PripojiÅ¥ '%s' k '%s'" @@ -956,7 +990,8 @@ msgid "Owners Of:" msgstr "Majitelia:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "OdstrániÅ¥ vybraté súbory z projektu? (nedá sa vrátiÅ¥ späť)" #: editor/dependency_editor.cpp @@ -1136,7 +1171,6 @@ msgid "Success!" msgstr "Úspech!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "InÅ¡talovaÅ¥" @@ -1499,6 +1533,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1683,7 +1721,7 @@ msgstr "OtvoriÅ¥ súbor" msgid "New Folder..." msgstr "VytvoriÅ¥ adresár" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1734,7 +1772,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1760,12 +1798,12 @@ msgstr "" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "VytvoriÅ¥ adresár" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" +msgid "Go to next folder." msgstr "VytvoriÅ¥ adresár" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp @@ -1773,12 +1811,16 @@ msgstr "VytvoriÅ¥ adresár" msgid "Go to parent folder." msgstr "VytvoriÅ¥ adresár" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2473,6 +2515,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "KopÃrovaÅ¥" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2665,14 +2712,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2993,6 +3032,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Súbor:" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3606,6 +3650,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" msgstr "Filter:" @@ -4663,6 +4708,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "InÅ¡talovaÅ¥" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4691,7 +4741,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4705,7 +4754,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4780,35 +4829,39 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "" +#, fuzzy +msgid "Move Vertical Guide" +msgstr "Popis:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "Popis:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "VÅ¡etky vybrané" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "" +#, fuzzy +msgid "Move Horizontal Guide" +msgstr "VÅ¡etky vybrané" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "Popis:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "VÅ¡etky vybrané" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" +msgstr "Popis:" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6414,10 +6467,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "VÅ¡etky vybrané" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6710,7 +6772,12 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "VÅ¡etky vybrané" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "VÅ¡etky vybrané" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6898,11 +6965,6 @@ msgstr "VÅ¡etky vybrané" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align Selection With View" -msgstr "VÅ¡etky vybrané" - -#: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Select" msgstr "VÅ¡etky vybrané" @@ -7484,14 +7546,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7910,6 +7964,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7998,6 +8056,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8005,10 +8079,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8098,7 +8206,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8106,7 +8214,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8118,7 +8226,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8135,7 +8243,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8204,11 +8312,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8224,7 +8332,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8252,11 +8360,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8296,11 +8404,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8310,7 +8422,7 @@ msgstr "VytvoriÅ¥ adresár" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8328,15 +8440,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8388,7 +8500,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8416,12 +8528,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8498,47 +8610,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9709,6 +9821,11 @@ msgid "Extend Script" msgstr "Popis:" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "VytvoriÅ¥ adresár" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9921,7 +10038,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9982,7 +10099,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10390,55 +10507,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Súbor:" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11031,7 +11099,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11084,8 +11152,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "Textúra s tvarom svetla musà maÅ¥ nastavenú vlastnosÅ¥ \"textúra\"." @@ -11097,7 +11166,7 @@ msgstr "" "prejavil." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11177,12 +11246,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11259,10 +11328,13 @@ msgid "" msgstr "" #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" +"MusÃte nastaviÅ¥ tvar objektu CollisionShape2D aby fungoval. ProsÃm, vytvorte " +"preň tvarový objekt!" #: scene/3d/collision_shape.cpp msgid "" @@ -11290,6 +11362,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11324,8 +11400,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11336,7 +11412,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11352,7 +11430,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11363,7 +11441,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11399,7 +11479,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11411,7 +11491,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11442,8 +11522,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11463,18 +11542,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11518,9 +11597,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Nesprávna veľkosÅ¥ pÃsma." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Nesprávna veľkosÅ¥ pÃsma." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Nesprávna veľkosÅ¥ pÃsma." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11537,6 +11626,18 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "VytvoriÅ¥ adresár" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "VytvoriÅ¥ adresár" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Súbor:" + #~ msgid "Path to Node:" #~ msgstr "Cesta k Node:" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 080553ddc3..3a098b5971 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -141,6 +141,31 @@ msgstr "Animacija Spremeni klic" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animacija Spremeni Äas kljuÄne slike" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animacija Spremeni prehod" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animacija Spremeni transformacijo" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animacija Spremeni vrednost kljuÄne slike" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animacija Spremeni klic" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Spremeni Ime Animacije:" @@ -658,6 +683,10 @@ msgstr "Pojdi na Vrstico" msgid "Line Number:" msgstr "Å tevilka Vrste:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Ni Zadetkov" @@ -707,7 +736,7 @@ msgstr "Oddalji" msgid "Reset Zoom" msgstr "Ponastavi PoveÄavo/PomanjÅ¡avo" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -819,6 +848,11 @@ msgid "Connect" msgstr "Poveži" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signali:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Poveži '%s' v '%s'" @@ -989,7 +1023,8 @@ msgid "Owners Of:" msgstr "Lastniki:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Odstranim izbrane datoteke iz projekta? (brez vrnitve)" #: editor/dependency_editor.cpp @@ -1174,7 +1209,6 @@ msgid "Success!" msgstr "Uspelo je!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Namesti" @@ -1542,6 +1576,10 @@ msgstr "" msgid "Template file not found:" msgstr "Predloge ni mogoÄe najti:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1739,7 +1777,7 @@ msgstr "Pokaži V Upravitelju Datotek" msgid "New Folder..." msgstr "Nova Mapa..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Osveži" @@ -1790,7 +1828,7 @@ msgstr "Pojdi Naprej" msgid "Go Up" msgstr "Pojdi Navzgor" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Preklopi na Skrite Datoteke" @@ -1816,27 +1854,32 @@ msgstr "Premakni Priljubljeno Navzdol" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "PrejÅ¡nji zavihek" +msgid "Go to previous folder." +msgstr "Pojdi v nadrejeno mapo" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Ustvarite Mapo" +msgid "Go to next folder." +msgstr "Pojdi v nadrejeno mapo" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Pojdi v nadrejeno mapo" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "IÅ¡Äi Razrede" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Mape ni mogoÄe ustvariti." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Preklopi na Skrite Datoteke" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2584,6 +2627,11 @@ msgid "Go to previously opened scene." msgstr "Pojdi na predhodno odprti prizor." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Kopiraj Pot" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Naslednji zavihek" @@ -2796,15 +2844,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Nastavitve Urejevalnika" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Odpri naslednji Urejevalnik" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Preklopi na Celozaslonski NaÄin" @@ -3132,6 +3171,11 @@ msgid "Calls" msgstr "Klici" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "ÄŒlani" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3773,6 +3817,7 @@ msgid "Nodes not in Group" msgstr "Dodaj v Skupino" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4867,6 +4912,11 @@ msgid "Idle" msgstr "Nedejaven" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Namesti" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Ponovi" @@ -4898,7 +4948,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Vse" @@ -4912,8 +4961,9 @@ msgid "Sort:" msgstr "Razvrsti:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Obrni" +#, fuzzy +msgid "Reverse sorting." +msgstr "Zahtevam..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4993,31 +5043,38 @@ msgid "Rotation Step:" msgstr "Rotacijski Korak:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Premakni navpiÄni vodnik" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Ustvari nov navpiÄni vodnik" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Odstranite navpiÄni vodnik" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Premakni vodoravni vodnik" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Ustvari nov vodoravni vodnik" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Odstrani vodoravni vodnik" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Ustvari nov vodoravni in navpiÄni vodnik" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6663,10 +6720,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "IzbriÅ¡i toÄke" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6965,7 +7031,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7155,10 +7225,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Izbira Orodja" @@ -7745,14 +7811,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8186,6 +8244,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8277,6 +8339,22 @@ msgid "Color uniform." msgstr "Preoblikovanje" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8284,10 +8362,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8378,7 +8490,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8386,7 +8498,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8398,7 +8510,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8415,7 +8527,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8484,11 +8596,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8504,7 +8616,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8532,11 +8644,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8577,11 +8689,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8591,7 +8707,7 @@ msgstr "Preoblikovanje Dialoga..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8609,15 +8725,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8669,7 +8785,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8697,12 +8813,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8779,47 +8895,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10011,6 +10127,11 @@ msgstr "Zaženi Skripto" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Ustvari Nov %s" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Shrani Prizor" @@ -10230,7 +10351,7 @@ msgid "Script is valid." msgstr "Drevo animacije je veljavno." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10288,7 +10409,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10698,55 +10819,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Ogled datotek" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11344,8 +11416,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Vir SpriteFrame mora biti ustvarjen ali nastavljen v 'Frames' lastnosti z " @@ -11406,7 +11479,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11416,7 +11489,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11497,12 +11570,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11581,7 +11654,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11610,6 +11683,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11644,8 +11721,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11656,7 +11733,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11671,10 +11750,13 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" +"Vir SpriteFrame mora biti ustvarjen ali nastavljen v 'Frames' lastnosti z " +"namenom, da AnimatedSprite prikaže sliÄice." #: scene/3d/vehicle_body.cpp msgid "" @@ -11683,7 +11765,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11721,7 +11805,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Odklopite '%s' iz '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11736,7 +11820,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Drevo animacije ni veljavno." #: scene/animation/animation_tree_player.cpp @@ -11768,8 +11852,7 @@ msgstr "Dodaj trenutno barvo kot prednastavljeno" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11787,23 +11870,24 @@ msgid "Please Confirm..." msgstr "Prosimo Potrdite..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Pojavna okna se bodo po privzeti nastavitvi skrila, razen ob klicu popup() " "ali katerih izmed popup*() funkcij. Spreminjanje vidnosti za urejanje je " "sprejemljivo, vendar se bodo ob zagonu skrila." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11847,9 +11931,19 @@ msgid "Input" msgstr "Dodaj Vnos" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "Neveljaven vir za shader." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Neveljaven vir za shader." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Neveljaven vir za shader." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11867,6 +11961,25 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "PrejÅ¡nji zavihek" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Ustvarite Mapo" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Odpri naslednji Urejevalnik" + +#~ msgid "Reverse" +#~ msgstr "Obrni" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Ogled datotek" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "IÅ¡Äi Razrede" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 0fd68aa976..fa9f6075e3 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -130,6 +130,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Ndrysho Gjatësin e Animacionit" @@ -616,6 +636,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -665,7 +689,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -773,6 +797,11 @@ msgid "Connect" msgstr "Lidh" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Sinjalet:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Lidh '%s' me '%s'" @@ -939,7 +968,8 @@ msgid "Owners Of:" msgstr "Pronarët e:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Hiq skedarët e zgjedhur nga projekti? (pa kthim pas)" #: editor/dependency_editor.cpp @@ -1123,7 +1153,6 @@ msgid "Success!" msgstr "Sukses!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Instalo" @@ -1498,6 +1527,10 @@ msgstr "Shablloni 'Custom release' nuk u gjet." msgid "Template file not found:" msgstr "Skedari shabllon nuk u gjet:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1689,7 +1722,7 @@ msgstr "Shfaq në Menaxherin e Skedarëve" msgid "New Folder..." msgstr "Folder i Ri..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Rifresko" @@ -1740,7 +1773,7 @@ msgstr "Shko Përpara" msgid "Go Up" msgstr "Shko Lartë" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Ndrysho Skedarët e Fshehur" @@ -1765,24 +1798,31 @@ msgid "Move Favorite Down" msgstr "Lëviz të Preferuarën Poshtë" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Folderi i Mëparshëm" +#, fuzzy +msgid "Go to previous folder." +msgstr "Shko te folderi prind" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Folderi Tjetër" +#, fuzzy +msgid "Go to next folder." +msgstr "Shko te folderi prind" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Kërko skedarët" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Hiqe nga të preferuarat folderin aktual." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Ndrysho Skedarët e Fshehur" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2518,6 +2558,11 @@ msgid "Go to previously opened scene." msgstr "Shko në skenën e hapur më parë." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Kopjo Rrugën" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Tabi tjetër" @@ -2728,15 +2773,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Hap Folderin e Editorit për të Dhënat/Opsionet" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Hap Editorin tjetër" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Ndrysho Ekranin e Plotë" @@ -3057,6 +3093,11 @@ msgid "Calls" msgstr "Thërritjet" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Modifiko:" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Mbi" @@ -3686,6 +3727,7 @@ msgid "Nodes not in Group" msgstr "Nyjet që nuk janë në Grup" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Nyjet filtruese" @@ -4717,6 +4759,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Instalo" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4745,7 +4792,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4759,8 +4805,9 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "" +#, fuzzy +msgid "Reverse sorting." +msgstr "Duke bër kërkesën..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4834,31 +4881,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "Krijo Pllakë" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Fshi keys të gabuar" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "Krijo një Folder" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Fshi keys të gabuar" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6434,10 +6485,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Krijo pika." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6727,7 +6787,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6912,10 +6976,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7485,14 +7545,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7881,6 +7933,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7967,6 +8023,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7974,10 +8046,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8066,7 +8172,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8074,7 +8180,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8086,7 +8192,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8103,7 +8209,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8172,11 +8278,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8192,7 +8298,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8220,11 +8326,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8264,11 +8370,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8277,7 +8387,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8295,15 +8405,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8353,7 +8463,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8381,12 +8491,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8463,47 +8573,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9663,6 +9773,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Krijo një Folder" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9875,7 +9990,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9931,7 +10046,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10333,54 +10448,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10957,7 +11024,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11006,7 +11073,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11016,7 +11083,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11092,12 +11159,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11176,7 +11243,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11205,6 +11272,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11239,8 +11310,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11251,7 +11322,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11267,7 +11340,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11278,7 +11351,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11313,7 +11388,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11325,7 +11400,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11356,8 +11431,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11377,18 +11451,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11431,9 +11505,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11450,15 +11532,22 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Folderi i Mëparshëm" + +#~ msgid "Next Folder" +#~ msgstr "Folderi Tjetër" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Hap Editorin tjetër" + #~ msgid "Update Always" #~ msgstr "Përditëso Gjithmonë" #~ msgid "Delete selected files?" #~ msgstr "Fshi skedarët e zgjedhur?" -#~ msgid "Go to parent folder" -#~ msgstr "Shko te folderi prind" - #~ msgid "Select device from the list" #~ msgstr "Zgjidh paisjen nga lista" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index a260055c15..4b22ba2ff2 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -138,6 +138,31 @@ msgstr "Промени позив анимације" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Промени вредноÑÑ‚" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Промени прелаз" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Промени положај" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Промени вредноÑÑ‚" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Промени позив анимације" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "Промени Ñ†Ð¸ÐºÐ»ÑƒÑ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ˜Ðµ" @@ -657,6 +682,10 @@ msgstr "Иди на линију" msgid "Line Number:" msgstr "Број линије:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Ðема подудара" @@ -706,7 +735,7 @@ msgstr "Умањи" msgid "Reset Zoom" msgstr "РеÑетуј увеличање" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -819,6 +848,11 @@ msgid "Connect" msgstr "Повежи" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Сигнали:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Повежи '%s' Ñа '%s'" @@ -992,7 +1026,8 @@ msgid "Owners Of:" msgstr "ВлаÑници:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Обриши одабране датотеке из пројекта? (ÐЕМРОПОЗИВÐЊÐ)" #: editor/dependency_editor.cpp @@ -1179,7 +1214,6 @@ msgid "Success!" msgstr "УÑпех!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "ИнÑталирај" @@ -1548,6 +1582,10 @@ msgstr "" msgid "Template file not found:" msgstr "ШаблонÑка датотека није пронађена:\n" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1746,7 +1784,7 @@ msgstr "Покажи у менаџеру датотека" msgid "New Folder..." msgstr "Ðови директоријум..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "ОÑвежи" @@ -1797,7 +1835,7 @@ msgstr "Ðапред" msgid "Go Up" msgstr "Иди горе" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Прикажи Ñакривене датотеке" @@ -1823,27 +1861,32 @@ msgstr "Помери надоле омиљену" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "Претодни Ñпрат" +msgid "Go to previous folder." +msgstr "Иди у родитељÑки директоријум" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Ðаправи директоријум" +msgid "Go to next folder." +msgstr "Иди у родитељÑки директоријум" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Иди у родитељÑки директоријум" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Потражи клаÑе" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "ÐеуÑпех при прављењу директоријума." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Прикажи Ñакривене датотеке" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2595,6 +2638,11 @@ msgid "Go to previously opened scene." msgstr "Отвори претходну Ñцену." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Копирај пут" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Следећи таб" @@ -2809,15 +2857,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "ПоÑтавке уредника" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Отвори Ñледећи уредник" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Укљ./ИÑкљ. режим целог екрана" @@ -3147,6 +3186,11 @@ msgid "Calls" msgstr "Позиви цртања" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Измени тему..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3800,6 +3844,7 @@ msgid "Nodes not in Group" msgstr "Додај у групу" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4894,6 +4939,11 @@ msgid "Idle" msgstr "Ðеактиван" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "ИнÑталирај" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Покушај поново" @@ -4924,7 +4974,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Ñви" @@ -4938,8 +4987,9 @@ msgid "Sort:" msgstr "Сортирање:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Обрнут" +#, fuzzy +msgid "Reverse sorting." +msgstr "Захтевање..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -5013,31 +5063,38 @@ msgid "Rotation Step:" msgstr "Ротације корака:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Помери вертикални водич" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Ðаправи нови вертикални водич" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Обриши вертикални водич" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Помери хоризонтални водич" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Ðаправи нови хоризонтални водич" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Обриши хоризонтални водич" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Ðаправи нови хоризонтални и вертикални водич" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6710,10 +6767,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Обриши тачке" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -7021,9 +7087,14 @@ msgstr "Бок" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Поравнавање Ñа погледом" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Поравнај одабрано Ñа погледом" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Ðема родитеља за прављење Ñина." @@ -7217,10 +7288,6 @@ msgid "Focus Selection" msgstr "Ð¤Ð¾ÐºÑƒÑ Ð½Ð° Ñелекцију" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Поравнај одабрано Ñа погледом" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Избор алатки" @@ -7827,14 +7894,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Огледало X оÑе" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Огледало Y оÑе" - -#: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Disable Autotile" msgstr "ÐутоматÑки рез" @@ -8276,6 +8335,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Vertex" msgstr "Тачке" @@ -8369,6 +8432,22 @@ msgid "Color uniform." msgstr "ТранÑформација" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8376,10 +8455,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "Промени векторÑку конÑтанту" @@ -8472,7 +8585,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8480,7 +8593,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8492,7 +8605,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8509,7 +8622,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8578,11 +8691,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8598,7 +8711,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8626,11 +8739,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8673,12 +8786,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "Промени текÑтурну униформу (uniform)" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "Промени текÑтурну униформу (uniform)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup with triplanar." msgstr "Промени текÑтурну униформу (uniform)" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8688,7 +8806,7 @@ msgstr "Прозор транÑформације..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8706,15 +8824,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8767,7 +8885,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8795,12 +8913,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8879,47 +8997,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10126,6 +10244,11 @@ msgstr "Покрени Ñкриптицу" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Ðаправи нов" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Сачувај Ñцену" @@ -10344,7 +10467,7 @@ msgid "Script is valid." msgstr "Ðнимационо дрво је важеће." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10402,7 +10525,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10816,62 +10939,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Generating solution..." -msgstr "Прављење контура..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "ÐеуÑпех при прављењу ивица!" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "Грешка при учитавању реÑурÑа." - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Done" -msgstr "Готово!" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create C# project." -msgstr "Грешка при учитавању реÑурÑа." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "Ðаправи ивице" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "Пројекат" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Погледај датотеке" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11465,7 +11532,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11514,7 +11581,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11524,7 +11591,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11600,12 +11667,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11684,7 +11751,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11713,6 +11780,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11747,8 +11818,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11759,7 +11830,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11775,7 +11848,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11786,7 +11859,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11824,7 +11899,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Повежи '%s' Ñа '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11838,7 +11913,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Ðнимационо дрво није важеће." #: scene/animation/animation_tree_player.cpp @@ -11869,8 +11944,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11890,18 +11964,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11946,9 +12020,19 @@ msgstr "Додај улаз" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Ðеважећа величина фонта." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Ðеважећа величина фонта." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Ðеважећа величина фонта." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11966,6 +12050,59 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "Претодни Ñпрат" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Ðаправи директоријум" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Отвори Ñледећи уредник" + +#~ msgid "Reverse" +#~ msgstr "Обрнут" + +#~ msgid "Mirror X" +#~ msgstr "Огледало X оÑе" + +#~ msgid "Mirror Y" +#~ msgstr "Огледало Y оÑе" + +#, fuzzy +#~ msgid "Generating solution..." +#~ msgstr "Прављење контура..." + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "ÐеуÑпех при прављењу ивица!" + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "Грешка при учитавању реÑурÑа." + +#, fuzzy +#~ msgid "Done" +#~ msgstr "Готово!" + +#, fuzzy +#~ msgid "Failed to create C# project." +#~ msgstr "Грешка при учитавању реÑурÑа." + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "Ðаправи ивице" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "Пројекат" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Погледај датотеке" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Потражи клаÑе" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 2c874795e3..21a14c6a83 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -5,12 +5,13 @@ # Milos Ponjavusic <brane@branegames.com>, 2018. # BLu <blmasfon@gmail.com>, 2018. # Vojislav Bajakic <ch3d4.ns@gmail.com>, 2018. +# LT <lakizvezdas@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2018-12-13 14:42+0100\n" -"Last-Translator: Vojislav Bajakic <ch3d4.ns@gmail.com>\n" +"PO-Revision-Date: 2019-07-29 19:21+0000\n" +"Last-Translator: LT <lakizvezdas@gmail.com>\n" "Language-Team: Serbian (latin) <https://hosted.weblate.org/projects/godot-" "engine/godot/sr_Latn/>\n" "Language: sr_Latn\n" @@ -19,7 +20,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Poedit 2.2\n" +"X-Generator: Weblate 3.8-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -63,33 +64,31 @@ msgstr "" #: editor/animation_bezier_editor.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Free" -msgstr "" +msgstr "Slobodno" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "Balansirano" #: editor/animation_bezier_editor.cpp msgid "Mirror" -msgstr "" +msgstr "Ogledalo" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" -msgstr "" +msgstr "Vreme:" #: editor/animation_bezier_editor.cpp msgid "Value:" -msgstr "" +msgstr "Vrednost:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "Animacija dodaj kljuÄ" +msgstr "Dodaj kljuÄ ovde" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Duplicate Selected Key(s)" -msgstr "Uduplaj Selekciju" +msgstr "Dupliraj Selektovane KljuÄeve" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" @@ -97,11 +96,11 @@ msgstr "IzbriÅ¡i oznaÄeni kljuÄ(eve)" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "" +msgstr "Dodaj Bezier TaÄku" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "" +msgstr "Pomeri Bezier TaÄke" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -133,8 +132,32 @@ msgstr "Animacija Promjeni Poziv" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Animacija Promjeni Vrijeme KljuÄnog Kadra" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animacija Promjeni Tranziciju" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animacija Promjeni Transformaciju" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Animacija Promjeni Vrijednost KljuÄnog Kadra" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animacija Promjeni Poziv" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "Promijeni Dužinu Animacije" +msgstr "Promeni Dužinu Animacije" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -159,26 +182,24 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "Audio Plejbek Traka" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "" +msgstr "Animacija Plejbek Traka" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "Optimizuj Animaciju" +msgstr "Dužina Animacije (frames)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" -msgstr "Promijeni Dužinu Animacije" +msgstr "Dužina Animacije (secunde)" #: editor/animation_track_editor.cpp #, fuzzy msgid "Add Track" -msgstr "Animacija Dodaj Kanal" +msgstr "Dodaj Traku" #: editor/animation_track_editor.cpp msgid "Animation Looping" @@ -186,16 +207,18 @@ msgstr "" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp +#, fuzzy msgid "Functions:" -msgstr "" +msgstr "Funkcije:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "" +msgstr "Audio Klipovi:" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Anim Clips:" -msgstr "" +msgstr "Anim Klipovi:" #: editor/animation_track_editor.cpp msgid "Change Track Path" @@ -224,7 +247,7 @@ msgstr "Odstrani Kanal Animacije" #: editor/animation_track_editor.cpp msgid "Time (s): " -msgstr "" +msgstr "Vreme (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -247,8 +270,9 @@ msgid "Capture" msgstr "" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Nearest" -msgstr "" +msgstr "Najbliže" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -275,12 +299,12 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy msgid "Duplicate Key(s)" -msgstr "Animacija Uduplaj KljuÄeve" +msgstr "Dupliraj KljuÄeve" #: editor/animation_track_editor.cpp #, fuzzy msgid "Delete Key(s)" -msgstr "Animacija ObriÅ¡i KljuÄeve" +msgstr "ObriÅ¡i KljuÄeve" #: editor/animation_track_editor.cpp #, fuzzy @@ -376,7 +400,7 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy msgid "Add Bezier Track" -msgstr "Animacija Dodaj Kanal" +msgstr "Dodaj Bezier Kanal" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." @@ -392,9 +416,8 @@ msgid "Add Transform Track Key" msgstr "Animacija Dodaj kanal i kljuÄ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track Key" -msgstr "Animacija Dodaj Kanal" +msgstr "Dodaj Kljuc Kanal" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." @@ -635,6 +658,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -684,7 +711,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -787,6 +814,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -946,7 +977,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1122,7 +1153,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1481,6 +1511,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1652,7 +1686,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1703,7 +1737,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1728,23 +1762,29 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "OtiÄ‘i Na Prethodni Korak" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "OtiÄ‘i Na Sljedeći Korak" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2421,6 +2461,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "ObriÅ¡i Selekciju" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2612,14 +2657,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2934,6 +2971,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Izmjeni Selekciju Krivulje" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3529,6 +3571,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4567,6 +4610,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4595,7 +4642,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4609,7 +4655,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4684,31 +4730,34 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "Napravi" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "ObriÅ¡i Selekciju" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "ObriÅ¡i Selekciju" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6284,10 +6333,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Napravi" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6577,7 +6635,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6762,10 +6824,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7340,14 +7398,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7749,6 +7799,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7835,6 +7889,22 @@ msgid "Color uniform." msgstr "Animacija Promjeni Transformaciju" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7842,10 +7912,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7935,7 +8039,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7943,7 +8047,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7955,7 +8059,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7972,7 +8076,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8041,11 +8145,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8061,7 +8165,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8089,11 +8193,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8134,11 +8238,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8148,7 +8256,7 @@ msgstr "Napravi" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8166,15 +8274,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8225,7 +8333,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8253,12 +8361,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8335,47 +8443,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9531,6 +9639,11 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Napravi" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9734,7 +9847,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9790,7 +9903,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10193,54 +10306,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10817,7 +10882,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10866,7 +10931,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10876,7 +10941,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10952,12 +11017,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11036,7 +11101,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11065,6 +11130,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11099,8 +11168,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11111,7 +11180,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11127,7 +11198,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11138,7 +11209,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11173,7 +11246,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11185,7 +11258,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11216,8 +11289,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11237,18 +11309,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11291,9 +11363,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index a3d27df45e..0b2f9133c3 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -135,6 +135,31 @@ msgid "Anim Change Call" msgstr "Anim Ändra Anrop" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Ändra Tid för Nyckebild" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Anim Ändra ÖvergÃ¥ng" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Anim Ändra Transformation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Ändra Värde PÃ¥ Nyckelbild" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Anim Ändra Anrop" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Ändra Animationslängd" @@ -661,6 +686,10 @@ msgstr "GÃ¥ till Rad" msgid "Line Number:" msgstr "Radnummer:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp #, fuzzy msgid "No Matches" @@ -713,7 +742,7 @@ msgstr "Zooma Ut" msgid "Reset Zoom" msgstr "Ã…terställ Zoom" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp #, fuzzy msgid "Warnings" msgstr "Varning" @@ -829,6 +858,11 @@ msgid "Connect" msgstr "Anslut" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Signaler:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Anslut '%s' till '%s'" @@ -1015,7 +1049,8 @@ msgid "Owners Of:" msgstr "Ägare av:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Ta bort valda filer frÃ¥n projektet? (gÃ¥r inte Ã¥ngra)" #: editor/dependency_editor.cpp @@ -1230,7 +1265,6 @@ msgid "Success!" msgstr "Klart!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Installera" @@ -1649,6 +1683,10 @@ msgstr "" msgid "Template file not found:" msgstr "Mallfil hittades inte:\n" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1847,7 +1885,7 @@ msgstr "Visa I Filhanteraren" msgid "New Folder..." msgstr "Ny Mapp..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Uppdatera" @@ -1900,7 +1938,7 @@ msgstr "GÃ¥ FramÃ¥t" msgid "Go Up" msgstr "GÃ¥ Upp" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp #, fuzzy msgid "Toggle Hidden Files" msgstr "Växla Dolda Filer" @@ -1929,27 +1967,32 @@ msgstr "Flytta Favorit Ner" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "FöregÃ¥ende flik" +msgid "Go to previous folder." +msgstr "GÃ¥ till överordnad mapp" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "Skapa Mapp" +msgid "Go to next folder." +msgstr "GÃ¥ till överordnad mapp" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "GÃ¥ till överordnad mapp" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Sök Klasser" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "Kunde inte skapa mapp." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Växla Dolda Filer" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2774,6 +2817,11 @@ msgid "Go to previously opened scene." msgstr "GÃ¥ till föregÃ¥ende öppna scen." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Kopiera Sökvägen" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Nästa flik" @@ -2979,14 +3027,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -3319,6 +3359,11 @@ msgstr "" #: editor/editor_properties.cpp #, fuzzy +msgid "Edit Text:" +msgstr "Redigera tema..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp +#, fuzzy msgid "On" msgstr "PÃ¥" @@ -3987,6 +4032,7 @@ msgid "Nodes not in Group" msgstr "Lägg till i Grupp" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Filtrera noder" @@ -5105,6 +5151,11 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy +msgid "Install..." +msgstr "Installera" + +#: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Retry" msgstr "Försök igen" @@ -5134,7 +5185,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Alla" @@ -5148,7 +5198,7 @@ msgid "Sort:" msgstr "Sortera:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5225,31 +5275,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "Skapa Mapp" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Ta bort Variabeln" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "Skapa Node" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Ta bort ogiltiga nycklar" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6913,10 +6967,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Radera punkter" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp #, fuzzy @@ -7240,7 +7303,12 @@ msgstr "Baksida" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr "Vy frÃ¥n höger" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr "Vy frÃ¥n höger" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7438,10 +7506,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -8042,16 +8106,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy -msgid "Mirror X" -msgstr "Spegla X" - -#: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy -msgid "Mirror Y" -msgstr "Spegla Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8478,6 +8532,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8569,6 +8627,22 @@ msgid "Color uniform." msgstr "Transformera" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8576,10 +8650,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8669,7 +8777,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8677,7 +8785,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8689,7 +8797,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8706,7 +8814,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8775,11 +8883,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8795,7 +8903,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8823,11 +8931,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8868,11 +8976,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8882,7 +8994,7 @@ msgstr "Transformera" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8900,15 +9012,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8960,7 +9072,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8988,12 +9100,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9070,47 +9182,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10364,6 +10476,11 @@ msgstr "Öppna Skript" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Byt Förälder-Node" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Vettigt!" @@ -10591,7 +10708,8 @@ msgid "Script is valid." msgstr "Skript giltigt" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "TillÃ¥tna: a-z, a-Z, 0-9 och _" #: editor/script_create_dialog.cpp @@ -10652,7 +10770,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp #, fuzzy msgid "Errors" msgstr "Fel" @@ -11080,62 +11198,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Generating solution..." -msgstr "Skapar konturer..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "Misslyckades att ladda resurs." - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "Misslyckades att ladda resurs." - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Done" -msgstr "Klar!" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create C# project." -msgstr "Misslyckades att ladda resurs." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "Skapa Prenumeration" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "Projekt" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Visa Filer" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11747,7 +11809,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11805,7 +11867,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11815,7 +11877,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11905,12 +11967,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11999,7 +12061,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -12028,6 +12090,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -12064,8 +12130,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -12076,8 +12142,12 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" +"Sökvägs-egenskapen mÃ¥ste peka pÃ¥ en giltigt Node2D Node för att fungera." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -12092,7 +12162,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -12103,7 +12173,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -12141,7 +12213,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Anslut '%s' till '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -12154,7 +12226,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -12186,8 +12258,7 @@ msgstr "Lägg till nuvarande färg som en förinställning" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -12209,18 +12280,18 @@ msgstr "Vänligen Bekräfta..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -12268,9 +12339,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Ogiltig teckenstorlek." + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Ogiltig teckenstorlek." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Ogiltig teckenstorlek." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -12288,6 +12369,54 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "FöregÃ¥ende flik" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "Skapa Mapp" + +#, fuzzy +#~ msgid "Mirror X" +#~ msgstr "Spegla X" + +#, fuzzy +#~ msgid "Mirror Y" +#~ msgstr "Spegla Y" + +#, fuzzy +#~ msgid "Generating solution..." +#~ msgstr "Skapar konturer..." + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "Misslyckades att ladda resurs." + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "Misslyckades att ladda resurs." + +#, fuzzy +#~ msgid "Done" +#~ msgstr "Klar!" + +#, fuzzy +#~ msgid "Failed to create C# project." +#~ msgstr "Misslyckades att ladda resurs." + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "Skapa Prenumeration" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "Projekt" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Visa Filer" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Sök Klasser" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index d8213fad4b..4444305cf2 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -132,6 +132,31 @@ msgid "Anim Change Call" msgstr "மாறà¯à®± அழைபà¯à®ªà¯ அசைவூடà¯à®Ÿà¯" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "மாறà¯à®± மதிபà¯à®ªà¯ அசைவூடà¯à®Ÿà¯" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "மாறà¯à®±à®®à¯ அசைவூடà¯à®Ÿà¯" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "உரà¯à®®à®¾à®±à¯à®±à®®à¯ அசைவூடà¯à®Ÿà¯" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "மாறà¯à®± மதிபà¯à®ªà¯ அசைவூடà¯à®Ÿà¯" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "மாறà¯à®± அழைபà¯à®ªà¯ அசைவூடà¯à®Ÿà¯" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -626,6 +651,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -675,7 +704,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -778,6 +807,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -937,7 +970,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1113,7 +1146,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1472,6 +1504,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1643,7 +1679,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1694,7 +1730,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1719,23 +1755,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2411,6 +2451,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2602,14 +2647,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2923,6 +2960,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "தேரà¯à®µà¯ வளைவை [Selection Curve] திரà¯à®¤à¯à®¤à¯" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3519,6 +3561,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4553,6 +4596,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4581,7 +4628,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4595,7 +4641,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4670,31 +4716,32 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "அசைவூடà¯à®Ÿà¯ பாதையை நீகà¯à®•à¯" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6260,10 +6307,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6549,7 +6604,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6734,10 +6793,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7304,14 +7359,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7695,6 +7742,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7780,6 +7831,22 @@ msgid "Color uniform." msgstr "உரà¯à®®à®¾à®±à¯à®±à®®à¯ அசைவூடà¯à®Ÿà¯" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7787,10 +7854,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7879,7 +7980,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7887,7 +7988,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7899,7 +8000,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7916,7 +8017,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7985,11 +8086,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8005,7 +8106,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8033,11 +8134,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8078,11 +8179,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8091,7 +8196,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8109,15 +8214,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8166,7 +8271,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8194,12 +8299,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8276,47 +8381,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9470,6 +9575,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9673,7 +9782,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9728,7 +9837,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10131,54 +10240,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10755,7 +10816,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10804,7 +10865,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10814,7 +10875,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10890,12 +10951,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10974,7 +11035,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11003,6 +11064,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11037,8 +11102,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11049,7 +11114,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11065,7 +11132,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11076,7 +11143,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11111,7 +11180,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11123,7 +11192,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11154,8 +11223,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11175,18 +11243,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11229,9 +11297,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index d904600213..abc011cfab 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -30,7 +30,7 @@ msgstr "డీకోడింగౠబైటà±à°²à± కోసం తగిన #: core/math/expression.cpp #, fuzzy msgid "Invalid input %i (not passed) in expression" -msgstr "à°µà±à°¯à°•à±à°¤à±€à°•రణలో చెలà±à°²à°¨à°¿ ఇనà±à°ªà±à°Ÿà±% i (ఆమోదించబడలేదà±)" +msgstr "à°µà±à°¯à°•à±à°¤à±€à°•రణలో చెలà±à°²à°¨à°¿ ఇనà±à°ªà±à°Ÿà± %i (ఆమోదించబడలేదà±)" #: core/math/expression.cpp #, fuzzy @@ -127,6 +127,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -610,6 +630,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -659,7 +683,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -762,6 +786,10 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -920,7 +948,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1096,7 +1124,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1455,6 +1482,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "" @@ -1625,7 +1656,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1676,7 +1707,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1701,23 +1732,27 @@ msgid "Move Favorite Down" msgstr "" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" +msgid "Go to previous folder." msgstr "" #: editor/editor_file_dialog.cpp -msgid "Next Folder" +msgid "Go to next folder." msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2392,6 +2427,10 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2583,14 +2622,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2904,6 +2935,10 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3499,6 +3534,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4524,6 +4560,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4552,7 +4592,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4566,7 +4605,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4641,31 +4680,31 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6224,10 +6263,18 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6513,7 +6560,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6698,10 +6749,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7262,14 +7309,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7647,6 +7686,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7731,6 +7774,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7738,10 +7797,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7830,7 +7923,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7838,7 +7931,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7850,7 +7943,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7867,7 +7960,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7936,11 +8029,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7956,7 +8049,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7984,11 +8077,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8028,11 +8121,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8041,7 +8138,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8059,15 +8156,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8116,7 +8213,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8144,12 +8241,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8226,47 +8323,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9417,6 +9514,10 @@ msgid "Extend Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9619,7 +9720,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9674,7 +9775,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10074,54 +10175,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10698,7 +10751,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10747,7 +10800,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10757,7 +10810,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -10833,12 +10886,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -10917,7 +10970,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -10946,6 +10999,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -10980,8 +11037,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -10992,7 +11049,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11008,7 +11067,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11019,7 +11078,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11054,7 +11115,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11066,7 +11127,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11097,8 +11158,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11118,18 +11178,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11172,9 +11232,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 0054a30068..e23decda82 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -141,6 +141,31 @@ msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™à¹à¸à¸™ #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "à¹à¸à¹‰à¹„ขเวลาคีย์เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "à¹à¸à¹‰à¹„ขทรานสิชันà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "เคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "à¹à¸à¹‰à¹„ขค่าคีย์เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸§à¸™à¸‹à¹‰à¸³à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" @@ -662,6 +687,10 @@ msgstr "ไปยังบรรทัด" msgid "Line Number:" msgstr "บรรทัดที่:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "ไม่พบ" @@ -711,7 +740,7 @@ msgstr "ย่à¸" msgid "Reset Zoom" msgstr "รีเซ็ตซูม" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "คำเตืà¸à¸™" @@ -822,6 +851,11 @@ msgid "Connect" msgstr "เชื่à¸à¸¡" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "สัà¸à¸à¸²à¸“:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "เชื่à¸à¸¡ '%s' à¸à¸±à¸š '%s'" @@ -993,7 +1027,8 @@ msgid "Owners Of:" msgstr "เจ้าขà¸à¸‡à¸‚à¸à¸‡:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "ลบไฟล์ที่เลืà¸à¸à¸à¸à¸à¸ˆà¸²à¸à¹‚ปรเจà¸à¸•์? (ย้à¸à¸™à¸à¸¥à¸±à¸šà¹„ม่ได้)" #: editor/dependency_editor.cpp @@ -1177,7 +1212,6 @@ msgid "Success!" msgstr "สำเร็จ!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "ติดตั้ง" @@ -1547,6 +1581,10 @@ msgstr "ไม่พบà¹à¸žà¸„เà¸à¸ˆà¸ˆà¸³à¸«à¸™à¹ˆà¸²à¸¢à¸—ี่à¸à¸³à¸« msgid "Template file not found:" msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸š:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1746,7 +1784,7 @@ msgstr "à¹à¸ªà¸”งในตัวจัดà¸à¸²à¸£à¹„ฟล์" msgid "New Folder..." msgstr "สร้างโฟลเดà¸à¸£à¹Œ..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "รีเฟรช" @@ -1797,7 +1835,7 @@ msgstr "ไปหน้า" msgid "Go Up" msgstr "ขึ้นบน" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "เปิด/ปิดไฟล์ที่ซ่à¸à¸™" @@ -1823,27 +1861,32 @@ msgstr "เลื่à¸à¸™à¹‚ฟลเดà¸à¸£à¹Œà¸—ี่ชà¸à¸šà¸¥à¸‡" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "ไปชั้นล่าง" +msgid "Go to previous folder." +msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸«à¸¥à¸±à¸" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "ไปชั้นบน" +msgid "Go to next folder." +msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸«à¸¥à¸±à¸" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸«à¸¥à¸±à¸" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "ค้นหาคลาส" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "ไม่สามารถสร้างโฟลเดà¸à¸£à¹Œ" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "เปิด/ปิดไฟล์ที่ซ่à¸à¸™" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2572,6 +2615,11 @@ msgid "Go to previously opened scene." msgstr "ไปยังฉาà¸à¸—ี่เพิ่งเปิด" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "คัดลà¸à¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "à¹à¸—็บถัดไป" @@ -2774,15 +2822,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "ตัวเลืà¸à¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "เปิดตัวà¹à¸à¹‰à¹„ขถัดไป" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "สลับเต็มจà¸" @@ -3110,6 +3149,11 @@ msgid "Calls" msgstr "จำนวนครั้ง" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "à¹à¸à¹‰à¹„ขธีม..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "เปิด" @@ -3747,6 +3791,7 @@ msgid "Nodes not in Group" msgstr "เพิ่มไปยังà¸à¸¥à¸¸à¹ˆà¸¡" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "ตัวà¸à¸£à¸à¸‡" @@ -4845,6 +4890,11 @@ msgid "Idle" msgstr "พร้à¸à¸¡à¹ƒà¸Šà¹‰à¸‡à¸²à¸™" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "ติดตั้ง" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "ลà¸à¸‡à¹ƒà¸«à¸¡à¹ˆ" @@ -4875,7 +4925,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "ทั้งหมด" @@ -4889,8 +4938,9 @@ msgid "Sort:" msgstr "เรียงตาม:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "ย้à¸à¸™à¸à¸¥à¸±à¸š" +#, fuzzy +msgid "Reverse sorting." +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸£à¹‰à¸à¸‡à¸‚à¸..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4967,31 +5017,38 @@ msgid "Rotation Step:" msgstr "ช่วงà¸à¸‡à¸¨à¸²:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "เลื่à¸à¸™à¹€à¸ªà¹‰à¸™à¸™à¸³à¹à¸™à¸§à¸•ั้ง" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "สร้างเส้นนำà¹à¸™à¸§à¸•ั้ง" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "ลบเส้นนำà¹à¸™à¸§à¸•ั้ง" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "เลื่à¸à¸™à¹€à¸ªà¹‰à¸™à¸™à¸³à¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "สร้างเส้นนำà¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "ลบเส้นนำà¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "สร้างเส้นนำà¹à¸™à¸§à¸•ั้งà¹à¸¥à¸°à¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6655,10 +6712,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "ลบจุด" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6965,9 +7031,14 @@ msgstr "หลัง" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "ย้ายมาที่à¸à¸¥à¹‰à¸à¸‡" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "ย้ายวัตถุที่เลืà¸à¸à¸¡à¸²à¸—ี่à¸à¸¥à¹‰à¸à¸‡" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "ไม่พบโหนดà¹à¸¡à¹ˆà¸—ี่จะรับà¸à¸´à¸™à¸ªà¹à¸•นซ์โหนดลูà¸" @@ -7158,10 +7229,6 @@ msgid "Focus Selection" msgstr "มà¸à¸‡à¸§à¸±à¸•ถุที่เลืà¸à¸" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "ย้ายวัตถุที่เลืà¸à¸à¸¡à¸²à¸—ี่à¸à¸¥à¹‰à¸à¸‡" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¹€à¸¥à¸·à¸à¸" @@ -7764,14 +7831,6 @@ msgid "Transpose" msgstr "สลับà¹à¸à¸™" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "สะท้à¸à¸™à¸‹à¹‰à¸²à¸¢à¸‚วา" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "สะท้à¸à¸™à¸šà¸™à¸¥à¹ˆà¸²à¸‡" - -#: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Disable Autotile" msgstr "Autotiles" @@ -8216,6 +8275,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Vertex" msgstr "มุมรูปทรง" @@ -8310,6 +8373,22 @@ msgid "Color uniform." msgstr "เคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8317,10 +8396,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "à¹à¸à¹‰à¹„ขค่าคงที่เวà¸à¹€à¸•à¸à¸£à¹Œ" @@ -8413,7 +8526,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8421,7 +8534,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8433,7 +8546,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8450,7 +8563,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8519,11 +8632,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8539,7 +8652,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8567,11 +8680,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8614,12 +8727,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "à¹à¸à¹‰à¹„ข Texture Uniform" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "à¹à¸à¹‰à¹„ข Texture Uniform" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup with triplanar." msgstr "à¹à¸à¹‰à¹„ข Texture Uniform" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8629,7 +8747,7 @@ msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8647,15 +8765,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8708,7 +8826,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8736,12 +8854,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8820,47 +8938,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10078,6 +10196,11 @@ msgstr "เปิดสคริปต์" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "หาโหนดà¹à¸¡à¹ˆà¹ƒà¸«à¸¡à¹ˆ" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "เข้าใจ!" @@ -10312,7 +10435,8 @@ msgid "Script is valid." msgstr "สคริปต์ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "à¸à¸±à¸à¸‚ระที่ใช้ได้: a-z, A-Z, 0-9 à¹à¸¥à¸° _" #: editor/script_create_dialog.cpp @@ -10371,7 +10495,7 @@ msgstr "สà¹à¸•ค" msgid "Pick one or more items from the list to display the graph." msgstr "เลืà¸à¸à¸‚้à¸à¸¡à¸¹à¸¥à¸ˆà¸²à¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸à¹€à¸žà¸·à¹ˆà¸à¹à¸ªà¸”งà¸à¸£à¸²à¸Ÿ" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "ข้à¸à¸œà¸´à¸”พลาด" @@ -10786,55 +10910,6 @@ msgstr "ระยะà¸à¸²à¸£à¹€à¸¥à¸·à¸à¸:" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡ solution..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¹‚ปรเจà¸à¸•์ C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "ผิดพลาดในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ solution" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "ผิดพลาดในà¸à¸²à¸£à¸šà¸±à¸™à¸—ึภsolution" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "เสร็จสิ้น" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "ผิดพลาดในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹‚ปรเจà¸à¸•์ C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "โมโน" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™ C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "สร้าง C# solution" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "สร้าง" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Build โปรเจà¸à¸•์" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "ดูไฟล์" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "สิ้นสุดสà¹à¸•คข้à¸à¸œà¸´à¸”พลาดภายใน" @@ -11421,8 +11496,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "ขนาดรูปหน้าจà¸à¹€à¸£à¸´à¹ˆà¸¡à¹‚ปรà¹à¸à¸£à¸¡à¸œà¸´à¸”พลาด (ต้à¸à¸‡à¹€à¸›à¹‡à¸™ 620x300)" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "ต้à¸à¸‡à¸¡à¸µ SpriteFrames ใน 'Frames' เพื่à¸à¹ƒà¸«à¹‰ AnimatedSprite à¹à¸ªà¸”งผลได้" @@ -11481,8 +11557,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸£à¹ˆà¸²à¸‡à¸‚à¸à¸‡à¹à¸ªà¸‡à¸à¸¢à¸¹à¹ˆà¹ƒà¸™ 'texture'" @@ -11492,7 +11569,8 @@ msgid "" msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸«à¸¥à¸²à¸¢à¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡à¹€à¸žà¸·à¹ˆà¸à¹ƒà¸«à¹‰à¸•ัวบังà¹à¸ªà¸‡à¸™à¸µà¹‰à¸—ำงานได้" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "รูปหลายเหลี่ยมขà¸à¸‡à¸•ัวบังà¹à¸ªà¸‡à¸™à¸µà¹‰à¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸² à¸à¸£à¸¸à¸“าวาดรูปหลายเหลี่ยม!" #: scene/2d/navigation_polygon.cpp @@ -11576,13 +11654,15 @@ msgstr "" "เพื่à¸à¹ƒà¸«à¹‰à¸¡à¸µà¸£à¸¹à¸›à¸—รง" #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "VisibilityEnable2D ควรจะเป็นโหนดลูà¸à¸‚à¸à¸‡à¹‚หนดหลัà¸à¹ƒà¸™à¸‰à¸²à¸à¸™à¸µà¹‰" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "ARVRCamera ต้à¸à¸‡à¸¡à¸µ ARVROrigin เป็นโหนดà¹à¸¡à¹ˆ" #: scene/3d/arvr_nodes.cpp @@ -11671,9 +11751,10 @@ msgstr "" "Area, StaticBody, RigidBody, KinematicBody ฯลฯ เพื่à¸à¹ƒà¸«à¹‰à¸¡à¸µà¸£à¸¹à¸›à¸—รง" #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸—รงเพื่à¸à¹ƒà¸«à¹‰ CollisionShape ทำงานได้ à¸à¸£à¸¸à¸“าสร้างรูปทรง!" #: scene/3d/collision_shape.cpp @@ -11703,6 +11784,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "ต้à¸à¸‡à¸¡à¸µ NavigationMesh เพื่à¸à¹ƒà¸«à¹‰à¹‚หนดนี้ทำงานได้" @@ -11740,8 +11825,8 @@ msgstr "PathFollow2D จะทำงานได้ต้à¸à¸‡à¹€à¸›à¹‡à¸™à¹‚ภ#: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11754,7 +11839,10 @@ msgstr "" "à¸à¸£à¸¸à¸“าปรับขนาดขà¸à¸‡ Collision shape à¹à¸—น" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "ต้à¸à¸‡à¹à¸à¹‰à¹„ข Path ให้ชี้ไปยังโหนด Spatial จึงจะทำงานได้" #: scene/3d/soft_body.cpp @@ -11772,8 +11860,9 @@ msgstr "" "à¸à¸£à¸¸à¸“าปรับขนาดขà¸à¸‡ Collision shape à¹à¸—น" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "ต้à¸à¸‡à¸¡à¸µ SpriteFrames ใน 'Frames' เพื่à¸à¹ƒà¸«à¹‰ AnimatedSprite3D à¹à¸ªà¸”งผลได้" @@ -11784,7 +11873,9 @@ msgid "" msgstr "VehicleWheel เป็นระบบล้à¸à¸‚à¸à¸‡ VehicleBody à¸à¸£à¸¸à¸“าใช้เป็นโหนดลูà¸à¸‚à¸à¸‡ VehicleBody" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11822,7 +11913,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง '%s' à¸à¸±à¸š '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11836,7 +11927,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "ผังà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹„ม่ถูà¸à¸•้à¸à¸‡" #: scene/animation/animation_tree_player.cpp @@ -11868,8 +11959,7 @@ msgstr "เพิ่มสีที่เลืà¸à¸à¹ƒà¸™à¸£à¸²à¸¢à¸à¸²à¸£à¹‚ msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11887,22 +11977,24 @@ msgid "Please Confirm..." msgstr "à¸à¸£à¸¸à¸“ายืนยัน..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "ปà¸à¸•ิป๊à¸à¸›à¸à¸±à¸žà¸ˆà¸°à¸–ูà¸à¸‹à¹ˆà¸à¸™à¸ˆà¸™à¸à¸§à¹ˆà¸²à¸ˆà¸°à¸¡à¸µà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¹ƒà¸Šà¹‰à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™ popup() หรืภpopup*() " "โดยขณะà¹à¸à¹‰à¹„ขสามารถเปิดให้มà¸à¸‡à¹€à¸«à¹‡à¸™à¹„ด้ à¹à¸•่เมื่à¸à¹€à¸£à¸´à¹ˆà¸¡à¹‚ปรà¹à¸à¸£à¸¡à¸›à¹Šà¸à¸›à¸à¸±à¸žà¸ˆà¸°à¸–ูà¸à¸‹à¹ˆà¸à¸™" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer ทำงานได้เมื่à¸à¸¡à¸µà¹‚หนดลูà¸à¹€à¸žà¸µà¸¢à¸‡à¸«à¸™à¸¶à¹ˆà¸‡à¹‚หนดเท่านั้น\n" @@ -11955,9 +12047,19 @@ msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "ต้นฉบับไม่ถูà¸à¸•้à¸à¸‡!" + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "ต้นฉบับไม่ถูà¸à¸•้à¸à¸‡!" +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "ต้นฉบับไม่ถูà¸à¸•้à¸à¸‡!" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11975,6 +12077,64 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "ไปชั้นล่าง" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "ไปชั้นบน" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "เปิดตัวà¹à¸à¹‰à¹„ขถัดไป" + +#~ msgid "Reverse" +#~ msgstr "ย้à¸à¸™à¸à¸¥à¸±à¸š" + +#~ msgid "Mirror X" +#~ msgstr "สะท้à¸à¸™à¸‹à¹‰à¸²à¸¢à¸‚วา" + +#~ msgid "Mirror Y" +#~ msgstr "สะท้à¸à¸™à¸šà¸™à¸¥à¹ˆà¸²à¸‡" + +#~ msgid "Generating solution..." +#~ msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡ solution..." + +#~ msgid "Generating C# project..." +#~ msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¹‚ปรเจà¸à¸•์ C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "ผิดพลาดในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡ solution" + +#~ msgid "Failed to save solution." +#~ msgstr "ผิดพลาดในà¸à¸²à¸£à¸šà¸±à¸™à¸—ึภsolution" + +#~ msgid "Done" +#~ msgstr "เสร็จสิ้น" + +#~ msgid "Failed to create C# project." +#~ msgstr "ผิดพลาดในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹‚ปรเจà¸à¸•์ C#" + +#~ msgid "Mono" +#~ msgstr "โมโน" + +#~ msgid "About C# support" +#~ msgstr "เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™ C#" + +#~ msgid "Create C# solution" +#~ msgstr "สร้าง C# solution" + +#~ msgid "Builds" +#~ msgstr "สร้าง" + +#~ msgid "Build Project" +#~ msgstr "Build โปรเจà¸à¸•์" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "ดูไฟล์" + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "ค้นหาคลาส" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index e27ab0131a..f59cc0a809 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -152,6 +152,31 @@ msgid "Anim Change Call" msgstr "Animasyon DeÄŸiÅŸikliÄŸi ÇaÄŸrısı" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Anim Anahtar-kare Zamanını DeÄŸiÅŸtir" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Animasyon GeçiÅŸinin DeÄŸiÅŸimi" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Animasyon DeÄŸiÅŸikliÄŸi Dönüşümü" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Anim Anahtar-kare DeÄŸerini DeÄŸiÅŸtir" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Animasyon DeÄŸiÅŸikliÄŸi ÇaÄŸrısı" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Animasyon UzunluÄŸunu DeÄŸiÅŸtir" @@ -652,6 +677,10 @@ msgstr "Satıra git" msgid "Line Number:" msgstr "Satır Numarası:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "EÅŸleÅŸme Yok" @@ -701,7 +730,7 @@ msgstr "UzaklaÅŸtır" msgid "Reset Zoom" msgstr "YaklaÅŸmayı Sıfırla" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Uyarılar" @@ -807,6 +836,11 @@ msgid "Connect" msgstr "BaÄŸla" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "Sinyaller:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Bunu '%s' ÅŸuna '%s' baÄŸla" @@ -974,7 +1008,8 @@ msgid "Owners Of:" msgstr "Åžunların sahipleri:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "Seçili dosyaları projeden kaldır? (geri alınamaz)" #: editor/dependency_editor.cpp @@ -1157,7 +1192,6 @@ msgid "Success!" msgstr "BaÅŸarılı!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Kur" @@ -1529,6 +1563,10 @@ msgstr "Özel yayınlama ÅŸablonu bulunamadı." msgid "Template file not found:" msgstr "Åžablon dosyası bulunamadı:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1726,7 +1764,7 @@ msgstr "Dosya Yöneticisinde Göster" msgid "New Folder..." msgstr "Yeni Klasör..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Yenile" @@ -1777,7 +1815,7 @@ msgstr "İleri Git" msgid "Go Up" msgstr "Yukarı Git" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Gizli Dosyalari Aç / Kapat" @@ -1802,25 +1840,32 @@ msgid "Move Favorite Down" msgstr "BeÄŸenileni AÅŸağı Taşı" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Önceki Klasör" +#, fuzzy +msgid "Go to previous folder." +msgstr "Üst klasöre git" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Sonraki Klasör" +#, fuzzy +msgid "Go to next folder." +msgstr "Üst klasöre git" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "Üst klasöre git" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Dosyaları ara" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Bu klasörü favorilerden çıkar/favorilere ekle." -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "Gizli Dosyalari Aç / Kapat" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2425,7 +2470,7 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" -"Sahne '% s' otomatik olarak içe aktarıldı, bu nedenle deÄŸiÅŸtirilemez.\n" +"Sahne '%s' otomatik olarak içe aktarıldı, bu nedenle deÄŸiÅŸtirilemez.\n" "DeÄŸiÅŸiklik yapmak için miras alınmış yeni bir sahne oluÅŸturulabilir." #: editor/editor_node.cpp @@ -2555,6 +2600,11 @@ msgid "Go to previously opened scene." msgstr "Daha önce açılan sahneye git." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Dosya Yolunu Tıpkıla" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Sonraki sekme" @@ -2767,15 +2817,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Düzenleyici Verileri/Ayarları Klasörünü Aç" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Sonraki Düzenleyiciyi aç" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Tam Ekran Aç / Kapat" @@ -3096,6 +3137,11 @@ msgid "Calls" msgstr "ÇaÄŸrılar" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Tema düzenle..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Açık" @@ -3725,6 +3771,7 @@ msgid "Nodes not in Group" msgstr "Düğümler Grupta DeÄŸil" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Düğümleri Süzgeçden Geçir" @@ -4807,6 +4854,11 @@ msgid "Idle" msgstr "BoÅŸta" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Kur" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Tekrarla" @@ -4837,7 +4889,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Hepsi" @@ -4851,8 +4902,9 @@ msgid "Sort:" msgstr "Sırala:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Tersi" +#, fuzzy +msgid "Reverse sorting." +msgstr "İsteniyor..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4933,31 +4985,38 @@ msgid "Rotation Step:" msgstr "Dönme Adımı:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "Dikey kılavuzu taşı" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "Yeni dikey kılavuz oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "Dikey kılavuzu kaldır" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "Yatay kılavuzu taşı" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "Yeni yatay kılavuz oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "Yatay kılavuzu kaldır" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "Yeni yatay ve dikey kılavuzlar oluÅŸtur" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6620,10 +6679,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Noktalar oluÅŸtur." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6930,9 +6998,14 @@ msgstr "Arka" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" msgstr "Görünüme Ayarla" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "Seçimi Görünüme Ayarla" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "ÇocuÄŸun örnek alacağı bir ebeveyn yok." @@ -7123,10 +7196,6 @@ msgid "Focus Selection" msgstr "Seçime Odaklan" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "Seçimi Görünüme Ayarla" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "Seçim Aracı" @@ -7726,14 +7795,6 @@ msgid "Transpose" msgstr "Tersine Çevir" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "X'e Aynala" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Y'ye Aynala" - -#: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy msgid "Disable Autotile" msgstr "Oto-döşemeler" @@ -8180,6 +8241,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Vertex" msgstr "Köşenoktalar" @@ -8273,6 +8338,22 @@ msgid "Color uniform." msgstr "Dönüşüm" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8280,10 +8361,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "Vec Sabitini DeÄŸiÅŸtir" @@ -8376,7 +8491,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8384,7 +8499,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8396,7 +8511,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8413,7 +8528,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8482,11 +8597,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8502,7 +8617,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8530,11 +8645,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8577,12 +8692,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "Doku Tekdüzenini DeÄŸiÅŸtir" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "Doku Tekdüzenini DeÄŸiÅŸtir" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup with triplanar." msgstr "Doku Tekdüzenini DeÄŸiÅŸtir" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8592,7 +8712,7 @@ msgstr "Dönüştürme İletiÅŸim Kutusu..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8610,15 +8730,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8671,7 +8791,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8699,12 +8819,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8783,47 +8903,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10052,6 +10172,11 @@ msgstr "Betik Aç" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "Düğümün EbeveynliÄŸini DeÄŸiÅŸtir" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "Anlamlı!" @@ -10288,7 +10413,8 @@ msgid "Script is valid." msgstr "Betik geçerli" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "İzin verilenler: a-z, A-Z, 0-9 ve _" #: editor/script_create_dialog.cpp @@ -10347,7 +10473,7 @@ msgstr "Çerçeveleri Yığ" msgid "Pick one or more items from the list to display the graph." msgstr "GrafiÄŸi görüntülemek için listeden bir veya daha fazla öğe seçin." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Hatalar" @@ -10763,55 +10889,6 @@ msgstr "Uzaklık Seç:" msgid "Class name can't be a reserved keyword" msgstr "Sınıf ismi ayrılmış anahtar kelime olamaz" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Çözüm oluÅŸturuluyor..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "C# projesi üretiliyor..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Çözüm oluÅŸturma baÅŸarısız." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Çözüm kaydetme baÅŸarısız." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Oldu" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "C# projesi oluÅŸturma baÅŸarısız." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Tekli" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "C# desteÄŸi hakkında" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "C# Çözümü oluÅŸtur" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "İnÅŸalar" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Projeyi İnÅŸa et" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "Dosyaları Görüntüle" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "İç özel durum yığını izlemesinin sonu" @@ -11409,8 +11486,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "Geçersiz açılış görüntülüğü bediz boyutları (620x300 olmalı)." #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Bir SpriteFrames kaynağı oluÅŸturulmalı ya da 'Kareler' özelliÄŸine atanmalı " @@ -11477,8 +11555,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "Işık yüzeyli bir doku, 'texture' özelliÄŸine saÄŸlanmalıdır." @@ -11490,7 +11569,8 @@ msgstr "" "(ya da çizilmelidir)." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "Bu engelleyici için engelleyici çokgeni boÅŸ. Lütfen bir çokgen çizin!" #: scene/2d/navigation_polygon.cpp @@ -11584,15 +11664,17 @@ msgstr "" "vermek için kullanın." #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D düğümü düzenlenmiÅŸ sahne kökü doÄŸrudan ebeveyn olarak " "kullanıldığında çalışır." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "ARVRCamera ebeveyni olarak ARVROrigin düğümüne sahip olmalı" #: scene/3d/arvr_nodes.cpp @@ -11688,9 +11770,10 @@ msgstr "" "RigidBody, KinematicBody, v.b. onu sadece bunların çocuÄŸu olarak kullanın." #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "CollisionShape'in çalışması için bir ÅŸekil verilmelidir. Lütfen bunun için " "bir ÅŸekil kaynağı oluÅŸturun!" @@ -11723,6 +11806,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11764,8 +11851,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11779,7 +11866,10 @@ msgstr "" "Boyu deÄŸiÅŸikliÄŸini bunun yerine çocuk çarpışma ÅŸekilleri içinden yapın." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" "Yol özelliÄŸi, çalışmak için geçerli bir Spatial düğümüne iÅŸaret etmelidir." @@ -11799,8 +11889,9 @@ msgstr "" "Boyu deÄŸiÅŸikliÄŸini bunun yerine çocuk çarpışma ÅŸekilleri içinden yapın." #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "AnimatedSprite3D 'nin çerçeveleri görüntülemek için bir SpriteFrames kaynağı " @@ -11815,8 +11906,10 @@ msgstr "" "Lütfen bunu VehicleBody'nin çocuÄŸu olarak kullanın." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment bir Environment kaynağı gerektirir." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" #: scene/3d/world_environment.cpp msgid "" @@ -11857,7 +11950,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Åžunun: '%s' ÅŸununla: '%s' baÄŸlantısını kes" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11873,7 +11966,7 @@ msgstr "" #: scene/animation/animation_tree.cpp #, fuzzy -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Animasyon aÄŸacı geçersizdir." #: scene/animation/animation_tree_player.cpp @@ -11905,8 +11998,7 @@ msgstr "Åžuanki rengi bir önayar olarak kaydet" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11924,23 +12016,25 @@ msgid "Please Confirm..." msgstr "Lütfen DoÄŸrulayın..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Açılır pencereler popup() veya popup*() iÅŸlevleri çaÄŸrılmadıkça varsayılan " "olarak gizlenecektir. Onları düzenleme için görünür kılmak da iyidir, ancak " "çalışırken gizlenecekler." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer tek bir çocuk denetimi ile çalışmak için tasarlanmıştır.\n" @@ -11994,9 +12088,19 @@ msgstr "GiriÅŸ Ekle" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "Geçersiz kaynak!" + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "Geçersiz kaynak!" +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "Geçersiz kaynak!" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -12013,6 +12117,65 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Önceki Klasör" + +#~ msgid "Next Folder" +#~ msgstr "Sonraki Klasör" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "Sonraki Düzenleyiciyi aç" + +#~ msgid "Reverse" +#~ msgstr "Tersi" + +#~ msgid "Mirror X" +#~ msgstr "X'e Aynala" + +#~ msgid "Mirror Y" +#~ msgstr "Y'ye Aynala" + +#~ msgid "Generating solution..." +#~ msgstr "Çözüm oluÅŸturuluyor..." + +#~ msgid "Generating C# project..." +#~ msgstr "C# projesi üretiliyor..." + +#~ msgid "Failed to create solution." +#~ msgstr "Çözüm oluÅŸturma baÅŸarısız." + +#~ msgid "Failed to save solution." +#~ msgstr "Çözüm kaydetme baÅŸarısız." + +#~ msgid "Done" +#~ msgstr "Oldu" + +#~ msgid "Failed to create C# project." +#~ msgstr "C# projesi oluÅŸturma baÅŸarısız." + +#~ msgid "Mono" +#~ msgstr "Tekli" + +#~ msgid "About C# support" +#~ msgstr "C# desteÄŸi hakkında" + +#~ msgid "Create C# solution" +#~ msgstr "C# Çözümü oluÅŸtur" + +#~ msgid "Builds" +#~ msgstr "İnÅŸalar" + +#~ msgid "Build Project" +#~ msgstr "Projeyi İnÅŸa et" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "Dosyaları Görüntüle" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment bir Environment kaynağı gerektirir." + #, fuzzy #~ msgid "Enabled Classes" #~ msgstr "Sınıfları Ara" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 5c3df4223f..19e21461cd 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:48+0000\n" +"PO-Revision-Date: 2019-07-21 11:06+0000\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -138,6 +138,31 @@ msgid "Anim Change Call" msgstr "Змінити виклик анімації" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "Змінити Ñ‡Ð°Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¾Ð³Ð¾ кадру" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Змінити перехід" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Змінити перетвореннÑ" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Змінити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¾Ð³Ð¾ кадру" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Змінити виклик анімації" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "Змінити триваліÑть анімації" @@ -462,9 +487,8 @@ msgid "Select All" msgstr "Виділити вÑе" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "Позначити вузол" +msgstr "СкаÑувати позначеннÑ" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -641,6 +665,10 @@ msgstr "Перейти до Ñ€Ñдка" msgid "Line Number:" msgstr "Ðомер Ñ€Ñдка:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "ВиÑвлено %d відповідників." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "Ðемає збігів" @@ -690,7 +718,7 @@ msgstr "ЗменшеннÑ" msgid "Reset Zoom" msgstr "Скинути маÑштаб" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "ПопередженнÑ" @@ -797,6 +825,10 @@ msgid "Connect" msgstr "З'єднати" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Сигнал:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Приєднати '%s' до %s'" @@ -959,8 +991,9 @@ msgid "Owners Of:" msgstr "ВлаÑники:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "Видалити вибрані файли з проєкту? (ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ)" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "" +"Вилучити позначені файли з проєкту? (Вилучені файли не вдаÑтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸)" #: editor/dependency_editor.cpp msgid "" @@ -1142,7 +1175,6 @@ msgid "Success!" msgstr "УÑпіх!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Ð’Ñтановити" @@ -1330,7 +1362,6 @@ msgid "Must not collide with an existing engine class name." msgstr "Ðазва має відрізнÑтиÑÑ Ð²Ñ–Ð´ наÑвної назви клаÑу рушіÑ." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "Ðазва не повинна збігатиÑÑ Ñ–Ð· наÑвною назвою вбудованого типу." @@ -1509,6 +1540,12 @@ msgstr "Ðетипового шаблону випуÑку не знайдено msgid "Template file not found:" msgstr "Файл шаблону не знайдено:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"При екÑпортуванні у 32-бітовому режимі вбудовані PCK не можуть перевищувати " +"за розміром 4 ГіБ." + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "3D-редактор" @@ -1534,9 +1571,8 @@ msgid "Node Dock" msgstr "Бічна панель вузлів" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "Бічна панель файлової ÑиÑтеми" +msgstr "Бічна панель файлової ÑиÑтеми та імпортуваннÑ" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1587,7 +1623,6 @@ msgid "File '%s' format is invalid, import aborted." msgstr "Формат файла «%s» Ñ” некоректним, Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." @@ -1604,9 +1639,8 @@ msgid "Unset" msgstr "Ðе вÑтановлено" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "Поточний профіль" +msgstr "Поточний профіль:" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1628,9 +1662,8 @@ msgid "Export" msgstr "ЕкÑпортуваннÑ" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "ДоÑтупні профілі" +msgstr "ДоÑтупні профілі:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1685,7 +1718,7 @@ msgstr "Показати у менеджері файлів" msgid "New Folder..." msgstr "Створити теку..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Оновити" @@ -1736,7 +1769,7 @@ msgstr "Йти вперед" msgid "Go Up" msgstr "Вгору" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Перемкнути приховані файли" @@ -1761,23 +1794,31 @@ msgid "Move Favorite Down" msgstr "ПереміÑтити вибране вниз" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñ‚ÐµÐºÐ°" +#, fuzzy +msgid "Go to previous folder." +msgstr "Перейти до батьківÑької теки." #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "ÐаÑтупна тека" +#, fuzzy +msgid "Go to next folder." +msgstr "Перейти до батьківÑької теки." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Перейти до батьківÑької теки." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Шукати файли" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Перемкнути Ñтан вибраноÑті Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— теки." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Увімкнути або вимкнути видиміÑть прихованих файлів." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2509,6 +2550,10 @@ msgid "Go to previously opened scene." msgstr "Перейти до раніше відкритої Ñцени." #: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Копіювати текÑÑ‚" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "ÐаÑтупна вкладка" @@ -2711,32 +2756,20 @@ msgid "Editor Layout" msgstr "Редактор компонуваннÑ" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "Зробити кореневим Ð´Ð»Ñ Ñцени" +msgstr "Зробити знімок вікна" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ‚ÐµÐºÐ¸ даних/параметрів редактора" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "Відкрити наÑтупний редактор" +msgstr "Знімки зберігаютьÑÑ Ñƒ теці Data/Settings редактора." #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Перемикач повноекранного режиму" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "Перемкнути видиміÑть CanvasItem" +msgstr "Увімкнути або вимкнути конÑоль ÑиÑтеми" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2845,19 +2878,16 @@ msgid "Spins when the editor window redraws." msgstr "ОбертаєтьÑÑ, коли перемальовуєтьÑÑ Ð²Ñ–ÐºÐ½Ð¾ редактора." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Ðеперервна" +msgstr "Оновлювати неперервно" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Оновлювати зміни" +msgstr "Оновлювати при зміні" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "Вимкнути Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ°" +msgstr "Приховати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ°" #: editor/editor_node.cpp msgid "FileSystem" @@ -3055,6 +3085,11 @@ msgid "Calls" msgstr "Виклики" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Редагувати тему" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "Увімкнено" @@ -3674,6 +3709,7 @@ msgid "Nodes not in Group" msgstr "Вузли поза групою" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Фільтрувати вузли" @@ -4724,6 +4760,10 @@ msgid "Idle" msgstr "ПроÑтій" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Ð’Ñтановити…" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Повторити Ñпробу" @@ -4752,7 +4792,6 @@ msgid "Last" msgstr "ОÑтанній" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Ð’Ñе" @@ -4766,8 +4805,8 @@ msgid "Sort:" msgstr "Сортувати:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Зворотний" +msgid "Reverse sorting." +msgstr "Обернений порÑдок." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4848,32 +4887,32 @@ msgid "Rotation Step:" msgstr "Крок повороту:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "ПереміÑтити вертикальну напрÑмну" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "Створити нову вертикальну напрÑмну" +msgid "Create Vertical Guide" +msgstr "Створити вертикальну напрÑмну" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +msgid "Remove Vertical Guide" msgstr "Вилучити вертикальну напрÑмну" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "ПереміÑтити горизонтальну напрÑмну" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "Створити нову горизонтальну напрÑмну" +msgid "Create Horizontal Guide" +msgstr "Створити горизонтальну напрÑмну" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "Вилучити горизонтальну напрÑмну" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "Створити нові горизонтальні та вертикальні напрÑмні" +msgid "Create Horizontal and Vertical Guides" +msgstr "Створити горизонтальні та вертикальні напрÑмні" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move pivot" @@ -5306,9 +5345,8 @@ msgstr "Завантажити маÑку випромінюваннÑ" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "Перезавантажити зараз" +msgstr "ПерезапуÑтити" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6219,18 +6257,16 @@ msgid "Find Next" msgstr "Знайти наÑтупне" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "Фільтрувати влаÑтивоÑті" +msgstr "Фільтрувати Ñкрипти" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." msgstr "Увімкнути або вимкнути упорÑÐ´ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° абеткою у ÑпиÑку методів." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "Режим фільтруваннÑ:" +msgstr "Фільтрувати методи" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6464,10 +6500,18 @@ msgid "Syntax Highlighter" msgstr "ЗаÑіб підÑÐ²Ñ–Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ ÑинтакÑиÑу" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "Перейти" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "Закладки" +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "Точки зупину" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6755,9 +6799,15 @@ msgid "Rear" msgstr "Ззаду" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "ВирівнÑти з переглÑдом" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "ВирівнÑти позначене із переглÑдом" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "Ðемає батьківÑького запиÑу Ð´Ð»Ñ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾." @@ -6946,10 +6996,6 @@ msgid "Focus Selection" msgstr "ФокуÑувати позначене" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "ВирівнÑти позначене із переглÑдом" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "ІнÑтрумент позначеннÑ" @@ -7512,14 +7558,6 @@ msgid "Transpose" msgstr "ТранÑпонувати" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "Віддзеркалити за X" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "Віддзеркалити за Y" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "Вимкнути автоплитки" @@ -7919,6 +7957,10 @@ msgid "Visual Shader Input Type Changed" msgstr "Змінено тип Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ шейдера" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "(лише GLES3)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "Вершина" @@ -8003,6 +8045,22 @@ msgid "Color uniform." msgstr "Однорідний колір." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "Повертає булевий результат порівнÑÐ½Ð½Ñ %s між двома параметрами." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "РівніÑть (==)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "Більше (>)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "Більше або дорівнює (>=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8012,11 +8070,47 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "Повертає булевий результат порівнÑÐ½Ð½Ñ Ð¼Ñ–Ð¶ INF та ÑкалÑрним параметром." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "Повертає булевий результат порівнÑÐ½Ð½Ñ Ð¼Ñ–Ð¶ NaN Ñ– ÑкалÑрним параметром." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "Менше (<)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "Менше або дорівнює (<=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "Ðе дорівнює (!=)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" "Повертає пов'Ñзаний вектор за заданим булевим значеннÑм «true» або «false»." #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "Повертає булевий результат порівнÑÐ½Ð½Ñ Ð¼Ñ–Ð¶ двома параметрами." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" +"Повертає булевий результат порівнÑÐ½Ð½Ñ Ð¼Ñ–Ð¶ INF (або NaN) та ÑкалÑрним " +"параметром." + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "Булева Ñтала." @@ -8025,43 +8119,36 @@ msgid "Boolean uniform." msgstr "Однорідне булеве." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for all shader modes." -msgstr "Вхідний параметр «uv» Ð´Ð»Ñ ÑƒÑÑ–Ñ… режимів шейдера." +msgstr "Вхідний параметр «%s» Ð´Ð»Ñ ÑƒÑÑ–Ñ… режимів шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Input parameter." msgstr "Вхідний параметр." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "Вхідний параметр «uv» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ вершин Ñ– фрагментів шейдера." +msgstr "Вхідний параметр «%s» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ вершин Ñ– фрагментів шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment and light shader modes." -msgstr "Вхідний параметр «view» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñ–Ð² фрагментів та Ñвітла шейдера." +msgstr "Вхідний параметр «%s» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñ–Ð² фрагментів та Ñвітла шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for fragment shader mode." -msgstr "Вхідний параметр «side» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñ–Ð² фрагментів шейдера." +msgstr "Вхідний параметр «%s» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñ–Ð² фрагментів шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for light shader mode." -msgstr "Вхідний параметр «diffuse» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ Ñвітла шейдера." +msgstr "Вхідний параметр «%s» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ Ñвітла шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex shader mode." -msgstr "Вхідний параметр «custom» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ вершин шейдера." +msgstr "Вхідний параметр «%s» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ вершин шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "Вхідний параметр «uv» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ вершин Ñ– фрагментів шейдера." +msgstr "Вхідний параметр «%s» Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ вершин Ñ– фрагментів шейдера." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar function." @@ -8112,16 +8199,16 @@ msgid "Returns the arc-cosine of the parameter." msgstr "Повертає арккоÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." -msgstr "(Лише GLES3) Повертає обернений гіперболічний коÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "Повертає обернений гіперболічний коÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." msgstr "Повертає аркÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." -msgstr "(Лише GLES3) Повертає обернений гіперболічний ÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "Повертає обернений гіперболічний ÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." @@ -8132,8 +8219,8 @@ msgid "Returns the arc-tangent of the parameters." msgstr "Повертає Ð°Ñ€ÐºÑ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." -msgstr "(Лише GLES3) Повертає обернений гіперболічний Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "Повертає обернений гіперболічний Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -8151,8 +8238,8 @@ msgid "Returns the cosine of the parameter." msgstr "Повертає коÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." -msgstr "(Лише GLES3) Повертає гіперболічний коÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "Повертає гіперболічний коÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." @@ -8224,12 +8311,12 @@ msgid "1.0 / scalar" msgstr "1.0 / ÑкалÑÑ€" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." -msgstr "(Лише GLES3) Знаходить найближче ціле Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾ параметра." +msgid "Finds the nearest integer to the parameter." +msgstr "Знаходить найближче ціле Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾ параметра." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." -msgstr "(Лише GLES3) Знаходить найближче парне ціле Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾ параметра." +msgid "Finds the nearest even integer to the parameter." +msgstr "Знаходить найближче парне ціле Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾ параметра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -8244,8 +8331,8 @@ msgid "Returns the sine of the parameter." msgstr "Повертає ÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." -msgstr "(Лише GLES3) Повертає гіперболічний ÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." +msgid "Returns the hyperbolic sine of the parameter." +msgstr "Повертає гіперболічний ÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." @@ -8280,12 +8367,12 @@ msgid "Returns the tangent of the parameter." msgstr "Повертає Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." -msgstr "(Лише GLES3) Повертає гіперболічний Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "Повертає гіперболічний Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." -msgstr "(Лише GLES3) Визначає обрізане до цілого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." +msgid "Finds the truncated value of the parameter." +msgstr "Визначає обрізане до цілого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." @@ -8324,12 +8411,16 @@ msgid "Perform the texture lookup." msgstr "Виконує пошук текÑтури." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." -msgstr "Однорідна кубічна текÑтура." +msgid "Cubic texture uniform lookup." +msgstr "Пошук однорідної кубічної текÑтури." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." +msgstr "Пошук однорідної плаÑкої текÑтури." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." -msgstr "Однорідна плаÑка текÑтура." +msgid "2D texture uniform lookup with triplanar." +msgstr "Однорідний пошук плаÑкої текÑтури за допомогою трьох площин." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." @@ -8337,7 +8428,7 @@ msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8345,7 +8436,7 @@ msgid "" "whose number of rows is the number of components in 'c' and whose number of " "columns is the number of components in 'r'." msgstr "" -"(Лише GLES3) ОбчиÑлити зовнішній добуток пари векторів.\n" +"ОбчиÑлити зовнішній добуток пари векторів.\n" "\n" "OuterProduct вважає перший параметр, «c», Ñ” вектором-Ñтовпчиком (матрицею із " "одного Ñтовпчика) а другий параметр, «r», Ñ” вектором-Ñ€Ñдком (матрицею із " @@ -8362,16 +8453,16 @@ msgid "Decomposes transform to four vectors." msgstr "Розкладає Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð° чотири вектори." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." -msgstr "(Лише GLES3) ОбчиÑлює визначник перетвореннÑ." +msgid "Calculates the determinant of a transform." +msgstr "ОбчиÑлює визначник перетвореннÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." -msgstr "(Лише GLES3) ОбчиÑлює обернену матрицю перетвореннÑ." +msgid "Calculates the inverse of a transform." +msgstr "ОбчиÑлює обернену матрицю перетвореннÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." -msgstr "(Лише GLES3) ОбчиÑлює транÑпозицію перетвореннÑ." +msgid "Calculates the transpose of a transform." +msgstr "ОбчиÑлює транÑпозицію перетвореннÑ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." @@ -8419,7 +8510,7 @@ msgstr "ОбчиÑлює ÑкалÑрний добуток двох вектор #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8451,14 +8542,14 @@ msgstr "1.0 / вектор" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" "Повертає вектор, Ñкий вказує напрÑмок Ð²Ñ–Ð´Ð±Ð¸Ñ‚Ñ‚Ñ ( a — вектор падіннÑ, b — " "вектор нормалі )." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "Повертає вектор, Ñкий вказує напрÑмок рефракції." #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8557,64 +8648,59 @@ msgstr "" "напрÑмку поглÑду камери (функції Ñлід передати відповіді вхідні дані)." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." -msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або Ñвітла) Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ ÑкалÑрної " -"похідної." +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "(лише у режимі фрагментів або Ñвітла) Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ ÑкалÑрної похідної." #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." -msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або Ñвітла) Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— " -"похідної." +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "(лише у режимі фрагментів або Ñвітла) Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— похідної." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або Ñвітла) (вектор) Похідна у «x» на " -"оÑнові локального диференціюваннÑ." +"(лише у режимі фрагментів або Ñвітла) (вектор) Похідна у «x» на оÑнові " +"локального диференціюваннÑ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або Ñвітла) (ÑкалÑÑ€) Похідна у «x» на " -"оÑнові локального диференціюваннÑ." +"(лише у режимі фрагментів або Ñвітла) (ÑкалÑÑ€) Похідна у «x» на оÑнові " +"локального диференціюваннÑ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або Ñвітла) (вектор) Похідна у «y» на " -"оÑнові локального диференціюваннÑ." +"(лише у режимі фрагментів або Ñвітла) (вектор) Похідна у «y» на оÑнові " +"локального диференціюваннÑ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або Ñвітла) (ÑкалÑÑ€) Похідна у «y» на " -"оÑнові локального диференціюваннÑ." +"(лише у режимі фрагментів або Ñвітла) (ÑкалÑÑ€) Похідна у «y» на оÑнові " +"локального диференціюваннÑ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або Ñвітла) (вектор) Сума похідних за " -"модулем у «x» та «y»." +"(лише у режимі фрагментів або Ñвітла) (вектор) Сума похідних за модулем у " +"«x» та «y»." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" -"(Лише GLES3) (лише у режимі фрагментів або Ñвітла) Сума похідних за модулем " -"у «x» та «y»." +"(лише у режимі фрагментів або Ñвітла) Сума похідних за модулем у «x» та «y»." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" @@ -9829,9 +9915,8 @@ msgid "Add Child Node" msgstr "Додати дочірній вузол" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "Згорнути вÑе" +msgstr "Розгорнути/Згорнути вÑе" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -9842,6 +9927,11 @@ msgid "Extend Script" msgstr "Розширити Ñкрипт" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Змінити батьківÑький вузол" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "Зробити кореневим Ð´Ð»Ñ Ñцени" @@ -9862,9 +9952,8 @@ msgid "Delete (No Confirm)" msgstr "Вилучити (без підтвердженнÑ)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." -msgstr "Додати або Ñтворити новий вузол" +msgstr "Додати або Ñтворити новий вузол." #: editor/scene_tree_dock.cpp msgid "" @@ -10059,8 +10148,8 @@ msgid "Script is valid." msgstr "Скрипт Ñ” коректним." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" -msgstr "Можна викориÑтовувати: a-z, A-Z, 0-9 Ñ– _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "Можна викориÑтовувати: a-z, A-Z, 0-9, _ Ñ– ." #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -10114,7 +10203,7 @@ msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека" msgid "Pick one or more items from the list to display the graph." msgstr "Виберіть один або декілька пунктів зі ÑпиÑку Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду графу." -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "Помилки" @@ -10516,54 +10605,6 @@ msgstr "ВідÑтань вибору:" msgid "Class name can't be a reserved keyword" msgstr "Ðазвою клаÑу не може бути зарезервоване ключове Ñлово" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð²'Ñзку..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "Створюємо проєкт C#..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "Ðе вдалоÑÑ Ñтворити розв'Ñзок." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ розв'Ñзок." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "Зроблено" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "Ðе вдалоÑÑ Ñтворити проєкт C#." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Моно" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "Про підтримку C#" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "Створити розв'Ñзок C#" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "ЗбираннÑ" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "Зібрати проєкт" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "ПереглÑнути журнал" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "Кінець траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ виключеннÑ" @@ -11188,7 +11229,7 @@ msgstr "Ðекоректні розмірноÑті Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–ÐºÐ #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "Щоб AnimatedSprite могла показувати кадри, має бути Ñтворено або вÑтановлено " @@ -11255,9 +11296,9 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." -msgstr "Ð”Ð»Ñ Ð²Ð»Ð°ÑтивоÑті «texture» Ñлід надати текÑтуру із формою оÑвітленнÑ." +msgstr "Ð”Ð»Ñ Ð²Ð»Ð°ÑтивоÑті «Texture» Ñлід надати текÑтуру із формою оÑвітленнÑ." #: scene/2d/light_occluder_2d.cpp msgid "" @@ -11267,10 +11308,10 @@ msgstr "" "багатокутник затулÑннÑ." #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" "Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ затулÑÐ½Ð½Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾ÐºÑƒÑ‚Ð½Ð¸Ðº Ñ” порожнім. Будь лаÑка, намалюйте " -"багатокутник!" +"багатокутник." #: scene/2d/navigation_polygon.cpp msgid "" @@ -11359,27 +11400,27 @@ msgstr "" "вÑтановіть Ñ—Ñ—." #: scene/2d/tile_map.cpp -#, fuzzy msgid "" "TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D призначено лише Ð´Ð»Ñ Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ Ð´Ð»Ñ Ð·Ñ–Ñ‚ÐºÐ½ÐµÐ½ÑŒ похідному " -"вузлу CollisionObject2D. Будь лаÑка, викориÑтовуйте його Ñк дочірній елемент " -"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D тощо, щоб надати їм форми." +"TileMap із увімкненим Use Parent on потребує Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ñ„Ð¾Ñ€Ð¼ до батьківÑького " +"CollisionShape2D. Будь лаÑка, викориÑтовуйте його Ñк дочірній елемент " +"Area2D, StaticBody2D, RigidBody2D, KinematicBody2D тощо, щоб надати йому " +"форми." #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" "VisibilityEnable2D найкраще працюватиме, Ñкщо його викориÑтано із " "безпоÑереднім батьківÑьким елементом — редагованим коренем Ñцени." #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" -msgstr "ARVRCamera повинен мати батьківÑьким вузлом вузол ARVROrigin" +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "ARVRCamera повинен мати батьківÑьким вузлом вузол ARVROrigin." #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -11471,10 +11512,10 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "Ð”Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ñ†ÐµÐ·Ð´Ð°Ñ‚Ð½Ð¾Ñті CollisionShape Ñлід надати форму. Будь " -"лаÑка, Ñтворіть реÑÑƒÑ€Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ елемента!" +"лаÑка, Ñтворіть реÑÑƒÑ€Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ елемента." #: scene/3d/collision_shape.cpp msgid "" @@ -11508,6 +11549,10 @@ msgstr "" "У драйвері GLES2 не передбачено підтримки GIProbes.\n" "СкориÑтайтеÑÑ Ð·Ð°Ð¼Ñ–Ñть них BakedLightmap." +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "SpotLight з кутом, Ñкий Ñ” більшим за 90 градуÑів, не може давати тіні." + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11553,10 +11598,10 @@ msgstr "PathFollow працюватиме лише Ñк дочірній елеР#: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" -"PathFollow ROTATION_ORIENTED потребує Ð²Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«Up Vector» у його " +"ROTATION_ORIENTED у PathFollow потребує Ð²Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«Up Vector» у його " "батьківÑькому реÑурÑÑ– Curve у Path." #: scene/3d/physics_body.cpp @@ -11570,10 +11615,12 @@ msgstr "" "ЗаміÑть цієї зміни, вам варто змінити розміри дочірніх форм зіткненнÑ." #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" -"Щоб уÑе працювало Ñк Ñлід, влаÑтивіÑть шлÑху (path) має вказувати на " -"коректний вузол Spatial." +"Щоб уÑе працювало Ñк Ñлід, влаÑтивіÑть «Remote Path» має вказувати на " +"коректний вузол Spatial або похідний від Spatial." #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -11590,11 +11637,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" -"Щоб AnimatedSprite могла показувати кадри, має бути Ñтворено або вÑтановлено " -"у влаÑтивоÑті «Frames» реÑÑƒÑ€Ñ SpriteFrames." +"Щоб AnimatedSprite3D могла показувати кадри, має бути Ñтворено або " +"вÑтановлено у влаÑтивоÑті «Frames» реÑÑƒÑ€Ñ SpriteFrames." #: scene/3d/vehicle_body.cpp msgid "" @@ -11605,8 +11652,12 @@ msgstr "" "Будь лаÑка, викориÑтовуйте цей елемент Ñк дочірній елемент вузла VehicleBody." #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment потребує реÑурÑу Environment." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"Щоб WorldEnvironment мала видимий ефект, Ñ—Ñ— влаÑтивіÑть «Environment» має " +"міÑтити Ñередовище." #: scene/3d/world_environment.cpp msgid "" @@ -11645,7 +11696,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Ðічого не з'єднано із входом «%s» вузла «%s»." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "Кореневий елемент AnimationNode Ð´Ð»Ñ Ð³Ñ€Ð°Ñ„Ñƒ не вÑтановлено." #: scene/animation/animation_tree.cpp @@ -11658,7 +11709,7 @@ msgstr "" "ШлÑÑ…, вÑтановлений Ð´Ð»Ñ AnimationPlayer, не веде до вузла AnimationPlayer." #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "Кореневий елемент AnimationPlayer не Ñ” коректним вузлом." #: scene/animation/animation_tree_player.cpp @@ -11672,12 +11723,11 @@ msgstr "Вибрати колір з екрана." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw" -msgstr "ВідхиленнÑ" +msgstr "Без обробки" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -11688,12 +11738,10 @@ msgid "Add current color as a preset." msgstr "Додати поточний колір Ñк шаблон." #: scene/gui/container.cpp -#, fuzzy msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "Сам контейнер не має призначеннÑ, Ñкщо Ñкрипт не налаштовує поведінку щодо " "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¹Ð¾Ð³Ð¾ дочірніх об'єктів.\n" @@ -11705,6 +11753,9 @@ msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"Панель підказки не буде показано, оÑкільки Mouse Filter Ð´Ð»Ñ Ð·Ð°Ñобу ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ " +"вÑтановлено у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«Ignore». Щоб вирішити проблему, вÑтановіть Ð´Ð»Ñ Mouse " +"Filter Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«Stop» або «Pass»." #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11717,21 +11768,21 @@ msgstr "Будь лаÑка, підтвердьте..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "КонтекÑтні підказки типово буде приховано, Ñкщо ви не викличете popup() або " "ÑкуÑÑŒ із функцій popup*(). Втім, робити Ñ—Ñ… видимими Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ â€” звична " "практика. Втім, Ñлід пам'Ñтати, що під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку Ñ—Ñ… буде приховано." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." -msgstr "Якщо exp_edit має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ true, min_value має бути > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "Якщо увімкнено «Exp Edit», «Min Value» має бути > 0." #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer призначено Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ із одинарним дочірнім заÑобом " @@ -11784,9 +11835,17 @@ msgid "Input" msgstr "Вхідні дані" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "Ðекоректне джерело Ð´Ð»Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "Ðекоректне джерело програми побудови тіней." +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "Ðекоректна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑÐ½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹Ð½Ð¾Ð³Ð¾." @@ -11803,6 +11862,66 @@ msgstr "Змінні величини можна пов'Ñзувати лише msgid "Constants cannot be modified." msgstr "Сталі не можна змінювати." +#~ msgid "Previous Folder" +#~ msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñ‚ÐµÐºÐ°" + +#~ msgid "Next Folder" +#~ msgstr "ÐаÑтупна тека" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "Ðвтоматично відкривати знімки вікон" + +#~ msgid "Open in an external image editor." +#~ msgstr "Відкрити у зовнішньому редакторі зображень." + +#~ msgid "Reverse" +#~ msgstr "Зворотний" + +#~ msgid "Mirror X" +#~ msgstr "Віддзеркалити за X" + +#~ msgid "Mirror Y" +#~ msgstr "Віддзеркалити за Y" + +#~ msgid "Generating solution..." +#~ msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð²'Ñзку..." + +#~ msgid "Generating C# project..." +#~ msgstr "Створюємо проєкт C#..." + +#~ msgid "Failed to create solution." +#~ msgstr "Ðе вдалоÑÑ Ñтворити розв'Ñзок." + +#~ msgid "Failed to save solution." +#~ msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ розв'Ñзок." + +#~ msgid "Done" +#~ msgstr "Зроблено" + +#~ msgid "Failed to create C# project." +#~ msgstr "Ðе вдалоÑÑ Ñтворити проєкт C#." + +#~ msgid "Mono" +#~ msgstr "Моно" + +#~ msgid "About C# support" +#~ msgstr "Про підтримку C#" + +#~ msgid "Create C# solution" +#~ msgstr "Створити розв'Ñзок C#" + +#~ msgid "Builds" +#~ msgstr "ЗбираннÑ" + +#~ msgid "Build Project" +#~ msgstr "Зібрати проєкт" + +#~ msgid "View log" +#~ msgstr "ПереглÑнути журнал" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment потребує реÑурÑу Environment." + #~ msgid "Enabled Classes" #~ msgstr "Увімкнені клаÑи" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 6413d52fb1..f22e442132 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -133,6 +133,26 @@ msgid "Anim Change Call" msgstr "" #: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "" @@ -620,6 +640,10 @@ msgstr "" msgid "Line Number:" msgstr "" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "" @@ -669,7 +693,7 @@ msgstr "" msgid "Reset Zoom" msgstr "" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -776,6 +800,11 @@ msgid "Connect" msgstr "" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr ".تمام کا انتخاب" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "" @@ -937,7 +966,7 @@ msgid "Owners Of:" msgstr "" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "" #: editor/dependency_editor.cpp @@ -1113,7 +1142,6 @@ msgid "Success!" msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "" @@ -1477,6 +1505,10 @@ msgstr "" msgid "Template file not found:" msgstr "" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1657,7 +1689,7 @@ msgstr "" msgid "New Folder..." msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "" @@ -1708,7 +1740,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "" @@ -1735,24 +1767,30 @@ msgid "Move Favorite Down" msgstr "Ù¾Ø³Ù†Ø¯ÛŒØ¯Û Ù†ÛŒÚ†Û’ منتقل کریں" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "" +#, fuzzy +msgid "Go to previous folder." +msgstr "سب سکریپشن بنائیں" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "" +#, fuzzy +msgid "Go to next folder." +msgstr "سب سکریپشن بنائیں" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "سب سکریپشن بنائیں" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "" -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." msgstr "" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2438,6 +2476,11 @@ msgid "Go to previously opened scene." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr ".تمام کا انتخاب" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "" @@ -2629,14 +2672,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "" @@ -2952,6 +2987,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr ".تمام کا انتخاب" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3558,6 +3598,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "" @@ -4603,6 +4644,10 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "" @@ -4631,7 +4676,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "" @@ -4645,7 +4689,7 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" +msgid "Reverse sorting." msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4720,35 +4764,39 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "" +#, fuzzy +msgid "Move Vertical Guide" +msgstr "سب سکریپشن بنائیں" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "سب سکریپشن بنائیں" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr ".تمام کا انتخاب" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "" +#, fuzzy +msgid "Move Horizontal Guide" +msgstr ".تمام کا انتخاب" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "سب سکریپشن بنائیں" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr ".تمام کا انتخاب" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" +msgstr "سب سکریپشن بنائیں" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6341,10 +6389,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr ".تمام کا انتخاب" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6634,7 +6691,12 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align with View" +msgid "Align Transform with View" +msgstr ".تمام کا انتخاب" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" msgstr ".تمام کا انتخاب" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6821,11 +6883,6 @@ msgstr ".تمام کا انتخاب" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy -msgid "Align Selection With View" -msgstr ".تمام کا انتخاب" - -#: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Tool Select" msgstr ".تمام کا انتخاب" @@ -7400,14 +7457,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7813,6 +7862,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7900,6 +7953,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7907,10 +7976,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -7999,7 +8102,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8007,7 +8110,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8019,7 +8122,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8036,7 +8139,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8105,11 +8208,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8125,7 +8228,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8153,11 +8256,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8197,11 +8300,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8211,7 +8318,7 @@ msgstr "سب سکریپشن بنائیں" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8229,15 +8336,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8289,7 +8396,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8317,12 +8424,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8399,47 +8506,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9603,6 +9710,11 @@ msgid "Extend Script" msgstr "سب سکریپشن بنائیں" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "سب سکریپشن بنائیں" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9811,7 +9923,7 @@ msgid "Script is valid." msgstr "" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9871,7 +9983,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10281,55 +10393,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "سب سکریپشن بنائیں" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10912,7 +10975,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -10961,7 +11024,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -10971,7 +11034,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11047,12 +11110,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11131,7 +11194,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11160,6 +11223,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11194,8 +11261,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11206,7 +11273,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11222,7 +11291,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11233,7 +11302,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11268,7 +11339,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11280,7 +11351,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11311,8 +11382,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11332,18 +11402,18 @@ msgstr "" #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11386,9 +11456,17 @@ msgid "Input" msgstr "" #: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "" +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11406,6 +11484,10 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "سب سکریپشن بنائیں" + +#, fuzzy #~ msgid "Ease in" #~ msgstr ".تمام کا انتخاب" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 9ab63cad7c..b8707a154c 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:49+0000\n" +"PO-Revision-Date: 2019-07-29 19:20+0000\n" "Last-Translator: Steve Dang <itsnguu@outlook.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" @@ -28,7 +28,7 @@ msgstr "" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "" +msgstr "Hà m convert() có đối số không hợp lệ, sá» dụng các hằng TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -71,7 +71,7 @@ msgstr "Miá»…n phÃ" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "Cân bằng" #: editor/animation_bezier_editor.cpp msgid "Mirror" @@ -86,14 +86,12 @@ msgid "Value:" msgstr "Giá trị:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "Chèn Key Anim" +msgstr "Thêm Khoá Tại Äây" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Duplicate Selected Key(s)" -msgstr "Nhân đôi lá»±a chá»n" +msgstr "Nhân đôi các khoá đã chá»n" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" @@ -101,12 +99,11 @@ msgstr "Xoá Key(s) được chá»n" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "" +msgstr "Thêm Ä‘iểm Bezier" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Move Bezier Points" -msgstr "Di chuyển đến..." +msgstr "Di chuyển Ä‘iểm Bezier" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -138,13 +135,37 @@ 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" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "Äổi Transition Animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "Äổi Transform Animation" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "Äổi giá trị khung hình" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "Äổi Function Gá»i Animation" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "Äổi vòng lặp Anim" +msgstr "Thay Äá»™ Dà i Hoạt Ảnh" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "Chỉnh Vòng Lặp Hoạt Ảnh" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -172,14 +193,12 @@ msgid "Animation Playback Track" msgstr "Ngưng chạy animation. (S)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "Äá»™ dà i Animation (giây)." +msgstr "Äá»™ dà i hoạt ảnh (khung hình)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" -msgstr "Äá»™ dà i Animation (giây)." +msgstr "Äá»™ dà i hoạt ảnh (giây)" #: editor/animation_track_editor.cpp #, fuzzy @@ -187,9 +206,8 @@ msgid "Add Track" msgstr "Thêm Track Animation" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Looping" -msgstr "Phóng Animation." +msgstr "Vòng Lặp Hoạt Ảnh" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -366,7 +384,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "" +msgstr "Các bản hoạt ảnh chỉ có thể trá» tá»›i các nút AnimationPlayer." #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." @@ -454,12 +472,11 @@ msgstr "Cảnh bảo: Chỉnh sá»a hoạt ảnh đã nháºp" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Select All" -msgstr "" +msgstr "Chá»n Toà n Bá»™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select None" -msgstr "Chế độ chá»n" +msgstr "Chá»n Không có" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." @@ -470,14 +487,12 @@ msgid "Group tracks by node or display them as plain list." msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Snap:" -msgstr "Bước (s):" +msgstr "Chụp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation step value." -msgstr "Phóng Animation." +msgstr "Giá trị bước hoạt ảnh." #: editor/animation_track_editor.cpp msgid "Seconds" @@ -521,27 +536,24 @@ msgid "Duplicate Transposed" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" -msgstr "Nhân đôi lá»±a chá»n" +msgstr "Xoá lá»±a chá»n" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" -msgstr "Äến Step tiếp theo" +msgstr "Äến Bước tiếp theo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" -msgstr "Äến Step trước đó" +msgstr "Äến Bước trước đó" #: editor/animation_track_editor.cpp msgid "Optimize Animation" -msgstr "Tối ưu Animation" +msgstr "Tối ưu Hoạt ảnh" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation" -msgstr "Dá»n dẹp Animation" +msgstr "Dá»n dẹp Hoạt ảnh" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" @@ -573,12 +585,11 @@ msgstr "Tối ưu" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" -msgstr "Há»§y key không đúng chuẩn" +msgstr "Gỡ bá» các khoá không hợp lệ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Remove unresolved and empty tracks" -msgstr "Gỡ bá» track trống và không tìm thấy" +msgstr "Gỡ bá» các Tracks không thể xá» lý và trống" #: editor/animation_track_editor.cpp msgid "Clean-up all animations" @@ -586,7 +597,7 @@ msgstr "Dá»n dẹp tất cả animations" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "Dá»n dẹp tất cả Animation (KHÔNG THỂ Há»’I LẠI)" +msgstr "Dá»n dẹp tất cả Hoạt ảnh (KHÔNG THỂ Há»’I LẠI)" #: editor/animation_track_editor.cpp msgid "Clean-Up" @@ -598,7 +609,7 @@ msgstr "Tỉ lệ Scale:" #: editor/animation_track_editor.cpp msgid "Select tracks to copy:" -msgstr "" +msgstr "Chá»n các Track để sao chép:" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -610,9 +621,8 @@ msgid "Copy" msgstr "Sao chép" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "Thêm Track Animation" +msgstr "Thêm Track Âm thanh" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -642,18 +652,21 @@ msgstr "Äến Dòng" msgid "Line Number:" msgstr "Dòng số:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "Tìm thấy %d khá»›p." + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" -msgstr "Không tìm thấy" +msgstr "Không khá»›p" #: editor/code_editor.cpp msgid "Replaced %d occurrence(s)." -msgstr "" +msgstr "Äã thay thế %d biến cố." #: editor/code_editor.cpp editor/find_in_files.cpp -#, fuzzy msgid "Match Case" -msgstr "Trùng khá»›p" +msgstr "Khá»›p Trưá»ng Hợp" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Whole Words" @@ -692,7 +705,7 @@ msgstr "Thu nhá»" msgid "Reset Zoom" msgstr "Äặt lại phóng" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "Cảnh báo" @@ -701,37 +714,32 @@ msgid "Line and column numbers." msgstr "Số dòng và cá»™t." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "Cách thức trong Node được chá»n phải được ghi rõ!" +msgstr "Phương thức trong nút Ä‘Ãch phải được chỉ định." #: editor/connections_dialog.cpp -#, fuzzy msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"Cách thức cá»§a đối tượng không tìm thấy! ghi rõ má»™t cách thức hợp lệ hoặc " -"Ä‘Ãnh kèm má»™t script cho đối tượng Node." +"Phương thức không tìm thấy. Chỉ định phương thức hợp lệ hoặc Ä‘Ãnh kèm tệp " +"lệnh và o nút." #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "Kết nối đến Node:" +msgstr "Kết nối đến Nút:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "Không thể kết nối tá»›i host:" +msgstr "Kết nối Tệp lệnh:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "Äang kết nối Signal:" +msgstr "Từ tÃn hiệu:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "Cảnh không chứa mã lệnh." +msgstr "Cảnh không chứa tệp lệnh." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -751,27 +759,26 @@ msgid "Remove" msgstr "Xóa" #: editor/connections_dialog.cpp -#, fuzzy msgid "Add Extra Call Argument:" -msgstr "Thêm đối số:" +msgstr "Thêm đối số mở rá»™ng:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "" +msgstr "Mở rá»™ng Äối số được gá»i:" #: editor/connections_dialog.cpp msgid "Advanced" msgstr "Nâng cao" #: editor/connections_dialog.cpp -#, fuzzy msgid "Deferred" -msgstr "Hoãn lại" +msgstr "Trì hoãn" #: editor/connections_dialog.cpp msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" +"Trì hoãn tÃn hiệu, lưu và o má»™t hà ng chá» và chỉ kÃch nó và o thá»i gian rãnh." #: editor/connections_dialog.cpp msgid "Oneshot" @@ -804,6 +811,10 @@ msgid "Connect" msgstr "Kết nối" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "TÃn hiệu:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "Kết nối '%s' đến '%s'" @@ -812,9 +823,8 @@ msgid "Disconnect '%s' from '%s'" msgstr "Há»§y kết nối '%s' từ '%s'" #: editor/connections_dialog.cpp -#, fuzzy msgid "Disconnect all from signal: '%s'" -msgstr "Há»§y kết nối '%s' từ '%s'" +msgstr "Dừng kết nối tất cả từ tÃn hiệu: '%s'" #: editor/connections_dialog.cpp msgid "Connect..." @@ -859,7 +869,7 @@ msgstr "Äến Method" #: editor/create_dialog.cpp msgid "Change %s Type" -msgstr "Äổi %s Type" +msgstr "Äổi %s Loại" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" @@ -912,38 +922,42 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" +"Cảnh '%s' hiện Ä‘ang được chỉnh sá»a.\n" +"Các thay đổi chỉ có hiệu lá»±c khi tải lại." #: editor/dependency_editor.cpp msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" +"Tà i nguyên '%s' Ä‘ang sá» dụng.\n" +"Thay đổi sẽ chỉ hiệu lá»±c khi tải lại." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Dependencies" -msgstr "" +msgstr "Các phụ thuá»™c" #: editor/dependency_editor.cpp msgid "Resource" -msgstr "" +msgstr "Tà i nguyên" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_settings_editor.cpp editor/script_create_dialog.cpp msgid "Path" -msgstr "" +msgstr "ÄÆ°á»ng dẫn" #: editor/dependency_editor.cpp msgid "Dependencies:" -msgstr "" +msgstr "Các phụ thuá»™c:" #: editor/dependency_editor.cpp msgid "Fix Broken" -msgstr "" +msgstr "Sá»a chữa" #: editor/dependency_editor.cpp msgid "Dependency Editor" -msgstr "" +msgstr "Trình chỉnh sá»a Phụ thuá»™c" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" @@ -961,11 +975,11 @@ msgstr "Mở" #: editor/dependency_editor.cpp msgid "Owners Of:" -msgstr "" +msgstr "Sở hữu cá»§a:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "Gỡ bá» các tệp đã chá»n trong dá»± án? (Không thể khôi phục)" #: editor/dependency_editor.cpp msgid "" @@ -988,15 +1002,15 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "" +msgstr "Luôn mở" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "" +msgstr "Chá»n hà nh động nên thá»±c hiện?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" -msgstr "" +msgstr "Sá»a các phần phụ thuá»™c" #: editor/dependency_editor.cpp msgid "Errors loading!" @@ -1025,7 +1039,7 @@ msgstr "Xóa" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "Sở hữu" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" @@ -1110,6 +1124,10 @@ msgid "" "is an exhaustive list of all such thirdparty components with their " "respective copyright statements and license terms." msgstr "" +"Godot Engine dá»±a trên má»™t số thư viện mã nguồn mở và miá»…n phà cá»§a bên thứ " +"ba, tất cả Ä‘á»u phù hợp vá»›i các Ä‘iá»u khoản trong giấy phép MIT. Sau đây là " +"danh sách tất cả các thà nh phần cá»§a bên thứ ba vá»›i các Ä‘iá»u khoản bản quyá»n " +"và điá»u khoản cấp phép tương ứng." #: editor/editor_about.cpp msgid "All Components" @@ -1129,7 +1147,7 @@ msgstr "Lá»—i không thể mở gói, không phải dạng nén." #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "" +msgstr "Giải nén Assets" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package installed successfully!" @@ -1141,7 +1159,6 @@ msgid "Success!" msgstr "Thà nh công!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "Cà i đặt" @@ -1151,7 +1168,7 @@ msgstr "Gói cà i đặt" #: editor/editor_audio_buses.cpp msgid "Speakers" -msgstr "" +msgstr "Máy phát thanh" #: editor/editor_audio_buses.cpp msgid "Add Effect" @@ -1260,7 +1277,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." -msgstr "" +msgstr "Vị trà cho Bố cục má»›i..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" @@ -1501,6 +1518,10 @@ msgstr "" msgid "Template file not found:" msgstr "Không tìm thấy tệp tin mẫu:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "Trình chỉnh sá»a 3D" @@ -1675,7 +1696,7 @@ msgstr "Xem trong trình quản lý tệp" msgid "New Folder..." msgstr "Thư mục má»›i ..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "Là m má»›i" @@ -1726,7 +1747,7 @@ msgstr "Tiến tá»›i" msgid "Go Up" msgstr "Äi Lên" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "Báºt tắt File ẩn" @@ -1751,23 +1772,31 @@ msgid "Move Favorite Down" msgstr "Di chuyển Ưa thÃch xuống" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "Thư mục trước" +#, fuzzy +msgid "Go to previous folder." +msgstr "Äến thư mục cha" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "Thư mục sau" +#, fuzzy +msgid "Go to next folder." +msgstr "Äến thư mục cha" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "Äến thư mục cha" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "Tìm kiếm tệp tin" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "Bá» yêu thÃch thư mục hiện tại." -#: editor/editor_file_dialog.cpp -msgid "Toggle visibility of hidden files." +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Toggle the visibility of hidden files." msgstr "Báºt tắt hiện các tệp tin ẩn." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2476,6 +2505,11 @@ msgid "Go to previously opened scene." msgstr "Trở vá» cảnh đã mở trước đó." #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "Sao chép đưá»ng dẫn" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "Tab tiếp theo" @@ -2670,14 +2704,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "Mở thư mục dữ liệu Trình biên táºp" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -msgid "Open in an external image editor." -msgstr "" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "Chế độ Toà n mà n hình" @@ -2994,6 +3020,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "Lưu Theme" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3596,6 +3627,7 @@ msgid "Nodes not in Group" msgstr "Nút không trong Nhóm" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "Lá»c các nút" @@ -3895,7 +3927,7 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Animation" -msgstr "Thêm Animation" +msgstr "Thêm Hoạt ảnh" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4097,7 +4129,7 @@ msgstr "Äổi bá»™ lá»c" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." -msgstr "" +msgstr "Không có trình phát hoạt ảnh, không thể truy xuất tên." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Player path set is invalid, so unable to retrieve track names." @@ -4109,6 +4141,7 @@ msgid "" "Animation player has no valid root node path, so unable to retrieve track " "names." msgstr "" +"TrÃnh phát hoạt ảnh không có đưá»ng dẫn nút Gốc, không thể truy xuất tên." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp @@ -4213,7 +4246,7 @@ msgstr "Chạy hoạt ảnh đã chá»n ngược lại từ cuối. (Shift+A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "Ngưng chạy hoạt ảnh. (S)" +msgstr "Dừng chạy lại hoạt ảnh. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" @@ -4639,6 +4672,11 @@ msgid "Idle" msgstr "Chạy không" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "Cà i đặt" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "Thá» lại" @@ -4667,7 +4705,6 @@ msgid "Last" msgstr "Cuối cùng" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "Tất cả" @@ -4681,8 +4718,9 @@ msgid "Sort:" msgstr "Sắp xếp:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "Ngược lại" +#, fuzzy +msgid "Reverse sorting." +msgstr "Äang yêu cầu..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4756,31 +4794,35 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +msgid "Move Vertical Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" -msgstr "" +#, fuzzy +msgid "Create Vertical Guide" +msgstr "Tạo Folder" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "Xoá Variable" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +msgid "Move Horizontal Guide" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" -msgstr "" +#, fuzzy +msgid "Create Horizontal Guide" +msgstr "Tạo Root Node:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" -msgstr "" +#, fuzzy +msgid "Remove Horizontal Guide" +msgstr "Há»§y key không đúng chuẩn" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +msgid "Create Horizontal and Vertical Guides" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6377,10 +6419,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "Tạo các Ä‘iểm." + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6676,7 +6727,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -6861,10 +6916,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "" @@ -7446,14 +7497,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -7870,6 +7913,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -7961,6 +8008,22 @@ msgid "Color uniform." msgstr "Äổi Transform Animation" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -7968,10 +8031,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8061,7 +8158,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8069,7 +8166,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8081,7 +8178,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8098,7 +8195,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8167,11 +8264,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8187,7 +8284,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8215,11 +8312,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8260,11 +8357,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8274,7 +8375,7 @@ msgstr "Tạo" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8292,15 +8393,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8352,7 +8453,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8380,12 +8481,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8462,47 +8563,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9677,6 +9778,11 @@ msgid "Extend Script" msgstr "Tạo Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "Tạo các nút má»›i." + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "" @@ -9891,7 +9997,7 @@ msgid "Script is valid." msgstr "Animation tree khả dụng." #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -9947,7 +10053,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10353,54 +10459,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -10985,7 +11043,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11034,7 +11092,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11044,7 +11102,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11120,12 +11178,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11204,7 +11262,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11233,6 +11291,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11267,8 +11329,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11279,7 +11341,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11295,7 +11359,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11306,7 +11370,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11341,7 +11407,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "Không có kết nối đến input '%s' cá»§a node '%s'." #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11354,8 +11420,9 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "" +#, fuzzy +msgid "The AnimationPlayer root node is not a valid node." +msgstr "Animation tree vô hiệu." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11385,8 +11452,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11404,23 +11470,24 @@ msgid "Please Confirm..." msgstr "Xin hãy xác nháºn..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Các popup sẽ mặc định là ẩn trừ khi bạn gá»i popup() hoặc bất kì function nà o " "có dạng popup*(). Có thể để popup nhìn thấy được để chỉnh sá»a, nhưng chúng " "sẽ ẩn khi chạy." #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11463,9 +11530,19 @@ msgid "Input" msgstr "Nháºp" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "nguồn vô hiệu cho shader." + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "nguồn vô hiệu cho shader." +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "nguồn vô hiệu cho shader." + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11482,6 +11559,15 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Previous Folder" +#~ msgstr "Thư mục trước" + +#~ msgid "Next Folder" +#~ msgstr "Thư mục sau" + +#~ msgid "Reverse" +#~ msgstr "Ngược lại" + #~ msgid "Enabled Classes" #~ msgstr "Các lá»›p đã báºt" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index d220c55c0b..affef14b72 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -47,12 +47,17 @@ # liushuyu011 <liushuyu011@gmail.com>, 2019. # DS <dseqrasd@126.com>, 2019. # ZeroAurora <zeroaurora@qq.com>, 2019. +# Gary Wang <wzc782970009@gmail.com>, 2019. +# ASC_8384 <ASC8384ST@gmail.com>, 2019. +# Lyu Shiqing <shiqing-thu18@yandex.com>, 2019. +# ColdThunder11 <lslyj27761@gmail.com>, 2019. +# liu lizhi <kz-xy@163.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2019-07-02 10:51+0000\n" -"Last-Translator: ZeroAurora <zeroaurora@qq.com>\n" +"PO-Revision-Date: 2019-07-19 13:42+0000\n" +"Last-Translator: liu lizhi <kz-xy@163.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -171,6 +176,31 @@ msgid "Anim Change Call" msgstr "修改回调" #: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "修改动画关键帧的时长" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "修改动画过渡方å¼" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "ä¿®æ”¹åŠ¨ç”»å˜æ¢" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "修改动画关键帧的值" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "修改回调" + +#: editor/animation_track_editor.cpp msgid "Change Animation Length" msgstr "修改动画长度" @@ -470,10 +500,15 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"æ¤åŠ¨ç”»å±žäºŽå¯¼å…¥çš„åœºæ™¯ï¼Œå› æ¤ä¸ä¼šä¿å˜å¯¹å¯¼å…¥è½¨é“的更改。\n" +"\n" +"è¦å¯ç”¨æ·»åŠ è‡ªå®šä¹‰è½¨é“的功能,å¯ä»¥å¯¼èˆªåˆ°åœºæ™¯çš„导入设置,将\n" +"“动画 > å˜å‚¨â€è®¾ä¸ºâ€œæ–‡ä»¶â€ï¼Œå¯ç”¨â€œåŠ¨ç”» > ä¿ç•™è‡ªå®šä¹‰è½¨é“â€å¹¶é‡æ–°å¯¼å…¥ã€‚\n" +"或者也å¯ä»¥é€‰æ‹©ä¸€ä¸ªå¯¼å…¥åŠ¨ç”»çš„å¯¼å…¥é¢„è®¾ä»¥åˆ†éš”æ–‡ä»¶ã€‚" #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "è¦å‘Š: æ£åœ¨ç¼–辑导入的动画" #: editor/animation_track_editor.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -658,6 +693,10 @@ msgstr "转到行" msgid "Line Number:" msgstr "行å·:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "找到%d个匹é…项。" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "æ— åŒ¹é…项" @@ -707,7 +746,7 @@ msgstr "缩å°" msgid "Reset Zoom" msgstr "é‡ç½®ç¼©æ”¾" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "è¦å‘Š" @@ -716,36 +755,30 @@ msgid "Line and column numbers." msgstr "行å·å’Œåˆ—å·ã€‚" #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "å¿…é¡»æŒ‡å®šç›®æ ‡èŠ‚ç‚¹çš„æ–¹æ³•ï¼" +msgstr "å¿…é¡»æŒ‡å®šç›®æ ‡èŠ‚ç‚¹çš„æ–¹æ³•ã€‚" #: editor/connections_dialog.cpp -#, fuzzy msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." -msgstr "找ä¸åˆ°ç›®æ ‡æ–¹æ³•ï¼ è¯·æŒ‡å®šä¸€ä¸ªæœ‰æ•ˆçš„æ–¹æ³•æˆ–æŠŠè„šæœ¬é™„åŠ åˆ°ç›®æ ‡èŠ‚ç‚¹ã€‚" +msgstr "找ä¸åˆ°ç›®æ ‡æ–¹æ³•ï¼ è¯·æŒ‡å®šä¸€ä¸ªæœ‰æ•ˆçš„æ–¹æ³•æˆ–è€…æŠŠè„šæœ¬é™„åŠ åˆ°ç›®æ ‡èŠ‚ç‚¹ã€‚" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" msgstr "连接到节点:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "æ— æ³•è¿žæŽ¥åˆ°æœåС噍:" +msgstr "连接到脚本:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "ä¿¡å·:" +msgstr "ä¿¡å·æº:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Scene does not contain any script." -msgstr "节点ä¸åŒ…å«å‡ 何。" +msgstr "节点ä¸åŒ…å«è„šæœ¬ã€‚" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -773,7 +806,6 @@ msgid "Extra Call Arguments:" msgstr "é¢å¤–è°ƒç”¨å‚æ•°:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" msgstr "高级选项" @@ -784,7 +816,7 @@ msgstr "å»¶æ—¶" #: editor/connections_dialog.cpp msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." -msgstr "" +msgstr "延迟信å·è§¦å‘ï¼Œå°†å…¶æ·»åŠ åˆ°ä¿¡å·é˜Ÿåˆ—,在引擎空闲时触å‘。" #: editor/connections_dialog.cpp msgid "Oneshot" @@ -792,12 +824,11 @@ msgstr "啿¬¡" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "" +msgstr "ä¿¡å·è§¦å‘åŽè‡ªåЍ喿¶ˆè¿žæŽ¥ã€‚" #: editor/connections_dialog.cpp -#, fuzzy msgid "Cannot connect signal" -msgstr "连接信å·ï¼š " +msgstr "æ— æ³•è¿žæŽ¥ä¿¡å·" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -818,6 +849,10 @@ msgid "Connect" msgstr "连接" #: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "ä¿¡å·:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "连接'%s'到'%s'" @@ -839,14 +874,12 @@ msgid "Disconnect" msgstr "åˆ é™¤ä¿¡å·è¿žæŽ¥" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect a Signal to a Method" -msgstr "连接信å·ï¼š " +msgstr "连接信å·åˆ°æ–¹æ³•" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "编辑广æ’订阅: " +msgstr "编辑连接:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -922,18 +955,18 @@ msgid "Dependencies For:" msgstr "ä¾èµ–项:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." -msgstr "场景'%s'å·²è¢«ä¿®æ”¹ï¼Œé‡æ–°åŠ è½½åŽç”Ÿæ•ˆã€‚" +msgstr "场景 '%s' å·²è¢«ä¿®æ”¹ï¼Œé‡æ–°åŠ è½½åŽç”Ÿæ•ˆã€‚" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." -msgstr "资æº'%s'æ£åœ¨ä½¿ç”¨ä¸ï¼Œä¿®æ”¹å°†åœ¨é‡æ–°åŠ è½½åŽç”Ÿæ•ˆã€‚" +msgstr "" +"资æº'%s'æ£åœ¨ä½¿ç”¨ä¸ã€‚\n" +"修改将åªåœ¨é‡æ–°åŠ è½½åŽç”Ÿæ•ˆã€‚" #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -980,8 +1013,8 @@ msgid "Owners Of:" msgstr "拥有者:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" -msgstr "确定从项目ä¸åˆ é™¤æ–‡ä»¶ï¼Ÿï¼ˆæ¤æ“ä½œæ— æ³•æ’¤é”€ï¼‰" +msgid "Remove selected files from the project? (Can't be restored)" +msgstr "确定从项目ä¸åˆ é™¤é€‰å®šæ–‡ä»¶ï¼Ÿï¼ˆæ¤æ“ä½œæ— æ³•æ’¤é”€ï¼‰" #: editor/dependency_editor.cpp msgid "" @@ -1023,9 +1056,8 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "æ°¸ä¹…åˆ é™¤é€‰ä¸çš„%dæ¡é¡¹ç›®å—ï¼Ÿï¼ˆæ¤æ“ä½œæ— æ³•æ’¤é”€ï¼ï¼‰" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "ä¾èµ–" +msgstr "显示ä¾èµ–" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Orphan Resource Explorer" @@ -1159,7 +1191,6 @@ msgid "Success!" msgstr "æˆåŠŸï¼" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "安装" @@ -1286,7 +1317,7 @@ msgstr "打开音频Bus布局" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "文件 '%s' ä¸å˜åœ¨ã€‚" #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -1343,23 +1374,20 @@ msgid "Valid characters:" msgstr "å—ç¬¦åˆæ³•:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing engine class name." -msgstr "åç§°éžæ³•,与引擎内置类型å称冲çªã€‚" +msgstr "与引擎内置类型å称冲çªã€‚" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "åç§°éžæ³•,与引擎内置类型å称冲çªã€‚" +msgstr "与引擎内置类型å称冲çªã€‚" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." -msgstr "åç§°éžæ³•,与已å˜åœ¨çš„全局常é‡å称冲çªã€‚" +msgstr "与已å˜åœ¨çš„全局常é‡å称冲çªã€‚" #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "该å称已被用作其他 autoload å 用。" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -1390,7 +1418,6 @@ msgid "Rearrange Autoloads" msgstr "釿ޒåºAutoload" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." msgstr "è·¯å¾„éžæ³•。" @@ -1445,9 +1472,8 @@ msgid "[unsaved]" msgstr "[未ä¿å˜]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "请先选择一个目录" +msgstr "请先选择一个目录。" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1525,15 +1551,17 @@ msgstr "找ä¸åˆ°è‡ªå®šä¹‰å‘布包。" msgid "Template file not found:" msgstr "找ä¸åˆ°æ¨¡æ¿æ–‡ä»¶:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "以32ä½å¹³å°å¯¼å‡ºæ—¶ï¼Œå†…嵌的PCKä¸èƒ½å¤§äºŽ4GB。" + #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "编辑器" +msgstr "3D编辑器" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "打开脚本编辑器" +msgstr "脚本编辑器" #: editor/editor_feature_profile.cpp msgid "Asset Library" @@ -1552,9 +1580,8 @@ msgid "Node Dock" msgstr "èŠ‚ç‚¹é¢æ¿" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "æ–‡ä»¶ç³»ç»Ÿé¢æ¿" +msgstr "æ–‡ä»¶ç³»ç»Ÿå’Œå¯¼å…¥é¢æ¿" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" @@ -1605,11 +1632,10 @@ msgid "File '%s' format is invalid, import aborted." msgstr "文件 '%s' æ ¼å¼æ— æ•ˆï¼Œå¯¼å…¥ä¸æ¢ã€‚" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." -msgstr "é…置文件 '%s' å·²å˜åœ¨ã€‚在导入之å‰é¦–先远程处ç†ï¼Œå¯¼å…¥å·²ä¸æ¢ã€‚" +msgstr "é…置文件 '%s' å·²å˜åœ¨ã€‚在导入之å‰å…ˆåˆ é™¤å®ƒï¼Œå¯¼å…¥å·²ä¸æ¢ã€‚" #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." @@ -1620,7 +1646,6 @@ msgid "Unset" msgstr "未设置" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" msgstr "当å‰é…置文件" @@ -1644,9 +1669,8 @@ msgid "Export" msgstr "导出" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "å¯ç”¨é…置文件" +msgstr "å¯ç”¨é…置文件:" #: editor/editor_feature_profile.cpp msgid "Class Options" @@ -1701,7 +1725,7 @@ msgstr "在文件管ç†å™¨ä¸æ˜¾ç¤º" msgid "New Folder..." msgstr "新建文件夹 ..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "刷新" @@ -1752,7 +1776,7 @@ msgstr "å‰è¿›" msgid "Go Up" msgstr "上一级" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "åˆ‡æ¢æ˜¾ç¤ºéšè—文件" @@ -1777,25 +1801,32 @@ msgid "Move Favorite Down" msgstr "å‘下移动收è—" #: editor/editor_file_dialog.cpp -msgid "Previous Folder" -msgstr "上一个文件夹" +#, fuzzy +msgid "Go to previous folder." +msgstr "转到父文件夹。" #: editor/editor_file_dialog.cpp -msgid "Next Folder" -msgstr "下一个文件夹" +#, fuzzy +msgid "Go to next folder." +msgstr "转到父文件夹。" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." msgstr "转到父文件夹。" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "æœç´¢æ–‡ä»¶" + #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." msgstr "ï¼ˆå–æ¶ˆï¼‰æ”¶è—当剿–‡ä»¶å¤¹ã€‚" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." -msgstr "åˆ‡æ¢æ˜¾ç¤ºéšè—文件" +msgid "Toggle the visibility of hidden files." +msgstr "åˆ‡æ¢æ˜¾ç¤ºéšè—文件。" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -1828,10 +1859,11 @@ msgid "ScanSources" msgstr "æ‰«ææºæ–‡ä»¶" #: editor/editor_file_system.cpp +#, fuzzy msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" -msgstr "" +msgstr "%s 文件å˜åœ¨å¤šç§å¯¼å…¥æ–¹å¼ã€è‡ªåŠ¨å¯¼å…¥å¤±è´¥ã€‚" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -2226,9 +2258,8 @@ msgid "Open Base Scene" msgstr "打开父场景" #: editor/editor_node.cpp -#, fuzzy msgid "Quick Open..." -msgstr "快速打开场景..." +msgstr "快速打开..." #: editor/editor_node.cpp msgid "Quick Open Scene..." @@ -2453,7 +2484,7 @@ msgstr "å…³é—å…¶ä»–æ ‡ç¾é¡µ" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "å…³é—å³ä¾§" #: editor/editor_node.cpp #, fuzzy @@ -2501,6 +2532,11 @@ msgid "Go to previously opened scene." msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ‰“开的场景。" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "æ‹·è´è·¯å¾„" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "下一项" @@ -2592,7 +2628,7 @@ msgstr "æ‰“å¼€é¡¹ç›®æ•°æ®æ–‡ä»¶å¤¹" #: editor/editor_node.cpp msgid "Install Android Build Template" -msgstr "" +msgstr "安装 Android 构建模æ¿" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2693,32 +2729,20 @@ msgid "Editor Layout" msgstr "编辑器布局" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "åˆ›å»ºåœºæ™¯æ ¹èŠ‚ç‚¹" +msgstr "截å–å±å¹•" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "打开“编辑器设置/æ•°æ®\"文件夹" - -#: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "打开下一个编辑器" +msgstr "截图已ä¿å˜åˆ°ç¼–辑器设置/æ•°æ®ç›®å½•。" #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "免屿¨¡å¼" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "切æ¢CanvasItemå¯è§" +msgstr "系统命令行模å¼" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2733,9 +2757,8 @@ msgid "Open Editor Settings Folder" msgstr "æ‰“å¼€â€œç¼–è¾‘å™¨è®¾ç½®â€æ–‡ä»¶å¤¹" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features" -msgstr "管ç†å¯¼å‡ºæ¨¡æ¿" +msgstr "管ç†ç¼–辑器功能" #: editor/editor_node.cpp editor/project_export.cpp msgid "Manage Export Templates" @@ -2868,7 +2891,7 @@ msgstr "ä¸ä¿å˜" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." -msgstr "" +msgstr "缺失 Android 构建模æ¿ï¼Œè¯·å®‰è£…相应的模æ¿ã€‚" #: editor/editor_node.cpp #, fuzzy @@ -2880,6 +2903,8 @@ msgid "" "This will install the Android project for custom builds.\n" "Note that, in order to use it, it needs to be enabled per export preset." msgstr "" +"将安装Android项目以进行自定义构建。\n" +"注æ„,为了å¯ç”¨ï¼Œéœ€è¦ä¸ºæ¯ä¸ªå¯¼å‡ºé¢„设å¯ç”¨ã€‚" #: editor/editor_node.cpp msgid "" @@ -2887,6 +2912,8 @@ msgid "" "Remove the \"build\" directory manually before attempting this operation " "again." msgstr "" +"Android 构建模æ¿å·²ç»å®‰è£…且ä¸ä¼šè¢«è¦†ç›–。\n" +"请先移除“buildâ€ç›®å½•å†é‡æ–°å°è¯•æ¤æ“作。" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3031,6 +3058,11 @@ msgid "Calls" msgstr "调用次数" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "编辑主题..." + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "å¯ç”¨" @@ -3592,7 +3624,7 @@ msgstr "ç›é€‰ï¼š" msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." -msgstr "" +msgstr "包å«ä¸‹åˆ—扩展å的文件。å¯åœ¨é¡¹ç›®è®¾ç½®ä¸å¢žåŠ æˆ–ç§»é™¤ã€‚" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -3644,6 +3676,7 @@ msgid "Nodes not in Group" msgstr "ä¸åœ¨åˆ†ç»„ä¸çš„节点" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp msgid "Filter nodes" msgstr "ç›é€‰èŠ‚ç‚¹" @@ -4680,6 +4713,11 @@ msgid "Idle" msgstr "空闲" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "安装" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "é‡è¯•" @@ -4708,7 +4746,6 @@ msgid "Last" msgstr "最åŽä¸€é¡¹" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "全部" @@ -4722,8 +4759,9 @@ msgid "Sort:" msgstr "排åº:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "å选" +#, fuzzy +msgid "Reverse sorting." +msgstr "æ£åœ¨è¯·æ±‚。。" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4800,31 +4838,38 @@ msgid "Rotation Step:" msgstr "旋转æ¥é•¿:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "ç§»åŠ¨åž‚ç›´æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "åˆ›å»ºæ–°çš„åž‚ç›´æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "åˆ é™¤åž‚ç›´æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "ç§»åŠ¨æ°´å¹³æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "åˆ›å»ºæ°´å¹³æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "ç§»é™¤æ°´å¹³æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "åˆ›å»ºåž‚ç›´æ°´å¹³æ ‡å°º" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -4865,7 +4910,7 @@ msgstr "控件节点的定ä½ç‚¹å’Œè¾¹è·å€¼çš„预设。" msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." -msgstr "" +msgstr "激活åŽï¼Œç§»åŠ¨æŽ§åˆ¶èŠ‚ç‚¹ä¼šæ›´æ”¹å˜é”šç‚¹ï¼Œè€Œéžè¾¹è·ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -5148,7 +5193,7 @@ msgstr "用于æ’入键的旋转掩ç 。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale mask for inserting keys." -msgstr "" +msgstr "æ’入键的缩放é®ç½©ã€‚" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert keys (based on mask)." @@ -5428,7 +5473,7 @@ msgstr "创建Trimesh(ä¸‰ç»´ç½‘æ ¼)形状" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Failed creating shapes!" -msgstr "" +msgstr "创建形状失败ï¼" #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -6426,9 +6471,18 @@ msgid "Syntax Highlighter" msgstr "è¯æ³•高亮显示" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "跳转到" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" -msgstr "" +msgstr "书ç¾" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "创建点。" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -6722,9 +6776,15 @@ msgid "Rear" msgstr "åŽæ–¹" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "对é½è§†å›¾" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "选ä¸é¡¹ä¸Žè§†å›¾å¯¹é½" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "没有选ä¸èŠ‚ç‚¹æ¥æ·»åŠ å®žä¾‹ã€‚" @@ -6913,10 +6973,6 @@ msgid "Focus Selection" msgstr "选ä¸é€‰ä¸é¡¹" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "选ä¸é¡¹ä¸Žè§†å›¾å¯¹é½" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Tool Select" msgstr "选择工具" @@ -7190,13 +7246,12 @@ msgid "Animation Frames:" msgstr "动画帧:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add a Texture from File" -msgstr "æ·»åŠ çº¹ç†åˆ°ç£è´´é›†ã€‚" +msgstr "ä»Žæ–‡ä»¶æ·»åŠ çº¹ç†" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "" +msgstr "从精çµè¡¨æ ¼ä¸æ·»åР叧" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -7215,9 +7270,8 @@ msgid "Move (After)" msgstr "å¾€åŽç§»åЍ" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" -msgstr "å †æ ˆå¸§ï¼ˆStack Frames)" +msgstr "选择帧" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -7378,7 +7432,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Submenu" -msgstr "" +msgstr "åèœå•(Submenu)" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -7494,17 +7548,8 @@ msgid "Transpose" msgstr "转置" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "沿X轴翻转" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "沿Y轴翻转" - -#: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Disable Autotile" -msgstr "智能瓦片" +msgstr "ç¦ç”¨æ™ºèƒ½ç£è´´(Autotile)" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -7520,6 +7565,8 @@ msgid "" "Shift+RMB: Line Draw\n" "Shift+Ctrl+RMB: Rectangle Paint" msgstr "" +"Shift+é¼ æ ‡å³é”®ï¼šç»˜åˆ¶ç›´çº¿\n" +"Shift+Ctrl+é¼ æ ‡å³é”®ï¼šç»˜åˆ¶çŸ©å½¢" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" @@ -7846,7 +7893,7 @@ msgstr "å‘é‡" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" -msgstr "" +msgstr "布尔值" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -7855,7 +7902,7 @@ msgstr "æ·»åŠ è¾“å…¥äº‹ä»¶" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" -msgstr "" +msgstr "å¢žåŠ è¾“å‡ºç«¯å£" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -7922,6 +7969,10 @@ msgid "Visual Shader Input Type Changed" msgstr "å¯è§†ç€è‰²å™¨è¾“入类型已更改" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "顶点" @@ -7945,7 +7996,7 @@ msgstr "转到函数" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." -msgstr "" +msgstr "颜色è¿ç®—符。" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -7954,11 +8005,11 @@ msgstr "创建方法" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." -msgstr "" +msgstr "å°†HSVå‘é‡è½¬æ¢ä¸ºç‰æ•ˆçš„RGBå‘é‡ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts RGB vector to HSV equivalent." -msgstr "" +msgstr "å°†RGBå‘é‡è½¬æ¢ä¸ºç‰æ•ˆçš„HSVå‘é‡ã€‚" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8013,6 +8064,22 @@ msgid "Color uniform." msgstr "æ¸…é™¤å˜æ¢" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8020,10 +8087,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "Boolean constant." msgstr "修改Vec常é‡ç³»æ•°" @@ -8116,7 +8217,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8124,7 +8225,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8136,7 +8237,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8153,7 +8254,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8222,11 +8323,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8242,7 +8343,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8270,11 +8371,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8317,12 +8418,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "修改Uniform纹ç†" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "修改Uniform纹ç†" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy +msgid "2D texture uniform lookup with triplanar." msgstr "修改Uniform纹ç†" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8332,7 +8438,7 @@ msgstr "å˜æ¢å¯¹è¯æ¡†..." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8350,15 +8456,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8411,7 +8517,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8439,12 +8545,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8523,47 +8629,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9001,7 +9107,7 @@ msgstr "æ‚¨ç¡®è®¤è¦æ‰«æ%s目录下现有的Godot项目å—?" #: editor/project_manager.cpp msgid "Project Manager" -msgstr "项目管ç†å‘˜" +msgstr "项目管ç†å™¨" #: editor/project_manager.cpp msgid "Project List" @@ -9769,6 +9875,11 @@ msgid "Extend Script" msgstr "打开脚本" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Reparent to New Node" +msgstr "é‡è®¾çˆ¶èŠ‚ç‚¹" + +#: editor/scene_tree_dock.cpp msgid "Make Scene Root" msgstr "åˆ›å»ºåœºæ™¯æ ¹èŠ‚ç‚¹" @@ -10000,7 +10111,8 @@ msgid "Script is valid." msgstr "脚本å¯ç”¨" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +#, fuzzy +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "ä»…å…许使用: a-z, A-Z, 0-9 或 _" #: editor/script_create_dialog.cpp @@ -10058,7 +10170,7 @@ msgstr "æ ˆè¿½è¸ª" msgid "Pick one or more items from the list to display the graph." msgstr "从列表ä¸é€‰å–一个或多个项目以显示图形。" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "错误" @@ -10460,54 +10572,6 @@ msgstr "拾å–è·ç¦»:" msgid "Class name can't be a reserved keyword" msgstr "ç±»åä¸èƒ½æ˜¯ä¿ç•™å…³é”®å—" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "æ£åœ¨åˆ›ç”Ÿæˆå†³æ–¹æ¡ˆ..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "æ£åœ¨ç”ŸæˆC#项目..." - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create solution." -msgstr "创建解决方案失败。" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "ä¿å˜è§£å†³æ–¹æ¡ˆå¤±è´¥ã€‚" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "完æˆ" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "创建C#项目失败。" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "Mono" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "关于C#支æŒ" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "创建C#解决方案" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "构建" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Build Project" -msgstr "构建项目" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "View log" -msgstr "查看日志" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "å†…éƒ¨å¼‚å¸¸å †æ ˆè¿½æœ”ç»“æŸ" @@ -10981,7 +11045,7 @@ msgstr "æ ‡è¯†ç¬¦å—æ®µä¸èƒ½ä¸ºç©º." #: platform/iphone/export/export.cpp msgid "The character '%s' is not allowed in Identifier." -msgstr "æ ‡è¯†ç¬¦ä¸ä¸å…许使用å—符 '% s' 。" +msgstr "æ ‡è¯†ç¬¦ä¸ä¸å…许使用å—符 '%s' 。" #: platform/iphone/export/export.cpp msgid "A digit cannot be the first character in a Identifier segment." @@ -11085,8 +11149,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "å¯åŠ¨ç”»é¢å›¾ç‰‡å°ºå¯¸æ— 效(应为620x300)。" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" "SpriteFrames资æºå¿…须是通过AnimatedSprite节点的frames属性创建的,å¦åˆ™æ— 法显示" @@ -11145,8 +11210,9 @@ msgid "" msgstr "CPUParticles2D动画需è¦ä½¿ç”¨å¯ç”¨äº†â€œç²’å动画â€çš„CanvasItemMaterial。" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "光照的形状与纹ç†å¿…é¡»æä¾›ç»™çº¹ç†å±žæ€§ã€‚" @@ -11156,7 +11222,8 @@ msgid "" msgstr "æ¤é®å…‰ä½“必须设置é®å…‰å½¢çжæ‰èƒ½èµ·åˆ°é®å…‰ä½œç”¨ã€‚" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "æ¤é®å…‰ä½“çš„é®å…‰å½¢çŠ¶ä¸ºç©ºï¼Œè¯·ä¸ºå…¶ç»˜åˆ¶ä¸€ä¸ªé®å…‰å½¢çжï¼" #: scene/2d/navigation_polygon.cpp @@ -11244,13 +11311,15 @@ msgstr "" "其放在Area2Dã€StaticBody2Dã€RigidBody2D或者是KinematicBody2D节点下。" #: scene/2d/visibility_notifier_2d.cpp +#, fuzzy msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "VisibilityEnable2Dç±»åž‹çš„èŠ‚ç‚¹ç”¨äºŽåœºæ™¯çš„æ ¹èŠ‚ç‚¹æ‰èƒ½èŽ·å¾—æœ€å¥½çš„æ•ˆæžœã€‚" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +#, fuzzy +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "ARVRCamera 必须处于 ARVROrigin 节点之下" #: scene/3d/arvr_nodes.cpp @@ -11338,9 +11407,10 @@ msgstr "" "在Areaã€StaticBodyã€RigidBody或KinematicBody节点下。" #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" "CollisionShape节点必须拥有一个形状æ‰èƒ½è¿›è¡Œç¢°æ’žæ£€æµ‹å·¥ä½œï¼Œè¯·ä¸ºå®ƒåˆ›å»ºä¸€ä¸ªå½¢çŠ¶èµ„" "æºï¼" @@ -11374,6 +11444,10 @@ msgstr "" "GLES2视频驱动程åºä¸æ”¯æŒå…¨å±€å…‰ç…§æŽ¢æµ‹å™¨ã€‚\n" "请改用已烘焙ç¯å…‰è´´å›¾ã€‚" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "角度宽于 90 度的 SpotLight æ— æ³•æŠ•å°„å‡ºé˜´å½±ã€‚" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "æ¤èŠ‚ç‚¹éœ€è¦è®¾ç½®NavigationMeshèµ„æºæ‰èƒ½æ£å¸¸å·¥ä½œã€‚" @@ -11411,9 +11485,10 @@ msgid "PathFollow only works when set as a child of a Path node." msgstr "PathFollowç±»åž‹çš„èŠ‚ç‚¹åªæœ‰ä½œä¸ºPath类型节点的å节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" #: scene/3d/path.cpp +#, fuzzy msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" "PathFollow ROTATION_ORIENTED需è¦åœ¨å…¶çˆ¶è·¯å¾„的曲线资æºä¸å¯ç”¨â€œUp Vectorâ€ã€‚" @@ -11428,7 +11503,10 @@ msgstr "" "建议您修改å节点的碰撞形状。" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +#, fuzzy +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "path属性必须指å‘ä¸€ä¸ªåˆæ³•çš„Spatial节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" #: scene/3d/soft_body.cpp @@ -11446,8 +11524,9 @@ msgstr "" "建议修改å节点的碰撞体形状尺寸。" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" "SpriteFrame资æºå¿…须是通过AnimatedSprite3D节点的Frames属性创建的,å¦åˆ™æ— 法显示" @@ -11462,8 +11541,11 @@ msgstr "" "VehicleBodyçš„å节点。" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." -msgstr "WorldEnvironment需è¦ä¸€ä¸ªçŽ¯å¢ƒèµ„æºã€‚" +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" +"WorldEnvironment è¦æ±‚其“Environmentâ€å±žæ€§æ˜¯ä¸€ä¸ª Environment,以产生å¯è§æ•ˆæžœã€‚" #: scene/3d/world_environment.cpp msgid "" @@ -11499,7 +11581,8 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "没有任何物体连接到节点 '%s' 的输入 '%s' 。" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +#, fuzzy +msgid "No root AnimationNode for the graph is set." msgstr "å›¾è¡¨æ²¡æœ‰è®¾ç½®åŠ¨ç”»èŠ‚ç‚¹ä½œä¸ºæ ¹èŠ‚ç‚¹ã€‚" #: scene/animation/animation_tree.cpp @@ -11511,7 +11594,8 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "åŠ¨ç”»æ’æ”¾å™¨çš„è·¯å¾„æ²¡æœ‰åŠ è½½ä¸€ä¸ª AnimationPlayer 节点。" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +#, fuzzy +msgid "The AnimationPlayer root node is not a valid node." msgstr "AnimationPlayer çš„æ ¹èŠ‚ç‚¹ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„节点。" #: scene/animation/animation_tree_player.cpp @@ -11544,8 +11628,7 @@ msgstr "将当å‰é¢œè‰²æ·»åŠ ä¸ºé¢„è®¾ã€‚" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" "除éžåœ¨è„šæœ¬å†…é…置其å项的放置行为,å¦åˆ™å®¹å™¨æœ¬èº«æ²¡æœ‰ç”¨å¤„。\n" "å¦‚æžœæ‚¨ä¸æ‰“ç®—æ·»åŠ è„šæœ¬ï¼Œè¯·ä½¿ç”¨ç®€å•的“控件â€èŠ‚ç‚¹ã€‚" @@ -11555,6 +11638,8 @@ msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" +"由于该控件的 Mouse Filter 设置为 \"Ignore\" å› æ¤å®ƒçš„ Hint Tooltip å°†ä¸ä¼šå±•" +"示。将 Mouse Filter 设置为 \"Stop\" 或 \"Pass\" å¯ä¿®æ£æ¤é—®é¢˜ã€‚" #: scene/gui/dialogs.cpp msgid "Alert!" @@ -11565,22 +11650,25 @@ msgid "Please Confirm..." msgstr "请确认..." #: scene/gui/popup.cpp +#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" "Popupå¯¹è±¡é»˜è®¤ä¿æŒéšè—,除éžä½ 调用popup()或其他popup相关方法。编辑时å¯ä»¥è®©å®ƒä»¬" "ä¿æŒå¯è§ï¼Œä½†å®ƒåœ¨è¿è¡Œæ—¶ä»¬ä¼šè‡ªåЍéšè—。" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +#, fuzzy +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "如果exp_edit为true, 则min_value必须为>0。" #: scene/gui/scroll_container.cpp +#, fuzzy msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" "ScrollContainer旨在与å•ä¸ªåæŽ§ä»¶é…åˆä½¿ç”¨ã€‚\n" @@ -11628,9 +11716,19 @@ msgid "Input" msgstr "输入" #: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid source for preview." +msgstr "éžæ³•çš„ç€è‰²å™¨æºã€‚" + +#: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for shader." msgstr "éžæ³•çš„ç€è‰²å™¨æºã€‚" +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "éžæ³•çš„ç€è‰²å™¨æºã€‚" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "对函数的赋值。" @@ -11645,7 +11743,67 @@ msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸æŒ‡å®šã€‚" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "ä¸å…许修改常é‡ã€‚" + +#~ msgid "Previous Folder" +#~ msgstr "上一个文件夹" + +#~ msgid "Next Folder" +#~ msgstr "下一个文件夹" + +#~ msgid "Automatically Open Screenshots" +#~ msgstr "自动打开截图" + +#~ msgid "Open in an external image editor." +#~ msgstr "使用外部图åƒç¼–辑器打开。" + +#~ msgid "Reverse" +#~ msgstr "å选" + +#~ msgid "Mirror X" +#~ msgstr "沿X轴翻转" + +#~ msgid "Mirror Y" +#~ msgstr "沿Y轴翻转" + +#~ msgid "Generating solution..." +#~ msgstr "æ£åœ¨åˆ›ç”Ÿæˆå†³æ–¹æ¡ˆ..." + +#~ msgid "Generating C# project..." +#~ msgstr "æ£åœ¨ç”ŸæˆC#项目..." + +#~ msgid "Failed to create solution." +#~ msgstr "创建解决方案失败。" + +#~ msgid "Failed to save solution." +#~ msgstr "ä¿å˜è§£å†³æ–¹æ¡ˆå¤±è´¥ã€‚" + +#~ msgid "Done" +#~ msgstr "完æˆ" + +#~ msgid "Failed to create C# project." +#~ msgstr "创建C#项目失败。" + +#~ msgid "Mono" +#~ msgstr "Mono" + +#~ msgid "About C# support" +#~ msgstr "关于C#支æŒ" + +#~ msgid "Create C# solution" +#~ msgstr "创建C#解决方案" + +#~ msgid "Builds" +#~ msgstr "构建" + +#~ msgid "Build Project" +#~ msgstr "构建项目" + +#~ msgid "View log" +#~ msgstr "查看日志" + +#~ msgid "WorldEnvironment needs an Environment resource." +#~ msgstr "WorldEnvironment需è¦ä¸€ä¸ªçŽ¯å¢ƒèµ„æºã€‚" #~ msgid "Enabled Classes" #~ msgstr "å¯ç”¨çš„ç±»" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 8c021ebf05..6946008e81 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -137,6 +137,31 @@ msgstr "" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "動畫變化數值" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "å‹•ç•«è®ŠåŒ–éŽæ¸¡" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "å‹•ç•«è®ŠåŒ–éŽæ¸¡" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "動畫變化數值" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "動畫軌跡變化數值模å¼" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "更改動畫å稱:" @@ -670,6 +695,10 @@ msgstr "跳到行" msgid "Line Number:" msgstr "行數:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "沒有相åŒ" @@ -721,7 +750,7 @@ msgstr "縮å°" msgid "Reset Zoom" msgstr "é‡è¨ç¸®æ”¾æ¯”例" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "" @@ -828,6 +857,11 @@ msgid "Connect" msgstr "連到" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "訊號:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "ç”± '%s' 連到 '%s'" @@ -997,7 +1031,7 @@ msgstr "" #: editor/dependency_editor.cpp #, fuzzy -msgid "Remove selected files from the project? (no undo)" +msgid "Remove selected files from the project? (Can't be restored)" msgstr "從專案ä¸åˆªé™¤æ‰€é¸çš„æª”案?(æ¤å‹•作無法復原)" #: editor/dependency_editor.cpp @@ -1185,7 +1219,6 @@ msgid "Success!" msgstr "æˆåŠŸï¼" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "安è£" @@ -1575,6 +1608,10 @@ msgstr "" msgid "Template file not found:" msgstr "未找到佈局å稱ï¼" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1773,7 +1810,7 @@ msgstr "開啟 Project Manager?" msgid "New Folder..." msgstr "新增資料夾" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "釿–°æ•´ç†" @@ -1824,7 +1861,7 @@ msgstr "" msgid "Go Up" msgstr "" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "(ä¸ï¼‰é¡¯ç¤ºéš±è—的文件" @@ -1852,27 +1889,32 @@ msgstr "下移最愛" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "上一個tab" +msgid "Go to previous folder." +msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "新增資料夾" +msgid "Go to next folder." +msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "無法新增資料夾" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "在幫助檔æœå°‹" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "無法新增資料夾" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "(ä¸ï¼‰é¡¯ç¤ºéš±è—的文件" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2611,6 +2653,11 @@ msgstr "上一個開啟的scene" #: editor/editor_node.cpp #, fuzzy +msgid "Copy Text" +msgstr "複製路徑" + +#: editor/editor_node.cpp +#, fuzzy msgid "Next tab" msgstr "下一個" @@ -2810,15 +2857,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "編輯器è¨å®š" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "è¦é›¢é–‹ç·¨è¼¯å™¨å—Ž?" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "全螢幕" @@ -3152,6 +3190,11 @@ msgid "Calls" msgstr "" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "檔案" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "" @@ -3806,6 +3849,7 @@ msgid "Nodes not in Group" msgstr "" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" msgstr "篩é¸:" @@ -4906,6 +4950,11 @@ msgid "Idle" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "安è£" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "é‡è©¦" @@ -4936,7 +4985,6 @@ msgid "Last" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "全部" @@ -4950,8 +4998,9 @@ msgid "Sort:" msgstr "排åºï¼š" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "" +#, fuzzy +msgid "Reverse sorting." +msgstr "請求ä¸..." #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -5025,35 +5074,39 @@ msgid "Rotation Step:" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" -msgstr "" +#, fuzzy +msgid "Move Vertical Guide" +msgstr "新增" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new vertical guide" +msgid "Create Vertical Guide" msgstr "新增" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" -msgstr "" +#, fuzzy +msgid "Remove Vertical Guide" +msgstr "åªé™é¸ä¸" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" -msgstr "" +#, fuzzy +msgid "Move Horizontal Guide" +msgstr "åªé™é¸ä¸" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Create new horizontal guide" +msgid "Create Horizontal Guide" msgstr "新增" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy -msgid "Remove horizontal guide" +msgid "Remove Horizontal Guide" msgstr "åªé™é¸ä¸" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" -msgstr "" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" +msgstr "新增" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6691,10 +6744,19 @@ msgid "Syntax Highlighter" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "刪除" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -7000,7 +7062,11 @@ msgid "Rear" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +msgid "Align Transform with View" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -7193,10 +7259,6 @@ msgid "Focus Selection" msgstr "åªé™é¸ä¸" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "所有é¸é …" @@ -7791,14 +7853,6 @@ msgid "Transpose" msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8226,6 +8280,10 @@ msgid "Visual Shader Input Type Changed" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "" @@ -8314,6 +8372,22 @@ msgid "Color uniform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8321,10 +8395,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8414,7 +8522,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8422,7 +8530,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8434,7 +8542,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8451,7 +8559,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8520,11 +8628,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8540,7 +8648,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8568,11 +8676,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8612,11 +8720,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8626,7 +8738,7 @@ msgstr "縮放selection" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8644,15 +8756,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8704,7 +8816,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8732,12 +8844,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8814,47 +8926,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -10072,6 +10184,11 @@ msgstr "下一個腳本" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "新增" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "儲å˜å ´æ™¯" @@ -10293,7 +10410,7 @@ msgid "Script is valid." msgstr "腳本" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10354,7 +10471,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "錯誤" @@ -10770,60 +10887,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "資æºåŠ è¼‰å¤±æ•—ã€‚" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to save solution." -msgstr "資æºåŠ è¼‰å¤±æ•—ã€‚" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create C# project." -msgstr "資æºåŠ è¼‰å¤±æ•—ã€‚" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Create C# solution" -msgstr "縮放selection" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "專案" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "檔案" - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11431,7 +11494,7 @@ msgstr "" #: scene/2d/animated_sprite.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "" @@ -11480,7 +11543,7 @@ msgstr "" #: scene/2d/light_2d.cpp msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "" @@ -11490,7 +11553,7 @@ msgid "" msgstr "" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" #: scene/2d/navigation_polygon.cpp @@ -11566,12 +11629,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11650,7 +11713,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" +"shape resource for it." msgstr "" #: scene/3d/collision_shape.cpp @@ -11679,6 +11742,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11713,8 +11780,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11725,7 +11792,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11741,7 +11810,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." msgstr "" @@ -11752,7 +11821,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11790,7 +11861,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "ç”± '%s' 連到 '%s'" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11803,7 +11874,7 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." +msgid "The AnimationPlayer root node is not a valid node." msgstr "" #: scene/animation/animation_tree_player.cpp @@ -11834,8 +11905,7 @@ msgstr "" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11855,18 +11925,18 @@ msgstr "請確èª..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11910,9 +11980,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "無效å—åž‹" + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "無效å—åž‹" +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "無效å—åž‹" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11929,6 +12009,42 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "上一個tab" + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "新增資料夾" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "è¦é›¢é–‹ç·¨è¼¯å™¨å—Ž?" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "資æºåŠ è¼‰å¤±æ•—ã€‚" + +#, fuzzy +#~ msgid "Failed to save solution." +#~ msgstr "資æºåŠ è¼‰å¤±æ•—ã€‚" + +#, fuzzy +#~ msgid "Failed to create C# project." +#~ msgstr "資æºåŠ è¼‰å¤±æ•—ã€‚" + +#, fuzzy +#~ msgid "Create C# solution" +#~ msgstr "縮放selection" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "專案" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "檔案" + #~ msgid "Update Always" #~ msgstr "ä¸åœæ›´æ–°" @@ -12069,9 +12185,6 @@ msgstr "" #~ msgid "Anim Track Change Interpolation" #~ msgstr "動畫軌跡變化Interpolation" -#~ msgid "Anim Track Change Value Mode" -#~ msgstr "動畫軌跡變化數值模å¼" - #~ msgid "Edit Selection Curve" #~ msgstr "編輯Selection Curve" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index a4f52399f3..54c1f74b02 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -58,7 +58,7 @@ msgstr "無效的內å˜åœ°å€é¡žåž‹ %sï¼ŒåŸºç¤Žåž‹å¼ %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "基本類型 %s 的命å索引 '% s' 無效" +msgstr "基本類型 %s 的命å索引 '%s' 無效" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" @@ -141,6 +141,31 @@ msgstr "更改回調" #: editor/animation_track_editor.cpp #, fuzzy +msgid "Anim Multi Change Keyframe Time" +msgstr "變更關éµç•«æ ¼çš„æ™‚é–“" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transition" +msgstr "è®Šæ›´è½‰å ´æ•ˆæžœ" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Transform" +msgstr "變更動畫變æ›" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Keyframe Value" +msgstr "變更關éµç•«æ ¼çš„æ•¸å€¼" + +#: editor/animation_track_editor.cpp +#, fuzzy +msgid "Anim Multi Change Call" +msgstr "更改回調" + +#: editor/animation_track_editor.cpp +#, fuzzy msgid "Change Animation Length" msgstr "變更動畫長度" @@ -655,6 +680,10 @@ msgstr "å‰å¾€ç¬¬...行" msgid "Line Number:" msgstr "行號:" +#: editor/code_editor.cpp +msgid "Found %d match(es)." +msgstr "" + #: editor/code_editor.cpp editor/editor_help.cpp msgid "No Matches" msgstr "ç„¡ç¬¦åˆæ¢ä»¶" @@ -704,7 +733,7 @@ msgstr "縮å°" msgid "Reset Zoom" msgstr "é‡è¨ç¸®æ”¾å¤§å°" -#: editor/code_editor.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/code_editor.cpp msgid "Warnings" msgstr "è¦å‘Š" @@ -816,6 +845,11 @@ msgid "Connect" msgstr "連接" #: editor/connections_dialog.cpp +#, fuzzy +msgid "Signal:" +msgstr "訊號:" + +#: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" msgstr "連接 '%s' 到 '%s'" @@ -985,7 +1019,8 @@ msgid "Owners Of:" msgstr "æ“æœ‰è€…:" #: editor/dependency_editor.cpp -msgid "Remove selected files from the project? (no undo)" +#, fuzzy +msgid "Remove selected files from the project? (Can't be restored)" msgstr "æ¤å‹•作無法復原, 確定è¦å¾žå°ˆæ¡ˆä¸åˆªé™¤æ‰€é¸çš„æª”案?" #: editor/dependency_editor.cpp @@ -1174,7 +1209,6 @@ msgid "Success!" msgstr "æˆåŠŸ!" #: editor/editor_asset_installer.cpp editor/editor_node.cpp -#: editor/plugins/asset_library_editor_plugin.cpp msgid "Install" msgstr "安è£" @@ -1552,6 +1586,10 @@ msgstr "找ä¸åˆ°è‡ªå®šç¾©ç™¼ä½ˆç¯„本。" msgid "Template file not found:" msgstr "找ä¸åˆ°ç¯„本檔案:" +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" + #: editor/editor_feature_profile.cpp #, fuzzy msgid "3D Editor" @@ -1751,7 +1789,7 @@ msgstr "在檔案管ç†å“¡å…§é¡¯ç¤º" msgid "New Folder..." msgstr "新增資料夾..." -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Refresh" msgstr "釿–°æ•´ç†" @@ -1802,7 +1840,7 @@ msgstr "å¾€å‰" msgid "Go Up" msgstr "往上" -#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" msgstr "切æ›é¡¯ç¤ºéš±è—檔案" @@ -1829,27 +1867,32 @@ msgstr "å‘下移動收è—" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Previous Folder" -msgstr "上個分é " +msgid "Go to previous folder." +msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp #, fuzzy -msgid "Next Folder" -msgstr "新增資料夾" +msgid "Go to next folder." +msgstr "無法新增資料夾" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Go to parent folder." msgstr "無法新增資料夾" +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Refresh files." +msgstr "æœå°‹ Class" + #: editor/editor_file_dialog.cpp #, fuzzy msgid "(Un)favorite current folder." msgstr "無法新增資料夾" -#: editor/editor_file_dialog.cpp +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy -msgid "Toggle visibility of hidden files." +msgid "Toggle the visibility of hidden files." msgstr "切æ›é¡¯ç¤ºéš±è—檔案" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp @@ -2570,6 +2613,11 @@ msgid "Go to previously opened scene." msgstr "å‰å¾€ä¸Šæ¬¡é–‹å•Ÿçš„å ´æ™¯ã€‚" #: editor/editor_node.cpp +#, fuzzy +msgid "Copy Text" +msgstr "複製路徑" + +#: editor/editor_node.cpp msgid "Next tab" msgstr "下一個分é " @@ -2772,15 +2820,6 @@ msgid "Screenshots are stored in the Editor Data/Settings Folder." msgstr "開啟 編輯器數據/è¨å®š 資料夾" #: editor/editor_node.cpp -msgid "Automatically Open Screenshots" -msgstr "" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Open in an external image editor." -msgstr "開啟下一個編輯器" - -#: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "全螢幕顯示" @@ -3103,6 +3142,11 @@ msgid "Calls" msgstr "調用" #: editor/editor_properties.cpp +#, fuzzy +msgid "Edit Text:" +msgstr "編輯主題…" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" msgstr "啟用" @@ -3369,7 +3413,7 @@ msgstr "下載完æˆã€‚" msgid "" "Templates installation failed. The problematic templates archives can be " "found at '%s'." -msgstr "範本安è£å¤±æ•—。有å•é¡Œçš„ç¯„æœ¬å˜æª”å¯ä»¥åœ¨ \"% s\" 䏿‰¾åˆ°ã€‚" +msgstr "範本安è£å¤±æ•—。有å•é¡Œçš„ç¯„æœ¬å˜æª”å¯ä»¥åœ¨ \"%s\" 䏿‰¾åˆ°ã€‚" #: editor/export_template_manager.cpp #, fuzzy @@ -3745,6 +3789,7 @@ msgid "Nodes not in Group" msgstr "ä¸åœ¨çµ„ä¸çš„節點" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" msgstr "éŽæ¿¾æª”案..." @@ -4824,6 +4869,11 @@ msgid "Idle" msgstr "空閒" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Install..." +msgstr "安è£" + +#: editor/plugins/asset_library_editor_plugin.cpp msgid "Retry" msgstr "é‡è©¦" @@ -4853,7 +4903,6 @@ msgid "Last" msgstr "最後" #: editor/plugins/asset_library_editor_plugin.cpp -#: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "All" msgstr "全部" @@ -4867,8 +4916,9 @@ msgid "Sort:" msgstr "排åº:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Reverse" -msgstr "å轉" +#, fuzzy +msgid "Reverse sorting." +msgstr "æ£åœ¨è«‹æ±‚…" #: editor/plugins/asset_library_editor_plugin.cpp #: editor/project_settings_editor.cpp @@ -4943,31 +4993,38 @@ msgid "Rotation Step:" msgstr "旋轉æ¥é©Ÿ:" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move vertical guide" +#, fuzzy +msgid "Move Vertical Guide" msgstr "垂直移動尺標" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new vertical guide" +#, fuzzy +msgid "Create Vertical Guide" msgstr "創建新的垂直尺標" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove vertical guide" +#, fuzzy +msgid "Remove Vertical Guide" msgstr "刪除垂直尺標" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Move horizontal guide" +#, fuzzy +msgid "Move Horizontal Guide" msgstr "移動水平尺標" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal guide" +#, fuzzy +msgid "Create Horizontal Guide" msgstr "創建新的水平尺標" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Remove horizontal guide" +#, fuzzy +msgid "Remove Horizontal Guide" msgstr "移除水平尺標" #: editor/plugins/canvas_item_editor_plugin.cpp -msgid "Create new horizontal and vertical guides" +#, fuzzy +msgid "Create Horizontal and Vertical Guides" msgstr "創建新的水平和垂直尺標" #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6609,10 +6666,19 @@ msgid "Syntax Highlighter" msgstr "高亮顯示語法" #: editor/plugins/script_text_editor.cpp +msgid "Go To" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" msgstr "" +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Breakpoints" +msgstr "刪除" + #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -6912,9 +6978,15 @@ msgid "Rear" msgstr "後" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with View" +#, fuzzy +msgid "Align Transform with View" msgstr "與視圖å°é½Š" +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Align Rotation with View" +msgstr "將所é¸å…§å®¹èˆ‡è¦–圖å°é½Š" + #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" @@ -7100,10 +7172,6 @@ msgid "Focus Selection" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align Selection With View" -msgstr "將所é¸å…§å®¹èˆ‡è¦–圖å°é½Š" - -#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Tool Select" msgstr "工具鏿“‡" @@ -7701,14 +7769,6 @@ msgid "Transpose" msgstr "轉置" #: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror X" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp -msgid "Mirror Y" -msgstr "" - -#: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" msgstr "" @@ -8131,6 +8191,10 @@ msgid "Visual Shader Input Type Changed" msgstr "視覺著色器輸入類型已更改" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" msgstr "é ‚é»ž" @@ -8223,6 +8287,22 @@ msgid "Color uniform." msgstr "清除變æ›" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." @@ -8230,10 +8310,44 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" "Returns an associated vector if the provided boolean value is true or false." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." msgstr "" @@ -8325,7 +8439,7 @@ msgid "Returns the arc-cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic cosine of the parameter." +msgid "Returns the inverse hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8333,7 +8447,7 @@ msgid "Returns the arc-sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic sine of the parameter." +msgid "Returns the inverse hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8345,7 +8459,7 @@ msgid "Returns the arc-tangent of the parameters." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the inverse hyperbolic tangent of the parameter." +msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8362,7 +8476,7 @@ msgid "Returns the cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic cosine of the parameter." +msgid "Returns the hyperbolic cosine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8431,11 +8545,11 @@ msgid "1.0 / scalar" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest integer to the parameter." +msgid "Finds the nearest integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the nearest even integer to the parameter." +msgid "Finds the nearest even integer to the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8451,7 +8565,7 @@ msgid "Returns the sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic sine of the parameter." +msgid "Returns the hyperbolic sine of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8479,11 +8593,11 @@ msgid "Returns the tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Returns the hyperbolic tangent of the parameter." +msgid "Returns the hyperbolic tangent of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Finds the truncated value of the parameter." +msgid "Finds the truncated value of the parameter." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8524,11 +8638,15 @@ msgid "Perform the texture lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Cubic texture uniform." +msgid "Cubic texture uniform lookup." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "2D texture uniform." +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8538,7 +8656,7 @@ msgstr "轉æ›å°è©±æ¡†..。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) Calculate the outer product of a pair of vectors.\n" +"Calculate the outer product of a pair of vectors.\n" "\n" "OuterProduct treats the first parameter 'c' as a column vector (matrix with " "one column) and the second parameter 'r' as a row vector (matrix with one " @@ -8556,15 +8674,15 @@ msgid "Decomposes transform to four vectors." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the determinant of a transform." +msgid "Calculates the determinant of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the inverse of a transform." +msgid "Calculates the inverse of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) Calculates the transpose of a transform." +msgid "Calculates the transpose of a transform." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8616,7 +8734,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the same direction as a reference vector. " +"Returns the vector that points in the same direction as a reference vector. " "The function has three vector parameters : N, the vector to orient, I, the " "incident vector, and Nref, the reference vector. If the dot product of I and " "Nref is smaller than zero the return value is N. Otherwise -N is returned." @@ -8644,12 +8762,12 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"Returns a vector that points in the direction of reflection ( a : incident " +"Returns the vector that points in the direction of reflection ( a : incident " "vector, b : normal vector )." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "Returns a vector that points in the direction of refraction." +msgid "Returns the vector that points in the direction of refraction." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -8726,47 +8844,47 @@ msgid "" msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Scalar derivative function." +msgid "(Fragment/Light mode only) Scalar derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -msgid "(GLES3 only) (Fragment/Light mode only) Vector derivative function." +msgid "(Fragment/Light mode only) Vector derivative function." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'x' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Derivative in 'y' using " -"local differencing." +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Vector) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" -"(GLES3 only) (Fragment/Light mode only) (Scalar) Sum of absolute derivative " -"in 'x' and 'y'." +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9976,6 +10094,11 @@ msgstr "開啟最近å˜å–" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Reparent to New Node" +msgstr "新增 %s" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Make Scene Root" msgstr "儲å˜å ´æ™¯" @@ -10196,7 +10319,7 @@ msgid "Script is valid." msgstr "動畫樹有效。" #: editor/script_create_dialog.cpp -msgid "Allowed: a-z, A-Z, 0-9 and _" +msgid "Allowed: a-z, A-Z, 0-9, _ and ." msgstr "" #: editor/script_create_dialog.cpp @@ -10255,7 +10378,7 @@ msgstr "" msgid "Pick one or more items from the list to display the graph." msgstr "" -#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp +#: editor/script_editor_debugger.cpp msgid "Errors" msgstr "" @@ -10689,57 +10812,6 @@ msgstr "" msgid "Class name can't be a reserved keyword" msgstr "" -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating solution..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Generating C# project..." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -#, fuzzy -msgid "Failed to create solution." -msgstr "無法新增資料夾" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to save solution." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Done" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Failed to create C# project." -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Mono" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "About C# support" -msgstr "" - -#: modules/mono/editor/godotsharp_editor.cpp -msgid "Create C# solution" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -msgid "Builds" -msgstr "" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "Build Project" -msgstr "專案è¨å®š" - -#: modules/mono/editor/mono_bottom_panel.cpp -#, fuzzy -msgid "View log" -msgstr "éŽæ¿¾æª”案..." - #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" msgstr "" @@ -11335,8 +11407,9 @@ msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" #: scene/2d/animated_sprite.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite to display frames." msgstr "SpriteFrames資æºå¿…é ˆåœ¨Frames屬性ä¸è¢«å‰µå»ºæˆ–è¨ç½®æ‰èƒ½å¤ é¡¯ç¤ºå‹•ç•«æ ¼ã€‚" @@ -11390,8 +11463,9 @@ msgid "" msgstr "" #: scene/2d/light_2d.cpp +#, fuzzy msgid "" -"A texture with the shape of the light must be supplied to the 'texture' " +"A texture with the shape of the light must be supplied to the \"Texture\" " "property." msgstr "光照形狀的æè³ªå¿…é ˆè¢«è³¦èˆ‡åœ¨æè³ªçš„屬性ä¸ã€‚" @@ -11401,7 +11475,8 @@ msgid "" msgstr "æ¤é®å…‰é«”å¿…é ˆè¢«å»ºç«‹æˆ–è¨ç½®é®è”½å½¢ç‹€æ‰èƒ½ç™¼æ®é®è”½ä½œç”¨ã€‚" #: scene/2d/light_occluder_2d.cpp -msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +#, fuzzy +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "æ¤é®å…‰é«”沒有被賦予形狀,請繪製一個å§ï¼" #: scene/2d/navigation_polygon.cpp @@ -11480,12 +11555,12 @@ msgstr "" #: scene/2d/visibility_notifier_2d.cpp msgid "" -"VisibilityEnable2D works best when used with the edited scene root directly " +"VisibilityEnabler2D works best when used with the edited scene root directly " "as parent." msgstr "" #: scene/3d/arvr_nodes.cpp -msgid "ARVRCamera must have an ARVROrigin node as its parent" +msgid "ARVRCamera must have an ARVROrigin node as its parent." msgstr "" #: scene/3d/arvr_nodes.cpp @@ -11562,10 +11637,11 @@ msgid "" msgstr "" #: scene/3d/collision_shape.cpp +#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " -"shape resource for it!" -msgstr "" +"shape resource for it." +msgstr "CollisionShape2Då¿…é ˆè¢«è³¦äºˆå½¢ç‹€æ‰èƒ½é‹ä½œï¼Œè«‹ç‚ºå®ƒå»ºç«‹å€‹å½¢ç‹€å§ï¼" #: scene/3d/collision_shape.cpp msgid "" @@ -11593,6 +11669,10 @@ msgid "" "Use a BakedLightmap instead." msgstr "" +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -11627,8 +11707,8 @@ msgstr "" #: scene/3d/path.cpp msgid "" -"PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent " -"Path's Curve resource." +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." msgstr "" #: scene/3d/physics_body.cpp @@ -11639,7 +11719,9 @@ msgid "" msgstr "" #: scene/3d/remote_transform.cpp -msgid "Path property must point to a valid Spatial node to work." +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." msgstr "" #: scene/3d/soft_body.cpp @@ -11654,10 +11736,11 @@ msgid "" msgstr "" #: scene/3d/sprite_3d.cpp +#, fuzzy msgid "" -"A SpriteFrames resource must be created or set in the 'Frames' property in " +"A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite3D to display frames." -msgstr "" +msgstr "SpriteFrames資æºå¿…é ˆåœ¨Frames屬性ä¸è¢«å‰µå»ºæˆ–è¨ç½®æ‰èƒ½å¤ é¡¯ç¤ºå‹•ç•«æ ¼ã€‚" #: scene/3d/vehicle_body.cpp msgid "" @@ -11666,7 +11749,9 @@ msgid "" msgstr "" #: scene/3d/world_environment.cpp -msgid "WorldEnvironment needs an Environment resource." +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." msgstr "" #: scene/3d/world_environment.cpp @@ -11704,7 +11789,7 @@ msgid "Nothing connected to input '%s' of node '%s'." msgstr "å°‡ '%s' 從 '%s' 䏿–·é€£æŽ¥" #: scene/animation/animation_tree.cpp -msgid "A root AnimationNode for the graph is not set." +msgid "No root AnimationNode for the graph is set." msgstr "" #: scene/animation/animation_tree.cpp @@ -11717,8 +11802,9 @@ msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" #: scene/animation/animation_tree.cpp -msgid "AnimationPlayer root is not a valid node." -msgstr "" +#, fuzzy +msgid "The AnimationPlayer root node is not a valid node." +msgstr "動畫樹無效。" #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." @@ -11750,8 +11836,7 @@ msgstr "將目å‰é¡è‰²è¨ç‚ºé è¨" msgid "" "Container by itself serves no purpose unless a script configures its " "children placement behavior.\n" -"If you don't intend to add a script, then please use a plain 'Control' node " -"instead." +"If you don't intend to add a script, use a plain Control node instead." msgstr "" #: scene/gui/control.cpp @@ -11771,18 +11856,18 @@ msgstr "請確èª..." #: scene/gui/popup.cpp msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " -"functions. Making them visible for editing is fine though, but they will " -"hide upon running." +"functions. Making them visible for editing is fine, but they will hide upon " +"running." msgstr "" #: scene/gui/range.cpp -msgid "If exp_edit is true min_value must be > 0." +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "" #: scene/gui/scroll_container.cpp msgid "" "ScrollContainer is intended to work with a single child control.\n" -"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " "minimum size manually." msgstr "" @@ -11828,9 +11913,19 @@ msgstr "" #: scene/resources/visual_shader_nodes.cpp #, fuzzy +msgid "Invalid source for preview." +msgstr "無效的å—體大å°ã€‚" + +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy msgid "Invalid source for shader." msgstr "無效的å—體大å°ã€‚" +#: scene/resources/visual_shader_nodes.cpp +#, fuzzy +msgid "Invalid comparison function for that type." +msgstr "無效的å—體大å°ã€‚" + #: servers/visual/shader_language.cpp msgid "Assignment to function." msgstr "" @@ -11848,6 +11943,33 @@ msgid "Constants cannot be modified." msgstr "" #, fuzzy +#~ msgid "Previous Folder" +#~ msgstr "上個分é " + +#, fuzzy +#~ msgid "Next Folder" +#~ msgstr "新增資料夾" + +#, fuzzy +#~ msgid "Open in an external image editor." +#~ msgstr "開啟下一個編輯器" + +#~ msgid "Reverse" +#~ msgstr "å轉" + +#, fuzzy +#~ msgid "Failed to create solution." +#~ msgstr "無法新增資料夾" + +#, fuzzy +#~ msgid "Build Project" +#~ msgstr "專案è¨å®š" + +#, fuzzy +#~ msgid "View log" +#~ msgstr "éŽæ¿¾æª”案..." + +#, fuzzy #~ msgid "Enabled Classes" #~ msgstr "æœå°‹ Class" diff --git a/main/SCsub b/main/SCsub index e7fe6ab4e1..62bc155c67 100644 --- a/main/SCsub +++ b/main/SCsub @@ -6,6 +6,7 @@ from platform_methods import run_in_subprocess import main_builders env.main_sources = [] + env.add_source_files(env.main_sources, "*.cpp") # order matters here. higher index controller database files write on top of lower index database files @@ -14,7 +15,9 @@ controller_databases = ["#main/gamecontrollerdb.txt", "#main/gamecontrollerdb_20 env.Depends("#main/default_controller_mappings.gen.cpp", controller_databases) env.CommandNoCache("#main/default_controller_mappings.gen.cpp", controller_databases, run_in_subprocess(main_builders.make_default_controller_mappings)) -env.main_sources.append("#main/default_controller_mappings.gen.cpp") +# Don't warn about duplicate entry here, we need it registered manually for first build, +# even if later builds will pick it up twice due to above *.cpp globbing. +env.add_source_files(env.main_sources, "#main/default_controller_mappings.gen.cpp", warn_duplicates=False) env.Depends("#main/splash.gen.h", "#main/splash.png") env.CommandNoCache("#main/splash.gen.h", "#main/splash.png", run_in_subprocess(main_builders.make_splash)) diff --git a/main/input_default.cpp b/main/input_default.cpp index a03d015fc3..5ba98c20e2 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -629,6 +629,10 @@ Input::CursorShape InputDefault::get_default_cursor_shape() const { } void InputDefault::set_default_cursor_shape(CursorShape p_shape) { + + if (default_shape == p_shape) + return; + default_shape = p_shape; // The default shape is set in Viewport::_gui_input_event. To instantly // see the shape in the viewport we need to trigger a mouse motion event. @@ -686,7 +690,8 @@ void InputDefault::release_pressed_events() { _joy_axis.clear(); for (Map<StringName, InputDefault::Action>::Element *E = action_state.front(); E; E = E->next()) { - action_release(E->key()); + if (E->get().pressed) + action_release(E->key()); } } diff --git a/main/main.cpp b/main/main.cpp index 3f84eca1d2..7e69864e1e 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1374,7 +1374,7 @@ bool Main::start() { { DirAccessRef da = DirAccess::open(doc_tool); if (!da) { - ERR_EXPLAIN("Argument supplied to --doctool must be a base godot build directory"); + ERR_EXPLAIN("Argument supplied to --doctool must be a base Godot build directory"); ERR_FAIL_V(false); } } @@ -1392,12 +1392,23 @@ bool Main::start() { doc_data_classes[name] = path; if (!checked_paths.has(path)) { checked_paths.insert(path); + + // Create the module documentation directory if it doesn't exist + DirAccess *da = DirAccess::create_for_path(path); + da->make_dir_recursive(path); + memdelete(da); + docsrc.load_classes(path); print_line("Loading docs from: " + path); } } String index_path = doc_tool.plus_file("doc/classes"); + // Create the main documentation directory if it doesn't exist + DirAccess *da = DirAccess::create_for_path(index_path); + da->make_dir_recursive(index_path); + memdelete(da); + docsrc.load_classes(index_path); checked_paths.insert(index_path); print_line("Loading docs from: " + index_path); @@ -1869,6 +1880,7 @@ bool Main::iteration() { double scaled_step = step * time_scale; Engine::get_singleton()->_frame_step = step; + Engine::get_singleton()->_physics_interpolation_fraction = advance.interpolation_fraction; uint64_t physics_process_ticks = 0; uint64_t idle_process_ticks = 0; diff --git a/main/main_builders.py b/main/main_builders.py index 038a7d17f5..c48aaaa572 100644 --- a/main/main_builders.py +++ b/main/main_builders.py @@ -19,7 +19,7 @@ def make_splash(target, source, env): g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n") g.write("#ifndef BOOT_SPLASH_H\n") g.write("#define BOOT_SPLASH_H\n") - g.write('static const Color boot_splash_bg_color = Color::html("#232323");\n') + g.write('static const Color boot_splash_bg_color = Color(0.14, 0.14, 0.14);\n') g.write("static const unsigned char boot_splash_png[] = {\n") for i in range(len(buf)): g.write(byte_to_str(buf[i]) + ",\n") @@ -38,7 +38,7 @@ def make_splash_editor(target, source, env): g.write("/* THIS FILE IS GENERATED DO NOT EDIT */\n") g.write("#ifndef BOOT_SPLASH_EDITOR_H\n") g.write("#define BOOT_SPLASH_EDITOR_H\n") - g.write('static const Color boot_splash_editor_bg_color = Color::html("#232323");\n') + g.write('static const Color boot_splash_editor_bg_color = Color(0.14, 0.14, 0.14);\n') g.write("static const unsigned char boot_splash_editor_png[] = {\n") for i in range(len(buf)): g.write(byte_to_str(buf[i]) + ",\n") diff --git a/main/main_timer_sync.cpp b/main/main_timer_sync.cpp index f7388c8517..edacb20f28 100644 --- a/main/main_timer_sync.cpp +++ b/main/main_timer_sync.cpp @@ -178,6 +178,10 @@ MainFrameTime MainTimerSync::advance_checked(float p_frame_slice, int p_iteratio // track deficit time_deficit = p_idle_step - ret.idle_step; + // p_frame_slice is 1.0 / iterations_per_sec + // i.e. the time in seconds taken by a physics tick + ret.interpolation_fraction = time_accum / p_frame_slice; + return ret; } diff --git a/main/main_timer_sync.h b/main/main_timer_sync.h index 179119edce..93d335b27f 100644 --- a/main/main_timer_sync.h +++ b/main/main_timer_sync.h @@ -36,6 +36,7 @@ struct MainFrameTime { float idle_step; // time to advance idles for (argument to process()) int physics_steps; // number of times to iterate the physics engine + float interpolation_fraction; // fraction through the current physics tick void clamp_idle(float min_idle_step, float max_idle_step); }; diff --git a/main/tests/test_shader_lang.cpp b/main/tests/test_shader_lang.cpp index dcb19b7df7..d66e706b6f 100644 --- a/main/tests/test_shader_lang.cpp +++ b/main/tests/test_shader_lang.cpp @@ -197,6 +197,13 @@ static String dump_node_code(SL::Node *p_node, int p_level) { case SL::Node::TYPE_VARIABLE_DECLARATION: { // FIXME: Implement } break; + case SL::Node::TYPE_ARRAY: { + SL::ArrayNode *vnode = (SL::ArrayNode *)p_node; + code = vnode->name; + } break; + case SL::Node::TYPE_ARRAY_DECLARATION: { + // FIXME: Implement + } break; case SL::Node::TYPE_CONSTANT: { SL::ConstantNode *cnode = (SL::ConstantNode *)p_node; return get_constant_text(cnode->datatype, cnode->values); diff --git a/main/tests/test_string.cpp b/main/tests/test_string.cpp index 05df888f40..ab5fb64252 100644 --- a/main/tests/test_string.cpp +++ b/main/tests/test_string.cpp @@ -1078,6 +1078,44 @@ bool test_34() { return state; } +bool test_35() { +#define COUNT_TEST(x) \ + { \ + bool success = x; \ + state = state && success; \ + if (!success) { \ + OS::get_singleton()->print("\tfailed at: %s\n", #x); \ + } \ + } + + OS::get_singleton()->print("\n\nTest 35: count and countn function\n"); + bool state = true; + + COUNT_TEST(String("").count("Test") == 0); + COUNT_TEST(String("Test").count("") == 0); + COUNT_TEST(String("Test").count("test") == 0); + COUNT_TEST(String("Test").count("TEST") == 0); + COUNT_TEST(String("TEST").count("TEST") == 1); + COUNT_TEST(String("Test").count("Test") == 1); + COUNT_TEST(String("aTest").count("Test") == 1); + COUNT_TEST(String("Testa").count("Test") == 1); + COUNT_TEST(String("TestTestTest").count("Test") == 3); + COUNT_TEST(String("TestTestTest").count("TestTest") == 1); + COUNT_TEST(String("TestGodotTestGodotTestGodot").count("Test") == 3); + + COUNT_TEST(String("TestTestTestTest").count("Test", 4, 8) == 1); + COUNT_TEST(String("TestTestTestTest").count("Test", 4, 12) == 2); + COUNT_TEST(String("TestTestTestTest").count("Test", 4, 16) == 3); + COUNT_TEST(String("TestTestTestTest").count("Test", 4) == 3); + + COUNT_TEST(String("Test").countn("test") == 1); + COUNT_TEST(String("Test").countn("TEST") == 1); + COUNT_TEST(String("testTest-Testatest").countn("tEst") == 4); + COUNT_TEST(String("testTest-TeStatest").countn("tEsT", 4, 16) == 2); + + return state; +} + typedef bool (*TestFunc)(void); TestFunc test_funcs[] = { @@ -1116,6 +1154,7 @@ TestFunc test_funcs[] = { test_32, test_33, test_34, + test_35, 0 }; diff --git a/methods.py b/methods.py index bb4adfb70b..86ab7cd9af 100644 --- a/methods.py +++ b/methods.py @@ -8,14 +8,28 @@ import subprocess from compat import iteritems, isbasestring, decode_utf8 -def add_source_files(self, sources, filetype, lib_env=None, shared=False): - - if isbasestring(filetype): - dir_path = self.Dir('.').abspath - filetype = sorted(glob.glob(dir_path + "/" + filetype)) - - for path in filetype: - sources.append(self.Object(path)) +def add_source_files(self, sources, files, warn_duplicates=True): + # Convert string to list of absolute paths (including expanding wildcard) + if isbasestring(files): + # Keep SCons project-absolute path as they are (no wildcard support) + if files.startswith('#'): + if '*' in files: + print("ERROR: Wildcards can't be expanded in SCons project-absolute path: '{}'".format(files)) + return + files = [files] + else: + dir_path = self.Dir('.').abspath + files = sorted(glob.glob(dir_path + "/" + files)) + + # Add each path as compiled Object following environment (self) configuration + for path in files: + obj = self.Object(path) + if obj in sources: + if warn_duplicates: + print("WARNING: Object \"{}\" already included in environment sources.".format(obj)) + else: + continue + sources.append(obj) def disable_warnings(self): @@ -603,7 +617,11 @@ def detect_darwin_sdk_path(platform, env): raise def get_compiler_version(env): - version = decode_utf8(subprocess.check_output([env['CXX'], '--version']).strip()) + # Not using this method on clang because it returns 4.2.1 # https://reviews.llvm.org/D56803 + if using_gcc(env): + version = decode_utf8(subprocess.check_output([env['CXX'], '-dumpversion']).strip()) + else: + version = decode_utf8(subprocess.check_output([env['CXX'], '--version']).strip()) match = re.search('[0-9][0-9.]*', version) if match is not None: return match.group().split('.') diff --git a/modules/SCsub b/modules/SCsub index 36c2472c42..42d89d6ce2 100644 --- a/modules/SCsub +++ b/modules/SCsub @@ -6,9 +6,9 @@ env_modules = env.Clone() Export('env_modules') -env.modules_sources = [ - "register_module_types.gen.cpp", -] +env.modules_sources = [] + +env_modules.add_source_files(env.modules_sources, "register_module_types.gen.cpp") for x in env.module_list: if (x in env.disabled_modules): diff --git a/modules/arkit/arkit_interface.mm b/modules/arkit/arkit_interface.mm index de58f93276..68844c54c2 100644 --- a/modules/arkit/arkit_interface.mm +++ b/modules/arkit/arkit_interface.mm @@ -430,7 +430,7 @@ void ARKitInterface::process() { // get some info about our screen and orientation Size2 screen_size = OS::get_singleton()->get_window_size(); - UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // Grab our camera image for our backbuffer CVPixelBufferRef pixelBuffer = current_frame.capturedImage; @@ -531,7 +531,7 @@ void ARKitInterface::process() { // we need to invert this, probably row v.s. column notation affine_transform = CGAffineTransformInvert(affine_transform); - if (orientation != UIDeviceOrientationPortrait) { + if (orientation != UIInterfaceOrientationPortrait) { affine_transform.b = -affine_transform.b; affine_transform.d = -affine_transform.d; affine_transform.ty = 1.0 - affine_transform.ty; @@ -582,28 +582,28 @@ void ARKitInterface::process() { // copy our current frame transform matrix_float4x4 m44 = camera.transform; - if (orientation == UIDeviceOrientationLandscapeLeft) { + if (orientation == UIInterfaceOrientationLandscapeLeft) { transform.basis.elements[0].x = m44.columns[0][0]; transform.basis.elements[1].x = m44.columns[0][1]; transform.basis.elements[2].x = m44.columns[0][2]; transform.basis.elements[0].y = m44.columns[1][0]; transform.basis.elements[1].y = m44.columns[1][1]; transform.basis.elements[2].y = m44.columns[1][2]; - } else if (orientation == UIDeviceOrientationPortrait) { + } else if (orientation == UIInterfaceOrientationPortrait) { transform.basis.elements[0].x = m44.columns[1][0]; transform.basis.elements[1].x = m44.columns[1][1]; transform.basis.elements[2].x = m44.columns[1][2]; transform.basis.elements[0].y = -m44.columns[0][0]; transform.basis.elements[1].y = -m44.columns[0][1]; transform.basis.elements[2].y = -m44.columns[0][2]; - } else if (orientation == UIDeviceOrientationLandscapeRight) { + } else if (orientation == UIInterfaceOrientationLandscapeRight) { transform.basis.elements[0].x = -m44.columns[0][0]; transform.basis.elements[1].x = -m44.columns[0][1]; transform.basis.elements[2].x = -m44.columns[0][2]; transform.basis.elements[0].y = -m44.columns[1][0]; transform.basis.elements[1].y = -m44.columns[1][1]; transform.basis.elements[2].y = -m44.columns[1][2]; - } else if (orientation == UIDeviceOrientationPortraitUpsideDown) { + } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { // this may not be correct transform.basis.elements[0].x = m44.columns[1][0]; transform.basis.elements[1].x = m44.columns[1][1]; diff --git a/modules/assimp/SCsub b/modules/assimp/SCsub index 8a77e4f803..275f1ff5e9 100644 --- a/modules/assimp/SCsub +++ b/modules/assimp/SCsub @@ -9,6 +9,7 @@ env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/include']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code/Importer/IFC']) env_assimp.Prepend(CPPPATH=['#thirdparty/misc']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code']) +env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/common']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/contrib/irrXML/']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/contrib/unzip/']) env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code/Importer/STEPParser']) @@ -65,18 +66,13 @@ env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_STEP_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_IFC_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_XGL_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_ASSBIN_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_C4D_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_3MF_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_X3D_IMPORTER']) - +env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF_IMPORTER']) +env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF2_IMPORTER']) env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_SINGLETHREADED']) -if (not env.msvc): - env_assimp.Append(CXXFLAGS=['-std=c++11']) -elif (env.msvc == False and env['platform'] == 'windows'): - env_assimp.Append(LDFLAGS=['-pthread']) - if(env['platform'] == 'windows'): env_assimp.Append(CPPDEFINES=['PLATFORM_WINDOWS']) env_assimp.Append(CPPDEFINES=[('PLATFORM', 'WINDOWS')]) @@ -89,7 +85,13 @@ elif(env['platform'] == 'osx'): env_thirdparty = env_assimp.Clone() env_thirdparty.disable_warnings() -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/Common/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/PostProcessing/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/Material/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/FBX/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/MMD/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/glTF/*.cpp')) +env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/glTF2/*.cpp')) # Godot's own source files env_assimp.add_source_files(env.modules_sources, "*.cpp") diff --git a/modules/assimp/editor_scene_importer_assimp.cpp b/modules/assimp/editor_scene_importer_assimp.cpp index f23c66dbcf..65fa8b6459 100644 --- a/modules/assimp/editor_scene_importer_assimp.cpp +++ b/modules/assimp/editor_scene_importer_assimp.cpp @@ -1718,7 +1718,7 @@ void EditorSceneImporterAssimp::_find_texture_path(const String &p_path, _Direct } } -String EditorSceneImporterAssimp::_assimp_get_string(const aiString p_string) const { +String EditorSceneImporterAssimp::_assimp_get_string(const aiString &p_string) const { //convert an assimp String to a Godot String String name; name.parse_utf8(p_string.C_Str() /*,p_string.length*/); @@ -1733,7 +1733,7 @@ String EditorSceneImporterAssimp::_assimp_get_string(const aiString p_string) co return name; } -String EditorSceneImporterAssimp::_assimp_anim_string_to_string(const aiString p_string) const { +String EditorSceneImporterAssimp::_assimp_anim_string_to_string(const aiString &p_string) const { String name; name.parse_utf8(p_string.C_Str() /*,p_string.length*/); @@ -1745,7 +1745,7 @@ String EditorSceneImporterAssimp::_assimp_anim_string_to_string(const aiString p return name; } -String EditorSceneImporterAssimp::_assimp_raw_string_to_string(const aiString p_string) const { +String EditorSceneImporterAssimp::_assimp_raw_string_to_string(const aiString &p_string) const { String name; name.parse_utf8(p_string.C_Str() /*,p_string.length*/); return name; diff --git a/modules/assimp/editor_scene_importer_assimp.h b/modules/assimp/editor_scene_importer_assimp.h index 598845236e..7a30816e3b 100644 --- a/modules/assimp/editor_scene_importer_assimp.h +++ b/modules/assimp/editor_scene_importer_assimp.h @@ -178,7 +178,7 @@ private: }; const Transform _assimp_matrix_transform(const aiMatrix4x4 p_matrix); - String _assimp_get_string(const aiString p_string) const; + String _assimp_get_string(const aiString &p_string) const; Transform _get_global_assimp_node_transform(const aiNode *p_current_node); void _calc_tangent_from_mesh(const aiMesh *ai_mesh, int i, int tri_index, int index, PoolColorArray::Write &w); @@ -200,8 +200,8 @@ private: Spatial *_generate_scene(const String &p_path, const aiScene *scene, const uint32_t p_flags, int p_bake_fps, const int32_t p_max_bone_weights); - String _assimp_anim_string_to_string(const aiString p_string) const; - String _assimp_raw_string_to_string(const aiString p_string) const; + String _assimp_anim_string_to_string(const aiString &p_string) const; + String _assimp_raw_string_to_string(const aiString &p_string) const; float _get_fbx_fps(int32_t time_mode, const aiScene *p_scene); template <class T> T _interpolate_track(const Vector<float> &p_times, const Vector<T> &p_values, float p_time, AssetImportAnimation::Interpolation p_interp); diff --git a/modules/assimp/godot_update_assimp.sh b/modules/assimp/godot_update_assimp.sh index dcf1e6d4a2..ff8ff59e97 100644..100755 --- a/modules/assimp/godot_update_assimp.sh +++ b/modules/assimp/godot_update_assimp.sh @@ -254,8 +254,9 @@ rm -rf contrib/irrXML rm -rf contrib/Open3DGC rm -rf contrib/openddlparser rm -rf contrib/poly2tri -rm -rf contrib/rapidjson +#rm -rf contrib/rapidjson rm -rf contrib/unzip rm -rf contrib/zip rm -rf contrib/stb_image rm .travis* + diff --git a/modules/bmp/image_loader_bmp.cpp b/modules/bmp/image_loader_bmp.cpp index a7e8dec11e..88732dff33 100644 --- a/modules/bmp/image_loader_bmp.cpp +++ b/modules/bmp/image_loader_bmp.cpp @@ -47,9 +47,6 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image, size_t height = (size_t)p_header.bmp_info_header.bmp_height; size_t bits_per_pixel = (size_t)p_header.bmp_info_header.bmp_bit_count; - if (p_header.bmp_info_header.bmp_compression != BI_RGB) { - err = FAILED; - } // Check whether we can load it if (bits_per_pixel == 1) { @@ -238,11 +235,16 @@ Error ImageLoaderBMP::load_image(Ref<Image> p_image, FileAccess *f, bmp_header.bmp_info_header.bmp_colors_used = f->get_32(); bmp_header.bmp_info_header.bmp_important_colors = f->get_32(); - // Compressed bitmaps not supported, stop parsing - if (bmp_header.bmp_info_header.bmp_compression != BI_RGB) { - ERR_EXPLAIN("Unsupported bmp file: " + f->get_path()); - f->close(); - ERR_FAIL_V(ERR_UNAVAILABLE); + switch (bmp_header.bmp_info_header.bmp_compression) { + case BI_RLE8: + case BI_RLE4: + case BI_CMYKRLE8: + case BI_CMYKRLE4: { + // Stop parsing + ERR_EXPLAIN("Compressed BMP files are not supported: " + f->get_path()); + f->close(); + ERR_FAIL_V(ERR_UNAVAILABLE); + } break; } // Don't rely on sizeof(bmp_file_header) as structure padding // adds 2 bytes offset leading to misaligned color table reading @@ -257,8 +259,8 @@ Error ImageLoaderBMP::load_image(Ref<Image> p_image, FileAccess *f, if (bmp_header.bmp_info_header.bmp_bit_count <= 8) { // Support 256 colors max color_table_size = 1 << bmp_header.bmp_info_header.bmp_bit_count; + ERR_FAIL_COND_V(color_table_size == 0, ERR_BUG); } - ERR_FAIL_COND_V(color_table_size == 0, ERR_BUG); PoolVector<uint8_t> bmp_color_table; // Color table is usually 4 bytes per color -> [B][G][R][0] diff --git a/modules/bmp/image_loader_bmp.h b/modules/bmp/image_loader_bmp.h index 0082cf778a..2debb19a1c 100644 --- a/modules/bmp/image_loader_bmp.h +++ b/modules/bmp/image_loader_bmp.h @@ -42,15 +42,15 @@ protected: enum bmp_compression_s { BI_RGB = 0x00, - BI_RLE8 = 0x01, - BI_RLE4 = 0x02, + BI_RLE8 = 0x01, // compressed + BI_RLE4 = 0x02, // compressed BI_BITFIELDS = 0x03, BI_JPEG = 0x04, BI_PNG = 0x05, BI_ALPHABITFIELDS = 0x06, BI_CMYK = 0x0b, - BI_CMYKRLE8 = 0x0c, - BI_CMYKRLE4 = 0x0d + BI_CMYKRLE8 = 0x0c, // compressed + BI_CMYKRLE4 = 0x0d // compressed }; struct bmp_header_s { diff --git a/modules/bullet/rigid_body_bullet.h b/modules/bullet/rigid_body_bullet.h index 2c9bdb8b0b..f63148092f 100644 --- a/modules/bullet/rigid_body_bullet.h +++ b/modules/bullet/rigid_body_bullet.h @@ -305,7 +305,7 @@ public: void reload_axis_lock(); /// Doc: - /// http://www.bulletphysics.org/mediawiki-1.5.8/index.php?title=Anti_tunneling_by_Motion_Clamping + /// https://web.archive.org/web/20180404091446/http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Anti_tunneling_by_Motion_Clamping void set_continuous_collision_detection(bool p_enable); bool is_continuous_collision_detection_enabled() const; diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp index 738b415d16..9d632aaf83 100644 --- a/modules/bullet/space_bullet.cpp +++ b/modules/bullet/space_bullet.cpp @@ -581,6 +581,10 @@ void SpaceBullet::create_empty_world(bool p_create_soft_world) { } else { world_mem = malloc(sizeof(btDiscreteDynamicsWorld)); } + if (!world_mem) { + ERR_EXPLAIN("Out of memory"); + ERR_FAIL(); + } if (p_create_soft_world) { collisionConfiguration = bulletnew(GodotSoftCollisionConfiguration(static_cast<btDiscreteDynamicsWorld *>(world_mem))); diff --git a/modules/csg/doc_classes/CSGBox.xml b/modules/csg/doc_classes/CSGBox.xml index d100c01205..14f5a1952e 100644 --- a/modules/csg/doc_classes/CSGBox.xml +++ b/modules/csg/doc_classes/CSGBox.xml @@ -17,7 +17,7 @@ <member name="height" type="float" setter="set_height" getter="get_height" default="2.0"> Height of the box measured from the center of the box. </member> - <member name="material" type="Material" setter="set_material" getter="get_material" default="null"> + <member name="material" type="Material" setter="set_material" getter="get_material"> The material used to render the box. </member> <member name="width" type="float" setter="set_width" getter="get_width" default="2.0"> diff --git a/modules/csg/doc_classes/CSGCylinder.xml b/modules/csg/doc_classes/CSGCylinder.xml index 643eb7c7f4..9fc0281887 100644 --- a/modules/csg/doc_classes/CSGCylinder.xml +++ b/modules/csg/doc_classes/CSGCylinder.xml @@ -17,7 +17,7 @@ <member name="height" type="float" setter="set_height" getter="get_height" default="1.0"> The height of the cylinder. </member> - <member name="material" type="Material" setter="set_material" getter="get_material" default="null"> + <member name="material" type="Material" setter="set_material" getter="get_material"> The material used to render the cylinder. </member> <member name="radius" type="float" setter="set_radius" getter="get_radius" default="1.0"> diff --git a/modules/csg/doc_classes/CSGMesh.xml b/modules/csg/doc_classes/CSGMesh.xml index daa08decb6..afe0bc262d 100644 --- a/modules/csg/doc_classes/CSGMesh.xml +++ b/modules/csg/doc_classes/CSGMesh.xml @@ -11,9 +11,9 @@ <methods> </methods> <members> - <member name="material" type="Material" setter="set_material" getter="get_material" default="null"> + <member name="material" type="Material" setter="set_material" getter="get_material"> </member> - <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh" default="null"> + <member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh"> The mesh resource to use as a CSG shape. </member> </members> diff --git a/modules/csg/doc_classes/CSGPolygon.xml b/modules/csg/doc_classes/CSGPolygon.xml index 48f5d730cc..0ecee92cd5 100644 --- a/modules/csg/doc_classes/CSGPolygon.xml +++ b/modules/csg/doc_classes/CSGPolygon.xml @@ -14,7 +14,7 @@ <member name="depth" type="float" setter="set_depth" getter="get_depth" default="1.0"> Extrusion depth when [member mode] is [constant MODE_DEPTH]. </member> - <member name="material" type="Material" setter="set_material" getter="get_material" default="null"> + <member name="material" type="Material" setter="set_material" getter="get_material"> Material to use for the resulting mesh. </member> <member name="mode" type="int" setter="set_mode" getter="get_mode" enum="CSGPolygon.Mode" default="0"> diff --git a/modules/csg/doc_classes/CSGSphere.xml b/modules/csg/doc_classes/CSGSphere.xml index 0a62644179..714e725acb 100644 --- a/modules/csg/doc_classes/CSGSphere.xml +++ b/modules/csg/doc_classes/CSGSphere.xml @@ -11,7 +11,7 @@ <methods> </methods> <members> - <member name="material" type="Material" setter="set_material" getter="get_material" default="null"> + <member name="material" type="Material" setter="set_material" getter="get_material"> The material used to render the sphere. </member> <member name="radial_segments" type="int" setter="set_radial_segments" getter="get_radial_segments" default="12"> diff --git a/modules/csg/doc_classes/CSGTorus.xml b/modules/csg/doc_classes/CSGTorus.xml index 156fb185e7..5dc6bb8380 100644 --- a/modules/csg/doc_classes/CSGTorus.xml +++ b/modules/csg/doc_classes/CSGTorus.xml @@ -14,7 +14,7 @@ <member name="inner_radius" type="float" setter="set_inner_radius" getter="get_inner_radius" default="2.0"> The inner radius of the torus. </member> - <member name="material" type="Material" setter="set_material" getter="get_material" default="null"> + <member name="material" type="Material" setter="set_material" getter="get_material"> The material used to render the torus. </member> <member name="outer_radius" type="float" setter="set_outer_radius" getter="get_outer_radius" default="3.0"> diff --git a/modules/etc/SCsub b/modules/etc/SCsub index 532b97b006..1742d3534f 100644 --- a/modules/etc/SCsub +++ b/modules/etc/SCsub @@ -29,10 +29,6 @@ thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] env_etc.Prepend(CPPPATH=[thirdparty_dir]) -# upstream uses c++11 -if not env.msvc: - env_etc.Append(CXXFLAGS="-std=c++11") - env_thirdparty = env_etc.Clone() env_thirdparty.disable_warnings() env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) diff --git a/modules/gdnative/doc_classes/GDNative.xml b/modules/gdnative/doc_classes/GDNative.xml index 95ed1fc048..8750ddc56d 100644 --- a/modules/gdnative/doc_classes/GDNative.xml +++ b/modules/gdnative/doc_classes/GDNative.xml @@ -33,7 +33,7 @@ </method> </methods> <members> - <member name="library" type="GDNativeLibrary" setter="set_library" getter="get_library" default="null"> + <member name="library" type="GDNativeLibrary" setter="set_library" getter="get_library"> </member> </members> <constants> diff --git a/modules/gdnative/doc_classes/NativeScript.xml b/modules/gdnative/doc_classes/NativeScript.xml index 460471386d..e34e209374 100644 --- a/modules/gdnative/doc_classes/NativeScript.xml +++ b/modules/gdnative/doc_classes/NativeScript.xml @@ -53,7 +53,7 @@ <members> <member name="class_name" type="String" setter="set_class_name" getter="get_class_name" default=""""> </member> - <member name="library" type="GDNativeLibrary" setter="set_library" getter="get_library" default="null"> + <member name="library" type="GDNativeLibrary" setter="set_library" getter="get_library"> </member> <member name="script_class_icon_path" type="String" setter="set_script_class_icon_path" getter="get_script_class_icon_path" default=""""> </member> diff --git a/modules/gdnative/gdnative/string.cpp b/modules/gdnative/gdnative/string.cpp index 913c57eb56..9086121940 100644 --- a/modules/gdnative/gdnative/string.cpp +++ b/modules/gdnative/gdnative/string.cpp @@ -186,6 +186,20 @@ godot_bool GDAPI godot_string_ends_with(const godot_string *p_self, const godot_ return self->ends_with(*string); } +godot_int GDAPI godot_string_count(const godot_string *p_self, godot_string p_what, godot_int p_from, godot_int p_to) { + const String *self = (const String *)p_self; + String *what = (String *)&p_what; + + return self->count(*what, p_from, p_to); +} + +godot_int GDAPI godot_string_countn(const godot_string *p_self, godot_string p_what, godot_int p_from, godot_int p_to) { + const String *self = (const String *)p_self; + String *what = (String *)&p_what; + + return self->countn(*what, p_from, p_to); +} + godot_int GDAPI godot_string_find(const godot_string *p_self, godot_string p_what) { const String *self = (const String *)p_self; String *what = (String *)&p_what; diff --git a/modules/gdnative/gdnative/vector2.cpp b/modules/gdnative/gdnative/vector2.cpp index a2ac61b35e..d82f2c692d 100644 --- a/modules/gdnative/gdnative/vector2.cpp +++ b/modules/gdnative/gdnative/vector2.cpp @@ -77,6 +77,14 @@ godot_bool GDAPI godot_vector2_is_normalized(const godot_vector2 *p_self) { return self->is_normalized(); } +godot_vector2 GDAPI godot_vector2_direction_to(const godot_vector2 *p_self, const godot_vector2 *p_to) { + godot_vector2 dest; + const Vector2 *self = (const Vector2 *)p_self; + const Vector2 *to = (const Vector2 *)p_to; + *((Vector2 *)&dest) = self->direction_to(*to); + return dest; +} + godot_real GDAPI godot_vector2_distance_to(const godot_vector2 *p_self, const godot_vector2 *p_to) { const Vector2 *self = (const Vector2 *)p_self; const Vector2 *to = (const Vector2 *)p_to; diff --git a/modules/gdnative/gdnative/vector3.cpp b/modules/gdnative/gdnative/vector3.cpp index 894683ab38..15a8ef9a2e 100644 --- a/modules/gdnative/gdnative/vector3.cpp +++ b/modules/gdnative/gdnative/vector3.cpp @@ -182,6 +182,14 @@ godot_vector3 GDAPI godot_vector3_ceil(const godot_vector3 *p_self) { return dest; } +godot_vector3 GDAPI godot_vector3_direction_to(const godot_vector3 *p_self, const godot_vector3 *p_to) { + godot_vector3 dest; + const Vector3 *self = (const Vector3 *)p_self; + const Vector3 *to = (const Vector3 *)p_to; + *((Vector3 *)&dest) = self->direction_to(*to); + return dest; +} + godot_real GDAPI godot_vector3_distance_to(const godot_vector3 *p_self, const godot_vector3 *p_b) { const Vector3 *self = (const Vector3 *)p_self; const Vector3 *b = (const Vector3 *)p_b; diff --git a/modules/gdnative/gdnative_api.json b/modules/gdnative/gdnative_api.json index 6c12ee6534..03258584ce 100644 --- a/modules/gdnative/gdnative_api.json +++ b/modules/gdnative/gdnative_api.json @@ -44,6 +44,42 @@ ["const godot_vector2 *", "p_to"], ["const godot_real", "p_delta"] ] + }, + { + "name": "godot_string_count", + "return_type": "godot_int", + "arguments": [ + ["const godot_string *", "p_self"], + ["godot_string", "p_what"], + ["godot_int", "p_from"], + ["godot_int", "p_to"] + ] + }, + { + "name": "godot_string_countn", + "return_type": "godot_int", + "arguments": [ + ["const godot_string *", "p_self"], + ["godot_string", "p_what"], + ["godot_int", "p_from"], + ["godot_int", "p_to"] + ] + }, + { + "name": "godot_vector3_direction_to", + "return_type": "godot_vector3", + "arguments": [ + ["const godot_vector3 *", "p_self"], + ["const godot_vector3 *", "p_to"] + ] + }, + { + "name": "godot_vector2_direction_to", + "return_type": "godot_vector2", + "arguments": [ + ["const godot_vector2 *", "p_self"], + ["const godot_vector2 *", "p_to"] + ] } ] }, @@ -6512,24 +6548,24 @@ "name": "godot_net_bind_stream_peer", "return_type": "void", "arguments": [ - ["godot_object *", "p_obj"], - ["const godot_net_stream_peer *", "p_interface"] + ["godot_object *", "p_obj"], + ["const godot_net_stream_peer *", "p_interface"] ] }, { "name": "godot_net_bind_packet_peer", "return_type": "void", "arguments": [ - ["godot_object *", "p_obj"], - ["const godot_net_packet_peer *", "p_interface"] + ["godot_object *", "p_obj"], + ["const godot_net_packet_peer *", "p_interface"] ] }, { "name": "godot_net_bind_multiplayer_peer", "return_type": "void", "arguments": [ - ["godot_object *", "p_obj"], - ["const godot_net_multiplayer_peer *", "p_interface"] + ["godot_object *", "p_obj"], + ["const godot_net_multiplayer_peer *", "p_interface"] ] } ] diff --git a/modules/gdnative/gdnative_library_editor_plugin.cpp b/modules/gdnative/gdnative_library_editor_plugin.cpp index e2a69b1635..5d272a6cdc 100644 --- a/modules/gdnative/gdnative_library_editor_plugin.cpp +++ b/modules/gdnative/gdnative_library_editor_plugin.cpp @@ -66,10 +66,18 @@ void GDNativeLibraryEditor::_update_tree() { tree->clear(); TreeItem *root = tree->create_item(); - for (Map<String, NativePlatformConfig>::Element *E = platforms.front(); E; E = E->next()) { + PopupMenu *filter_list = filter->get_popup(); + String text = ""; + for (int i = 0; i < filter_list->get_item_count(); i++) { - if (showing_platform != E->key() && showing_platform != "All") + if (!filter_list->is_item_checked(i)) { continue; + } + Map<String, NativePlatformConfig>::Element *E = platforms.find(filter_list->get_item_metadata(i)); + if (!text.empty()) { + text += ", "; + } + text += E->get().name; TreeItem *platform = tree->create_item(root); platform->set_text(0, E->get().name); @@ -119,6 +127,7 @@ void GDNativeLibraryEditor::_update_tree() { platform->set_collapsed(collapsed_items.find(E->get().name) != NULL); } + filter->set_text(text); } void GDNativeLibraryEditor::_on_item_button(Object *item, int column, int id) { @@ -162,9 +171,10 @@ void GDNativeLibraryEditor::_on_dependencies_selected(const PoolStringArray &fil _set_target_value(file_dialog->get_meta("section"), file_dialog->get_meta("target"), files); } -void GDNativeLibraryEditor::_on_filter_selected(int id) { +void GDNativeLibraryEditor::_on_filter_selected(int index) { - showing_platform = filter->get_item_metadata(id); + PopupMenu *filter_list = filter->get_popup(); + filter_list->set_item_checked(index, !filter_list->is_item_checked(index)); _update_tree(); } @@ -265,8 +275,6 @@ void GDNativeLibraryEditor::_translate_to_config_file() { GDNativeLibraryEditor::GDNativeLibraryEditor() { - showing_platform = "All"; - { // Define platforms NativePlatformConfig platform_windows; platform_windows.name = "Windows"; @@ -336,20 +344,21 @@ GDNativeLibraryEditor::GDNativeLibraryEditor() { Label *label = memnew(Label); label->set_text(TTR("Platform:")); hbox->add_child(label); - filter = memnew(OptionButton); - hbox->add_child(filter); + filter = memnew(MenuButton); filter->set_h_size_flags(SIZE_EXPAND_FILL); + filter->set_text_align(filter->ALIGN_LEFT); + hbox->add_child(filter); + PopupMenu *filter_list = filter->get_popup(); + filter_list->set_hide_on_checkable_item_selection(false); int idx = 0; - filter->add_item(TTR("All"), idx); - filter->set_item_metadata(idx, "All"); - idx += 1; for (Map<String, NativePlatformConfig>::Element *E = platforms.front(); E; E = E->next()) { - filter->add_item(E->get().name, idx); - filter->set_item_metadata(idx, E->key()); + filter_list->add_check_item(E->get().name, idx); + filter_list->set_item_metadata(idx, E->key()); + filter_list->set_item_checked(idx, true); idx += 1; } - filter->connect("item_selected", this, "_on_filter_selected"); + filter_list->connect("index_pressed", this, "_on_filter_selected"); tree = memnew(Tree); container->add_child(tree); @@ -387,11 +396,9 @@ GDNativeLibraryEditor::GDNativeLibraryEditor() { void GDNativeLibraryEditorPlugin::edit(Object *p_node) { - if (Object::cast_to<GDNativeLibrary>(p_node)) { - library_editor->edit(Object::cast_to<GDNativeLibrary>(p_node)); - library_editor->show(); - } else - library_editor->hide(); + Ref<GDNativeLibrary> new_library = Object::cast_to<GDNativeLibrary>(p_node); + if (new_library.is_valid()) + library_editor->edit(new_library); } bool GDNativeLibraryEditorPlugin::handles(Object *p_node) const { diff --git a/modules/gdnative/gdnative_library_editor_plugin.h b/modules/gdnative/gdnative_library_editor_plugin.h index e7d50ba29f..8c1449f55a 100644 --- a/modules/gdnative/gdnative_library_editor_plugin.h +++ b/modules/gdnative/gdnative_library_editor_plugin.h @@ -61,7 +61,7 @@ class GDNativeLibraryEditor : public Control { }; Tree *tree; - OptionButton *filter; + MenuButton *filter; EditorFileDialog *file_dialog; ConfirmationDialog *new_architecture_dialog; LineEdit *new_architecture_input; diff --git a/modules/gdnative/include/gdnative/string.h b/modules/gdnative/include/gdnative/string.h index f045ac9d58..7500d70f20 100644 --- a/modules/gdnative/include/gdnative/string.h +++ b/modules/gdnative/include/gdnative/string.h @@ -102,6 +102,8 @@ godot_bool GDAPI godot_string_begins_with_char_array(const godot_string *p_self, godot_array GDAPI godot_string_bigrams(const godot_string *p_self); godot_string GDAPI godot_string_chr(wchar_t p_character); godot_bool GDAPI godot_string_ends_with(const godot_string *p_self, const godot_string *p_string); +godot_int GDAPI godot_string_count(const godot_string *p_self, godot_string p_what, godot_int p_from, godot_int p_to); +godot_int GDAPI godot_string_countn(const godot_string *p_self, godot_string p_what, godot_int p_from, godot_int p_to); godot_int GDAPI godot_string_find(const godot_string *p_self, godot_string p_what); godot_int GDAPI godot_string_find_from(const godot_string *p_self, godot_string p_what, godot_int p_from); godot_int GDAPI godot_string_findmk(const godot_string *p_self, const godot_array *p_keys); diff --git a/modules/gdnative/include/gdnative/vector2.h b/modules/gdnative/include/gdnative/vector2.h index 7a5ae6afa9..15a6c80887 100644 --- a/modules/gdnative/include/gdnative/vector2.h +++ b/modules/gdnative/include/gdnative/vector2.h @@ -71,6 +71,8 @@ godot_real GDAPI godot_vector2_length_squared(const godot_vector2 *p_self); godot_bool GDAPI godot_vector2_is_normalized(const godot_vector2 *p_self); +godot_vector2 GDAPI godot_vector2_direction_to(const godot_vector2 *p_self, const godot_vector2 *p_b); + godot_real GDAPI godot_vector2_distance_to(const godot_vector2 *p_self, const godot_vector2 *p_to); godot_real GDAPI godot_vector2_distance_squared_to(const godot_vector2 *p_self, const godot_vector2 *p_to); diff --git a/modules/gdnative/include/gdnative/vector3.h b/modules/gdnative/include/gdnative/vector3.h index 70ec6422ac..ee7d029028 100644 --- a/modules/gdnative/include/gdnative/vector3.h +++ b/modules/gdnative/include/gdnative/vector3.h @@ -106,6 +106,8 @@ godot_vector3 GDAPI godot_vector3_floor(const godot_vector3 *p_self); godot_vector3 GDAPI godot_vector3_ceil(const godot_vector3 *p_self); +godot_vector3 GDAPI godot_vector3_direction_to(const godot_vector3 *p_self, const godot_vector3 *p_b); + godot_real GDAPI godot_vector3_distance_to(const godot_vector3 *p_self, const godot_vector3 *p_b); godot_real GDAPI godot_vector3_distance_squared_to(const godot_vector3 *p_self, const godot_vector3 *p_b); diff --git a/modules/gdnative/include/nativescript/godot_nativescript.h b/modules/gdnative/include/nativescript/godot_nativescript.h index f3b9f7fb31..7f52f5736c 100644 --- a/modules/gdnative/include/nativescript/godot_nativescript.h +++ b/modules/gdnative/include/nativescript/godot_nativescript.h @@ -56,7 +56,7 @@ typedef enum { GODOT_PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc" GODOT_PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) GODOT_PROPERTY_HINT_LENGTH, ///< hint_text= "length" (as integer) - GODOT_PROPERTY_HINT_SPRITE_FRAME, + GODOT_PROPERTY_HINT_SPRITE_FRAME, // FIXME: Obsolete: drop whenever we can break compat GODOT_PROPERTY_HINT_KEY_ACCEL, ///< hint_text= "length" (as integer) GODOT_PROPERTY_HINT_FLAGS, ///< hint_text= "flag1,flag2,etc" (as bit flags) GODOT_PROPERTY_HINT_LAYERS_2D_RENDER, @@ -98,8 +98,8 @@ typedef enum { GODOT_PROPERTY_USAGE_INTERNATIONALIZED = 64, //hint for internationalized strings GODOT_PROPERTY_USAGE_GROUP = 128, //used for grouping props in the editor GODOT_PROPERTY_USAGE_CATEGORY = 256, - GODOT_PROPERTY_USAGE_STORE_IF_NONZERO = 512, //only store if nonzero - GODOT_PROPERTY_USAGE_STORE_IF_NONONE = 1024, //only store if false + GODOT_PROPERTY_USAGE_STORE_IF_NONZERO = 512, // FIXME: Obsolete: drop whenever we can break compat + GODOT_PROPERTY_USAGE_STORE_IF_NONONE = 1024, // FIXME: Obsolete: drop whenever we can break compat GODOT_PROPERTY_USAGE_NO_INSTANCE_STATE = 2048, GODOT_PROPERTY_USAGE_RESTART_IF_CHANGED = 4096, GODOT_PROPERTY_USAGE_SCRIPT_VARIABLE = 8192, diff --git a/modules/gdnative/pluginscript/register_types.cpp b/modules/gdnative/pluginscript/register_types.cpp index b7ab887e11..3b46f33afb 100644 --- a/modules/gdnative/pluginscript/register_types.cpp +++ b/modules/gdnative/pluginscript/register_types.cpp @@ -114,6 +114,8 @@ void unregister_pluginscript_types() { for (List<PluginScriptLanguage *>::Element *e = pluginscript_languages.front(); e; e = e->next()) { PluginScriptLanguage *language = e->get(); ScriptServer::unregister_language(language); + ResourceLoader::remove_resource_format_loader(language->get_resource_loader()); + ResourceSaver::remove_resource_format_saver(language->get_resource_saver()); memdelete(language); } } diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 3870a5ea7d..ad47323613 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -322,6 +322,7 @@ <description> The natural exponential function. It raises the mathematical constant [b]e[/b] to the power of [code]s[/code] and returns it. [b]e[/b] has an approximate value of 2.71828. + For exponents to other bases use the method [method pow]. [codeblock] a = exp(2) # Approximately 7.39 [/codeblock] @@ -345,45 +346,47 @@ <method name="fmod"> <return type="float"> </return> - <argument index="0" name="x" type="float"> + <argument index="0" name="a" type="float"> </argument> - <argument index="1" name="y" type="float"> + <argument index="1" name="b" type="float"> </argument> <description> - Returns the floating-point remainder of [code]x/y[/code]. + Returns the floating-point remainder of [code]a/b[/code], keeping the sign of [code]a[/code]. [codeblock] # Remainder is 1.5 var remainder = fmod(7, 5.5) [/codeblock] + For the integer remainder operation, use the % operator. </description> </method> <method name="fposmod"> <return type="float"> </return> - <argument index="0" name="x" type="float"> + <argument index="0" name="a" type="float"> </argument> - <argument index="1" name="y" type="float"> + <argument index="1" name="b" type="float"> </argument> <description> - Returns the floating-point remainder of [code]x/y[/code] that wraps equally in positive and negative. + Returns the floating-point modulus of [code]a/b[/code] that wraps equally in positive and negative. [codeblock] - var i = -10 - while i < 0: - prints(i, fposmod(i, 10)) + var i = -6 + while i < 5: + prints(i, fposmod(i, 3)) i += 1 [/codeblock] Produces: [codeblock] - -10 10 - -9 1 - -8 2 - -7 3 - -6 4 - -5 5 - -4 6 - -3 7 - -2 8 - -1 9 + -6 0 + -5 1 + -4 2 + -3 0 + -2 1 + -1 2 + 0 0 + 1 1 + 2 2 + 3 0 + 4 1 [/codeblock] </description> </method> @@ -571,6 +574,29 @@ [/codeblock] </description> </method> + <method name="lerp_angle"> + <return type="float"> + </return> + <argument index="0" name="from" type="float"> + </argument> + <argument index="1" name="to" type="float"> + </argument> + <argument index="2" name="weight" type="float"> + </argument> + <description> + Linearly interpolates between two angles (in radians) by a normalized value. + Similar to [method lerp] but interpolate correctly when the angles wrap around [constant @GDScript.TAU]. + [codeblock] + extends Sprite + var elapsed = 0.0 + func _process(delta): + var min_angle = deg2rad(0.0) + var max_angle = deg2rad(90.0) + rotation = lerp_angle(min_angle, max_angle, elapsed) + elapsed += delta + [/codeblock] + </description> + </method> <method name="linear2db"> <return type="float"> </return> @@ -697,12 +723,43 @@ Converts a 2D point expressed in the polar coordinate system (a distance from the origin [code]r[/code] and an angle [code]th[/code]) to the cartesian coordinate system (X and Y axis). </description> </method> + <method name="posmod"> + <return type="int"> + </return> + <argument index="0" name="a" type="int"> + </argument> + <argument index="1" name="b" type="int"> + </argument> + <description> + Returns the integer modulus of [code]a/b[/code] that wraps equally in positive and negative. + [codeblock] + var i = -6 + while i < 5: + prints(i, posmod(i, 3)) + i += 1 + [/codeblock] + Produces: + [codeblock] + -6 0 + -5 1 + -4 2 + -3 0 + -2 1 + -1 2 + 0 0 + 1 1 + 2 2 + 3 0 + 4 1 + [/codeblock] + </description> + </method> <method name="pow"> <return type="float"> </return> - <argument index="0" name="x" type="float"> + <argument index="0" name="base" type="float"> </argument> - <argument index="1" name="y" type="float"> + <argument index="1" name="exp" type="float"> </argument> <description> Returns the result of [code]x[/code] raised to the power of [code]y[/code]. @@ -1039,7 +1096,7 @@ <argument index="0" name="step" type="float"> </argument> <description> - Returns the position of the first non-zero digit, after the decimal point. + Returns the position of the first non-zero digit, after the decimal point. Note that the maximum return value is 10, which is a design decision in the implementation. [codeblock] # n is 0 n = step_decimals(5) diff --git a/modules/gdscript/editor/gdscript_highlighter.cpp b/modules/gdscript/editor/gdscript_highlighter.cpp index 62b65fe96b..963b40529d 100644 --- a/modules/gdscript/editor/gdscript_highlighter.cpp +++ b/modules/gdscript/editor/gdscript_highlighter.cpp @@ -370,8 +370,8 @@ void GDScriptSyntaxHighlighter::_update_cache() { bool default_theme = text_editor_color_theme == "Default"; bool dark_theme = settings->is_dark_theme(); - function_definition_color = Color::html(default_theme ? "#01e1ff" : dark_theme ? "#01e1ff" : "#00a5ba"); - node_path_color = Color::html(default_theme ? "#64c15a" : dark_theme ? "64c15a" : "#518b4b"); + function_definition_color = default_theme ? Color(0.0, 0.88, 1.0) : dark_theme ? Color(0.0, 0.88, 1.0) : Color(0.0, 0.65, 0.73); + node_path_color = default_theme ? Color(0.39, 0.76, 0.35) : dark_theme ? Color(0.39, 0.76, 0.35) : Color(0.32, 0.55, 0.29); EDITOR_DEF("text_editor/highlighting/gdscript/function_definition_color", function_definition_color); EDITOR_DEF("text_editor/highlighting/gdscript/node_path_color", node_path_color); diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 78a1bfc99b..9f65a9fff1 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -159,7 +159,11 @@ bool GDScriptLanguage::validate(const String &p_script, int &r_line_error, int & for (int i = 0; i < cl->subclasses.size(); i++) { for (int j = 0; j < cl->subclasses[i]->functions.size(); j++) { - funcs[cl->subclasses[i]->functions[j]->line] = String(cl->subclasses[i]->name) + "." + String(cl->subclasses[i]->functions[j]->name); + funcs[cl->subclasses[i]->functions[j]->line] = String(cl->subclasses[i]->name) + "." + cl->subclasses[i]->functions[j]->name; + } + for (int j = 0; j < cl->subclasses[i]->static_functions.size(); j++) { + + funcs[cl->subclasses[i]->static_functions[j]->line] = String(cl->subclasses[i]->name) + "." + cl->subclasses[i]->static_functions[j]->name; } } @@ -382,8 +386,6 @@ void GDScriptLanguage::debug_get_globals(List<String> *p_globals, List<Variant> String GDScriptLanguage::debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems, int p_max_depth) { - if (_debug_parse_err_line >= 0) - return ""; return ""; } diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp index d5e74c07c9..42f349ffc0 100644 --- a/modules/gdscript/gdscript_function.cpp +++ b/modules/gdscript/gdscript_function.cpp @@ -1784,20 +1784,9 @@ GDScriptFunction::~GDScriptFunction() { Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_argcount, Variant::CallError &r_error) { - if (state.instance_id && !ObjectDB::get_instance(state.instance_id)) { -#ifdef DEBUG_ENABLED - ERR_EXPLAIN("Resumed function '" + String(function->get_name()) + "()' after yield, but class instance is gone. At script: " + state.script->get_path() + ":" + itos(state.line)); - ERR_FAIL_V(Variant()); -#else - return Variant(); -#endif - } - Variant arg; r_error.error = Variant::CallError::CALL_OK; - ERR_FAIL_COND_V(!function, Variant()); - if (p_argcount == 0) { r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; r_error.argument = 1; @@ -1823,44 +1812,7 @@ Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_ar return Variant(); } - state.result = arg; - Variant ret = function->call(NULL, NULL, 0, r_error, &state); - - bool completed = true; - - // If the return value is a GDScriptFunctionState reference, - // then the function did yield again after resuming. - if (ret.is_ref()) { - GDScriptFunctionState *gdfs = Object::cast_to<GDScriptFunctionState>(ret); - if (gdfs && gdfs->function == function) { - completed = false; - gdfs->first_state = first_state.is_valid() ? first_state : Ref<GDScriptFunctionState>(this); - } - } - - function = NULL; //cleaned up; - state.result = Variant(); - - if (completed) { - if (first_state.is_valid()) { - first_state->emit_signal("completed", ret); - } else { - emit_signal("completed", ret); - } - } - -#ifdef DEBUG_ENABLED - if (ScriptDebugger::get_singleton()) - GDScriptLanguage::get_singleton()->exit_function(); - if (state.stack_size) { - //free stack - Variant *stack = (Variant *)state.stack.ptr(); - for (int i = 0; i < state.stack_size; i++) - stack[i].~Variant(); - } -#endif - - return ret; + return resume(arg); } bool GDScriptFunctionState::is_valid(bool p_extended_check) const { diff --git a/modules/gdscript/gdscript_functions.cpp b/modules/gdscript/gdscript_functions.cpp index 0736f3d010..f5f245b25f 100644 --- a/modules/gdscript/gdscript_functions.cpp +++ b/modules/gdscript/gdscript_functions.cpp @@ -58,6 +58,7 @@ const char *GDScriptFunctions::get_func_name(Function p_func) { "sqrt", "fmod", "fposmod", + "posmod", "floor", "ceil", "round", @@ -75,6 +76,7 @@ const char *GDScriptFunctions::get_func_name(Function p_func) { "step_decimals", "stepify", "lerp", + "lerp_angle", "inverse_lerp", "range_lerp", "smoothstep", @@ -243,6 +245,12 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_ VALIDATE_ARG_NUM(1); r_ret = Math::fposmod((double)*p_args[0], (double)*p_args[1]); } break; + case MATH_POSMOD: { + VALIDATE_ARG_COUNT(2); + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + r_ret = Math::posmod((int)*p_args[0], (int)*p_args[1]); + } break; case MATH_FLOOR: { VALIDATE_ARG_COUNT(1); VALIDATE_ARG_NUM(0); @@ -376,6 +384,13 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_ } break; } } break; + case MATH_LERP_ANGLE: { + VALIDATE_ARG_COUNT(3); + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + VALIDATE_ARG_NUM(2); + r_ret = Math::lerp_angle((double)*p_args[0], (double)*p_args[1], (double)*p_args[2]); + } break; case MATH_INVERSE_LERP: { VALIDATE_ARG_COUNT(3); VALIDATE_ARG_NUM(0); @@ -1456,6 +1471,7 @@ bool GDScriptFunctions::is_deterministic(Function p_func) { case MATH_SQRT: case MATH_FMOD: case MATH_FPOSMOD: + case MATH_POSMOD: case MATH_FLOOR: case MATH_CEIL: case MATH_ROUND: @@ -1568,15 +1584,20 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) { return mi; } break; case MATH_FMOD: { - MethodInfo mi("fmod", PropertyInfo(Variant::REAL, "x"), PropertyInfo(Variant::REAL, "y")); + MethodInfo mi("fmod", PropertyInfo(Variant::REAL, "a"), PropertyInfo(Variant::REAL, "b")); mi.return_val.type = Variant::REAL; return mi; } break; case MATH_FPOSMOD: { - MethodInfo mi("fposmod", PropertyInfo(Variant::REAL, "x"), PropertyInfo(Variant::REAL, "y")); + MethodInfo mi("fposmod", PropertyInfo(Variant::REAL, "a"), PropertyInfo(Variant::REAL, "b")); mi.return_val.type = Variant::REAL; return mi; } break; + case MATH_POSMOD: { + MethodInfo mi("posmod", PropertyInfo(Variant::INT, "a"), PropertyInfo(Variant::INT, "b")); + mi.return_val.type = Variant::INT; + return mi; + } break; case MATH_FLOOR: { MethodInfo mi("floor", PropertyInfo(Variant::REAL, "s")); mi.return_val.type = Variant::REAL; @@ -1603,7 +1624,7 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) { return mi; } break; case MATH_POW: { - MethodInfo mi("pow", PropertyInfo(Variant::REAL, "x"), PropertyInfo(Variant::REAL, "y")); + MethodInfo mi("pow", PropertyInfo(Variant::REAL, "base"), PropertyInfo(Variant::REAL, "exp")); mi.return_val.type = Variant::REAL; return mi; } break; @@ -1663,6 +1684,11 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) { mi.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT; return mi; } break; + case MATH_LERP_ANGLE: { + MethodInfo mi("lerp_angle", PropertyInfo(Variant::REAL, "from"), PropertyInfo(Variant::REAL, "to"), PropertyInfo(Variant::REAL, "weight")); + mi.return_val.type = Variant::REAL; + return mi; + } break; case MATH_INVERSE_LERP: { MethodInfo mi("inverse_lerp", PropertyInfo(Variant::REAL, "from"), PropertyInfo(Variant::REAL, "to"), PropertyInfo(Variant::REAL, "weight")); mi.return_val.type = Variant::REAL; diff --git a/modules/gdscript/gdscript_functions.h b/modules/gdscript/gdscript_functions.h index 6ad70f2eb4..8f7ba76d2c 100644 --- a/modules/gdscript/gdscript_functions.h +++ b/modules/gdscript/gdscript_functions.h @@ -49,6 +49,7 @@ public: MATH_SQRT, MATH_FMOD, MATH_FPOSMOD, + MATH_POSMOD, MATH_FLOOR, MATH_CEIL, MATH_ROUND, @@ -66,6 +67,7 @@ public: MATH_STEP_DECIMALS, MATH_STEPIFY, MATH_LERP, + MATH_LERP_ANGLE, MATH_INVERSE_LERP, MATH_RANGE_LERP, MATH_SMOOTHSTEP, diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index ffb2e8f8e7..357e9c9615 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -1766,8 +1766,6 @@ GDScriptParser::Node *GDScriptParser::_reduce_expression(Node *p_node, bool p_to cn->value = v; cn->datatype = _type_from_variant(v); return cn; - - } else if (op->arguments[0]->type == Node::TYPE_BUILT_IN_FUNCTION && last_not_constant == 0) { } return op; //don't reduce yet @@ -2211,6 +2209,8 @@ void GDScriptParser::_parse_pattern_block(BlockNode *p_block, Vector<PatternBran p_block->has_return = true; + bool catch_all_appeared = false; + while (true) { while (tokenizer->get_token() == GDScriptTokenizer::TK_NEWLINE && _parse_newline()) @@ -2221,7 +2221,7 @@ void GDScriptParser::_parse_pattern_block(BlockNode *p_block, Vector<PatternBran return; if (indent_level > tab_level.back()->get()) { - return; // go back a level + break; // go back a level } if (pending_newline != -1) { @@ -2236,12 +2236,20 @@ void GDScriptParser::_parse_pattern_block(BlockNode *p_block, Vector<PatternBran branch->patterns.push_back(_parse_pattern(p_static)); if (!branch->patterns[0]) { - return; + break; } bool has_binding = branch->patterns[0]->pt_type == PatternNode::PT_BIND; bool catch_all = has_binding || branch->patterns[0]->pt_type == PatternNode::PT_WILDCARD; +#ifdef DEBUG_ENABLED + // Branches after a wildcard or binding are unreachable + if (catch_all_appeared && !current_function->has_unreachable_code) { + _add_warning(GDScriptWarning::UNREACHABLE_CODE, -1, current_function->name.operator String()); + current_function->has_unreachable_code = true; + } +#endif + while (tokenizer->get_token() == GDScriptTokenizer::TK_COMMA) { tokenizer->advance(); branch->patterns.push_back(_parse_pattern(p_static)); @@ -2259,6 +2267,8 @@ void GDScriptParser::_parse_pattern_block(BlockNode *p_block, Vector<PatternBran catch_all = catch_all || pt == PatternNode::PT_WILDCARD; } + catch_all_appeared = catch_all_appeared || catch_all; + if (!_enter_indent_block()) { _set_error("Expected block in pattern branch"); return; @@ -2274,6 +2284,11 @@ void GDScriptParser::_parse_pattern_block(BlockNode *p_block, Vector<PatternBran p_branches.push_back(branch); } + + // Even if all branches return, there is possibility of default fallthrough + if (!catch_all_appeared) { + p_block->has_return = false; + } } void GDScriptParser::_generate_pattern(PatternNode *p_pattern, Node *p_node_to_match, Node *&p_resulting_node, Map<StringName, Node *> &p_bindings) { diff --git a/modules/gdscript/gdscript_tokenizer.cpp b/modules/gdscript/gdscript_tokenizer.cpp index 95715ab648..59b53b5f9a 100644 --- a/modules/gdscript/gdscript_tokenizer.cpp +++ b/modules/gdscript/gdscript_tokenizer.cpp @@ -517,7 +517,22 @@ void GDScriptTokenizerText::_advance() { INCPOS(1); column = 1; int i = 0; - while (GETCHAR(i) == ' ' || GETCHAR(i) == '\t') { + while (true) { + if (GETCHAR(i) == ' ') { + if (file_indent_type == INDENT_NONE) file_indent_type = INDENT_SPACES; + if (file_indent_type != INDENT_SPACES) { + _make_error("Spaces used for indentation in tab-indented file!"); + return; + } + } else if (GETCHAR(i) == '\t') { + if (file_indent_type == INDENT_NONE) file_indent_type = INDENT_TABS; + if (file_indent_type != INDENT_TABS) { + _make_error("Tabs used for indentation in space-indented file!"); + return; + } + } else { + break; // not indentation anymore + } i++; } @@ -555,9 +570,25 @@ void GDScriptTokenizerText::_advance() { column = 1; line++; int i = 0; - while (GETCHAR(i) == ' ' || GETCHAR(i) == '\t') { + while (true) { + if (GETCHAR(i) == ' ') { + if (file_indent_type == INDENT_NONE) file_indent_type = INDENT_SPACES; + if (file_indent_type != INDENT_SPACES) { + _make_error("Spaces used for indentation in tab-indented file!"); + return; + } + } else if (GETCHAR(i) == '\t') { + if (file_indent_type == INDENT_NONE) file_indent_type = INDENT_TABS; + if (file_indent_type != INDENT_TABS) { + _make_error("Tabs used for indentation in space-indented file!"); + return; + } + } else { + break; // not indentation anymore + } i++; } + _make_newline(i); return; @@ -1082,6 +1113,7 @@ void GDScriptTokenizerText::set_code(const String &p_code) { ignore_warnings = false; #endif // DEBUG_ENABLED last_error = ""; + file_indent_type = INDENT_NONE; for (int i = 0; i < MAX_LOOKAHEAD + 1; i++) _advance(); } diff --git a/modules/gdscript/gdscript_tokenizer.h b/modules/gdscript/gdscript_tokenizer.h index 7b977ff67c..89d586b912 100644 --- a/modules/gdscript/gdscript_tokenizer.h +++ b/modules/gdscript/gdscript_tokenizer.h @@ -222,6 +222,12 @@ class GDScriptTokenizerText : public GDScriptTokenizer { int tk_rb_pos; String last_error; bool error_flag; + enum { + INDENT_NONE, + INDENT_SPACES, + INDENT_TABS, + } file_indent_type; + #ifdef DEBUG_ENABLED Vector<Pair<int, String> > warning_skips; Set<String> warning_global_skips; diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index 325432579f..1bd3d72066 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -210,7 +210,7 @@ </member> <member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="1"> </member> - <member name="mesh_library" type="MeshLibrary" setter="set_mesh_library" getter="get_mesh_library" default="null"> + <member name="mesh_library" type="MeshLibrary" setter="set_mesh_library" getter="get_mesh_library"> The assigned [MeshLibrary]. </member> <member name="theme" type="MeshLibrary" setter="set_theme" getter="get_theme"> diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index 994a84fbc4..bdecbbdbad 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -481,11 +481,6 @@ bool GridMap::_octant_update(const OctantKey &p_key) { Transform xform; - if (clip && ((clip_above && cellpos[clip_axis] > clip_floor) || (!clip_above && cellpos[clip_axis] < clip_floor))) { - - } else { - } - xform.basis.set_orthogonal_index(c.rot); xform.set_origin(cellpos * cell_size + ofs); xform.basis.scale(Vector3(cell_scale, cell_scale, cell_scale)); diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp index 2cf566941e..5a21833ffa 100644 --- a/modules/gridmap/grid_map_editor_plugin.cpp +++ b/modules/gridmap/grid_map_editor_plugin.cpp @@ -345,7 +345,7 @@ void GridMapEditor::_validate_selection() { _update_selection_transform(); } -void GridMapEditor::_set_selection(bool p_active, const Vector3 p_begin, const Vector3 p_end) { +void GridMapEditor::_set_selection(bool p_active, const Vector3 &p_begin, const Vector3 &p_end) { selection.active = p_active; selection.begin = p_begin; diff --git a/modules/gridmap/grid_map_editor_plugin.h b/modules/gridmap/grid_map_editor_plugin.h index da36165d4e..b9be925ff7 100644 --- a/modules/gridmap/grid_map_editor_plugin.h +++ b/modules/gridmap/grid_map_editor_plugin.h @@ -222,7 +222,7 @@ class GridMapEditor : public VBoxContainer { void _do_paste(); void _update_selection_transform(); void _validate_selection(); - void _set_selection(bool p_active, const Vector3 p_begin = Vector3(), const Vector3 p_end = Vector3()); + void _set_selection(bool p_active, const Vector3 &p_begin = Vector3(), const Vector3 &p_end = Vector3()); void _floor_changed(float p_value); void _floor_mouse_exited(); diff --git a/modules/mono/build_scripts/godot_tools_build.py b/modules/mono/build_scripts/godot_tools_build.py index f66ffdb573..c47cfc8a38 100644 --- a/modules/mono/build_scripts/godot_tools_build.py +++ b/modules/mono/build_scripts/godot_tools_build.py @@ -87,7 +87,7 @@ def build(env_mono): target_filenames = ['GodotTools.dll', 'GodotTools.BuildLogger.dll', 'GodotTools.ProjectEditor.dll', 'DotNet.Glob.dll', 'GodotTools.Core.dll'] if env_mono['target'] == 'debug': - target_filenames += ['GodotTools.pdb', 'GodotTools.BuildLogger.dll', 'GodotTools.ProjectEditor.dll', 'GodotTools.Core.dll'] + target_filenames += ['GodotTools.pdb', 'GodotTools.BuildLogger.pdb', 'GodotTools.ProjectEditor.pdb', 'GodotTools.Core.pdb'] targets = [os.path.join(editor_tools_dir, filename) for filename in target_filenames] @@ -102,6 +102,10 @@ def build_project_editor_only(env_mono): editor_tools_dir = os.path.join(output_dir, 'GodotSharp', 'Tools') target_filenames = ['GodotTools.ProjectEditor.dll', 'DotNet.Glob.dll', 'GodotTools.Core.dll'] + + if env_mono['target'] == 'debug': + target_filenames += ['GodotTools.ProjectEditor.pdb', 'GodotTools.Core.pdb'] + targets = [os.path.join(editor_tools_dir, filename) for filename in target_filenames] cmd = env_mono.CommandNoCache(targets, [], build_godot_tools_project_editor, module_dir=os.getcwd()) diff --git a/modules/mono/build_scripts/mono_reg_utils.py b/modules/mono/build_scripts/mono_reg_utils.py index 583708bf07..b2c48f0a61 100644 --- a/modules/mono/build_scripts/mono_reg_utils.py +++ b/modules/mono/build_scripts/mono_reg_utils.py @@ -116,5 +116,3 @@ def find_msbuild_tools_path_reg(): return value except (WindowsError, OSError): return '' - - return '' diff --git a/modules/mono/build_scripts/solution_builder.py b/modules/mono/build_scripts/solution_builder.py index 9f549a10ed..d1529a64d2 100644 --- a/modules/mono/build_scripts/solution_builder.py +++ b/modules/mono/build_scripts/solution_builder.py @@ -108,10 +108,14 @@ def find_msbuild_windows(env): if not mono_root: raise RuntimeError('Cannot find mono root directory') - framework_path = os.path.join(mono_root, 'lib', 'mono', '4.5') mono_bin_dir = os.path.join(mono_root, 'bin') msbuild_mono = os.path.join(mono_bin_dir, 'msbuild.bat') + msbuild_tools_path = find_msbuild_tools_path_reg() + + if msbuild_tools_path: + return (os.path.join(msbuild_tools_path, 'MSBuild.exe'), {}) + if os.path.isfile(msbuild_mono): # The (Csc/Vbc/Fsc)ToolExe environment variables are required when # building with Mono's MSBuild. They must point to the batch files @@ -121,12 +125,7 @@ def find_msbuild_windows(env): 'VbcToolExe': os.path.join(mono_bin_dir, 'vbc.bat'), 'FscToolExe': os.path.join(mono_bin_dir, 'fsharpc.bat') } - return (msbuild_mono, framework_path, mono_msbuild_env) - - msbuild_tools_path = find_msbuild_tools_path_reg() - - if msbuild_tools_path: - return (os.path.join(msbuild_tools_path, 'MSBuild.exe'), framework_path, {}) + return (msbuild_mono, mono_msbuild_env) return None @@ -172,7 +171,6 @@ def build_solution(env, solution_path, build_config, extra_msbuild_args=[]): global verbose verbose = env['verbose'] - framework_path = '' msbuild_env = os.environ.copy() # Needed when running from Developer Command Prompt for VS @@ -185,8 +183,7 @@ def build_solution(env, solution_path, build_config, extra_msbuild_args=[]): if msbuild_info is None: raise RuntimeError('Cannot find MSBuild executable') msbuild_path = msbuild_info[0] - framework_path = msbuild_info[1] - msbuild_env.update(msbuild_info[2]) + msbuild_env.update(msbuild_info[1]) else: msbuild_path = find_msbuild_unix('msbuild') if msbuild_path is None: @@ -212,7 +209,6 @@ def build_solution(env, solution_path, build_config, extra_msbuild_args=[]): # Build solution msbuild_args = [solution_path, '/p:Configuration=' + build_config] - msbuild_args += ['/p:FrameworkPathOverride=' + framework_path] if framework_path else [] msbuild_args += extra_msbuild_args run_command(msbuild_path, msbuild_args, env_override=msbuild_env, name='msbuild') diff --git a/modules/mono/class_db_api_json.cpp b/modules/mono/class_db_api_json.cpp new file mode 100644 index 0000000000..4a6637434a --- /dev/null +++ b/modules/mono/class_db_api_json.cpp @@ -0,0 +1,246 @@ +/*************************************************************************/ +/* class_db_api_json.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2018 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 "class_db_api_json.h" + +#ifdef DEBUG_METHODS_ENABLED + +#include "core/io/json.h" +#include "core/os/file_access.h" +#include "core/project_settings.h" +#include "core/version.h" + +void class_db_api_to_json(const String &p_output_file, ClassDB::APIType p_api) { + Dictionary classes_dict; + + List<StringName> names; + + const StringName *k = NULL; + + while ((k = ClassDB::classes.next(k))) { + + names.push_back(*k); + } + //must be alphabetically sorted for hash to compute + names.sort_custom<StringName::AlphCompare>(); + + for (List<StringName>::Element *E = names.front(); E; E = E->next()) { + + ClassDB::ClassInfo *t = ClassDB::classes.getptr(E->get()); + ERR_FAIL_COND(!t); + if (t->api != p_api || !t->exposed) + continue; + + Dictionary class_dict; + classes_dict[t->name] = class_dict; + + class_dict["inherits"] = t->inherits; + + { //methods + + List<StringName> snames; + + k = NULL; + + while ((k = t->method_map.next(k))) { + + snames.push_back(*k); + } + + snames.sort_custom<StringName::AlphCompare>(); + + Array methods; + + for (List<StringName>::Element *F = snames.front(); F; F = F->next()) { + Dictionary method_dict; + methods.push_back(method_dict); + + MethodBind *mb = t->method_map[F->get()]; + method_dict["name"] = mb->get_name(); + method_dict["argument_count"] = mb->get_argument_count(); + method_dict["return_type"] = mb->get_argument_type(-1); + + Array arguments; + method_dict["arguments"] = arguments; + + for (int i = 0; i < mb->get_argument_count(); i++) { + Dictionary argument_dict; + arguments.push_back(argument_dict); + const PropertyInfo info = mb->get_argument_info(i); + argument_dict["type"] = info.type; + argument_dict["name"] = info.name; + argument_dict["hint"] = info.hint; + argument_dict["hint_string"] = info.hint_string; + } + + method_dict["default_argument_count"] = mb->get_default_argument_count(); + + Array default_arguments; + method_dict["default_arguments"] = default_arguments; + + for (int i = 0; i < mb->get_default_argument_count(); i++) { + Dictionary default_argument_dict; + default_arguments.push_back(default_argument_dict); + //hash should not change, i hope for tis + Variant da = mb->get_default_argument(i); + default_argument_dict["value"] = da; + } + + method_dict["hint_flags"] = mb->get_hint_flags(); + } + + if (!methods.empty()) { + class_dict["methods"] = methods; + } + } + + { //constants + + List<StringName> snames; + + k = NULL; + + while ((k = t->constant_map.next(k))) { + + snames.push_back(*k); + } + + snames.sort_custom<StringName::AlphCompare>(); + + Array constants; + + for (List<StringName>::Element *F = snames.front(); F; F = F->next()) { + Dictionary constant_dict; + constants.push_back(constant_dict); + + constant_dict["name"] = F->get(); + constant_dict["value"] = t->constant_map[F->get()]; + } + + if (!constants.empty()) { + class_dict["constants"] = constants; + } + } + + { //signals + + List<StringName> snames; + + k = NULL; + + while ((k = t->signal_map.next(k))) { + + snames.push_back(*k); + } + + snames.sort_custom<StringName::AlphCompare>(); + + Array signals; + + for (List<StringName>::Element *F = snames.front(); F; F = F->next()) { + Dictionary signal_dict; + signals.push_back(signal_dict); + + MethodInfo &mi = t->signal_map[F->get()]; + signal_dict["name"] = F->get(); + + Array arguments; + signal_dict["arguments"] = arguments; + for (int i = 0; i < mi.arguments.size(); i++) { + Dictionary argument_dict; + arguments.push_back(argument_dict); + argument_dict["type"] = mi.arguments[i].type; + } + } + + if (!signals.empty()) { + class_dict["signals"] = signals; + } + } + + { //properties + + List<StringName> snames; + + k = NULL; + + while ((k = t->property_setget.next(k))) { + + snames.push_back(*k); + } + + snames.sort_custom<StringName::AlphCompare>(); + + Array properties; + + for (List<StringName>::Element *F = snames.front(); F; F = F->next()) { + Dictionary property_dict; + properties.push_back(property_dict); + + ClassDB::PropertySetGet *psg = t->property_setget.getptr(F->get()); + + property_dict["name"] = F->get(); + property_dict["setter"] = psg->setter; + property_dict["getter"] = psg->getter; + } + + if (!properties.empty()) { + class_dict["property_setget"] = properties; + } + } + + Array property_list; + + //property list + for (List<PropertyInfo>::Element *F = t->property_list.front(); F; F = F->next()) { + Dictionary property_dict; + property_list.push_back(property_dict); + + property_dict["name"] = F->get().name; + property_dict["type"] = F->get().type; + property_dict["hint"] = F->get().hint; + property_dict["hint_string"] = F->get().hint_string; + property_dict["usage"] = F->get().usage; + } + + if (!property_list.empty()) { + class_dict["property_list"] = property_list; + } + } + + FileAccessRef f = FileAccess::open(p_output_file, FileAccess::WRITE); + ERR_FAIL_COND(!f); + f->store_string(JSON::print(classes_dict, /*indent: */ "\t")); + f->close(); + + print_line(String() + "ClassDB API JSON written to: " + ProjectSettings::get_singleton()->globalize_path(p_output_file)); +} + +#endif // DEBUG_METHODS_ENABLED diff --git a/modules/mono/class_db_api_json.h b/modules/mono/class_db_api_json.h new file mode 100644 index 0000000000..ddfe2debea --- /dev/null +++ b/modules/mono/class_db_api_json.h @@ -0,0 +1,46 @@ +/*************************************************************************/ +/* class_db_api_json.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2018 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 CLASS_DB_API_JSON_H +#define CLASS_DB_API_JSON_H + +// 'core/method_bind.h' defines DEBUG_METHODS_ENABLED, but it looks like we +// cannot include it here. That's why we include it through 'core/class_db.h'. +#include "core/class_db.h" + +#ifdef DEBUG_METHODS_ENABLED + +#include "core/ustring.h" + +void class_db_api_to_json(const String &p_output_file, ClassDB::APIType p_api); + +#endif // DEBUG_METHODS_ENABLED + +#endif // CLASS_DB_API_JSON_H diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index b5c91a8585..846c84d222 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -44,6 +44,10 @@ #include "editor/editor_node.h" #endif +#ifdef DEBUG_METHODS_ENABLED +#include "class_db_api_json.h" +#endif + #include "editor/editor_internal_calls.h" #include "godotsharp_dirs.h" #include "mono_gd/gd_mono_class.h" @@ -98,18 +102,32 @@ Error CSharpLanguage::execute_file(const String &p_path) { void CSharpLanguage::init() { +#ifdef DEBUG_METHODS_ENABLED + if (OS::get_singleton()->get_cmdline_args().find("--class_db_to_json")) { + class_db_api_to_json("user://class_db_api.json", ClassDB::API_CORE); +#ifdef TOOLS_ENABLED + class_db_api_to_json("user://class_db_api_editor.json", ClassDB::API_EDITOR); +#endif + } +#endif + gdmono = memnew(GDMono); gdmono->initialize(); -#ifndef MONO_GLUE_ENABLED - WARN_PRINT("This binary is built with `mono_glue=no` and cannot be used for scripting"); -#endif - #if defined(TOOLS_ENABLED) && defined(DEBUG_METHODS_ENABLED) + // Generate bindings here, before loading assemblies. `initialize_load_assemblies` aborts + // the applications if the api assemblies or the main tools assembly is missing, but this + // is not a problem for BindingsGenerator as it only needs the tools project editor assembly. List<String> cmdline_args = OS::get_singleton()->get_cmdline_args(); BindingsGenerator::handle_cmdline_args(cmdline_args); #endif +#ifndef MONO_GLUE_ENABLED + print_line("Run this binary with `--generate-mono-glue path/to/modules/mono/glue`"); +#endif + + gdmono->initialize_load_assemblies(); + #ifdef TOOLS_ENABLED EditorNode::add_init_callback(&_editor_init_callback); @@ -611,7 +629,6 @@ void CSharpLanguage::frame() { if (exc) { GDMonoUtils::debug_unhandled_exception(exc); - GD_UNREACHABLE(); } } } @@ -697,14 +714,6 @@ bool CSharpLanguage::is_assembly_reloading_needed() { return false; // No assembly to load } -#ifdef TOOLS_ENABLED - if (!gdmono->get_core_api_assembly() && gdmono->metadata_is_api_assembly_invalidated(APIAssembly::API_CORE)) - return false; // The core API assembly to load is invalidated - - if (!gdmono->get_editor_api_assembly() && gdmono->metadata_is_api_assembly_invalidated(APIAssembly::API_EDITOR)) - return false; // The editor API assembly to load is invalidated -#endif - return true; } @@ -867,17 +876,26 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) { script->reload(p_soft_reload); script->update_exports(); + + if (!script->valid) { + script->pending_reload_instances.clear(); + continue; + } } else { const StringName &class_namespace = script->tied_class_namespace_for_reload; const StringName &class_name = script->tied_class_name_for_reload; GDMonoAssembly *project_assembly = gdmono->get_project_assembly(); - GDMonoAssembly *tools_assembly = gdmono->get_tools_assembly(); // Search in project and tools assemblies first as those are the most likely to have the class GDMonoClass *script_class = (project_assembly ? project_assembly->get_class(class_namespace, class_name) : NULL); + +#ifdef TOOLS_ENABLED if (!script_class) { + GDMonoAssembly *tools_assembly = gdmono->get_tools_assembly(); script_class = (tools_assembly ? tools_assembly->get_class(class_namespace, class_name) : NULL); } +#endif + if (!script_class) { script_class = gdmono->get_class(class_namespace, class_name); } @@ -897,12 +915,7 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) { GDMonoClass *native = GDMonoUtils::get_class_native_base(script_class); - Ref<CSharpScript> new_script = CSharpScript::create_for_managed_type(script_class, native); - CRASH_COND(new_script.is_null()); - - new_script->pending_reload_instances = script->pending_reload_instances; - new_script->pending_reload_state = script->pending_reload_state; - script = new_script; + CSharpScript::initialize_for_managed_type(script, script_class, native); } String native_name = NATIVE_GDMONOCLASS_NAME(script->native); @@ -953,7 +966,6 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) { CRASH_COND(si != NULL); #endif // Re-create script instance - obj->set_script(script.get_ref_ptr()); // will create the script instance as well } } @@ -1203,7 +1215,9 @@ CSharpLanguage::CSharpLanguage() { scripts_metadata_invalidated = true; +#ifdef TOOLS_ENABLED godotsharp_editor = NULL; +#endif } CSharpLanguage::~CSharpLanguage() { @@ -2144,7 +2158,6 @@ void CSharpScript::_update_exports_values(Map<StringName, Variant> &values, List propnames.push_back(E->get()); } } -#endif void CSharpScript::_update_member_info_no_exports() { @@ -2191,6 +2204,7 @@ void CSharpScript::_update_member_info_no_exports() { } } } +#endif bool CSharpScript::_update_exports() { @@ -2673,35 +2687,46 @@ void CSharpScript::_bind_methods() { Ref<CSharpScript> CSharpScript::create_for_managed_type(GDMonoClass *p_class, GDMonoClass *p_native) { - // This method should not fail + // This method should not fail, only assertions allowed CRASH_COND(p_class == NULL); // TODO OPTIMIZE: Cache the 'CSharpScript' associated with this 'p_class' instead of allocating a new one every time Ref<CSharpScript> script = memnew(CSharpScript); - script->name = p_class->get_name(); - script->script_class = p_class; - script->native = p_native; + initialize_for_managed_type(script, p_class, p_native); - CRASH_COND(script->native == NULL); + return script; +} - GDMonoClass *base = script->script_class->get_parent_class(); +void CSharpScript::initialize_for_managed_type(Ref<CSharpScript> p_script, GDMonoClass *p_class, GDMonoClass *p_native) { - if (base != script->native) - script->base = base; + // This method should not fail, only assertions allowed - script->valid = true; - script->tool = script->script_class->has_attribute(CACHED_CLASS(ToolAttribute)); + CRASH_COND(p_class == NULL); - if (!script->tool) { - GDMonoClass *nesting_class = script->script_class->get_nesting_class(); - script->tool = nesting_class && nesting_class->has_attribute(CACHED_CLASS(ToolAttribute)); + p_script->name = p_class->get_name(); + p_script->script_class = p_class; + p_script->native = p_native; + + CRASH_COND(p_script->native == NULL); + + GDMonoClass *base = p_script->script_class->get_parent_class(); + + if (base != p_script->native) + p_script->base = base; + + p_script->valid = true; + p_script->tool = p_script->script_class->has_attribute(CACHED_CLASS(ToolAttribute)); + + if (!p_script->tool) { + GDMonoClass *nesting_class = p_script->script_class->get_nesting_class(); + p_script->tool = nesting_class && nesting_class->has_attribute(CACHED_CLASS(ToolAttribute)); } #if TOOLS_ENABLED - if (!script->tool) { - script->tool = script->script_class->get_assembly() == GDMono::get_singleton()->get_tools_assembly(); + if (!p_script->tool) { + p_script->tool = p_script->script_class->get_assembly() == GDMono::get_singleton()->get_tools_assembly(); } #endif @@ -2710,10 +2735,10 @@ Ref<CSharpScript> CSharpScript::create_for_managed_type(GDMonoClass *p_class, GD // Native base methods must be fetched before the current class. // Not needed if the script class itself is a native class. - if (script->script_class != script->native) { - GDMonoClass *native_top = script->native; + if (p_script->script_class != p_script->native) { + GDMonoClass *native_top = p_script->native; while (native_top) { - native_top->fetch_methods_with_godot_api_checks(script->native); + native_top->fetch_methods_with_godot_api_checks(p_script->native); if (native_top == CACHED_CLASS(GodotObject)) break; @@ -2723,19 +2748,19 @@ Ref<CSharpScript> CSharpScript::create_for_managed_type(GDMonoClass *p_class, GD } #endif - script->script_class->fetch_methods_with_godot_api_checks(script->native); + p_script->script_class->fetch_methods_with_godot_api_checks(p_script->native); // Need to fetch method from base classes as well - GDMonoClass *top = script->script_class; - while (top && top != script->native) { - top->fetch_methods_with_godot_api_checks(script->native); + GDMonoClass *top = p_script->script_class; + while (top && top != p_script->native) { + top->fetch_methods_with_godot_api_checks(p_script->native); top = top->get_parent_class(); } - script->load_script_signals(script->script_class, script->native); - script->_update_member_info_no_exports(); - - return script; + p_script->load_script_signals(p_script->script_class, p_script->native); +#ifdef TOOLS_ENABLED + p_script->_update_member_info_no_exports(); +#endif } bool CSharpScript::can_instance() const { diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index d31a1c35d2..eb168f344d 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -121,6 +121,7 @@ class CSharpScript : public Script { bool placeholder_fallback_enabled; bool exports_invalidated; void _update_exports_values(Map<StringName, Variant> &values, List<PropertyInfo> &propnames); + void _update_member_info_no_exports(); virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder); #endif @@ -131,7 +132,6 @@ class CSharpScript : public Script { void load_script_signals(GDMonoClass *p_class, GDMonoClass *p_native_class); bool _get_signal(GDMonoClass *p_class, GDMonoClass *p_delegate, Vector<Argument> ¶ms); - void _update_member_info_no_exports(); bool _update_exports(); #ifdef TOOLS_ENABLED bool _get_member_export(IMonoClassMember *p_member, bool p_inspect_export, PropertyInfo &r_prop_info, bool &r_exported); @@ -144,6 +144,7 @@ class CSharpScript : public Script { // Do not use unless you know what you are doing friend void GDMonoInternals::tie_managed_to_unmanaged(MonoObject *, Object *); static Ref<CSharpScript> create_for_managed_type(GDMonoClass *p_class, GDMonoClass *p_native); + static void initialize_for_managed_type(Ref<CSharpScript> p_script, GDMonoClass *p_class, GDMonoClass *p_native); protected: static void _bind_methods(); @@ -354,7 +355,9 @@ public: _FORCE_INLINE_ static CSharpLanguage *get_singleton() { return singleton; } +#ifdef TOOLS_ENABLED _FORCE_INLINE_ EditorPlugin *get_godotsharp_editor() const { return godotsharp_editor; } +#endif static void release_script_gchandle(Ref<MonoGCHandle> &p_gchandle); static void release_script_gchandle(MonoObject *p_expected_obj, Ref<MonoGCHandle> &p_gchandle); diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectGenerator.cs b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectGenerator.cs index 7cf58b6755..4f21871f1a 100644 --- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectGenerator.cs +++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectGenerator.cs @@ -91,13 +91,11 @@ namespace GodotTools.ProjectEditor var coreApiRef = root.AddItem("Reference", CoreApiProjectName); coreApiRef.AddMetadata("HintPath", Path.Combine("$(ProjectDir)", ".mono", "assemblies", "$(ApiConfiguration)", CoreApiProjectName + ".dll")); - coreApiRef.AddMetadata("HintPath", Path.Combine("$(ProjectDir)", ".mono", "assemblies", CoreApiProjectName + ".dll")); coreApiRef.AddMetadata("Private", "False"); var editorApiRef = root.AddItem("Reference", EditorApiProjectName); editorApiRef.Condition = " '$(Configuration)' == 'Tools' "; editorApiRef.AddMetadata("HintPath", Path.Combine("$(ProjectDir)", ".mono", "assemblies", "$(ApiConfiguration)", EditorApiProjectName + ".dll")); - editorApiRef.AddMetadata("HintPath", Path.Combine("$(ProjectDir)", ".mono", "assemblies", EditorApiProjectName + ".dll")); editorApiRef.AddMetadata("Private", "False"); GenAssemblyInfoFile(root, dir, name); diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs index 22cf89695d..233aab45b3 100644 --- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs @@ -1,6 +1,8 @@ using GodotTools.Core; using System.Collections.Generic; +using System.Diagnostics; using System.IO; +using System.Linq; using DotNet.Globbing; using Microsoft.Build.Construction; @@ -12,6 +14,8 @@ namespace GodotTools.ProjectEditor { var dir = Directory.GetParent(projectPath).FullName; var root = ProjectRootElement.Open(projectPath); + Debug.Assert(root != null); + var normalizedInclude = include.RelativeToPath(dir).Replace("/", "\\"); if (root.AddItemChecked(itemType, normalizedInclude)) @@ -23,7 +27,8 @@ namespace GodotTools.ProjectEditor string[] files = Directory.GetFiles(rootDirectory, mask, SearchOption.AllDirectories); // We want relative paths - for (int i = 0; i < files.Length; i++) { + for (int i = 0; i < files.Length; i++) + { files[i] = files[i].RelativeToPath(rootDirectory); } @@ -35,7 +40,7 @@ namespace GodotTools.ProjectEditor var result = new List<string>(); var existingFiles = GetAllFilesRecursive(Path.GetDirectoryName(projectPath), "*.cs"); - GlobOptions globOptions = new GlobOptions(); + var globOptions = new GlobOptions(); globOptions.Evaluation.CaseInsensitive = false; var root = ProjectRootElement.Open(projectPath); @@ -68,5 +73,103 @@ namespace GodotTools.ProjectEditor return result.ToArray(); } + + /// Simple function to make sure the Api assembly references are configured correctly + public static void FixApiHintPath(string projectPath) + { + var root = ProjectRootElement.Open(projectPath); + Debug.Assert(root != null); + + bool dirty = false; + + void AddPropertyIfNotPresent(string name, string condition, string value) + { + if (root.PropertyGroups + .Any(g => (g.Condition == string.Empty || g.Condition == condition) && + g.Properties + .Any(p => p.Name == name && + p.Value == value && + (p.Condition == condition || g.Condition == condition)))) + { + return; + } + + root.AddProperty(name, value).Condition = condition; + dirty = true; + } + + AddPropertyIfNotPresent(name: "ApiConfiguration", + condition: " '$(Configuration)' != 'Release' ", + value: "Debug"); + AddPropertyIfNotPresent(name: "ApiConfiguration", + condition: " '$(Configuration)' == 'Release' ", + value: "Release"); + + void SetReferenceHintPath(string referenceName, string condition, string hintPath) + { + foreach (var itemGroup in root.ItemGroups.Where(g => + g.Condition == string.Empty || g.Condition == condition)) + { + var references = itemGroup.Items.Where(item => + item.ItemType == "Reference" && + item.Include == referenceName && + (item.Condition == condition || itemGroup.Condition == condition)); + + var referencesWithHintPath = references.Where(reference => + reference.Metadata.Any(m => m.Name == "HintPath")); + + if (referencesWithHintPath.Any(reference => reference.Metadata + .Any(m => m.Name == "HintPath" && m.Value == hintPath))) + { + // Found a Reference item with the right HintPath + return; + } + + var referenceWithHintPath = referencesWithHintPath.FirstOrDefault(); + if (referenceWithHintPath != null) + { + // Found a Reference item with a wrong HintPath + foreach (var metadata in referenceWithHintPath.Metadata.ToList() + .Where(m => m.Name == "HintPath")) + { + // Safe to remove as we duplicate with ToList() to loop + referenceWithHintPath.RemoveChild(metadata); + } + + referenceWithHintPath.AddMetadata("HintPath", hintPath); + dirty = true; + return; + } + + var referenceWithoutHintPath = references.FirstOrDefault(); + if (referenceWithoutHintPath != null) + { + // Found a Reference item without a HintPath + referenceWithoutHintPath.AddMetadata("HintPath", hintPath); + dirty = true; + return; + } + } + + // Found no Reference item at all. Add it. + root.AddItem("Reference", referenceName).Condition = condition; + dirty = true; + } + + const string coreProjectName = "GodotSharp"; + const string editorProjectName = "GodotSharpEditor"; + + const string coreCondition = ""; + const string editorCondition = " '$(Configuration)' == 'Tools' "; + + var coreHintPath = $"$(ProjectDir)/.mono/assemblies/$(ApiConfiguration)/{coreProjectName}.dll"; + var editorHintPath = $"$(ProjectDir)/.mono/assemblies/$(ApiConfiguration)/{editorProjectName}.dll"; + + SetReferenceHintPath(coreProjectName, coreCondition, coreHintPath); + SetReferenceHintPath(editorProjectName, editorCondition, editorHintPath); + + if (dirty) + root.Save(); + } } } diff --git a/modules/mono/editor/GodotTools/GodotTools.sln b/modules/mono/editor/GodotTools/GodotTools.sln new file mode 100644 index 0000000000..6f7d44bec2 --- /dev/null +++ b/modules/mono/editor/GodotTools/GodotTools.sln @@ -0,0 +1,35 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotTools.ProjectEditor", "GodotTools.ProjectEditor\GodotTools.ProjectEditor.csproj", "{A8CDAD94-C6D4-4B19-A7E7-76C53CC92984}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotTools", "GodotTools\GodotTools.csproj", "{27B00618-A6F2-4828-B922-05CAEB08C286}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotTools.Core", "GodotTools.Core\GodotTools.Core.csproj", "{639E48BD-44E5-4091-8EDD-22D36DC0768D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotTools.BuildLogger", "GodotTools.BuildLogger\GodotTools.BuildLogger.csproj", "{6CE9A984-37B1-4F8A-8FE9-609F05F071B3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A8CDAD94-C6D4-4B19-A7E7-76C53CC92984}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8CDAD94-C6D4-4B19-A7E7-76C53CC92984}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8CDAD94-C6D4-4B19-A7E7-76C53CC92984}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8CDAD94-C6D4-4B19-A7E7-76C53CC92984}.Release|Any CPU.Build.0 = Release|Any CPU + {27B00618-A6F2-4828-B922-05CAEB08C286}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27B00618-A6F2-4828-B922-05CAEB08C286}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27B00618-A6F2-4828-B922-05CAEB08C286}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27B00618-A6F2-4828-B922-05CAEB08C286}.Release|Any CPU.Build.0 = Release|Any CPU + {639E48BD-44E5-4091-8EDD-22D36DC0768D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {639E48BD-44E5-4091-8EDD-22D36DC0768D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {639E48BD-44E5-4091-8EDD-22D36DC0768D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {639E48BD-44E5-4091-8EDD-22D36DC0768D}.Release|Any CPU.Build.0 = Release|Any CPU + {6CE9A984-37B1-4F8A-8FE9-609F05F071B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6CE9A984-37B1-4F8A-8FE9-609F05F071B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CE9A984-37B1-4F8A-8FE9-609F05F071B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6CE9A984-37B1-4F8A-8FE9-609F05F071B3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs index f849356919..d8cb9024c3 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs @@ -137,7 +137,7 @@ namespace GodotTools.Build private static string BuildArguments(string solution, string config, string loggerOutputDir, List<string> customProperties) { - string arguments = $@"""{solution}"" /v:normal /t:Rebuild ""/p:{"Configuration=" + config}"" " + + string arguments = $@"""{solution}"" /v:normal /t:Build ""/p:{"Configuration=" + config}"" " + $@"""/l:{typeof(GodotBuildLogger).FullName},{GodotBuildLogger.AssemblyPath};{loggerOutputDir}"""; foreach (string customProperty in customProperties) diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs index a0d14c43c9..926aabdf89 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs @@ -15,7 +15,6 @@ namespace GodotTools.Build { private static string _msbuildToolsPath = string.Empty; private static string _msbuildUnixPath = string.Empty; - private static string _xbuildUnixPath = string.Empty; public static string FindMsBuild() { @@ -44,7 +43,6 @@ namespace GodotTools.Build return Path.Combine(_msbuildToolsPath, "MSBuild.exe"); } - case GodotSharpBuilds.BuildTool.MsBuildMono: { string msbuildPath = Path.Combine(Internal.MonoWindowsInstallRoot, "bin", "msbuild.bat"); @@ -56,19 +54,6 @@ namespace GodotTools.Build return msbuildPath; } - - case GodotSharpBuilds.BuildTool.XBuild: - { - string xbuildPath = Path.Combine(Internal.MonoWindowsInstallRoot, "bin", "xbuild.bat"); - - if (!File.Exists(xbuildPath)) - { - throw new FileNotFoundException($"Cannot find executable for '{GodotSharpBuilds.PropNameXbuild}'. Tried with path: {xbuildPath}"); - } - - return xbuildPath; - } - default: throw new IndexOutOfRangeException("Invalid build tool in editor settings"); } @@ -76,20 +61,7 @@ namespace GodotTools.Build if (OS.IsUnix()) { - if (buildTool == GodotSharpBuilds.BuildTool.XBuild) - { - if (_xbuildUnixPath.Empty() || !File.Exists(_xbuildUnixPath)) - { - // Try to search it again if it wasn't found last time or if it was removed from its location - _xbuildUnixPath = FindBuildEngineOnUnix("msbuild"); - } - - if (_xbuildUnixPath.Empty()) - { - throw new FileNotFoundException($"Cannot find binary for '{GodotSharpBuilds.PropNameXbuild}'"); - } - } - else + if (buildTool == GodotSharpBuilds.BuildTool.MsBuildMono) { if (_msbuildUnixPath.Empty() || !File.Exists(_msbuildUnixPath)) { @@ -101,9 +73,13 @@ namespace GodotTools.Build { throw new FileNotFoundException($"Cannot find binary for '{GodotSharpBuilds.PropNameMsbuildMono}'"); } - } - return buildTool != GodotSharpBuilds.BuildTool.XBuild ? _msbuildUnixPath : _xbuildUnixPath; + return _msbuildUnixPath; + } + else + { + throw new IndexOutOfRangeException("Invalid build tool in editor settings"); + } } throw new PlatformNotSupportedException(); @@ -172,7 +148,7 @@ namespace GodotTools.Build if (outputArray.Count == 0) return string.Empty; - var lines = outputArray[1].Split('\n'); + var lines = outputArray[0].Split('\n'); foreach (string line in lines) { diff --git a/modules/mono/editor/GodotTools/GodotTools/CSharpProject.cs b/modules/mono/editor/GodotTools/GodotTools/CSharpProject.cs index 0426f0ac5a..4535ed7247 100644 --- a/modules/mono/editor/GodotTools/GodotTools/CSharpProject.cs +++ b/modules/mono/editor/GodotTools/GodotTools/CSharpProject.cs @@ -1,9 +1,9 @@ using Godot; using System; -using System.Collections.Generic; using Godot.Collections; using GodotTools.Internals; using GodotTools.ProjectEditor; +using static GodotTools.Internals.Globals; using File = GodotTools.Utils.File; using Directory = GodotTools.Utils.Directory; @@ -11,11 +11,11 @@ namespace GodotTools { public static class CSharpProject { - public static string GenerateGameProject(string dir, string name, IEnumerable<string> files = null) + public static string GenerateGameProject(string dir, string name) { try { - return ProjectGenerator.GenGameProject(dir, name, files); + return ProjectGenerator.GenGameProject(dir, name, compileItems: new string[] { }); } catch (Exception e) { @@ -26,12 +26,24 @@ namespace GodotTools public static void AddItem(string projectPath, string itemType, string include) { - if (!(bool) Internal.GlobalDef("mono/project/auto_update_project", true)) + if (!(bool) GlobalDef("mono/project/auto_update_project", true)) return; ProjectUtils.AddItemToProjectChecked(projectPath, itemType, include); } + public static void FixApiHintPath(string projectPath) + { + try + { + ProjectUtils.FixApiHintPath(projectPath); + } + catch (Exception e) + { + GD.PushError(e.ToString()); + } + } + private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); private static ulong ConvertToTimestamp(this DateTime value) @@ -58,7 +70,7 @@ namespace GodotTools { var oldFileDict = (Dictionary) oldFileVar; - if (ulong.TryParse((string) oldFileDict["modified_time"], out ulong storedModifiedTime)) + if (ulong.TryParse(oldFileDict["modified_time"] as string, out ulong storedModifiedTime)) { if (storedModifiedTime == modifiedTime) { diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs index 433a931941..de3a4d9a6e 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpBuilds.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using GodotTools.Build; using GodotTools.Internals; using GodotTools.Utils; +using static GodotTools.Internals.Globals; using Error = Godot.Error; using File = GodotTools.Utils.File; using Directory = GodotTools.Utils.Directory; @@ -17,7 +18,6 @@ namespace GodotTools public const string PropNameMsbuildMono = "MSBuild (Mono)"; public const string PropNameMsbuildVs = "MSBuild (VS Build Tools)"; - public const string PropNameXbuild = "xbuild (Deprecated)"; public const string MsBuildIssuesFileName = "msbuild_issues.csv"; public const string MsBuildLogFileName = "msbuild_log.txt"; @@ -25,8 +25,7 @@ namespace GodotTools public enum BuildTool { MsBuildMono, - MsBuildVs, - XBuild // Deprecated + MsBuildVs } private static void RemoveOldIssuesFile(MonoBuildInfo buildInfo) @@ -63,7 +62,7 @@ namespace GodotTools private static string GetIssuesFilePath(MonoBuildInfo buildInfo) { - return Path.Combine(Godot.ProjectSettings.LocalizePath(buildInfo.LogsDirPath), MsBuildIssuesFileName); + return Path.Combine(buildInfo.LogsDirPath, MsBuildIssuesFileName); } private static void PrintVerbose(string text) @@ -192,134 +191,17 @@ namespace GodotTools return false; } - private static bool CopyApiAssembly(string srcDir, string dstDir, string assemblyName, ApiAssemblyType apiType) - { - // Create destination directory if needed - if (!Directory.Exists(dstDir)) - { - try - { - Directory.CreateDirectory(dstDir); - } - catch (IOException e) - { - ShowBuildErrorDialog($"Failed to create destination directory for the API assemblies. Exception message: {e.Message}"); - return false; - } - } - - string assemblyFile = assemblyName + ".dll"; - string assemblySrc = Path.Combine(srcDir, assemblyFile); - string assemblyDst = Path.Combine(dstDir, assemblyFile); - - if (!File.Exists(assemblyDst) || File.GetLastWriteTime(assemblySrc) > File.GetLastWriteTime(assemblyDst) || - Internal.MetadataIsApiAssemblyInvalidated(apiType)) - { - string xmlFile = $"{assemblyName}.xml"; - string pdbFile = $"{assemblyName}.pdb"; - - try - { - File.Copy(Path.Combine(srcDir, xmlFile), Path.Combine(dstDir, xmlFile)); - } - catch (IOException e) - { - Godot.GD.PushWarning(e.ToString()); - } - - try - { - File.Copy(Path.Combine(srcDir, pdbFile), Path.Combine(dstDir, pdbFile)); - } - catch (IOException e) - { - Godot.GD.PushWarning(e.ToString()); - } - - try - { - File.Copy(assemblySrc, assemblyDst); - } - catch (IOException e) - { - ShowBuildErrorDialog($"Failed to copy {assemblyFile}. Exception message: {e.Message}"); - return false; - } - - Internal.MetadataSetApiAssemblyInvalidated(apiType, false); - } - - return true; - } - - public static bool MakeApiAssembly(ApiAssemblyType apiType, string config) - { - string apiName = apiType == ApiAssemblyType.Core ? ApiAssemblyNames.Core : ApiAssemblyNames.Editor; - - string editorPrebuiltApiDir = Path.Combine(GodotSharpDirs.DataEditorPrebuiltApiDir, config); - string resAssembliesDir = Path.Combine(GodotSharpDirs.ResAssembliesBaseDir, config); - - if (File.Exists(Path.Combine(editorPrebuiltApiDir, $"{apiName}.dll"))) - { - using (var copyProgress = new EditorProgress("mono_copy_prebuilt_api_assembly", $"Copying prebuilt {apiName} assembly...", 1)) - { - copyProgress.Step($"Copying {apiName} assembly", 0); - return CopyApiAssembly(editorPrebuiltApiDir, resAssembliesDir, apiName, apiType); - } - } - - const string apiSolutionName = ApiAssemblyNames.SolutionName; - - using (var pr = new EditorProgress($"mono_build_release_{apiSolutionName}", $"Building {apiSolutionName} solution...", 3)) - { - pr.Step($"Generating {apiSolutionName} solution", 0); - - string apiSlnDir = Path.Combine(GodotSharpDirs.MonoSolutionsDir, _ApiFolderName(ApiAssemblyType.Core)); - string apiSlnFile = Path.Combine(apiSlnDir, $"{apiSolutionName}.sln"); - - if (!Directory.Exists(apiSlnDir) || !File.Exists(apiSlnFile)) - { - var bindingsGenerator = new BindingsGenerator(); - - if (!Godot.OS.IsStdoutVerbose()) - bindingsGenerator.LogPrintEnabled = false; - - Error err = bindingsGenerator.GenerateCsApi(apiSlnDir); - if (err != Error.Ok) - { - ShowBuildErrorDialog($"Failed to generate {apiSolutionName} solution. Error: {err}"); - return false; - } - } - - pr.Step($"Building {apiSolutionName} solution", 1); - - if (!BuildApiSolution(apiSlnDir, config)) - return false; - - pr.Step($"Copying {apiName} assembly", 2); - - // Copy the built assembly to the assemblies directory - string apiAssemblyDir = Path.Combine(apiSlnDir, apiName, "bin", config); - if (!CopyApiAssembly(apiAssemblyDir, resAssembliesDir, apiName, apiType)) - return false; - } - - return true; - } - public static bool BuildProjectBlocking(string config, IEnumerable<string> godotDefines) { if (!File.Exists(GodotSharpDirs.ProjectSlnPath)) return true; // No solution to build - string apiConfig = config == "Release" ? "Release" : "Debug"; + // Make sure to update the API assemblies if they happen to be missing. Just in + // case the user decided to delete them at some point after they were loaded. + Internal.UpdateApiAssembliesFromPrebuilt(); - if (!MakeApiAssembly(ApiAssemblyType.Core, apiConfig)) - return false; - - if (!MakeApiAssembly(ApiAssemblyType.Editor, apiConfig)) - return false; + var editorSettings = GodotSharpEditor.Instance.GetEditorInterface().GetEditorSettings(); + var buildTool = (BuildTool)editorSettings.GetSetting("mono/builds/build_tool"); using (var pr = new EditorProgress("mono_project_debug_build", "Building project solution...", 1)) { @@ -328,7 +210,7 @@ namespace GodotTools var buildInfo = new MonoBuildInfo(GodotSharpDirs.ProjectSlnPath, config); // Add Godot defines - string constants = OS.IsWindows() ? "GodotDefineConstants=\"" : "GodotDefineConstants=\\\""; + string constants = buildTool == BuildTool.MsBuildVs ? "GodotDefineConstants=\"" : "GodotDefineConstants=\\\""; foreach (var godotDefine in godotDefines) constants += $"GODOT_{godotDefine.ToUpper().Replace("-", "_").Replace(" ", "_").Replace(";", "_")};"; @@ -336,7 +218,7 @@ namespace GodotTools if (Internal.GodotIsRealTDouble()) constants += "GODOT_REAL_T_IS_DOUBLE;"; - constants += OS.IsWindows() ? "\"" : "\\\""; + constants += buildTool == BuildTool.MsBuildVs ? "\"" : "\\\""; buildInfo.CustomProperties.Add(constants); @@ -376,7 +258,7 @@ namespace GodotTools { // Build tool settings - Internal.EditorDef("mono/builds/build_tool", OS.IsWindows() ? BuildTool.MsBuildVs : BuildTool.MsBuildMono); + EditorDef("mono/builds/build_tool", OS.IsWindows() ? BuildTool.MsBuildVs : BuildTool.MsBuildMono); var editorSettings = GodotSharpEditor.Instance.GetEditorInterface().GetEditorSettings(); @@ -386,11 +268,11 @@ namespace GodotTools ["name"] = "mono/builds/build_tool", ["hint"] = Godot.PropertyHint.Enum, ["hint_string"] = OS.IsWindows() ? - $"{PropNameMsbuildMono},{PropNameMsbuildVs},{PropNameXbuild}" : - $"{PropNameMsbuildMono},{PropNameXbuild}" + $"{PropNameMsbuildMono},{PropNameMsbuildVs}" : + $"{PropNameMsbuildMono}" }); - Internal.EditorDef("mono/builds/print_build_output", false); + EditorDef("mono/builds/print_build_output", false); } } } diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index 955574d5fe..9b5afb94a3 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using GodotTools.Internals; using GodotTools.ProjectEditor; +using static GodotTools.Internals.Globals; using File = GodotTools.Utils.File; using Path = System.IO.Path; using OS = GodotTools.Utils.OS; @@ -26,13 +27,15 @@ namespace GodotTools private MonoDevelopInstance monoDevelopInstance; private MonoDevelopInstance visualStudioForMacInstance; + private WeakRef exportPluginWeak; // TODO Use WeakReference once we have proper serialization + public MonoBottomPanel MonoBottomPanel { get; private set; } private bool CreateProjectSolution() { - using (var pr = new EditorProgress("create_csharp_solution", "Generating solution...", 2)) // TTR("Generating solution...") + using (var pr = new EditorProgress("create_csharp_solution", "Generating solution...".TTR(), 2)) { - pr.Step("Generating C# project..."); // TTR("Generating C# project...") + pr.Step("Generating C# project...".TTR()); string resourceDir = ProjectSettings.GlobalizePath("res://"); @@ -65,96 +68,28 @@ namespace GodotTools } catch (IOException e) { - ShowErrorDialog($"Failed to save solution. Exception message: {e.Message}"); // TTR + ShowErrorDialog("Failed to save solution. Exception message: ".TTR() + e.Message); return false; } - string apiConfig = "Debug"; - - if (!GodotSharpBuilds.MakeApiAssembly(ApiAssemblyType.Core, apiConfig)) - return false; - - if (!GodotSharpBuilds.MakeApiAssembly(ApiAssemblyType.Editor, apiConfig)) - return false; + // Make sure to update the API assemblies if they happen to be missing. Just in + // case the user decided to delete them at some point after they were loaded. + Internal.UpdateApiAssembliesFromPrebuilt(); - pr.Step("Done"); // TTR("Done") + pr.Step("Done".TTR()); // Here, after all calls to progress_task_step CallDeferred(nameof(_RemoveCreateSlnMenuOption)); } else { - ShowErrorDialog("Failed to create C# project."); // TTR + ShowErrorDialog("Failed to create C# project.".TTR()); } return true; } } - private static int _makeApiSolutionsAttempts = 100; - private static bool _makeApiSolutionsRecursionGuard = false; - - private void _MakeApiSolutionsIfNeeded() - { - // I'm sick entirely of ProgressDialog - - if (Internal.IsMessageQueueFlushing() || Engine.GetMainLoop() == null) - { - if (_makeApiSolutionsAttempts == 0) // This better never happen or I swear... - throw new TimeoutException(); - - if (Engine.GetMainLoop() != null) - { - if (!Engine.GetMainLoop().IsConnected("idle_frame", this, nameof(_MakeApiSolutionsIfNeeded))) - Engine.GetMainLoop().Connect("idle_frame", this, nameof(_MakeApiSolutionsIfNeeded)); - } - else - { - CallDeferred(nameof(_MakeApiSolutionsIfNeededImpl)); - } - - _makeApiSolutionsAttempts--; - return; - } - - // Recursion guard needed because signals don't play well with ProgressDialog either, but unlike - // the message queue, with signals the collateral damage should be minimal in the worst case. - if (!_makeApiSolutionsRecursionGuard) - { - _makeApiSolutionsRecursionGuard = true; - - // Oneshot signals don't play well with ProgressDialog either, so we do it this way instead - if (Engine.GetMainLoop().IsConnected("idle_frame", this, nameof(_MakeApiSolutionsIfNeeded))) - Engine.GetMainLoop().Disconnect("idle_frame", this, nameof(_MakeApiSolutionsIfNeeded)); - - _MakeApiSolutionsIfNeededImpl(); - - _makeApiSolutionsRecursionGuard = false; - } - } - - private void _MakeApiSolutionsIfNeededImpl() - { - // If the project has a solution and C# project make sure the API assemblies are present and up to date - - string api_config = "Debug"; - string resAssembliesDir = Path.Combine(GodotSharpDirs.ResAssembliesBaseDir, api_config); - - if (!File.Exists(Path.Combine(resAssembliesDir, $"{ApiAssemblyNames.Core}.dll")) || - Internal.MetadataIsApiAssemblyInvalidated(ApiAssemblyType.Core)) - { - if (!GodotSharpBuilds.MakeApiAssembly(ApiAssemblyType.Core, api_config)) - return; - } - - if (!File.Exists(Path.Combine(resAssembliesDir, $"{ApiAssemblyNames.Editor}.dll")) || - Internal.MetadataIsApiAssemblyInvalidated(ApiAssemblyType.Editor)) - { - if (!GodotSharpBuilds.MakeApiAssembly(ApiAssemblyType.Editor, api_config)) - return; // Redundant? I don't think so! - } - } - private void _RemoveCreateSlnMenuOption() { menuPopup.RemoveItem(menuPopup.GetItemIndex((int) MenuOptions.CreateSln)); @@ -363,7 +298,16 @@ namespace GodotTools if (line >= 0) scriptPath += $";{line + 1};{col}"; - GetMonoDevelopInstance(GodotSharpDirs.ProjectSlnPath).Execute(scriptPath); + try + { + GetMonoDevelopInstance(GodotSharpDirs.ProjectSlnPath).Execute(scriptPath); + } + catch (FileNotFoundException) + { + string editorName = editor == ExternalEditor.VisualStudioForMac ? "Visual Studio" : "MonoDevelop"; + GD.PushError($"Cannot find code editor: {editorName}"); + return Error.FileNotFound; + } break; } @@ -405,7 +349,7 @@ namespace GodotTools MonoBottomPanel = new MonoBottomPanel(); - bottomPanelBtn = AddControlToBottomPanel(MonoBottomPanel, "Mono"); // TTR("Mono") + bottomPanelBtn = AddControlToBottomPanel(MonoBottomPanel, "Mono".TTR()); AddChild(new HotReloadAssemblyWatcher {Name = "HotReloadAssemblyWatcher"}); @@ -417,7 +361,7 @@ namespace GodotTools // TODO: Remove or edit this info dialog once Mono support is no longer in alpha { - menuPopup.AddItem("About C# support", (int) MenuOptions.AboutCSharp); // TTR("About C# support") + menuPopup.AddItem("About C# support".TTR(), (int) MenuOptions.AboutCSharp); aboutDialog = new AcceptDialog(); editorBaseControl.AddChild(aboutDialog); aboutDialog.WindowTitle = "Important: C# support is not feature-complete"; @@ -439,7 +383,7 @@ namespace GodotTools var aboutLabel = new Label(); aboutHBox.AddChild(aboutLabel); - aboutLabel.RectMinSize = new Vector2(600, 150) * Internal.EditorScale; + aboutLabel.RectMinSize = new Vector2(600, 150) * EditorScale; aboutLabel.SizeFlagsVertical = (int) Control.SizeFlags.ExpandFill; aboutLabel.Autowrap = true; aboutLabel.Text = @@ -452,7 +396,7 @@ namespace GodotTools " https://github.com/godotengine/godot/issues\n\n" + "Your critical feedback at this stage will play a great role in shaping the C# support in future releases, so thank you!"; - Internal.EditorDef("mono/editor/show_info_on_start", true); + EditorDef("mono/editor/show_info_on_start", true); // CheckBox in main container aboutDialogCheckBox = new CheckBox {Text = "Show this warning when starting the editor"}; @@ -462,13 +406,13 @@ namespace GodotTools if (File.Exists(GodotSharpDirs.ProjectSlnPath) && File.Exists(GodotSharpDirs.ProjectCsProjPath)) { - // Defer this task because EditorProgress calls Main::iterarion() and the main loop is not yet initialized. - CallDeferred(nameof(_MakeApiSolutionsIfNeeded)); + // Make sure the existing project has Api assembly references configured correctly + CSharpProject.FixApiHintPath(GodotSharpDirs.ProjectCsProjPath); } else { bottomPanelBtn.Hide(); - menuPopup.AddItem("Create C# solution", (int) MenuOptions.CreateSln); // TTR("Create C# solution") + menuPopup.AddItem("Create C# solution".TTR(), (int) MenuOptions.CreateSln); } menuPopup.Connect("id_pressed", this, nameof(_MenuOptionPressed)); @@ -483,7 +427,7 @@ namespace GodotTools AddControlToContainer(CustomControlContainer.Toolbar, buildButton); // External editor settings - Internal.EditorDef("mono/editor/external_editor", ExternalEditor.None); + EditorDef("mono/editor/external_editor", ExternalEditor.None); string settingsHintStr = "Disabled"; @@ -513,11 +457,29 @@ namespace GodotTools }); // Export plugin - AddExportPlugin(new GodotSharpExport()); + var exportPlugin = new GodotSharpExport(); + AddExportPlugin(exportPlugin); + exportPluginWeak = WeakRef(exportPlugin); GodotSharpBuilds.Initialize(); } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (exportPluginWeak != null) + { + // We need to dispose our export plugin before the editor destroys EditorSettings. + // Otherwise, if the GC disposes it at a later time, EditorExportPlatformAndroid + // will be freed after EditorSettings already was, and its device polling thread + // will try to access the EditorSettings singleton, resulting in null dereferencing. + (exportPluginWeak.GetRef() as GodotSharpExport)?.Dispose(); + + exportPluginWeak.Dispose(); + } + } + public void OnBeforeSerialize() { } diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj b/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj index a0ff8a0df1..01e8c87d14 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj +++ b/modules/mono/editor/GodotTools/GodotTools/GodotTools.csproj @@ -44,6 +44,7 @@ <Compile Include="Internals\GodotSharpDirs.cs" /> <Compile Include="Internals\Internal.cs" /> <Compile Include="Internals\ScriptClassParser.cs" /> + <Compile Include="Internals\Globals.cs" /> <Compile Include="MonoDevelopInstance.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Build\BuildSystem.cs" /> diff --git a/modules/mono/editor/GodotTools/GodotTools/HotReloadAssemblyWatcher.cs b/modules/mono/editor/GodotTools/GodotTools/HotReloadAssemblyWatcher.cs index aa52079cf4..0f6f5ffadc 100644 --- a/modules/mono/editor/GodotTools/GodotTools/HotReloadAssemblyWatcher.cs +++ b/modules/mono/editor/GodotTools/GodotTools/HotReloadAssemblyWatcher.cs @@ -1,5 +1,6 @@ using Godot; using GodotTools.Internals; +using static GodotTools.Internals.Globals; namespace GodotTools { @@ -37,7 +38,7 @@ namespace GodotTools watchTimer = new Timer { OneShot = false, - WaitTime = (float) Internal.EditorDef("mono/assembly_watch_interval_sec", 0.5) + WaitTime = (float) EditorDef("mono/assembly_watch_interval_sec", 0.5) }; watchTimer.Connect("timeout", this, nameof(TimerTimeout)); AddChild(watchTimer); diff --git a/modules/mono/editor/GodotTools/GodotTools/Internals/Globals.cs b/modules/mono/editor/GodotTools/GodotTools/Internals/Globals.cs new file mode 100644 index 0000000000..793f84fd77 --- /dev/null +++ b/modules/mono/editor/GodotTools/GodotTools/Internals/Globals.cs @@ -0,0 +1,33 @@ +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace GodotTools.Internals +{ + public static class Globals + { + public static float EditorScale => internal_EditorScale(); + + public static object GlobalDef(string setting, object defaultValue, bool restartIfChanged = false) => + internal_GlobalDef(setting, defaultValue, restartIfChanged); + + public static object EditorDef(string setting, object defaultValue, bool restartIfChanged = false) => + internal_EditorDef(setting, defaultValue, restartIfChanged); + + [SuppressMessage("ReSharper", "InconsistentNaming")] + public static string TTR(this string text) => internal_TTR(text); + + // Internal Calls + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern float internal_EditorScale(); + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern object internal_GlobalDef(string setting, object defaultValue, bool restartIfChanged); + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern object internal_EditorDef(string setting, object defaultValue, bool restartIfChanged); + + [MethodImpl(MethodImplOptions.InternalCall)] + private static extern string internal_TTR(string text); + } +} diff --git a/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs b/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs index 5c7ce832cd..9526dd3c6f 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs @@ -10,13 +10,8 @@ namespace GodotTools.Internals public const string CSharpLanguageType = "CSharpScript"; public const string CSharpLanguageExtension = "cs"; - public static float EditorScale => internal_EditorScale(); - - public static object GlobalDef(string setting, object defaultValue, bool restartIfChanged = false) => - internal_GlobalDef(setting, defaultValue, restartIfChanged); - - public static object EditorDef(string setting, object defaultValue, bool restartIfChanged = false) => - internal_EditorDef(setting, defaultValue, restartIfChanged); + public static string UpdateApiAssembliesFromPrebuilt() => + internal_UpdateApiAssembliesFromPrebuilt(); public static string FullTemplatesDir => internal_FullTemplatesDir(); @@ -25,14 +20,6 @@ namespace GodotTools.Internals public static bool IsOsxAppBundleInstalled(string bundleId) => internal_IsOsxAppBundleInstalled(bundleId); - public static bool MetadataIsApiAssemblyInvalidated(ApiAssemblyType apiType) => - internal_MetadataIsApiAssemblyInvalidated(apiType); - - public static void MetadataSetApiAssemblyInvalidated(ApiAssemblyType apiType, bool invalidated) => - internal_MetadataSetApiAssemblyInvalidated(apiType, invalidated); - - public static bool IsMessageQueueFlushing() => internal_IsMessageQueueFlushing(); - public static bool GodotIs32Bits() => internal_GodotIs32Bits(); public static bool GodotIsRealTDouble() => internal_GodotIsRealTDouble(); @@ -62,13 +49,7 @@ namespace GodotTools.Internals // Internal Calls [MethodImpl(MethodImplOptions.InternalCall)] - private static extern float internal_EditorScale(); - - [MethodImpl(MethodImplOptions.InternalCall)] - private static extern object internal_GlobalDef(string setting, object defaultValue, bool restartIfChanged); - - [MethodImpl(MethodImplOptions.InternalCall)] - private static extern object internal_EditorDef(string setting, object defaultValue, bool restartIfChanged); + private static extern string internal_UpdateApiAssembliesFromPrebuilt(); [MethodImpl(MethodImplOptions.InternalCall)] private static extern string internal_FullTemplatesDir(); @@ -80,15 +61,6 @@ namespace GodotTools.Internals private static extern bool internal_IsOsxAppBundleInstalled(string bundleId); [MethodImpl(MethodImplOptions.InternalCall)] - private static extern bool internal_MetadataIsApiAssemblyInvalidated(ApiAssemblyType apiType); - - [MethodImpl(MethodImplOptions.InternalCall)] - private static extern void internal_MetadataSetApiAssemblyInvalidated(ApiAssemblyType apiType, bool invalidated); - - [MethodImpl(MethodImplOptions.InternalCall)] - private static extern bool internal_IsMessageQueueFlushing(); - - [MethodImpl(MethodImplOptions.InternalCall)] private static extern bool internal_GodotIs32Bits(); [MethodImpl(MethodImplOptions.InternalCall)] diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoBottomPanel.cs b/modules/mono/editor/GodotTools/GodotTools/MonoBottomPanel.cs index 300cf7fcb9..53ff0891d5 100644 --- a/modules/mono/editor/GodotTools/GodotTools/MonoBottomPanel.cs +++ b/modules/mono/editor/GodotTools/GodotTools/MonoBottomPanel.cs @@ -3,6 +3,7 @@ using System; using System.IO; using Godot.Collections; using GodotTools.Internals; +using static GodotTools.Internals.Globals; using File = GodotTools.Utils.File; using Path = System.IO.Path; @@ -254,7 +255,7 @@ namespace GodotTools panelTabs = new TabContainer { TabAlign = TabContainer.TabAlignEnum.Left, - RectMinSize = new Vector2(0, 228) * Internal.EditorScale, + RectMinSize = new Vector2(0, 228) * EditorScale, SizeFlagsVertical = (int) SizeFlags.ExpandFill }; panelTabs.AddStyleboxOverride("panel", editorBaseControl.GetStylebox("DebuggerPanel", "EditorStyles")); @@ -266,7 +267,7 @@ namespace GodotTools // Builds tab panelBuildsTab = new VBoxContainer { - Name = "Builds", // TTR + Name = "Builds".TTR(), SizeFlagsHorizontal = (int) SizeFlags.ExpandFill }; panelTabs.AddChild(panelBuildsTab); @@ -276,7 +277,7 @@ namespace GodotTools var buildProjectBtn = new Button { - Text = "Build Project", // TTR + Text = "Build Project".TTR(), FocusMode = FocusModeEnum.None }; buildProjectBtn.Connect("pressed", this, nameof(BuildProjectPressed)); @@ -286,7 +287,7 @@ namespace GodotTools warningsBtn = new ToolButton { - Text = "Warnings", // TTR + Text = "Warnings".TTR(), ToggleMode = true, Pressed = true, Visible = false, @@ -297,7 +298,7 @@ namespace GodotTools errorsBtn = new ToolButton { - Text = "Errors", // TTR + Text = "Errors".TTR(), ToggleMode = true, Pressed = true, Visible = false, @@ -310,7 +311,7 @@ namespace GodotTools viewLogBtn = new Button { - Text = "View log", // TTR + Text = "View log".TTR(), FocusMode = FocusModeEnum.None, Visible = false }; diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs b/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs index 75fdacc0da..3a74fa2f66 100644 --- a/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs +++ b/modules/mono/editor/GodotTools/GodotTools/MonoBuildTab.cs @@ -61,41 +61,48 @@ namespace GodotTools { using (var file = new Godot.File()) { - Error openError = file.Open(csvFile, Godot.File.ModeFlags.Read); - - if (openError != Error.Ok) - return; - - while (!file.EofReached()) + try { - string[] csvColumns = file.GetCsvLine(); + Error openError = file.Open(csvFile, Godot.File.ModeFlags.Read); - if (csvColumns.Length == 1 && csvColumns[0].Empty()) + if (openError != Error.Ok) return; - if (csvColumns.Length != 7) + while (!file.EofReached()) { - GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); - continue; + string[] csvColumns = file.GetCsvLine(); + + if (csvColumns.Length == 1 && csvColumns[0].Empty()) + return; + + if (csvColumns.Length != 7) + { + GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); + continue; + } + + var issue = new BuildIssue + { + Warning = csvColumns[0] == "warning", + File = csvColumns[1], + Line = int.Parse(csvColumns[2]), + Column = int.Parse(csvColumns[3]), + Code = csvColumns[4], + Message = csvColumns[5], + ProjectFile = csvColumns[6] + }; + + if (issue.Warning) + WarningCount += 1; + else + ErrorCount += 1; + + issues.Add(issue); } - - var issue = new BuildIssue - { - Warning = csvColumns[0] == "warning", - File = csvColumns[1], - Line = int.Parse(csvColumns[2]), - Column = int.Parse(csvColumns[3]), - Code = csvColumns[4], - Message = csvColumns[5], - ProjectFile = csvColumns[6] - }; - - if (issue.Warning) - WarningCount += 1; - else - ErrorCount += 1; - - issues.Add(issue); + } + finally + { + file.Close(); // Disposing it is not enough. We need to call Close() } } } diff --git a/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs b/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs index 0c8d86e799..61a0a992ce 100644 --- a/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs +++ b/modules/mono/editor/GodotTools/GodotTools/MonoDevelopInstance.cs @@ -4,6 +4,7 @@ using System.IO; using System.Collections.Generic; using System.Diagnostics; using GodotTools.Internals; +using GodotTools.Utils; namespace GodotTools { @@ -30,7 +31,7 @@ namespace GodotTools if (Utils.OS.IsOSX()) { - string bundleId = CodeEditorBundleIds[editorId]; + string bundleId = BundleIds[editorId]; if (Internal.IsOsxAppBundleInstalled(bundleId)) { @@ -47,12 +48,12 @@ namespace GodotTools } else { - command = CodeEditorPaths[editorId]; + command = OS.PathWhich(ExecutableNames[editorId]); } } else { - command = CodeEditorPaths[editorId]; + command = OS.PathWhich(ExecutableNames[editorId]); } args.Add("--ipc-tcp"); @@ -70,6 +71,9 @@ namespace GodotTools args.Add("\"" + Path.GetFullPath(filePath.NormalizePath()) + cursor + "\""); } + if (command == null) + throw new FileNotFoundException(); + if (newWindow) { process = Process.Start(new ProcessStartInfo @@ -99,20 +103,20 @@ namespace GodotTools this.editorId = editorId; } - private static readonly IReadOnlyDictionary<EditorId, string> CodeEditorPaths; - private static readonly IReadOnlyDictionary<EditorId, string> CodeEditorBundleIds; + private static readonly IReadOnlyDictionary<EditorId, string> ExecutableNames; + private static readonly IReadOnlyDictionary<EditorId, string> BundleIds; static MonoDevelopInstance() { if (Utils.OS.IsOSX()) { - CodeEditorPaths = new Dictionary<EditorId, string> + ExecutableNames = new Dictionary<EditorId, string> { // Rely on PATH {EditorId.MonoDevelop, "monodevelop"}, {EditorId.VisualStudioForMac, "VisualStudio"} }; - CodeEditorBundleIds = new Dictionary<EditorId, string> + BundleIds = new Dictionary<EditorId, string> { // TODO EditorId.MonoDevelop {EditorId.VisualStudioForMac, "com.microsoft.visual-studio"} @@ -120,7 +124,7 @@ namespace GodotTools } else if (Utils.OS.IsWindows()) { - CodeEditorPaths = new Dictionary<EditorId, string> + ExecutableNames = new Dictionary<EditorId, string> { // XamarinStudio is no longer a thing, and the latest version is quite old // MonoDevelop is available from source only on Windows. The recommendation @@ -131,7 +135,7 @@ namespace GodotTools } else if (Utils.OS.IsUnix()) { - CodeEditorPaths = new Dictionary<EditorId, string> + ExecutableNames = new Dictionary<EditorId, string> { // Rely on PATH {EditorId.MonoDevelop, "monodevelop"} diff --git a/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs b/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs index 3ae6c10bbf..288c65de74 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Utils/CollectionExtensions.cs @@ -10,8 +10,9 @@ namespace GodotTools.Utils { foreach (T elem in enumerable) { - if (predicate(elem) != null) - return elem; + T result = predicate(elem); + if (result != null) + return result; } return orElse; diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index 1a440e5ced..45037bf637 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -875,14 +875,14 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_proj_dir, Vect da->make_dir("Core"); da->make_dir("ObjectType"); - String core_dir = path_join(p_proj_dir, "Core"); - String obj_type_dir = path_join(p_proj_dir, "ObjectType"); + String core_dir = path::join(p_proj_dir, "Core"); + String obj_type_dir = path::join(p_proj_dir, "ObjectType"); // Generate source file for global scope constants and enums { StringBuilder constants_source; _generate_global_constants(constants_source); - String output_file = path_join(core_dir, BINDINGS_GLOBAL_SCOPE_CLASS "_constants.cs"); + String output_file = path::join(core_dir, BINDINGS_GLOBAL_SCOPE_CLASS "_constants.cs"); Error save_err = _save_file(output_file, constants_source); if (save_err != OK) return save_err; @@ -896,7 +896,7 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_proj_dir, Vect if (itype.api_type == ClassDB::API_EDITOR) continue; - String output_file = path_join(obj_type_dir, itype.proxy_name + ".cs"); + String output_file = path::join(obj_type_dir, itype.proxy_name + ".cs"); Error err = _generate_cs_type(itype, output_file); if (err == ERR_SKIP) @@ -917,7 +917,7 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_proj_dir, Vect const String &file_name = E->key(); const GodotCsCompressedFile &file_data = E->value(); - String output_file = path_join(core_dir, file_name); + String output_file = path::join(core_dir, file_name); Vector<uint8_t> data; data.resize(file_data.uncompressed_size); @@ -971,7 +971,7 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_proj_dir, Vect cs_icalls_content.append(INDENT1 CLOSE_BLOCK CLOSE_BLOCK); - String internal_methods_file = path_join(core_dir, BINDINGS_CLASS_NATIVECALLS ".cs"); + String internal_methods_file = path::join(core_dir, BINDINGS_CLASS_NATIVECALLS ".cs"); Error err = _save_file(internal_methods_file, cs_icalls_content); if (err != OK) @@ -996,8 +996,8 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_proj_dir, Ve da->make_dir("Core"); da->make_dir("ObjectType"); - String core_dir = path_join(p_proj_dir, "Core"); - String obj_type_dir = path_join(p_proj_dir, "ObjectType"); + String core_dir = path::join(p_proj_dir, "Core"); + String obj_type_dir = path::join(p_proj_dir, "ObjectType"); for (OrderedHashMap<StringName, TypeInterface>::Element E = obj_types.front(); E; E = E.next()) { const TypeInterface &itype = E.get(); @@ -1005,7 +1005,7 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_proj_dir, Ve if (itype.api_type != ClassDB::API_EDITOR) continue; - String output_file = path_join(obj_type_dir, itype.proxy_name + ".cs"); + String output_file = path::join(obj_type_dir, itype.proxy_name + ".cs"); Error err = _generate_cs_type(itype, output_file); if (err == ERR_SKIP) @@ -1051,7 +1051,7 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_proj_dir, Ve cs_icalls_content.append(INDENT1 CLOSE_BLOCK CLOSE_BLOCK); - String internal_methods_file = path_join(core_dir, BINDINGS_CLASS_NATIVECALLS_EDITOR ".cs"); + String internal_methods_file = path::join(core_dir, BINDINGS_CLASS_NATIVECALLS_EDITOR ".cs"); Error err = _save_file(internal_methods_file, cs_icalls_content); if (err != OK) @@ -1064,7 +1064,7 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_proj_dir, Ve Error BindingsGenerator::generate_cs_api(const String &p_output_dir) { - String output_dir = DirAccess::get_full_path(p_output_dir, DirAccess::ACCESS_FILESYSTEM); + String output_dir = path::abspath(path::realpath(p_output_dir)); DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); ERR_FAIL_COND_V(!da, ERR_CANT_CREATE); @@ -1862,7 +1862,7 @@ Error BindingsGenerator::generate_glue(const String &p_output_dir) { output.append("\n#endif // MONO_GLUE_ENABLED\n"); - Error save_err = _save_file(path_join(p_output_dir, "mono_glue.gen.cpp"), output); + Error save_err = _save_file(path::join(p_output_dir, "mono_glue.gen.cpp"), output); if (save_err != OK) return save_err; @@ -2192,7 +2192,7 @@ void BindingsGenerator::_populate_object_type_interfaces() { itype.base_name = ClassDB::get_parent_class(type_cname); itype.is_singleton = Engine::get_singleton()->has_singleton(itype.proxy_name); - itype.is_instantiable = ClassDB::can_instance(type_cname) && !itype.is_singleton; + itype.is_instantiable = class_info->creation_func && !itype.is_singleton; itype.is_reference = ClassDB::is_parent_class(type_cname, name_cache.type_Reference); itype.memory_own = itype.is_reference; diff --git a/modules/mono/editor/editor_internal_calls.cpp b/modules/mono/editor/editor_internal_calls.cpp index a3b5b450ef..0014aaca70 100644 --- a/modules/mono/editor/editor_internal_calls.cpp +++ b/modules/mono/editor/editor_internal_calls.cpp @@ -30,7 +30,6 @@ #include "editor_internal_calls.h" -#include "core/message_queue.h" #include "core/os/os.h" #include "core/version.h" #include "editor/editor_node.h" @@ -231,24 +230,34 @@ uint32_t godot_icall_GodotSharpExport_GetExportedAssemblyDependencies(MonoString return GodotSharpExport::get_exported_assembly_dependencies(project_dll_name, project_dll_src_path, build_config, custom_lib_dir, dependencies); } -float godot_icall_Internal_EditorScale() { +float godot_icall_Globals_EditorScale() { return EDSCALE; } -MonoObject *godot_icall_Internal_GlobalDef(MonoString *p_setting, MonoObject *p_default_value, MonoBoolean p_restart_if_changed) { +MonoObject *godot_icall_Globals_GlobalDef(MonoString *p_setting, MonoObject *p_default_value, MonoBoolean p_restart_if_changed) { String setting = GDMonoMarshal::mono_string_to_godot(p_setting); Variant default_value = GDMonoMarshal::mono_object_to_variant(p_default_value); Variant result = _GLOBAL_DEF(setting, default_value, (bool)p_restart_if_changed); return GDMonoMarshal::variant_to_mono_object(result); } -MonoObject *godot_icall_Internal_EditorDef(MonoString *p_setting, MonoObject *p_default_value, MonoBoolean p_restart_if_changed) { +MonoObject *godot_icall_Globals_EditorDef(MonoString *p_setting, MonoObject *p_default_value, MonoBoolean p_restart_if_changed) { String setting = GDMonoMarshal::mono_string_to_godot(p_setting); Variant default_value = GDMonoMarshal::mono_object_to_variant(p_default_value); - Variant result = _GLOBAL_DEF(setting, default_value, (bool)p_restart_if_changed); + Variant result = _EDITOR_DEF(setting, default_value, (bool)p_restart_if_changed); return GDMonoMarshal::variant_to_mono_object(result); } +MonoString *godot_icall_Globals_TTR(MonoString *p_text) { + String text = GDMonoMarshal::mono_string_to_godot(p_text); + return GDMonoMarshal::mono_string_from_godot(TTR(text)); +} + +MonoString *godot_icall_Internal_UpdateApiAssembliesFromPrebuilt() { + String error_str = GDMono::get_singleton()->update_api_assemblies_from_prebuilt(); + return GDMonoMarshal::mono_string_from_godot(error_str); +} + MonoString *godot_icall_Internal_FullTemplatesDir() { String full_templates_dir = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG); return GDMonoMarshal::mono_string_from_godot(full_templates_dir); @@ -269,18 +278,6 @@ MonoBoolean godot_icall_Internal_IsOsxAppBundleInstalled(MonoString *p_bundle_id #endif } -MonoBoolean godot_icall_Internal_MetadataIsApiAssemblyInvalidated(int32_t p_api_type) { - return GDMono::get_singleton()->metadata_is_api_assembly_invalidated((APIAssembly::Type)p_api_type); -} - -void godot_icall_Internal_MetadataSetApiAssemblyInvalidated(int32_t p_api_type, MonoBoolean p_invalidated) { - GDMono::get_singleton()->metadata_set_api_assembly_invalidated((APIAssembly::Type)p_api_type, (bool)p_invalidated); -} - -MonoBoolean godot_icall_Internal_IsMessageQueueFlushing() { - return (MonoBoolean)MessageQueue::get_singleton()->is_flushing(); -} - MonoBoolean godot_icall_Internal_GodotIs32Bits() { return sizeof(void *) == 4; } @@ -402,15 +399,10 @@ void register_editor_internal_calls() { mono_add_internal_call("GodotTools.GodotSharpExport::internal_GetExportedAssemblyDependencies", (void *)godot_icall_GodotSharpExport_GetExportedAssemblyDependencies); // Internals - mono_add_internal_call("GodotTools.Internals.Internal::internal_EditorScale", (void *)godot_icall_Internal_EditorScale); - mono_add_internal_call("GodotTools.Internals.Internal::internal_GlobalDef", (void *)godot_icall_Internal_GlobalDef); - mono_add_internal_call("GodotTools.Internals.Internal::internal_EditorDef", (void *)godot_icall_Internal_EditorDef); + mono_add_internal_call("GodotTools.Internals.Internal::internal_UpdateApiAssembliesFromPrebuilt", (void *)godot_icall_Internal_UpdateApiAssembliesFromPrebuilt); mono_add_internal_call("GodotTools.Internals.Internal::internal_FullTemplatesDir", (void *)godot_icall_Internal_FullTemplatesDir); mono_add_internal_call("GodotTools.Internals.Internal::internal_SimplifyGodotPath", (void *)godot_icall_Internal_SimplifyGodotPath); mono_add_internal_call("GodotTools.Internals.Internal::internal_IsOsxAppBundleInstalled", (void *)godot_icall_Internal_IsOsxAppBundleInstalled); - mono_add_internal_call("GodotTools.Internals.Internal::internal_MetadataIsApiAssemblyInvalidated", (void *)godot_icall_Internal_MetadataIsApiAssemblyInvalidated); - mono_add_internal_call("GodotTools.Internals.Internal::internal_MetadataSetApiAssemblyInvalidated", (void *)godot_icall_Internal_MetadataSetApiAssemblyInvalidated); - mono_add_internal_call("GodotTools.Internals.Internal::internal_IsMessageQueueFlushing", (void *)godot_icall_Internal_IsMessageQueueFlushing); mono_add_internal_call("GodotTools.Internals.Internal::internal_GodotIs32Bits", (void *)godot_icall_Internal_GodotIs32Bits); mono_add_internal_call("GodotTools.Internals.Internal::internal_GodotIsRealTDouble", (void *)godot_icall_Internal_GodotIsRealTDouble); mono_add_internal_call("GodotTools.Internals.Internal::internal_GodotMainIteration", (void *)godot_icall_Internal_GodotMainIteration); @@ -424,6 +416,12 @@ void register_editor_internal_calls() { mono_add_internal_call("GodotTools.Internals.Internal::internal_GetScriptsMetadataOrNothing", (void *)godot_icall_Internal_GetScriptsMetadataOrNothing); mono_add_internal_call("GodotTools.Internals.Internal::internal_MonoWindowsInstallRoot", (void *)godot_icall_Internal_MonoWindowsInstallRoot); + // Globals + mono_add_internal_call("GodotTools.Internals.Globals::internal_EditorScale", (void *)godot_icall_Globals_EditorScale); + mono_add_internal_call("GodotTools.Internals.Globals::internal_GlobalDef", (void *)godot_icall_Globals_GlobalDef); + mono_add_internal_call("GodotTools.Internals.Globals::internal_EditorDef", (void *)godot_icall_Globals_EditorDef); + mono_add_internal_call("GodotTools.Internals.Globals::internal_TTR", (void *)godot_icall_Globals_TTR); + // Utils.OS mono_add_internal_call("GodotTools.Utils.OS::GetPlatformName", (void *)godot_icall_Utils_OS_GetPlatformName); } diff --git a/modules/mono/glue/Managed/Files/Basis.cs b/modules/mono/glue/Managed/Files/Basis.cs index 9cc31a0557..5a6a5ff658 100644 --- a/modules/mono/glue/Managed/Files/Basis.cs +++ b/modules/mono/glue/Managed/Files/Basis.cs @@ -225,7 +225,7 @@ namespace Godot return orthonormalizedBasis.Quat(); } - internal void SetQuantScale(Quat quat, Vector3 scale) + internal void SetQuatScale(Quat quat, Vector3 scale) { SetDiagonal(scale); Rotate(quat); @@ -241,7 +241,6 @@ namespace Godot Row0 = new Vector3(diagonal.x, 0, 0); Row1 = new Vector3(0, diagonal.y, 0); Row2 = new Vector3(0, 0, diagonal.z); - } public real_t Determinant() diff --git a/modules/mono/glue/Managed/Files/Color.cs b/modules/mono/glue/Managed/Files/Color.cs index 84ff19fc54..da57a7f9ae 100644 --- a/modules/mono/glue/Managed/Files/Color.cs +++ b/modules/mono/glue/Managed/Files/Color.cs @@ -375,7 +375,7 @@ namespace Godot return c; } - public string ToHtml(bool include_alpha = true) + public string ToHtml(bool includeAlpha = true) { var txt = string.Empty; @@ -383,7 +383,7 @@ namespace Godot txt += ToHex32(g); txt += ToHex32(b); - if (include_alpha) + if (includeAlpha) txt = ToHex32(a) + txt; return txt; @@ -465,13 +465,13 @@ namespace Godot for (int i = 0; i < 2; i++) { - char[] c = { (char)0, (char)0 }; + char c; int lv = v & 0xF; if (lv < 10) - c[0] = (char)('0' + lv); + c = (char)('0' + lv); else - c[0] = (char)('a' + lv - 10); + c = (char)('a' + lv - 10); v >>= 4; ret = c + ret; @@ -490,12 +490,17 @@ namespace Godot bool alpha; - if (color.Length == 8) - alpha = true; - else if (color.Length == 6) - alpha = false; - else - return false; + switch (color.Length) + { + case 8: + alpha = true; + break; + case 6: + alpha = false; + break; + default: + return false; + } if (alpha) { diff --git a/modules/mono/glue/Managed/Files/Mathf.cs b/modules/mono/glue/Managed/Files/Mathf.cs index 2d8c63fe7f..6c1a51fcf9 100644 --- a/modules/mono/glue/Managed/Files/Mathf.cs +++ b/modules/mono/glue/Managed/Files/Mathf.cs @@ -185,6 +185,12 @@ namespace Godot return from + (to - from) * weight; } + public static real_t LerpAngle(real_t from, real_t to, real_t weight) { + real_t difference = (to - from) % Mathf.Tau; + real_t distance = ((2 * difference) % Mathf.Tau) - difference; + return from + distance * weight; + } + public static real_t Log(real_t s) { return (real_t)Math.Log(s); diff --git a/modules/mono/glue/Managed/Files/NodePath.cs b/modules/mono/glue/Managed/Files/NodePath.cs index 94a4ed1de9..4de4e1e6a9 100644 --- a/modules/mono/glue/Managed/Files/NodePath.cs +++ b/modules/mono/glue/Managed/Files/NodePath.cs @@ -55,7 +55,7 @@ namespace Godot get { return ptr; } } - public NodePath() : this(string.Empty) { } + public NodePath() : this(string.Empty) {} public NodePath(string path) { diff --git a/modules/mono/glue/Managed/Files/Quat.cs b/modules/mono/glue/Managed/Files/Quat.cs index 0d4349084a..f1d97b9b5c 100644 --- a/modules/mono/glue/Managed/Files/Quat.cs +++ b/modules/mono/glue/Managed/Files/Quat.cs @@ -95,6 +95,7 @@ namespace Godot return this / Length; } + [Obsolete("Set is deprecated. Use the Quat(" + nameof(real_t) + ", " + nameof(real_t) + ", " + nameof(real_t) + ", " + nameof(real_t) + ") constructor instead.", error: true)] public void Set(real_t x, real_t y, real_t z, real_t w) { this.x = x; @@ -103,16 +104,19 @@ namespace Godot this.w = w; } + [Obsolete("Set is deprecated. Use the Quat(" + nameof(Quat) + ") constructor instead.", error: true)] public void Set(Quat q) { this = q; } + [Obsolete("SetAxisAngle is deprecated. Use the Quat(" + nameof(Vector3) + ", " + nameof(real_t) + ") constructor instead.", error: true)] public void SetAxisAngle(Vector3 axis, real_t angle) { this = new Quat(axis, angle); } + [Obsolete("SetEuler is deprecated. Use the Quat(" + nameof(Vector3) + ") constructor instead.", error: true)] public void SetEuler(Vector3 eulerYXZ) { this = new Quat(eulerYXZ); @@ -229,9 +233,9 @@ namespace Godot public Quat(Vector3 eulerYXZ) { - real_t half_a1 = eulerYXZ.y * (real_t)0.5; - real_t half_a2 = eulerYXZ.x * (real_t)0.5; - real_t half_a3 = eulerYXZ.z * (real_t)0.5; + real_t half_a1 = eulerYXZ.y * 0.5f; + real_t half_a2 = eulerYXZ.x * 0.5f; + real_t half_a3 = eulerYXZ.z * 0.5f; // R = Y(a1).X(a2).Z(a3) convention for Euler angles. // Conversion to quaternion as listed in https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770024290.pdf (page A-6) @@ -246,7 +250,7 @@ namespace Godot x = sin_a1 * cos_a2 * sin_a3 + cos_a1 * sin_a2 * cos_a3; y = sin_a1 * cos_a2 * cos_a3 - cos_a1 * sin_a2 * sin_a3; - z = -sin_a1 * sin_a2 * cos_a3 + cos_a1 * cos_a2 * sin_a3; + z = cos_a1 * cos_a2 * sin_a3 - sin_a1 * sin_a2 * cos_a3; w = sin_a1 * sin_a2 * sin_a3 + cos_a1 * cos_a2 * cos_a3; } diff --git a/modules/mono/glue/Managed/Files/StringExtensions.cs b/modules/mono/glue/Managed/Files/StringExtensions.cs index b43034fbb5..6045c83e95 100644 --- a/modules/mono/glue/Managed/Files/StringExtensions.cs +++ b/modules/mono/glue/Managed/Files/StringExtensions.cs @@ -98,6 +98,66 @@ namespace Godot } // <summary> + // Return the amount of substrings in string. + // </summary> + public static int Count(this string instance, string what, bool caseSensitive = true, int from = 0, int to = 0) + { + if (what.Length == 0) + { + return 0; + } + + int len = instance.Length; + int slen = what.Length; + + if (len < slen) + { + return 0; + } + + string str; + + if (from >= 0 && to >= 0) + { + if (to == 0) + { + to = len; + } + else if (from >= to) + { + return 0; + } + if (from == 0 && to == len) + { + str = instance; + } + else + { + str = instance.Substring(from, to - from); + } + } + else + { + return 0; + } + + int c = 0; + int idx; + + do + { + idx = str.IndexOf(what, caseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase); + if (idx != -1) + { + str = str.Substring(idx + slen); + ++c; + } + } while (idx != -1); + + return c; + } + + // <summary> // Return a copy of the string with special characters escaped using the C language standard. // </summary> public static string CEscape(this string instance) diff --git a/modules/mono/glue/Managed/Files/Transform.cs b/modules/mono/glue/Managed/Files/Transform.cs index bd79144873..de70ccbe98 100644 --- a/modules/mono/glue/Managed/Files/Transform.cs +++ b/modules/mono/glue/Managed/Files/Transform.cs @@ -33,7 +33,7 @@ namespace Godot Vector3 destinationLocation = transform.origin; var interpolated = new Transform(); - interpolated.basis.SetQuantScale(sourceRotation.Slerp(destinationRotation, c).Normalized(), sourceScale.LinearInterpolate(destinationScale, c)); + interpolated.basis.SetQuatScale(sourceRotation.Slerp(destinationRotation, c).Normalized(), sourceScale.LinearInterpolate(destinationScale, c)); interpolated.origin = sourceLocation.LinearInterpolate(destinationLocation, c); return interpolated; diff --git a/modules/mono/glue/Managed/Files/Transform2D.cs b/modules/mono/glue/Managed/Files/Transform2D.cs index 33ff286769..12a3811230 100644 --- a/modules/mono/glue/Managed/Files/Transform2D.cs +++ b/modules/mono/glue/Managed/Files/Transform2D.cs @@ -98,6 +98,8 @@ namespace Godot return x[columnIndex]; case 1: return y[columnIndex]; + case 2: + return origin[columnIndex]; default: throw new IndexOutOfRangeException(); } @@ -112,6 +114,9 @@ namespace Godot case 1: y[columnIndex] = value; return; + case 2: + origin[columnIndex] = value; + return; default: throw new IndexOutOfRangeException(); } @@ -136,7 +141,7 @@ namespace Godot inv[0] *= new Vector2(detInv, -detInv); inv[1] *= new Vector2(-detInv, detInv); - inv[2] = BasisXform(-inv[2]); + inv[2] = inv.BasisXform(-inv[2]); return inv; } diff --git a/modules/mono/glue/Managed/Files/Vector2.cs b/modules/mono/glue/Managed/Files/Vector2.cs index a7f26283a7..3fb40d8a61 100644 --- a/modules/mono/glue/Managed/Files/Vector2.cs +++ b/modules/mono/glue/Managed/Files/Vector2.cs @@ -222,11 +222,13 @@ namespace Godot return new Vector2(Mathf.Round(x), Mathf.Round(y)); } + [Obsolete("Set is deprecated. Use the Vector2(" + nameof(real_t) + ", " + nameof(real_t) + ") constructor instead.", error: true)] public void Set(real_t x, real_t y) { this.x = x; this.y = y; } + [Obsolete("Set is deprecated. Use the Vector2(" + nameof(Vector2) + ") constructor instead.", error: true)] public void Set(Vector2 v) { x = v.x; diff --git a/modules/mono/glue/Managed/Files/Vector3.cs b/modules/mono/glue/Managed/Files/Vector3.cs index 16803ae55c..68601da1e7 100644 --- a/modules/mono/glue/Managed/Files/Vector3.cs +++ b/modules/mono/glue/Managed/Files/Vector3.cs @@ -248,12 +248,14 @@ namespace Godot return new Basis(axis, phi).Xform(this); } + [Obsolete("Set is deprecated. Use the Vector3(" + nameof(real_t) + ", " + nameof(real_t) + ", " + nameof(real_t) + ") constructor instead.", error: true)] public void Set(real_t x, real_t y, real_t z) { this.x = x; this.y = y; this.z = z; } + [Obsolete("Set is deprecated. Use the Vector3(" + nameof(Vector3) + ") constructor instead.", error: true)] public void Set(Vector3 v) { x = v.x; diff --git a/modules/mono/glue/base_object_glue.cpp b/modules/mono/glue/base_object_glue.cpp index 75b2dfce9a..6d85f55b97 100644 --- a/modules/mono/glue/base_object_glue.cpp +++ b/modules/mono/glue/base_object_glue.cpp @@ -219,7 +219,18 @@ MonoBoolean godot_icall_DynamicGodotObject_SetMember(Object *p_ptr, MonoString * } MonoString *godot_icall_Object_ToString(Object *p_ptr) { - return GDMonoMarshal::mono_string_from_godot(Variant(p_ptr).operator String()); +#ifdef DEBUG_ENABLED + // Cannot happen in C#; would get an ObjectDisposedException instead. + CRASH_COND(p_ptr == NULL); + + if (ScriptDebugger::get_singleton() && !Object::cast_to<Reference>(p_ptr)) { // Only if debugging! + // Cannot happen either in C#; the handle is nullified when the object is destroyed + CRASH_COND(!ObjectDB::instance_validate(p_ptr)); + } +#endif + + String result = "[" + p_ptr->get_class() + ":" + itos(p_ptr->get_instance_id()) + "]"; + return GDMonoMarshal::mono_string_from_godot(result); } void godot_register_object_icalls() { diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp index 7ae991eeaa..45f79074be 100644 --- a/modules/mono/mono_gd/gd_mono.cpp +++ b/modules/mono/mono_gd/gd_mono.cpp @@ -59,10 +59,6 @@ #include "android_mono_config.gen.h" #endif -#define OUT_OF_SYNC_ERR_MESSAGE(m_assembly_name) "The assembly '" m_assembly_name "' is out of sync. " \ - "This error is expected if you just upgraded to a newer Godot version. " \ - "Building the project will update the assembly to the correct version." - GDMono *GDMono::singleton = NULL; namespace { @@ -241,9 +237,9 @@ void GDMono::initialize() { locations.push_back("/usr/local/var/homebrew/linked/mono/"); for (int i = 0; i < locations.size(); i++) { - String hint_assembly_rootdir = path_join(locations[i], "lib"); - String hint_mscorlib_path = path_join(hint_assembly_rootdir, "mono", "4.5", "mscorlib.dll"); - String hint_config_dir = path_join(locations[i], "etc"); + String hint_assembly_rootdir = path::join(locations[i], "lib"); + String hint_mscorlib_path = path::join(hint_assembly_rootdir, "mono", "4.5", "mscorlib.dll"); + String hint_config_dir = path::join(locations[i], "etc"); if (FileAccess::exists(hint_mscorlib_path) && DirAccess::exists(hint_config_dir)) { assembly_rootdir = hint_assembly_rootdir; @@ -287,6 +283,18 @@ void GDMono::initialize() { add_mono_shared_libs_dir_to_path(); + { + PropertyInfo exc_policy_prop = PropertyInfo(Variant::INT, "mono/unhandled_exception_policy", PROPERTY_HINT_ENUM, + vformat("Terminate Application:%s,Log Error:%s", (int)POLICY_TERMINATE_APP, (int)POLICY_LOG_ERROR)); + unhandled_exception_policy = (UnhandledExceptionPolicy)(int)GLOBAL_DEF(exc_policy_prop.name, (int)POLICY_TERMINATE_APP); + ProjectSettings::get_singleton()->set_custom_property_info(exc_policy_prop.name, exc_policy_prop); + + if (Engine::get_singleton()->is_editor_hint()) { + // Unhandled exceptions should not terminate the editor + unhandled_exception_policy = POLICY_LOG_ERROR; + } + } + GDMonoAssembly::initialize(); gdmono_profiler_init(); @@ -304,26 +312,9 @@ void GDMono::initialize() { mono_install_unhandled_exception_hook(&unhandled_exception_hook, NULL); #ifndef TOOLS_ENABLED - if (!DirAccess::exists("res://.mono")) { - // 'res://.mono/' is missing so there is nothing to load. We don't need to initialize mono, but - // we still do so unless mscorlib is missing (which is the case for projects that don't use C#). - - String mscorlib_fname("mscorlib.dll"); - - Vector<String> search_dirs; - GDMonoAssembly::fill_search_dirs(search_dirs); - - bool found = false; - for (int i = 0; i < search_dirs.size(); i++) { - if (FileAccess::exists(search_dirs[i].plus_file(mscorlib_fname))) { - found = true; - break; - } - } - - if (!found) - return; // mscorlib is missing, do not initialize mono - } + // Export templates only load the Mono runtime if the project uses it + if (!DirAccess::exists("res://.mono")) + return; #endif root_domain = mono_jit_init_version("GodotEngine.RootDomain", "v4.0.30319"); @@ -354,63 +345,48 @@ void GDMono::initialize() { _register_internal_calls(); - // The following assemblies are not required at initialization -#ifdef MONO_GLUE_ENABLED - if (_load_api_assemblies()) { - // Everything is fine with the api assemblies, load the tools and project assemblies - -#if defined(TOOLS_ENABLED) - ERR_EXPLAIN("Mono: Failed to load GodotTools assemblies"); - ERR_FAIL_COND(!_load_tools_assemblies()); -#endif + print_verbose("Mono: INITIALIZED"); +} - _load_project_assembly(); +void GDMono::initialize_load_assemblies() { - } else { - if ((core_api_assembly && (core_api_assembly_out_of_sync || !GDMonoUtils::mono_cache.godot_api_cache_updated)) -#ifdef TOOLS_ENABLED - || (editor_api_assembly && editor_api_assembly_out_of_sync) +#ifndef MONO_GLUE_ENABLED + ERR_EXPLAIN("Mono: This binary was built with `mono_glue=no`; cannot load assemblies"); + CRASH_NOW(); #endif - ) { -#ifdef TOOLS_ENABLED - // The assembly was successfully loaded, but the full api could not be cached. - // This is most likely an outdated assembly loaded because of an invalid version in the - // metadata, so we invalidate the version in the metadata and unload the script domain. - - if (core_api_assembly_out_of_sync) { - ERR_PRINT(OUT_OF_SYNC_ERR_MESSAGE(CORE_API_ASSEMBLY_NAME)); - metadata_set_api_assembly_invalidated(APIAssembly::API_CORE, true); - } else if (!GDMonoUtils::mono_cache.godot_api_cache_updated) { - ERR_PRINT("The loaded assembly '" CORE_API_ASSEMBLY_NAME "' is in sync, but the cache update failed"); - metadata_set_api_assembly_invalidated(APIAssembly::API_CORE, true); - } - if (editor_api_assembly_out_of_sync) { - ERR_PRINT(OUT_OF_SYNC_ERR_MESSAGE(EDITOR_API_ASSEMBLY_NAME)); - metadata_set_api_assembly_invalidated(APIAssembly::API_EDITOR, true); - } + // Load assemblies. The API and tools assemblies are required, + // the application is aborted if these assemblies cannot be loaded. - print_line("Mono: Proceeding to unload scripts domain because of invalid API assemblies."); + _load_api_assemblies(); - Error err = _unload_scripts_domain(); - if (err != OK) { - WARN_PRINT("Mono: Failed to unload scripts domain"); - } -#else - ERR_PRINT("The loaded API assembly is invalid"); - CRASH_NOW(); -#endif // TOOLS_ENABLED - } +#if defined(TOOLS_ENABLED) + if (!_load_tools_assemblies()) { + ERR_EXPLAIN("Mono: Failed to load GodotTools assemblies"); + CRASH_NOW(); } -#else - print_verbose("Mono: Glue disabled, ignoring script assemblies."); -#endif // MONO_GLUE_ENABLED +#endif - print_verbose("Mono: INITIALIZED"); + // Load the project's main assembly. This doesn't necessarily need to succeed. + // The game may not be using .NET at all, or if the project does use .NET and + // we're running in the editor, it may just happen to be it wasn't built yet. + if (!_load_project_assembly()) { + if (OS::get_singleton()->is_stdout_verbose()) + print_error("Mono: Failed to load project assembly"); + } +} + +bool GDMono::_are_api_assemblies_out_of_sync() { + bool out_of_sync = core_api_assembly && (core_api_assembly_out_of_sync || !GDMonoUtils::mono_cache.godot_api_cache_updated); +#ifdef TOOLS_ENABLED + if (!out_of_sync) + out_of_sync = editor_api_assembly && editor_api_assembly_out_of_sync; +#endif + return out_of_sync; } -#ifdef MONO_GLUE_ENABLED namespace GodotSharpBindings { +#ifdef MONO_GLUE_ENABLED uint64_t get_core_api_hash(); #ifdef TOOLS_ENABLED @@ -419,13 +395,33 @@ uint64_t get_editor_api_hash(); uint32_t get_bindings_version(); void register_generated_icalls(); -} // namespace GodotSharpBindings + +#else + +uint64_t get_core_api_hash() { + CRASH_NOW(); + GD_UNREACHABLE(); +} +#ifdef TOOLS_ENABLED +uint64_t get_editor_api_hash() { + CRASH_NOW(); + GD_UNREACHABLE(); +} #endif +uint32_t get_bindings_version() { + CRASH_NOW(); + GD_UNREACHABLE(); +} + +void register_generated_icalls() { + /* Fine, just do nothing */ +} + +#endif // MONO_GLUE_ENABLED +} // namespace GodotSharpBindings void GDMono::_register_internal_calls() { -#ifdef MONO_GLUE_ENABLED GodotSharpBindings::register_generated_icalls(); -#endif } void GDMono::_initialize_and_check_api_hashes() { @@ -564,12 +560,22 @@ bool GDMono::_load_corlib_assembly() { return success; } -static bool copy_api_assembly(const String &p_src_dir, const String &p_dst_dir, const String &p_assembly_name, APIAssembly::Type p_api_type) { +#ifdef TOOLS_ENABLED +bool GDMono::copy_prebuilt_api_assembly(APIAssembly::Type p_api_type) { + + bool &api_assembly_out_of_sync = (p_api_type == APIAssembly::API_CORE) ? + GDMono::get_singleton()->core_api_assembly_out_of_sync : + GDMono::get_singleton()->editor_api_assembly_out_of_sync; + + String src_dir = GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug"); + String dst_dir = GodotSharpDirs::get_res_assemblies_dir(); + + String assembly_name = p_api_type == APIAssembly::API_CORE ? CORE_API_ASSEMBLY_NAME : EDITOR_API_ASSEMBLY_NAME; // Create destination directory if needed - if (!DirAccess::exists(p_dst_dir)) { - DirAccess *da = DirAccess::create_for_path(p_dst_dir); - Error err = da->make_dir_recursive(p_dst_dir); + if (!DirAccess::exists(dst_dir)) { + DirAccess *da = DirAccess::create_for_path(dst_dir); + Error err = da->make_dir_recursive(dst_dir); memdelete(da); if (err != OK) { @@ -578,21 +584,19 @@ static bool copy_api_assembly(const String &p_src_dir, const String &p_dst_dir, } } - String assembly_file = p_assembly_name + ".dll"; - String assembly_src = p_src_dir.plus_file(assembly_file); - String assembly_dst = p_dst_dir.plus_file(assembly_file); + String assembly_file = assembly_name + ".dll"; + String assembly_src = src_dir.plus_file(assembly_file); + String assembly_dst = dst_dir.plus_file(assembly_file); - if (!FileAccess::exists(assembly_dst) || - FileAccess::get_modified_time(assembly_src) > FileAccess::get_modified_time(assembly_dst) || - GDMono::get_singleton()->metadata_is_api_assembly_invalidated(p_api_type)) { + if (!FileAccess::exists(assembly_dst) || api_assembly_out_of_sync) { DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - String xml_file = p_assembly_name + ".xml"; - if (da->copy(p_src_dir.plus_file(xml_file), p_dst_dir.plus_file(xml_file)) != OK) + String xml_file = assembly_name + ".xml"; + if (da->copy(src_dir.plus_file(xml_file), dst_dir.plus_file(xml_file)) != OK) WARN_PRINTS("Failed to copy " + xml_file); - String pdb_file = p_assembly_name + ".pdb"; - if (da->copy(p_src_dir.plus_file(pdb_file), p_dst_dir.plus_file(pdb_file)) != OK) + String pdb_file = assembly_name + ".pdb"; + if (da->copy(src_dir.plus_file(pdb_file), dst_dir.plus_file(pdb_file)) != OK) WARN_PRINTS("Failed to copy " + pdb_file); Error err = da->copy(assembly_src, assembly_dst); @@ -602,47 +606,72 @@ static bool copy_api_assembly(const String &p_src_dir, const String &p_dst_dir, return false; } - GDMono::get_singleton()->metadata_set_api_assembly_invalidated(p_api_type, false); + api_assembly_out_of_sync = false; } return true; } +String GDMono::update_api_assemblies_from_prebuilt() { + +#define FAIL_REASON(m_out_of_sync, m_prebuilt_exists) \ + ( \ + (m_out_of_sync ? \ + String("The assembly is invalidated") : \ + String("The assembly was not found")) + \ + (m_prebuilt_exists ? \ + String(" and the prebuilt assemblies are missing") : \ + String(" and we failed to copy the prebuilt assemblies"))) + + bool api_assembly_out_of_sync = core_api_assembly_out_of_sync || editor_api_assembly_out_of_sync; + + String core_assembly_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(CORE_API_ASSEMBLY_NAME ".dll"); + String editor_assembly_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(EDITOR_API_ASSEMBLY_NAME ".dll"); + + if (!api_assembly_out_of_sync && FileAccess::exists(core_assembly_path) && FileAccess::exists(editor_assembly_path)) + return String(); // No update needed + + print_verbose("Updating API assemblies"); + + String prebuilt_api_dir = GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug"); + String prebuilt_core_dll_path = prebuilt_api_dir.plus_file(CORE_API_ASSEMBLY_NAME ".dll"); + String prebuilt_editor_dll_path = prebuilt_api_dir.plus_file(EDITOR_API_ASSEMBLY_NAME ".dll"); + + if (!FileAccess::exists(prebuilt_core_dll_path) || !FileAccess::exists(prebuilt_editor_dll_path)) + return FAIL_REASON(api_assembly_out_of_sync, /* prebuilt_exists: */ false); + + // Copy the prebuilt Api + if (!copy_prebuilt_api_assembly(APIAssembly::API_CORE) || !copy_prebuilt_api_assembly(APIAssembly::API_EDITOR)) + return FAIL_REASON(api_assembly_out_of_sync, /* prebuilt_exists: */ true); + + return String(); // Updated successfully + +#undef FAIL_REASON +} +#endif + bool GDMono::_load_core_api_assembly() { if (core_api_assembly) return true; #ifdef TOOLS_ENABLED - if (metadata_is_api_assembly_invalidated(APIAssembly::API_CORE)) { - String prebuilt_api_dir = GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug"); - String prebuilt_dll_path = prebuilt_api_dir.plus_file(CORE_API_ASSEMBLY_NAME ".dll"); - String invalidated_dll_path = get_invalidated_api_assembly_path(APIAssembly::API_CORE); - - if (!FileAccess::exists(prebuilt_dll_path) || - FileAccess::get_modified_time(invalidated_dll_path) == FileAccess::get_modified_time(prebuilt_dll_path)) { - print_verbose("Mono: Skipping loading of Core API assembly because it was invalidated"); - return false; - } else { - // Copy the prebuilt Api - String res_assemblies_dir = GodotSharpDirs::get_res_assemblies_dir(); - if (!copy_api_assembly(prebuilt_api_dir, res_assemblies_dir, CORE_API_ASSEMBLY_NAME, APIAssembly::API_CORE) || - !copy_api_assembly(prebuilt_api_dir, res_assemblies_dir, EDITOR_API_ASSEMBLY_NAME, APIAssembly::API_EDITOR)) { - print_verbose("Mono: Failed to copy prebuilt API. Skipping loading of Core API assembly because it was invalidated"); - return false; - } - } - } -#endif + // For the editor and the editor player we want to load it from a specific path to make sure we can keep it up to date + + // If running the project manager, load it from the prebuilt API directory + String assembly_dir = !Main::is_project_manager() ? + GodotSharpDirs::get_res_assemblies_dir() : + GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug"); - String assembly_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(CORE_API_ASSEMBLY_NAME ".dll"); + String assembly_path = assembly_dir.plus_file(CORE_API_ASSEMBLY_NAME ".dll"); - bool success = (FileAccess::exists(assembly_path) && - load_assembly_from(CORE_API_ASSEMBLY_NAME, assembly_path, &core_api_assembly)) || - load_assembly(CORE_API_ASSEMBLY_NAME, &core_api_assembly); + bool success = FileAccess::exists(assembly_path) && + load_assembly_from(CORE_API_ASSEMBLY_NAME, assembly_path, &core_api_assembly); +#else + bool success = load_assembly(CORE_API_ASSEMBLY_NAME, &core_api_assembly); +#endif if (success) { -#ifdef MONO_GLUE_ENABLED APIAssembly::Version api_assembly_ver = APIAssembly::Version::get_from_loaded_assembly(core_api_assembly, APIAssembly::API_CORE); core_api_assembly_out_of_sync = GodotSharpBindings::get_core_api_hash() != api_assembly_ver.godot_api_hash || GodotSharpBindings::get_bindings_version() != api_assembly_ver.bindings_version || @@ -652,9 +681,8 @@ bool GDMono::_load_core_api_assembly() { _install_trace_listener(); } -#else - GDMonoUtils::update_godot_api_cache(); -#endif + } else { + core_api_assembly_out_of_sync = false; } return success; @@ -666,44 +694,119 @@ bool GDMono::_load_editor_api_assembly() { if (editor_api_assembly) return true; - if (metadata_is_api_assembly_invalidated(APIAssembly::API_EDITOR)) { - String prebuilt_api_dir = GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug"); - String prebuilt_dll_path = prebuilt_api_dir.plus_file(EDITOR_API_ASSEMBLY_NAME ".dll"); - String invalidated_dll_path = get_invalidated_api_assembly_path(APIAssembly::API_EDITOR); + // For the editor and the editor player we want to load it from a specific path to make sure we can keep it up to date - if (!FileAccess::exists(prebuilt_dll_path) || - FileAccess::get_modified_time(invalidated_dll_path) == FileAccess::get_modified_time(prebuilt_dll_path)) { - print_verbose("Mono: Skipping loading of Editor API assembly because it was invalidated"); - return false; - } else { - // Copy the prebuilt editor Api (no need to copy the core api if we got to this point) - String res_assemblies_dir = GodotSharpDirs::get_res_assemblies_dir(); - if (!copy_api_assembly(prebuilt_api_dir, res_assemblies_dir, EDITOR_API_ASSEMBLY_NAME, APIAssembly::API_EDITOR)) { - print_verbose("Mono: Failed to copy prebuilt API. Skipping loading of Editor API assembly because it was invalidated"); - return false; - } - } - } + // If running the project manager, load it from the prebuilt API directory + String assembly_dir = !Main::is_project_manager() ? + GodotSharpDirs::get_res_assemblies_dir() : + GodotSharpDirs::get_data_editor_prebuilt_api_dir().plus_file("Debug"); - String assembly_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(EDITOR_API_ASSEMBLY_NAME ".dll"); + String assembly_path = assembly_dir.plus_file(EDITOR_API_ASSEMBLY_NAME ".dll"); - bool success = (FileAccess::exists(assembly_path) && - load_assembly_from(EDITOR_API_ASSEMBLY_NAME, assembly_path, &editor_api_assembly)) || - load_assembly(EDITOR_API_ASSEMBLY_NAME, &editor_api_assembly); + bool success = FileAccess::exists(assembly_path) && + load_assembly_from(EDITOR_API_ASSEMBLY_NAME, assembly_path, &editor_api_assembly); if (success) { -#ifdef MONO_GLUE_ENABLED APIAssembly::Version api_assembly_ver = APIAssembly::Version::get_from_loaded_assembly(editor_api_assembly, APIAssembly::API_EDITOR); editor_api_assembly_out_of_sync = GodotSharpBindings::get_editor_api_hash() != api_assembly_ver.godot_api_hash || GodotSharpBindings::get_bindings_version() != api_assembly_ver.bindings_version || CS_GLUE_VERSION != api_assembly_ver.cs_glue_version; -#endif + } else { + editor_api_assembly_out_of_sync = false; } return success; } #endif +bool GDMono::_try_load_api_assemblies() { + + if (!_load_core_api_assembly()) { + if (OS::get_singleton()->is_stdout_verbose()) + print_error("Mono: Failed to load Core API assembly"); + return false; + } + +#ifdef TOOLS_ENABLED + if (!_load_editor_api_assembly()) { + if (OS::get_singleton()->is_stdout_verbose()) + print_error("Mono: Failed to load Editor API assembly"); + return false; + } + + if (editor_api_assembly_out_of_sync) + return false; +#endif + + // Check if the core API assembly is out of sync only after trying to load the + // editor API assembly. Otherwise, if both assemblies are out of sync, we would + // only update the former as we won't know the latter also needs to be updated. + if (core_api_assembly_out_of_sync || !GDMonoUtils::mono_cache.godot_api_cache_updated) + return false; + + return true; +} + +void GDMono::_load_api_assemblies() { + + if (!_try_load_api_assemblies()) { +#ifdef TOOLS_ENABLED + // The API assemblies are out of sync. Fine, try one more time, but this time + // update them from the prebuilt assemblies directory before trying to load them. + + // Shouldn't happen. The project manager loads the prebuilt API assemblies + if (Main::is_project_manager()) { + ERR_EXPLAIN("Failed to load one of the prebuilt API assemblies"); + CRASH_NOW(); + } + + // 1. Unload the scripts domain + if (_unload_scripts_domain() != OK) { + ERR_EXPLAIN("Mono: Failed to unload scripts domain"); + CRASH_NOW(); + } + + // 2. Update the API assemblies + String update_error = update_api_assemblies_from_prebuilt(); + if (!update_error.empty()) { + ERR_EXPLAIN(update_error); + CRASH_NOW(); + } + + // 3. Load the scripts domain again + if (_load_scripts_domain() != OK) { + ERR_EXPLAIN("Mono: Failed to load scripts domain"); + CRASH_NOW(); + } + + // 4. Try loading the updated assemblies + if (!_try_load_api_assemblies()) { + // welp... too bad + + if (_are_api_assemblies_out_of_sync()) { + if (core_api_assembly_out_of_sync) { + ERR_PRINT("The assembly '" CORE_API_ASSEMBLY_NAME "' is out of sync"); + } else if (!GDMonoUtils::mono_cache.godot_api_cache_updated) { + ERR_PRINT("The loaded assembly '" CORE_API_ASSEMBLY_NAME "' is in sync, but the cache update failed"); + } + + if (editor_api_assembly_out_of_sync) { + ERR_PRINT("The assembly '" EDITOR_API_ASSEMBLY_NAME "' is out of sync"); + } + + CRASH_NOW(); + } else { + ERR_EXPLAIN("Failed to load one of the API assemblies"); + CRASH_NOW(); + } + } +#else + ERR_EXPLAIN("Failed to load one of the API assemblies"); + CRASH_NOW(); +#endif + } +} + #ifdef TOOLS_ENABLED bool GDMono::_load_tools_assemblies() { @@ -732,39 +835,11 @@ bool GDMono::_load_project_assembly() { if (success) { mono_assembly_set_main(project_assembly->get_assembly()); - } else { - if (OS::get_singleton()->is_stdout_verbose()) - print_error("Mono: Failed to load project assembly"); } return success; } -bool GDMono::_load_api_assemblies() { - - if (!_load_core_api_assembly()) { - if (OS::get_singleton()->is_stdout_verbose()) - print_error("Mono: Failed to load Core API assembly"); - return false; - } - - if (core_api_assembly_out_of_sync || !GDMonoUtils::mono_cache.godot_api_cache_updated) - return false; - -#ifdef TOOLS_ENABLED - if (!_load_editor_api_assembly()) { - if (OS::get_singleton()->is_stdout_verbose()) - print_error("Mono: Failed to load Editor API assembly"); - return false; - } - - if (editor_api_assembly_out_of_sync) - return false; -#endif - - return true; -} - void GDMono::_install_trace_listener() { #ifdef DEBUG_ENABLED @@ -782,78 +857,6 @@ void GDMono::_install_trace_listener() { #endif } -#ifdef TOOLS_ENABLED -String GDMono::_get_api_assembly_metadata_path() { - - return GodotSharpDirs::get_res_metadata_dir().plus_file("api_assemblies.cfg"); -} - -void GDMono::metadata_set_api_assembly_invalidated(APIAssembly::Type p_api_type, bool p_invalidated) { - - String section = APIAssembly::to_string(p_api_type); - String path = _get_api_assembly_metadata_path(); - - Ref<ConfigFile> metadata; - metadata.instance(); - metadata->load(path); - - metadata->set_value(section, "invalidated", p_invalidated); - - String assembly_path = GodotSharpDirs::get_res_assemblies_dir() - .plus_file(p_api_type == APIAssembly::API_CORE ? - CORE_API_ASSEMBLY_NAME ".dll" : - EDITOR_API_ASSEMBLY_NAME ".dll"); - - ERR_FAIL_COND(!FileAccess::exists(assembly_path)); - - uint64_t modified_time = FileAccess::get_modified_time(assembly_path); - - metadata->set_value(section, "invalidated_asm_modified_time", String::num_uint64(modified_time)); - - String dir = path.get_base_dir(); - if (!DirAccess::exists(dir)) { - DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - ERR_FAIL_COND(!da); - Error err = da->make_dir_recursive(ProjectSettings::get_singleton()->globalize_path(dir)); - ERR_FAIL_COND(err != OK); - } - - Error save_err = metadata->save(path); - ERR_FAIL_COND(save_err != OK); -} - -bool GDMono::metadata_is_api_assembly_invalidated(APIAssembly::Type p_api_type) { - - String section = APIAssembly::to_string(p_api_type); - - Ref<ConfigFile> metadata; - metadata.instance(); - metadata->load(_get_api_assembly_metadata_path()); - - String assembly_path = GodotSharpDirs::get_res_assemblies_dir() - .plus_file(p_api_type == APIAssembly::API_CORE ? - CORE_API_ASSEMBLY_NAME ".dll" : - EDITOR_API_ASSEMBLY_NAME ".dll"); - - if (!FileAccess::exists(assembly_path)) - return false; - - uint64_t modified_time = FileAccess::get_modified_time(assembly_path); - - uint64_t stored_modified_time = metadata->get_value(section, "invalidated_asm_modified_time", 0); - - return metadata->get_value(section, "invalidated", false) && modified_time <= stored_modified_time; -} - -String GDMono::get_invalidated_api_assembly_path(APIAssembly::Type p_api_type) { - - return GodotSharpDirs::get_res_assemblies_dir() - .plus_file(p_api_type == APIAssembly::API_CORE ? - CORE_API_ASSEMBLY_NAME ".dll" : - EDITOR_API_ASSEMBLY_NAME ".dll"); -} -#endif - Error GDMono::_load_scripts_domain() { ERR_FAIL_COND_V(scripts_domain != NULL, ERR_BUG); @@ -901,11 +904,6 @@ Error GDMono::_unload_scripts_domain() { tools_project_editor_assembly = NULL; #endif - core_api_assembly_out_of_sync = false; -#ifdef TOOLS_ENABLED - editor_api_assembly_out_of_sync = false; -#endif - MonoDomain *domain = scripts_domain; scripts_domain = NULL; @@ -942,57 +940,25 @@ Error GDMono::reload_scripts_domain() { return err; } -#ifdef MONO_GLUE_ENABLED - if (!_load_api_assemblies()) { - if ((core_api_assembly && (core_api_assembly_out_of_sync || !GDMonoUtils::mono_cache.godot_api_cache_updated)) -#ifdef TOOLS_ENABLED - || (editor_api_assembly && editor_api_assembly_out_of_sync) -#endif - ) { -#ifdef TOOLS_ENABLED - // The assembly was successfully loaded, but the full api could not be cached. - // This is most likely an outdated assembly loaded because of an invalid version in the - // metadata, so we invalidate the version in the metadata and unload the script domain. - - if (core_api_assembly_out_of_sync) { - ERR_PRINT(OUT_OF_SYNC_ERR_MESSAGE(CORE_API_ASSEMBLY_NAME)); - metadata_set_api_assembly_invalidated(APIAssembly::API_CORE, true); - } else if (!GDMonoUtils::mono_cache.godot_api_cache_updated) { - ERR_PRINT("The loaded Core API assembly is in sync, but the cache update failed"); - metadata_set_api_assembly_invalidated(APIAssembly::API_CORE, true); - } + // Load assemblies. The API and tools assemblies are required, + // the application is aborted if these assemblies cannot be loaded. - if (editor_api_assembly_out_of_sync) { - ERR_PRINT(OUT_OF_SYNC_ERR_MESSAGE(EDITOR_API_ASSEMBLY_NAME)); - metadata_set_api_assembly_invalidated(APIAssembly::API_EDITOR, true); - } + _load_api_assemblies(); - err = _unload_scripts_domain(); - if (err != OK) { - WARN_PRINT("Mono: Failed to unload scripts domain"); - } - - return ERR_CANT_RESOLVE; -#else - ERR_PRINT("The loaded API assembly is invalid"); - CRASH_NOW(); -#endif - } else { - return ERR_CANT_OPEN; - } +#if defined(TOOLS_ENABLED) + if (!_load_tools_assemblies()) { + ERR_EXPLAIN("Mono: Failed to load GodotTools assemblies"); + CRASH_NOW(); } - -#ifdef TOOLS_ENABLED - ERR_EXPLAIN("Mono: Failed to load GodotTools assemblies"); - ERR_FAIL_COND_V(!_load_tools_assemblies(), ERR_CANT_OPEN); #endif + // Load the project's main assembly. Here, during hot-reloading, we do + // consider failing to load the project's main assembly to be an error. + // However, unlike the API and tools assemblies, the application can continue working. if (!_load_project_assembly()) { + print_error("Mono: Failed to load project assembly"); return ERR_CANT_OPEN; } -#else - print_verbose("Mono: Glue disabled, ignoring script assemblies."); -#endif // MONO_GLUE_ENABLED return OK; } @@ -1129,6 +1095,8 @@ GDMono::GDMono() { #ifdef TOOLS_ENABLED api_editor_hash = 0; #endif + + unhandled_exception_policy = POLICY_TERMINATE_APP; } GDMono::~GDMono() { diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h index a926bf4126..c5bcce4fa1 100644 --- a/modules/mono/mono_gd/gd_mono.h +++ b/modules/mono/mono_gd/gd_mono.h @@ -80,6 +80,13 @@ String to_string(Type p_type); class GDMono { +public: + enum UnhandledExceptionPolicy { + POLICY_TERMINATE_APP, + POLICY_LOG_ERROR + }; + +private: bool runtime_initialized; bool finalizing_scripts_domain; @@ -102,8 +109,12 @@ class GDMono { HashMap<uint32_t, HashMap<String, GDMonoAssembly *> > assemblies; + UnhandledExceptionPolicy unhandled_exception_policy; + void _domain_assemblies_cleanup(uint32_t p_domain_id); + bool _are_api_assemblies_out_of_sync(); + bool _load_corlib_assembly(); bool _load_core_api_assembly(); #ifdef TOOLS_ENABLED @@ -112,11 +123,8 @@ class GDMono { #endif bool _load_project_assembly(); - bool _load_api_assemblies(); - -#ifdef TOOLS_ENABLED - String _get_api_assembly_metadata_path(); -#endif + bool _try_load_api_assemblies(); + void _load_api_assemblies(); void _install_trace_listener(); @@ -157,14 +165,15 @@ public: #endif #ifdef TOOLS_ENABLED - void metadata_set_api_assembly_invalidated(APIAssembly::Type p_api_type, bool p_invalidated); - bool metadata_is_api_assembly_invalidated(APIAssembly::Type p_api_type); - String get_invalidated_api_assembly_path(APIAssembly::Type p_api_type); + bool copy_prebuilt_api_assembly(APIAssembly::Type p_api_type); + String update_api_assemblies_from_prebuilt(); #endif static GDMono *get_singleton() { return singleton; } - static void unhandled_exception_hook(MonoObject *p_exc, void *p_user_data); + GD_NORETURN static void unhandled_exception_hook(MonoObject *p_exc, void *p_user_data); + + UnhandledExceptionPolicy get_unhandled_exception_policy() const { return unhandled_exception_policy; } // Do not use these, unless you know what you're doing void add_assembly(uint32_t p_domain_id, GDMonoAssembly *p_assembly); @@ -203,6 +212,7 @@ public: Error finalize_and_unload_domain(MonoDomain *p_domain); void initialize(); + void initialize_load_assemblies(); GDMono(); ~GDMono(); diff --git a/modules/mono/mono_gd/gd_mono_assembly.cpp b/modules/mono/mono_gd/gd_mono_assembly.cpp index 8e63ef3563..761c7f6fcb 100644 --- a/modules/mono/mono_gd/gd_mono_assembly.cpp +++ b/modules/mono/mono_gd/gd_mono_assembly.cpp @@ -46,20 +46,6 @@ bool GDMonoAssembly::in_preload = false; Vector<String> GDMonoAssembly::search_dirs; -static String _get_expected_api_build_config() { -#ifdef TOOLS_ENABLED - return "Debug"; -#else - -#ifdef DEBUG_ENABLED - return "Debug"; -#else - return "Release"; -#endif - -#endif -} - void GDMonoAssembly::fill_search_dirs(Vector<String> &r_search_dirs, const String &p_custom_config, const String &p_custom_bcl_dir) { String framework_dir; @@ -81,11 +67,14 @@ void GDMonoAssembly::fill_search_dirs(Vector<String> &r_search_dirs, const Strin r_search_dirs.push_back(GodotSharpDirs::get_res_temp_assemblies_dir()); } - String api_config = p_custom_config.empty() ? _get_expected_api_build_config() : - (p_custom_config == "Release" ? "Release" : "Debug"); - r_search_dirs.push_back(GodotSharpDirs::get_res_assemblies_base_dir().plus_file(api_config)); + if (p_custom_config.empty()) { + r_search_dirs.push_back(GodotSharpDirs::get_res_assemblies_dir()); + } else { + String api_config = p_custom_config == "Release" ? "Release" : "Debug"; + r_search_dirs.push_back(GodotSharpDirs::get_res_assemblies_base_dir().plus_file(api_config)); + } - r_search_dirs.push_back(GodotSharpDirs::get_res_assemblies_dir()); + r_search_dirs.push_back(GodotSharpDirs::get_res_assemblies_base_dir()); r_search_dirs.push_back(OS::get_singleton()->get_resource_dir()); r_search_dirs.push_back(OS::get_singleton()->get_executable_path().get_base_dir()); diff --git a/modules/mono/mono_gd/gd_mono_internals.cpp b/modules/mono/mono_gd/gd_mono_internals.cpp index a84332d4cd..e50e3b0794 100644 --- a/modules/mono/mono_gd/gd_mono_internals.cpp +++ b/modules/mono/mono_gd/gd_mono_internals.cpp @@ -108,9 +108,18 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged) { void unhandled_exception(MonoException *p_exc) { mono_unhandled_exception((MonoObject *)p_exc); // prints the exception as well - // Too bad 'mono_invoke_unhandled_exception_hook' is not exposed to embedders - GDMono::unhandled_exception_hook((MonoObject *)p_exc, NULL); - GD_UNREACHABLE(); + + if (GDMono::get_singleton()->get_unhandled_exception_policy() == GDMono::POLICY_TERMINATE_APP) { + // Too bad 'mono_invoke_unhandled_exception_hook' is not exposed to embedders + GDMono::unhandled_exception_hook((MonoObject *)p_exc, NULL); + GD_UNREACHABLE(); + } else { +#ifdef DEBUG_ENABLED + GDMonoUtils::debug_send_unhandled_exception_error((MonoException *)p_exc); + if (ScriptDebugger::get_singleton()) + ScriptDebugger::get_singleton()->idle_poll(); +#endif + } } } // namespace GDMonoInternals diff --git a/modules/mono/mono_gd/gd_mono_internals.h b/modules/mono/mono_gd/gd_mono_internals.h index 2d77bde27c..0d82723913 100644 --- a/modules/mono/mono_gd/gd_mono_internals.h +++ b/modules/mono/mono_gd/gd_mono_internals.h @@ -45,7 +45,7 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged); * Do not call this function directly. * Use GDMonoUtils::debug_unhandled_exception(MonoException *) instead. */ -GD_NORETURN void unhandled_exception(MonoException *p_exc); +void unhandled_exception(MonoException *p_exc); } // namespace GDMonoInternals diff --git a/modules/mono/mono_gd/gd_mono_utils.cpp b/modules/mono/mono_gd/gd_mono_utils.cpp index 5987fa8ebb..7afdfc8ac8 100644 --- a/modules/mono/mono_gd/gd_mono_utils.cpp +++ b/modules/mono/mono_gd/gd_mono_utils.cpp @@ -37,6 +37,10 @@ #include "core/project_settings.h" #include "core/reference.h" +#ifdef TOOLS_ENABLED +#include "editor/script_editor_debugger.h" +#endif + #include "../csharp_script.h" #include "../utils/macros.h" #include "../utils/mutex_utils.h" @@ -596,8 +600,14 @@ void debug_print_unhandled_exception(MonoException *p_exc) { void debug_send_unhandled_exception_error(MonoException *p_exc) { #ifdef DEBUG_ENABLED - if (!ScriptDebugger::get_singleton()) + if (!ScriptDebugger::get_singleton()) { +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + ERR_PRINTS(GDMonoUtils::get_exception_name_and_message(p_exc)); + } +#endif return; + } _TLS_RECURSION_GUARD_; @@ -621,7 +631,7 @@ void debug_send_unhandled_exception_error(MonoException *p_exc) { if (unexpected_exc) { GDMonoInternals::unhandled_exception(unexpected_exc); - GD_UNREACHABLE(); + return; } Vector<ScriptLanguage::StackInfo> _si; @@ -655,7 +665,6 @@ void debug_send_unhandled_exception_error(MonoException *p_exc) { void debug_unhandled_exception(MonoException *p_exc) { GDMonoInternals::unhandled_exception(p_exc); // prints the exception as well - GD_UNREACHABLE(); } void print_unhandled_exception(MonoException *p_exc) { @@ -665,11 +674,9 @@ void print_unhandled_exception(MonoException *p_exc) { void set_pending_exception(MonoException *p_exc) { #ifdef NO_PENDING_EXCEPTIONS debug_unhandled_exception(p_exc); - GD_UNREACHABLE(); #else if (get_runtime_invoke_count() == 0) { debug_unhandled_exception(p_exc); - GD_UNREACHABLE(); } if (!mono_runtime_set_pending_exception(p_exc, false)) { diff --git a/modules/mono/mono_gd/gd_mono_utils.h b/modules/mono/mono_gd/gd_mono_utils.h index f535fbb6d0..d73743bf0b 100644 --- a/modules/mono/mono_gd/gd_mono_utils.h +++ b/modules/mono/mono_gd/gd_mono_utils.h @@ -289,7 +289,7 @@ void set_exception_message(MonoException *p_exc, String message); void debug_print_unhandled_exception(MonoException *p_exc); void debug_send_unhandled_exception_error(MonoException *p_exc); -GD_NORETURN void debug_unhandled_exception(MonoException *p_exc); +void debug_unhandled_exception(MonoException *p_exc); void print_unhandled_exception(MonoException *p_exc); /** diff --git a/modules/mono/utils/path_utils.cpp b/modules/mono/utils/path_utils.cpp index 6e431f51e7..20863b1afe 100644 --- a/modules/mono/utils/path_utils.cpp +++ b/modules/mono/utils/path_utils.cpp @@ -36,16 +36,21 @@ #include "core/project_settings.h" #ifdef WINDOWS_ENABLED +#include <windows.h> + #define ENV_PATH_SEP ";" #else -#define ENV_PATH_SEP ":" #include <limits.h> +#include <unistd.h> + +#define ENV_PATH_SEP ":" #endif #include <stdlib.h> -String path_which(const String &p_name) { +namespace path { +String find_executable(const String &p_name) { #ifdef WINDOWS_ENABLED Vector<String> exts = OS::get_singleton()->get_environment("PATHEXT").split(ENV_PATH_SEP, false); #endif @@ -55,7 +60,7 @@ String path_which(const String &p_name) { return String(); for (int i = 0; i < env_path.size(); i++) { - String p = path_join(env_path[i], p_name); + String p = path::join(env_path[i], p_name); #ifdef WINDOWS_ENABLED for (int j = 0; j < exts.size(); j++) { @@ -73,42 +78,96 @@ String path_which(const String &p_name) { return String(); } -void fix_path(const String &p_path, String &r_out) { - r_out = p_path.replace("\\", "/"); +String cwd() { +#ifdef WINDOWS_ENABLED + const DWORD expected_size = ::GetCurrentDirectoryW(0, NULL); + + String buffer; + buffer.resize((int)expected_size); + if (::GetCurrentDirectoryW(expected_size, buffer.ptrw()) == 0) + return "."; + + return buffer.simplify_path(); +#else + char buffer[PATH_MAX]; + if (::getcwd(buffer, sizeof(buffer)) == NULL) + return "."; + + String result; + if (result.parse_utf8(buffer)) + return "."; - while (true) { // in case of using 2 or more slash - String compare = r_out.replace("//", "/"); - if (r_out == compare) - break; - else - r_out = compare; + return result.simplify_path(); +#endif +} + +String abspath(const String &p_path) { + if (p_path.is_abs_path()) { + return p_path.simplify_path(); + } else { + return path::join(path::cwd(), p_path).simplify_path(); } } -bool rel_path_to_abs(const String &p_existing_path, String &r_abs_path) { +String realpath(const String &p_path) { #ifdef WINDOWS_ENABLED - CharType ret[_MAX_PATH]; - if (::_wfullpath(ret, p_existing_path.c_str(), _MAX_PATH)) { - String abspath = String(ret).replace("\\", "/"); - int pos = abspath.find(":/"); - if (pos != -1) { - r_abs_path = abspath.substr(pos - 1, abspath.length()); - } else { - r_abs_path = abspath; - } - return true; - } -#else - char *resolved_path = ::realpath(p_existing_path.utf8().get_data(), NULL); - if (resolved_path) { - String retstr; - bool success = !retstr.parse_utf8(resolved_path); - ::free(resolved_path); - if (success) { - r_abs_path = retstr; - return true; - } + // Open file without read/write access + HANDLE hFile = ::CreateFileW(p_path.c_str(), 0, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + return p_path; + + const DWORD expected_size = ::GetFinalPathNameByHandleW(hFile, NULL, 0, FILE_NAME_NORMALIZED); + + if (expected_size == 0) { + ::CloseHandle(hFile); + return p_path; } + + String buffer; + buffer.resize((int)expected_size); + ::GetFinalPathNameByHandleW(hFile, buffer.ptrw(), expected_size, FILE_NAME_NORMALIZED); + + ::CloseHandle(hFile); + return buffer.simplify_path(); +#elif UNIX_ENABLED + char *resolved_path = ::realpath(p_path.utf8().get_data(), NULL); + + if (!resolved_path) + return p_path; + + String result; + bool parse_ok = result.parse_utf8(resolved_path); + ::free(resolved_path); + + if (parse_ok) + return p_path; + + return result.simplify_path(); #endif - return false; } + +String join(const String &p_a, const String &p_b) { + if (p_a.empty()) + return p_b; + + const CharType a_last = p_a[p_a.length() - 1]; + if ((a_last == '/' || a_last == '\\') || + (p_b.size() > 0 && (p_b[0] == '/' || p_b[0] == '\\'))) { + return p_a + p_b; + } + + return p_a + "/" + p_b; +} + +String join(const String &p_a, const String &p_b, const String &p_c) { + return path::join(path::join(p_a, p_b), p_c); +} + +String join(const String &p_a, const String &p_b, const String &p_c, const String &p_d) { + return path::join(path::join(path::join(p_a, p_b), p_c), p_d); +} + +} // namespace path diff --git a/modules/mono/utils/path_utils.h b/modules/mono/utils/path_utils.h index 69edf4deb7..ca25bc09f7 100644 --- a/modules/mono/utils/path_utils.h +++ b/modules/mono/utils/path_utils.h @@ -31,24 +31,32 @@ #ifndef PATH_UTILS_H #define PATH_UTILS_H +#include "core/string_builder.h" #include "core/ustring.h" -_FORCE_INLINE_ String path_join(const String &e1, const String &e2) { - return e1.plus_file(e2); -} +namespace path { -_FORCE_INLINE_ String path_join(const String &e1, const String &e2, const String &e3) { - return e1.plus_file(e2).plus_file(e3); -} +String join(const String &p_a, const String &p_b); +String join(const String &p_a, const String &p_b, const String &p_c); +String join(const String &p_a, const String &p_b, const String &p_c, const String &p_d); -_FORCE_INLINE_ String path_join(const String &e1, const String &e2, const String &e3, const String &e4) { - return e1.plus_file(e2).plus_file(e3).plus_file(e4); -} +String find_executable(const String &p_name); -String path_which(const String &p_name); +/// Returns a normalized absolute path to the current working directory +String cwd(); -void fix_path(const String &p_path, String &r_out); +/** + * Obtains a normalized absolute path to p_path. Symbolic links are + * not resolved. The path p_path might not exist in the file system. + */ +String abspath(const String &p_path); -bool rel_path_to_abs(const String &p_existing_path, String &r_abs_path); +/** + * Obtains a normalized path to p_path with symbolic links resolved. + * The resulting path might be either a relative or an absolute path. + */ +String realpath(const String &p_path); + +} // namespace path #endif // PATH_UTILS_H diff --git a/modules/opensimplex/doc_classes/NoiseTexture.xml b/modules/opensimplex/doc_classes/NoiseTexture.xml index 4826b6cd2a..4b59a380f5 100644 --- a/modules/opensimplex/doc_classes/NoiseTexture.xml +++ b/modules/opensimplex/doc_classes/NoiseTexture.xml @@ -20,7 +20,7 @@ <member name="height" type="int" setter="set_height" getter="get_height" default="512"> Height of the generated texture. </member> - <member name="noise" type="OpenSimplexNoise" setter="set_noise" getter="get_noise" default="null"> + <member name="noise" type="OpenSimplexNoise" setter="set_noise" getter="get_noise"> The [OpenSimplexNoise] instance used to generate the noise. </member> <member name="seamless" type="bool" setter="set_seamless" getter="get_seamless" default="false"> diff --git a/modules/recast/register_types.cpp b/modules/recast/register_types.cpp index 247d7f6144..44129fbb61 100644 --- a/modules/recast/register_types.cpp +++ b/modules/recast/register_types.cpp @@ -40,7 +40,14 @@ void register_recast_types() { #ifdef TOOLS_ENABLED EditorPlugins::add_by_type<NavigationMeshEditorPlugin>(); _nav_mesh_generator = memnew(EditorNavigationMeshGenerator); + + ClassDB::APIType prev_api = ClassDB::get_current_api(); + ClassDB::set_current_api(ClassDB::API_EDITOR); + ClassDB::register_class<EditorNavigationMeshGenerator>(); + + ClassDB::set_current_api(prev_api); + Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationMeshGenerator", EditorNavigationMeshGenerator::get_singleton())); #endif } diff --git a/modules/regex/SCsub b/modules/regex/SCsub index acbe4a5a01..1be5af02a5 100644 --- a/modules/regex/SCsub +++ b/modules/regex/SCsub @@ -33,6 +33,7 @@ if env['builtin_pcre2']: "pcre2_newline.c", "pcre2_ord2utf.c", "pcre2_pattern_info.c", + "pcre2_script_run.c", "pcre2_serialize.c", "pcre2_string_utils.c", "pcre2_study.c", diff --git a/modules/regex/doc_classes/RegExMatch.xml b/modules/regex/doc_classes/RegExMatch.xml index e279607d13..6dec9fc516 100644 --- a/modules/regex/doc_classes/RegExMatch.xml +++ b/modules/regex/doc_classes/RegExMatch.xml @@ -48,9 +48,7 @@ </method> </methods> <members> - <member name="names" type="Dictionary" setter="" getter="get_names" default="{ - -}"> + <member name="names" type="Dictionary" setter="" getter="get_names" default="{}"> A dictionary of named groups and its corresponding group number. Only groups with that were matched are included. If multiple groups have the same name, that name would refer to the first matching one. </member> <member name="strings" type="Array" setter="" getter="get_strings" default="[ ]"> diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp index ae542713ea..6a1b463305 100644 --- a/modules/theora/video_stream_theora.cpp +++ b/modules/theora/video_stream_theora.cpp @@ -499,7 +499,6 @@ void VideoStreamPlaybackTheora::update(float p_delta) { /*If we are too slow, reduce the pp level.*/ pp_inc = pp_level > 0 ? -1 : 0; } - } else { } } else { diff --git a/modules/vhacd/SCsub b/modules/vhacd/SCsub index e581fb7bb2..685976dc33 100644 --- a/modules/vhacd/SCsub +++ b/modules/vhacd/SCsub @@ -26,10 +26,6 @@ thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] env_vhacd.Prepend(CPPPATH=[thirdparty_dir + "/inc"]) -# upstream uses c++11 -if not env.msvc: - env_vhacd.Append(CXXFLAGS="-std=c++11") - env_thirdparty = env_vhacd.Clone() env_thirdparty.disable_warnings() env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) diff --git a/modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml b/modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml index 470a3a5e35..9e3670ec35 100644 --- a/modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml +++ b/modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml @@ -213,7 +213,11 @@ return t * t * (3.0 - 2.0 * t) [/codeblock] </constant> - <constant name="FUNC_MAX" value="65" enum="BuiltinFunc"> + <constant name="MATH_POSMOD" value="65" enum="BuiltinFunc"> + </constant> + <constant name="MATH_LERP_ANGLE" value="66" enum="BuiltinFunc"> + </constant> + <constant name="FUNC_MAX" value="67" enum="BuiltinFunc"> Represents the size of the [enum BuiltinFunc] enum. </constant> </constants> diff --git a/modules/visual_script/doc_classes/VisualScriptPreload.xml b/modules/visual_script/doc_classes/VisualScriptPreload.xml index 05ed0ad1e5..b3b39691c9 100644 --- a/modules/visual_script/doc_classes/VisualScriptPreload.xml +++ b/modules/visual_script/doc_classes/VisualScriptPreload.xml @@ -15,7 +15,7 @@ <methods> </methods> <members> - <member name="resource" type="Resource" setter="set_preload" getter="get_preload" default="null"> + <member name="resource" type="Resource" setter="set_preload" getter="get_preload"> The [Resource] to load. </member> </members> diff --git a/modules/visual_script/visual_script.cpp b/modules/visual_script/visual_script.cpp index b816e37936..4425565afa 100644 --- a/modules/visual_script/visual_script.cpp +++ b/modules/visual_script/visual_script.cpp @@ -2629,8 +2629,6 @@ void VisualScriptLanguage::debug_get_globals(List<String> *p_locals, List<Varian } String VisualScriptLanguage::debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems, int p_max_depth) { - if (_debug_parse_err_node >= 0) - return ""; return ""; } diff --git a/modules/visual_script/visual_script_builtin_funcs.cpp b/modules/visual_script/visual_script_builtin_funcs.cpp index 75b79f8929..8088a71198 100644 --- a/modules/visual_script/visual_script_builtin_funcs.cpp +++ b/modules/visual_script/visual_script_builtin_funcs.cpp @@ -104,6 +104,8 @@ const char *VisualScriptBuiltinFunc::func_name[VisualScriptBuiltinFunc::FUNC_MAX "bytes2var", "color_named", "smoothstep", + "posmod", + "lerp_angle", }; VisualScriptBuiltinFunc::BuiltinFunc VisualScriptBuiltinFunc::find_function(const String &p_string) { @@ -192,6 +194,7 @@ int VisualScriptBuiltinFunc::get_func_argument_count(BuiltinFunc p_func) { case MATH_ATAN2: case MATH_FMOD: case MATH_FPOSMOD: + case MATH_POSMOD: case MATH_POW: case MATH_EASE: case MATH_STEPIFY: @@ -205,6 +208,7 @@ int VisualScriptBuiltinFunc::get_func_argument_count(BuiltinFunc p_func) { case COLORN: return 2; case MATH_LERP: + case MATH_LERP_ANGLE: case MATH_INVERSE_LERP: case MATH_SMOOTHSTEP: case MATH_MOVE_TOWARD: @@ -261,7 +265,16 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const case MATH_ASIN: case MATH_ACOS: case MATH_ATAN: - case MATH_SQRT: { + case MATH_SQRT: + case MATH_FLOOR: + case MATH_CEIL: + case MATH_ROUND: + case MATH_ABS: + case MATH_SIGN: + case MATH_LOG: + case MATH_EXP: + case MATH_ISNAN: + case MATH_ISINF: { return PropertyInfo(Variant::REAL, "s"); } break; case MATH_ATAN2: { @@ -271,32 +284,25 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const return PropertyInfo(Variant::REAL, "x"); } break; case MATH_FMOD: - case MATH_FPOSMOD: { + case MATH_FPOSMOD: + case LOGIC_MAX: + case LOGIC_MIN: { if (p_idx == 0) - return PropertyInfo(Variant::REAL, "x"); + return PropertyInfo(Variant::REAL, "a"); else - return PropertyInfo(Variant::REAL, "y"); + return PropertyInfo(Variant::REAL, "b"); } break; - case MATH_FLOOR: - case MATH_CEIL: - case MATH_ROUND: - case MATH_ABS: - case MATH_SIGN: { - return PropertyInfo(Variant::REAL, "s"); - + case MATH_POSMOD: { + if (p_idx == 0) + return PropertyInfo(Variant::INT, "a"); + else + return PropertyInfo(Variant::INT, "b"); } break; - case MATH_POW: { if (p_idx == 0) - return PropertyInfo(Variant::REAL, "x"); + return PropertyInfo(Variant::REAL, "base"); else - return PropertyInfo(Variant::REAL, "y"); - } break; - case MATH_LOG: - case MATH_EXP: - case MATH_ISNAN: - case MATH_ISINF: { - return PropertyInfo(Variant::REAL, "s"); + return PropertyInfo(Variant::REAL, "exp"); } break; case MATH_EASE: { if (p_idx == 0) @@ -313,15 +319,10 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const else return PropertyInfo(Variant::REAL, "steps"); } break; - case MATH_LERP: { - if (p_idx == 0) - return PropertyInfo(Variant::REAL, "from"); - else if (p_idx == 1) - return PropertyInfo(Variant::REAL, "to"); - else - return PropertyInfo(Variant::REAL, "weight"); - } break; - case MATH_INVERSE_LERP: { + case MATH_LERP: + case MATH_LERP_ANGLE: + case MATH_INVERSE_LERP: + case MATH_SMOOTHSTEP: { if (p_idx == 0) return PropertyInfo(Variant::REAL, "from"); else if (p_idx == 1) @@ -341,14 +342,6 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const else return PropertyInfo(Variant::REAL, "ostop"); } break; - case MATH_SMOOTHSTEP: { - if (p_idx == 0) - return PropertyInfo(Variant::REAL, "from"); - else if (p_idx == 1) - return PropertyInfo(Variant::REAL, "to"); - else - return PropertyInfo(Variant::REAL, "weight"); - } break; case MATH_MOVE_TOWARD: { if (p_idx == 0) return PropertyInfo(Variant::REAL, "from"); @@ -365,12 +358,8 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const else return PropertyInfo(Variant::REAL, "step"); } break; - case MATH_RANDOMIZE: { - - } break; - case MATH_RAND: { - - } break; + case MATH_RANDOMIZE: + case MATH_RAND: case MATH_RANDF: { } break; @@ -380,9 +369,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const else return PropertyInfo(Variant::REAL, "to"); } break; - case MATH_SEED: { - return PropertyInfo(Variant::INT, "seed"); - } break; + case MATH_SEED: case MATH_RANDSEED: { return PropertyInfo(Variant::INT, "seed"); } break; @@ -418,26 +405,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const else return PropertyInfo(Variant::INT, "max"); } break; - case MATH_WRAPF: { - if (p_idx == 0) - return PropertyInfo(Variant::REAL, "value"); - else if (p_idx == 1) - return PropertyInfo(Variant::REAL, "min"); - else - return PropertyInfo(Variant::REAL, "max"); - } break; - case LOGIC_MAX: { - if (p_idx == 0) - return PropertyInfo(Variant::REAL, "a"); - else - return PropertyInfo(Variant::REAL, "b"); - } break; - case LOGIC_MIN: { - if (p_idx == 0) - return PropertyInfo(Variant::REAL, "a"); - else - return PropertyInfo(Variant::REAL, "b"); - } break; + case MATH_WRAPF: case LOGIC_CLAMP: { if (p_idx == 0) return PropertyInfo(Variant::REAL, "value"); @@ -450,20 +418,15 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const return PropertyInfo(Variant::INT, "value"); } break; case OBJ_WEAKREF: { - return PropertyInfo(Variant::OBJECT, "source"); - } break; case FUNC_FUNCREF: { - if (p_idx == 0) return PropertyInfo(Variant::OBJECT, "instance"); else return PropertyInfo(Variant::STRING, "funcname"); - } break; case TYPE_CONVERT: { - if (p_idx == 0) return PropertyInfo(Variant::NIL, "what"); else @@ -471,45 +434,24 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const } break; case TYPE_OF: { return PropertyInfo(Variant::NIL, "what"); - } break; case TYPE_EXISTS: { - return PropertyInfo(Variant::STRING, "type"); - } break; case TEXT_CHAR: { - return PropertyInfo(Variant::INT, "ascii"); - - } break; - case TEXT_STR: { - - return PropertyInfo(Variant::NIL, "value"); - - } break; - case TEXT_PRINT: { - - return PropertyInfo(Variant::NIL, "value"); - - } break; - case TEXT_PRINTERR: { - return PropertyInfo(Variant::NIL, "value"); - } break; + case TEXT_STR: + case TEXT_PRINT: + case TEXT_PRINTERR: case TEXT_PRINTRAW: { - return PropertyInfo(Variant::NIL, "value"); - - } break; - case VAR_TO_STR: { - return PropertyInfo(Variant::NIL, "var"); - } break; case STR_TO_VAR: { return PropertyInfo(Variant::STRING, "string"); } break; + case VAR_TO_STR: case VAR_TO_BYTES: { if (p_idx == 0) return PropertyInfo(Variant::NIL, "var"); @@ -525,12 +467,10 @@ PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const return PropertyInfo(Variant::BOOL, "allow_objects"); } break; case COLORN: { - if (p_idx == 0) return PropertyInfo(Variant::STRING, "name"); else return PropertyInfo(Variant::REAL, "alpha"); - } break; case FUNC_MAX: { } @@ -561,6 +501,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_output_value_port_info(int p_idx) cons case MATH_CEIL: { t = Variant::REAL; } break; + case MATH_POSMOD: case MATH_ROUND: { t = Variant::INT; } break; @@ -587,6 +528,7 @@ PropertyInfo VisualScriptBuiltinFunc::get_output_value_port_info(int p_idx) cons } break; case MATH_STEPIFY: case MATH_LERP: + case MATH_LERP_ANGLE: case MATH_INVERSE_LERP: case MATH_RANGE_LERP: case MATH_SMOOTHSTEP: @@ -806,6 +748,12 @@ void VisualScriptBuiltinFunc::exec_func(BuiltinFunc p_func, const Variant **p_in VALIDATE_ARG_NUM(1); *r_return = Math::fposmod((double)*p_inputs[0], (double)*p_inputs[1]); } break; + case VisualScriptBuiltinFunc::MATH_POSMOD: { + + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + *r_return = Math::posmod((int)*p_inputs[0], (int)*p_inputs[1]); + } break; case VisualScriptBuiltinFunc::MATH_FLOOR: { VALIDATE_ARG_NUM(0); @@ -905,6 +853,13 @@ void VisualScriptBuiltinFunc::exec_func(BuiltinFunc p_func, const Variant **p_in VALIDATE_ARG_NUM(2); *r_return = Math::lerp((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]); } break; + case VisualScriptBuiltinFunc::MATH_LERP_ANGLE: { + + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + VALIDATE_ARG_NUM(2); + *r_return = Math::lerp_angle((double)*p_inputs[0], (double)*p_inputs[1], (double)*p_inputs[2]); + } break; case VisualScriptBuiltinFunc::MATH_INVERSE_LERP: { VALIDATE_ARG_NUM(0); @@ -1417,6 +1372,8 @@ void VisualScriptBuiltinFunc::_bind_methods() { BIND_ENUM_CONSTANT(BYTES_TO_VAR); BIND_ENUM_CONSTANT(COLORN); BIND_ENUM_CONSTANT(MATH_SMOOTHSTEP); + BIND_ENUM_CONSTANT(MATH_POSMOD); + BIND_ENUM_CONSTANT(MATH_LERP_ANGLE); BIND_ENUM_CONSTANT(FUNC_MAX); } @@ -1454,6 +1411,7 @@ void register_visual_script_builtin_func_node() { VisualScriptLanguage::singleton->add_register_func("functions/built_in/sqrt", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SQRT>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/fmod", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FMOD>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/fposmod", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FPOSMOD>); + VisualScriptLanguage::singleton->add_register_func("functions/built_in/posmod", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_POSMOD>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/floor", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FLOOR>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/ceil", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_CEIL>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/round", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ROUND>); @@ -1469,6 +1427,7 @@ void register_visual_script_builtin_func_node() { VisualScriptLanguage::singleton->add_register_func("functions/built_in/decimals", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_DECIMALS>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/stepify", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_STEPIFY>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_LERP>); + VisualScriptLanguage::singleton->add_register_func("functions/built_in/lerp_angle", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_LERP_ANGLE>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/inverse_lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_INVERSE_LERP>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/range_lerp", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RANGE_LERP>); VisualScriptLanguage::singleton->add_register_func("functions/built_in/smoothstep", create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SMOOTHSTEP>); diff --git a/modules/visual_script/visual_script_builtin_funcs.h b/modules/visual_script/visual_script_builtin_funcs.h index f009f49b5b..cf475d675d 100644 --- a/modules/visual_script/visual_script_builtin_funcs.h +++ b/modules/visual_script/visual_script_builtin_funcs.h @@ -104,6 +104,8 @@ public: BYTES_TO_VAR, COLORN, MATH_SMOOTHSTEP, + MATH_POSMOD, + MATH_LERP_ANGLE, FUNC_MAX }; diff --git a/modules/visual_script/visual_script_editor.cpp b/modules/visual_script/visual_script_editor.cpp index 4579644d49..eef3f0f8ae 100644 --- a/modules/visual_script/visual_script_editor.cpp +++ b/modules/visual_script/visual_script_editor.cpp @@ -341,74 +341,74 @@ static Color _color_from_type(Variant::Type p_type, bool dark_theme = true) { Color color; if (dark_theme) switch (p_type) { - case Variant::NIL: color = Color::html("#69ecbd"); break; - - case Variant::BOOL: color = Color::html("#8da6f0"); break; - case Variant::INT: color = Color::html("#7dc6ef"); break; - case Variant::REAL: color = Color::html("#61daf4"); break; - case Variant::STRING: color = Color::html("#6ba7ec"); break; - - case Variant::VECTOR2: color = Color::html("#bd91f1"); break; - case Variant::RECT2: color = Color::html("#f191a5"); break; - case Variant::VECTOR3: color = Color::html("#d67dee"); break; - case Variant::TRANSFORM2D: color = Color::html("#c4ec69"); break; - case Variant::PLANE: color = Color::html("#f77070"); break; - case Variant::QUAT: color = Color::html("#ec69a3"); break; - case Variant::AABB: color = Color::html("#ee7991"); break; - case Variant::BASIS: color = Color::html("#e3ec69"); break; - case Variant::TRANSFORM: color = Color::html("#f6a86e"); break; - - case Variant::COLOR: color = Color::html("#9dff70"); break; - case Variant::NODE_PATH: color = Color::html("#6993ec"); break; - case Variant::_RID: color = Color::html("#69ec9a"); break; - case Variant::OBJECT: color = Color::html("#79f3e8"); break; - case Variant::DICTIONARY: color = Color::html("#77edb1"); break; - - case Variant::ARRAY: color = Color::html("#e0e0e0"); break; - case Variant::POOL_BYTE_ARRAY: color = Color::html("#aaf4c8"); break; - case Variant::POOL_INT_ARRAY: color = Color::html("#afdcf5"); break; - case Variant::POOL_REAL_ARRAY: color = Color::html("#97e7f8"); break; - case Variant::POOL_STRING_ARRAY: color = Color::html("#9dc4f2"); break; - case Variant::POOL_VECTOR2_ARRAY: color = Color::html("#d1b3f5"); break; - case Variant::POOL_VECTOR3_ARRAY: color = Color::html("#df9bf2"); break; - case Variant::POOL_COLOR_ARRAY: color = Color::html("#e9ff97"); break; + case Variant::NIL: color = Color(0.41, 0.93, 0.74); break; + + case Variant::BOOL: color = Color(0.55, 0.65, 0.94); break; + case Variant::INT: color = Color(0.49, 0.78, 0.94); break; + case Variant::REAL: color = Color(0.38, 0.85, 0.96); break; + case Variant::STRING: color = Color(0.42, 0.65, 0.93); break; + + case Variant::VECTOR2: color = Color(0.74, 0.57, 0.95); break; + case Variant::RECT2: color = Color(0.95, 0.57, 0.65); break; + case Variant::VECTOR3: color = Color(0.84, 0.49, 0.93); break; + case Variant::TRANSFORM2D: color = Color(0.77, 0.93, 0.41); break; + case Variant::PLANE: color = Color(0.97, 0.44, 0.44); break; + case Variant::QUAT: color = Color(0.93, 0.41, 0.64); break; + case Variant::AABB: color = Color(0.93, 0.47, 0.57); break; + case Variant::BASIS: color = Color(0.89, 0.93, 0.41); break; + case Variant::TRANSFORM: color = Color(0.96, 0.66, 0.43); break; + + case Variant::COLOR: color = Color(0.62, 1.0, 0.44); break; + case Variant::NODE_PATH: color = Color(0.41, 0.58, 0.93); break; + case Variant::_RID: color = Color(0.41, 0.93, 0.6); break; + case Variant::OBJECT: color = Color(0.47, 0.95, 0.91); break; + case Variant::DICTIONARY: color = Color(0.47, 0.93, 0.69); break; + + case Variant::ARRAY: color = Color(0.88, 0.88, 0.88); break; + case Variant::POOL_BYTE_ARRAY: color = Color(0.67, 0.96, 0.78); break; + case Variant::POOL_INT_ARRAY: color = Color(0.69, 0.86, 0.96); break; + case Variant::POOL_REAL_ARRAY: color = Color(0.59, 0.91, 0.97); break; + case Variant::POOL_STRING_ARRAY: color = Color(0.62, 0.77, 0.95); break; + case Variant::POOL_VECTOR2_ARRAY: color = Color(0.82, 0.7, 0.96); break; + case Variant::POOL_VECTOR3_ARRAY: color = Color(0.87, 0.61, 0.95); break; + case Variant::POOL_COLOR_ARRAY: color = Color(0.91, 1.0, 0.59); break; default: color.set_hsv(p_type / float(Variant::VARIANT_MAX), 0.7, 0.7); } else switch (p_type) { - case Variant::NIL: color = Color::html("#25e3a0"); break; - - case Variant::BOOL: color = Color::html("#6d8eeb"); break; - case Variant::INT: color = Color::html("#4fb2e9"); break; - case Variant::REAL: color = Color::html("#27ccf0"); break; - case Variant::STRING: color = Color::html("#4690e7"); break; - - case Variant::VECTOR2: color = Color::html("#ad76ee"); break; - case Variant::RECT2: color = Color::html("#ee758e"); break; - case Variant::VECTOR3: color = Color::html("#dc6aed"); break; - case Variant::TRANSFORM2D: color = Color::html("#96ce1a"); break; - case Variant::PLANE: color = Color::html("#f77070"); break; - case Variant::QUAT: color = Color::html("#ec69a3"); break; - case Variant::AABB: color = Color::html("#ee7991"); break; - case Variant::BASIS: color = Color::html("#b2bb19"); break; - case Variant::TRANSFORM: color = Color::html("#f49047"); break; - - case Variant::COLOR: color = Color::html("#3cbf00"); break; - case Variant::NODE_PATH: color = Color::html("#6993ec"); break; - case Variant::_RID: color = Color::html("#2ce573"); break; - case Variant::OBJECT: color = Color::html("#12d5c3"); break; - case Variant::DICTIONARY: color = Color::html("#57e99f"); break; - - case Variant::ARRAY: color = Color::html("#737373"); break; - case Variant::POOL_BYTE_ARRAY: color = Color::html("#61ea98"); break; - case Variant::POOL_INT_ARRAY: color = Color::html("#61baeb"); break; - case Variant::POOL_REAL_ARRAY: color = Color::html("#40d3f2"); break; - case Variant::POOL_STRING_ARRAY: color = Color::html("#609fea"); break; - case Variant::POOL_VECTOR2_ARRAY: color = Color::html("#9d5dea"); break; - case Variant::POOL_VECTOR3_ARRAY: color = Color::html("#ca5aea"); break; - case Variant::POOL_COLOR_ARRAY: color = Color::html("#92ba00"); break; + case Variant::NIL: color = Color(0.15, 0.89, 0.63); break; + + case Variant::BOOL: color = Color(0.43, 0.56, 0.92); break; + case Variant::INT: color = Color(0.31, 0.7, 0.91); break; + case Variant::REAL: color = Color(0.15, 0.8, 0.94); break; + case Variant::STRING: color = Color(0.27, 0.56, 0.91); break; + + case Variant::VECTOR2: color = Color(0.68, 0.46, 0.93); break; + case Variant::RECT2: color = Color(0.93, 0.46, 0.56); break; + case Variant::VECTOR3: color = Color(0.86, 0.42, 0.93); break; + case Variant::TRANSFORM2D: color = Color(0.59, 0.81, 0.1); break; + case Variant::PLANE: color = Color(0.97, 0.44, 0.44); break; + case Variant::QUAT: color = Color(0.93, 0.41, 0.64); break; + case Variant::AABB: color = Color(0.93, 0.47, 0.57); break; + case Variant::BASIS: color = Color(0.7, 0.73, 0.1); break; + case Variant::TRANSFORM: color = Color(0.96, 0.56, 0.28); break; + + case Variant::COLOR: color = Color(0.24, 0.75, 0.0); break; + case Variant::NODE_PATH: color = Color(0.41, 0.58, 0.93); break; + case Variant::_RID: color = Color(0.17, 0.9, 0.45); break; + case Variant::OBJECT: color = Color(0.07, 0.84, 0.76); break; + case Variant::DICTIONARY: color = Color(0.34, 0.91, 0.62); break; + + case Variant::ARRAY: color = Color(0.45, 0.45, 0.45); break; + case Variant::POOL_BYTE_ARRAY: color = Color(0.38, 0.92, 0.6); break; + case Variant::POOL_INT_ARRAY: color = Color(0.38, 0.73, 0.92); break; + case Variant::POOL_REAL_ARRAY: color = Color(0.25, 0.83, 0.95); break; + case Variant::POOL_STRING_ARRAY: color = Color(0.38, 0.62, 0.92); break; + case Variant::POOL_VECTOR2_ARRAY: color = Color(0.62, 0.36, 0.92); break; + case Variant::POOL_VECTOR3_ARRAY: color = Color(0.79, 0.35, 0.92); break; + case Variant::POOL_COLOR_ARRAY: color = Color(0.57, 0.73, 0.0); break; default: color.set_hsv(p_type / float(Variant::VARIANT_MAX), 0.3, 0.3); @@ -776,8 +776,8 @@ void VisualScriptEditor::_update_members() { TreeItem *functions = members->create_item(root); functions->set_selectable(0, false); functions->set_text(0, TTR("Functions:")); - functions->add_button(0, Control::get_icon("Override", "EditorIcons"), 1); - functions->add_button(0, Control::get_icon("Add", "EditorIcons"), 0); + functions->add_button(0, Control::get_icon("Override", "EditorIcons"), 1, false, TTR("Override an existing built-in function.")); + functions->add_button(0, Control::get_icon("Add", "EditorIcons"), 0, false, TTR("Create a new function.")); functions->set_custom_color(0, Control::get_color("mono_color", "Editor")); List<StringName> func_names; @@ -795,7 +795,7 @@ void VisualScriptEditor::_update_members() { TreeItem *variables = members->create_item(root); variables->set_selectable(0, false); variables->set_text(0, TTR("Variables:")); - variables->add_button(0, Control::get_icon("Add", "EditorIcons")); + variables->add_button(0, Control::get_icon("Add", "EditorIcons"), -1, false, TTR("Create a new variable.")); variables->set_custom_color(0, Control::get_color("mono_color", "Editor")); Ref<Texture> type_icons[Variant::VARIANT_MAX] = { @@ -848,7 +848,7 @@ void VisualScriptEditor::_update_members() { TreeItem *_signals = members->create_item(root); _signals->set_selectable(0, false); _signals->set_text(0, TTR("Signals:")); - _signals->add_button(0, Control::get_icon("Add", "EditorIcons")); + _signals->add_button(0, Control::get_icon("Add", "EditorIcons"), -1, false, TTR("Create a new signal.")); _signals->set_custom_color(0, Control::get_color("mono_color", "Editor")); List<StringName> signal_names; @@ -3054,19 +3054,19 @@ void VisualScriptEditor::_notification(int p_what) { List<Pair<String, Color> > colors; if (dark_theme) { - colors.push_back(Pair<String, Color>("flow_control", Color::html("#f4f4f4"))); - colors.push_back(Pair<String, Color>("functions", Color::html("#f58581"))); - colors.push_back(Pair<String, Color>("data", Color::html("#80f6cf"))); - colors.push_back(Pair<String, Color>("operators", Color::html("#ab97df"))); - colors.push_back(Pair<String, Color>("custom", Color::html("#80bbf6"))); - colors.push_back(Pair<String, Color>("constants", Color::html("#f680b0"))); + colors.push_back(Pair<String, Color>("flow_control", Color(0.96, 0.96, 0.96))); + colors.push_back(Pair<String, Color>("functions", Color(0.96, 0.52, 0.51))); + colors.push_back(Pair<String, Color>("data", Color(0.5, 0.96, 0.81))); + colors.push_back(Pair<String, Color>("operators", Color(0.67, 0.59, 0.87))); + colors.push_back(Pair<String, Color>("custom", Color(0.5, 0.73, 0.96))); + colors.push_back(Pair<String, Color>("constants", Color(0.96, 0.5, 0.69))); } else { - colors.push_back(Pair<String, Color>("flow_control", Color::html("#424242"))); - colors.push_back(Pair<String, Color>("functions", Color::html("#f26661"))); - colors.push_back(Pair<String, Color>("data", Color::html("#13bb83"))); - colors.push_back(Pair<String, Color>("operators", Color::html("#8265d0"))); - colors.push_back(Pair<String, Color>("custom", Color::html("#4ea0f2"))); - colors.push_back(Pair<String, Color>("constants", Color::html("#f02f7d"))); + colors.push_back(Pair<String, Color>("flow_control", Color(0.26, 0.26, 0.26))); + colors.push_back(Pair<String, Color>("functions", Color(0.95, 0.4, 0.38))); + colors.push_back(Pair<String, Color>("data", Color(0.07, 0.73, 0.51))); + colors.push_back(Pair<String, Color>("operators", Color(0.51, 0.4, 0.82))); + colors.push_back(Pair<String, Color>("custom", Color(0.31, 0.63, 0.95))); + colors.push_back(Pair<String, Color>("constants", Color(0.94, 0.18, 0.49))); } for (List<Pair<String, Color> >::Element *E = colors.front(); E; E = E->next()) { @@ -3670,7 +3670,6 @@ VisualScriptEditor::VisualScriptEditor() { new_virtual_method_select = memnew(VisualScriptPropertySelector); add_child(new_virtual_method_select); new_virtual_method_select->connect("selected", this, "_selected_new_virtual_method"); - new_virtual_method_select->get_cancel(); member_popup = memnew(PopupMenu); add_child(member_popup); diff --git a/modules/visual_script/visual_script_func_nodes.cpp b/modules/visual_script/visual_script_func_nodes.cpp index 0413bbf303..c330fa1bc0 100644 --- a/modules/visual_script/visual_script_func_nodes.cpp +++ b/modules/visual_script/visual_script_func_nodes.cpp @@ -1026,7 +1026,6 @@ void VisualScriptPropertySet::_adjust_input_index(PropertyInfo &pinfo) const { } PropertyInfo VisualScriptPropertySet::get_input_value_port_info(int p_idx) const { - if (call_mode == CALL_MODE_INSTANCE || call_mode == CALL_MODE_BASIC_TYPE) { if (p_idx == 0) { PropertyInfo pi; @@ -1037,6 +1036,16 @@ PropertyInfo VisualScriptPropertySet::get_input_value_port_info(int p_idx) const } } + List<PropertyInfo> props; + ClassDB::get_property_list(_get_base_type(), &props, true); + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + if (E->get().name == property) { + PropertyInfo pinfo = PropertyInfo(E->get().type, "value", PROPERTY_HINT_TYPE_STRING, E->get().hint_string); + _adjust_input_index(pinfo); + return pinfo; + } + } + PropertyInfo pinfo = type_cache; pinfo.name = "value"; _adjust_input_index(pinfo); @@ -1047,6 +1056,13 @@ PropertyInfo VisualScriptPropertySet::get_output_value_port_info(int p_idx) cons if (call_mode == CALL_MODE_BASIC_TYPE) { return PropertyInfo(basic_type, "out"); } else if (call_mode == CALL_MODE_INSTANCE) { + List<PropertyInfo> props; + ClassDB::get_property_list(_get_base_type(), &props, true); + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + if (E->get().name == property) { + return PropertyInfo(E->get().type, "pass", PROPERTY_HINT_TYPE_STRING, E->get().hint_string); + } + } return PropertyInfo(Variant::OBJECT, "pass", PROPERTY_HINT_TYPE_STRING, get_base_type()); } else { return PropertyInfo(); @@ -1796,14 +1812,12 @@ PropertyInfo VisualScriptPropertyGet::get_input_value_port_info(int p_idx) const } PropertyInfo VisualScriptPropertyGet::get_output_value_port_info(int p_idx) const { - - if (index != StringName()) { - - Variant v; - Variant::CallError ce; - v = Variant::construct(type_cache, NULL, 0, ce); - Variant i = v.get(index); - return PropertyInfo(i.get_type(), "value." + String(index)); + List<PropertyInfo> props; + ClassDB::get_property_list(_get_base_type(), &props, true); + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + if (E->get().name == property) { + return PropertyInfo(E->get().type, "value." + String(index)); + } } return PropertyInfo(type_cache, "value"); diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp index 1b0e41b2de..3b0210597b 100644 --- a/modules/visual_script/visual_script_nodes.cpp +++ b/modules/visual_script/visual_script_nodes.cpp @@ -197,7 +197,6 @@ String VisualScriptFunction::get_output_sequence_port_text(int p_port) const { PropertyInfo VisualScriptFunction::get_input_value_port_info(int p_idx) const { ERR_FAIL_V(PropertyInfo()); - return PropertyInfo(); } PropertyInfo VisualScriptFunction::get_output_value_port_info(int p_idx) const { @@ -418,7 +417,7 @@ PropertyInfo VisualScriptOperator::get_input_value_port_info(int p_idx) const { { Variant::NIL, Variant::NIL } //OP_IN, }; - ERR_FAIL_INDEX_V(p_idx, Variant::OP_MAX, PropertyInfo()); + ERR_FAIL_INDEX_V(p_idx, 2, PropertyInfo()); PropertyInfo pinfo; pinfo.name = p_idx == 0 ? "A" : "B"; diff --git a/modules/visual_script/visual_script_property_selector.cpp b/modules/visual_script/visual_script_property_selector.cpp index 1e7ed3019c..41828f040e 100644 --- a/modules/visual_script/visual_script_property_selector.cpp +++ b/modules/visual_script/visual_script_property_selector.cpp @@ -405,7 +405,7 @@ void VisualScriptPropertySelector::_item_selected() { String name = item->get_metadata(0); String class_type; - if (type) { + if (type != Variant::NIL) { class_type = Variant::get_type_name(type); } else { diff --git a/modules/webm/SCsub b/modules/webm/SCsub index e57437229f..32e6727656 100644 --- a/modules/webm/SCsub +++ b/modules/webm/SCsub @@ -17,10 +17,6 @@ thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] env_webm.Prepend(CPPPATH=[thirdparty_dir, thirdparty_dir + "libwebm/"]) -# upstream uses c++11 -if (not env_webm.msvc): - env_webm.Append(CXXFLAGS="-std=c++11") - # also requires libogg, libvorbis and libopus if env['builtin_libogg']: env_webm.Prepend(CPPPATH=["#thirdparty/libogg"]) diff --git a/modules/websocket/wsl_client.cpp b/modules/websocket/wsl_client.cpp index b2d865a58f..af75f2a320 100644 --- a/modules/websocket/wsl_client.cpp +++ b/modules/websocket/wsl_client.cpp @@ -92,6 +92,7 @@ void WSLClient::_do_handshake() { data->id = 1; _peer->make_context(data, _in_buf_size, _in_pkt_size, _out_buf_size, _out_pkt_size); _on_connect(protocol); + break; } _resp_pos += 1; } @@ -189,8 +190,8 @@ Error WSLClient::connect_to_host(String p_host, String p_path, uint16_t p_port, Error err = _tcp->connect_to_host(addr, p_port); if (err != OK) { - _on_error(); _tcp->disconnect_from_host(); + _on_error(); return err; } _connection = _tcp; @@ -229,8 +230,8 @@ void WSLClient::poll() { if (_peer->is_connected_to_host()) { _peer->poll(); if (!_peer->is_connected_to_host()) { - _on_disconnect(_peer->close_code != -1); disconnect_from_host(); + _on_disconnect(_peer->close_code != -1); } return; } @@ -241,8 +242,8 @@ void WSLClient::poll() { switch (_tcp->get_status()) { case StreamPeerTCP::STATUS_NONE: // Clean close - _on_error(); disconnect_from_host(); + _on_error(); break; case StreamPeerTCP::STATUS_CONNECTED: { Ref<StreamPeerSSL> ssl; @@ -254,8 +255,8 @@ void WSLClient::poll() { ERR_FAIL_COND(ssl.is_null()); ssl->set_blocking_handshake_enabled(false); if (ssl->connect_to_stream(_tcp, verify_ssl, _host) != OK) { - _on_error(); disconnect_from_host(); + _on_error(); return; } _connection = ssl; @@ -267,8 +268,8 @@ void WSLClient::poll() { if (ssl->get_status() == StreamPeerSSL::STATUS_HANDSHAKING) return; // Need more polling. else if (ssl->get_status() != StreamPeerSSL::STATUS_CONNECTED) { - _on_error(); disconnect_from_host(); + _on_error(); return; // Error. } } @@ -276,8 +277,8 @@ void WSLClient::poll() { _do_handshake(); } break; case StreamPeerTCP::STATUS_ERROR: - _on_error(); disconnect_from_host(); + _on_error(); break; case StreamPeerTCP::STATUS_CONNECTING: break; // Wait for connection diff --git a/modules/xatlas_unwrap/SCsub b/modules/xatlas_unwrap/SCsub index 50e3cb1551..b242fd4673 100644 --- a/modules/xatlas_unwrap/SCsub +++ b/modules/xatlas_unwrap/SCsub @@ -15,10 +15,6 @@ if env['builtin_xatlas']: env_xatlas_unwrap.Prepend(CPPPATH=[thirdparty_dir]) - # upstream uses c++11 - if (not env.msvc): - env_xatlas_unwrap.Append(CXXFLAGS="-std=c++11") - env_thirdparty = env_xatlas_unwrap.Clone() env_thirdparty.disable_warnings() env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) diff --git a/modules/xatlas_unwrap/register_types.cpp b/modules/xatlas_unwrap/register_types.cpp index 903b57f017..c18aa04336 100644 --- a/modules/xatlas_unwrap/register_types.cpp +++ b/modules/xatlas_unwrap/register_types.cpp @@ -39,57 +39,37 @@ extern bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const flo bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y) { //set up input mesh - xatlas::InputMesh input_mesh; - input_mesh.indexData = malloc(sizeof(int) * p_index_count); + xatlas::MeshDecl input_mesh; + input_mesh.indexData = p_indices; input_mesh.indexCount = p_index_count; - input_mesh.indexFormat = xatlas::IndexFormat::Float; //really xatlas? - input_mesh.faceMaterialData = (uint16_t *)malloc(sizeof(uint16_t) * p_index_count); - - for (int i = 0; i < p_index_count; i++) { - int *index = (int *)input_mesh.indexData; - index[i] = p_indices[i]; - } - for (int i = 0; i < p_index_count / 3; i++) { - uint16_t *mat_index = (uint16_t *)input_mesh.faceMaterialData; - mat_index[i] = p_face_materials[i]; - } + input_mesh.indexFormat = xatlas::IndexFormat::UInt32; input_mesh.vertexCount = p_vertex_count; - input_mesh.vertexPositionData = malloc(sizeof(float) * p_vertex_count * 3); + input_mesh.vertexPositionData = p_vertices; input_mesh.vertexPositionStride = sizeof(float) * 3; - input_mesh.vertexNormalData = malloc(sizeof(float) * p_vertex_count * 3); - input_mesh.vertexNormalStride = sizeof(float) * 3; - - //material is a better hint than this i guess? + input_mesh.vertexNormalData = p_normals; + input_mesh.vertexNormalStride = sizeof(uint32_t) * 3; input_mesh.vertexUvData = NULL; input_mesh.vertexUvStride = 0; - for (int i = 0; i < p_vertex_count * 3; i++) { - float *vertex_ptr = (float *)input_mesh.vertexPositionData; - float *normal_ptr = (float *)input_mesh.vertexNormalData; + xatlas::ChartOptions chart_options; + xatlas::PackOptions pack_options; - vertex_ptr[i] = p_vertices[i]; - normal_ptr[i] = p_normals[i]; - } - - xatlas::CharterOptions chart_options; - xatlas::PackerOptions pack_options; - - pack_options.method = xatlas::PackMethod::TexelArea; - pack_options.texelArea = 1.0 / p_texel_size; - pack_options.quality = 3; + pack_options.maxChartSize = 4096; + pack_options.bruteForce = true; + pack_options.texelsPerUnit = 1.0 / p_texel_size; xatlas::Atlas *atlas = xatlas::Create(); - printf("adding mesh..\n"); - xatlas::AddMeshError err = xatlas::AddMesh(atlas, input_mesh); - ERR_EXPLAINC(xatlas::StringForEnum(err.code)); - ERR_FAIL_COND_V(err.code != xatlas::AddMeshErrorCode::Success, false); + printf("Adding mesh..\n"); + xatlas::AddMeshError::Enum err = xatlas::AddMesh(atlas, input_mesh, 1); + ERR_EXPLAINC(xatlas::StringForEnum(err)); + ERR_FAIL_COND_V(err != xatlas::AddMeshError::Enum::Success, false); - printf("generate..\n"); - xatlas::Generate(atlas, chart_options, pack_options); + printf("Generate..\n"); + xatlas::Generate(atlas, chart_options, NULL, pack_options); - *r_size_hint_x = xatlas::GetWidth(atlas); - *r_size_hint_y = xatlas::GetHeight(atlas); + *r_size_hint_x = atlas->width; + *r_size_hint_y = atlas->height; float w = *r_size_hint_x; float h = *r_size_hint_y; @@ -98,39 +78,33 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver return false; //could not bake } - const xatlas::OutputMesh *const *output_meshes = xatlas::GetOutputMeshes(atlas); - - const xatlas::OutputMesh *output = output_meshes[0]; + const xatlas::Mesh &output = atlas->meshes[0]; - *r_vertex = (int *)malloc(sizeof(int) * output->vertexCount); - *r_uv = (float *)malloc(sizeof(float) * output->vertexCount * 2); - *r_index = (int *)malloc(sizeof(int) * output->indexCount); + *r_vertex = (int *)malloc(sizeof(int) * output.vertexCount); + *r_uv = (float *)malloc(sizeof(float) * output.vertexCount * 2); + *r_index = (int *)malloc(sizeof(int) * output.indexCount); float max_x = 0; float max_y = 0; - for (uint32_t i = 0; i < output->vertexCount; i++) { - (*r_vertex)[i] = output->vertexArray[i].xref; - (*r_uv)[i * 2 + 0] = output->vertexArray[i].uv[0] / w; - (*r_uv)[i * 2 + 1] = output->vertexArray[i].uv[1] / h; - max_x = MAX(max_x, output->vertexArray[i].uv[0]); - max_y = MAX(max_y, output->vertexArray[i].uv[1]); + for (uint32_t i = 0; i < output.vertexCount; i++) { + (*r_vertex)[i] = output.vertexArray[i].xref; + (*r_uv)[i * 2 + 0] = output.vertexArray[i].uv[0] / w; + (*r_uv)[i * 2 + 1] = output.vertexArray[i].uv[1] / h; + max_x = MAX(max_x, output.vertexArray[i].uv[0]); + max_y = MAX(max_y, output.vertexArray[i].uv[1]); } - printf("final texsize: %f,%f - max %f,%f\n", w, h, max_x, max_y); - *r_vertex_count = output->vertexCount; + printf("Final texture size: %f,%f - max %f,%f\n", w, h, max_x, max_y); + *r_vertex_count = output.vertexCount; - for (uint32_t i = 0; i < output->indexCount; i++) { - (*r_index)[i] = output->indexArray[i]; + for (uint32_t i = 0; i < output.indexCount; i++) { + (*r_index)[i] = output.indexArray[i]; } - *r_index_count = output->indexCount; + *r_index_count = output.indexCount; //xatlas::Destroy(atlas); - free((void *)input_mesh.indexData); - free((void *)input_mesh.vertexPositionData); - free((void *)input_mesh.vertexNormalData); - free((void *)input_mesh.faceMaterialData); - printf("done"); + printf("Done\n"); return true; } diff --git a/platform/SCsub b/platform/SCsub index aa83154ee0..20c89ae8c6 100644 --- a/platform/SCsub +++ b/platform/SCsub @@ -3,7 +3,8 @@ from compat import open_utf8 Import('env') -platform_sources = [] + +env.platform_sources = [] # Register platform-exclusive APIs reg_apis_inc = '#include "register_platform_apis.h"\n' @@ -11,7 +12,7 @@ reg_apis = 'void register_platform_apis() {\n' unreg_apis = 'void unregister_platform_apis() {\n' for platform in env.platform_apis: platform_dir = env.Dir(platform) - platform_sources.append(platform_dir.File('api/api.cpp')) + env.add_source_files(env.platform_sources, platform + '/api/api.cpp') reg_apis += '\tregister_' + platform + '_api();\n' unreg_apis += '\tunregister_' + platform + '_api();\n' reg_apis_inc += '#include "' + platform + '/api/api.h"\n' @@ -25,7 +26,7 @@ with open_utf8('register_platform_apis.gen.cpp', 'w') as f: f.write(reg_apis) f.write(unreg_apis) -platform_sources.append('register_platform_apis.gen.cpp') +env.add_source_files(env.platform_sources, 'register_platform_apis.gen.cpp') -lib = env.add_library('platform', platform_sources) +lib = env.add_library('platform', env.platform_sources) env.Prepend(LIBS=lib) diff --git a/platform/android/SCsub b/platform/android/SCsub index cf6752fa54..e355caf0f9 100644 --- a/platform/android/SCsub +++ b/platform/android/SCsub @@ -2,7 +2,6 @@ Import('env') -from compat import open_utf8 from distutils.version import LooseVersion from detect import get_ndk_version @@ -54,7 +53,6 @@ if lib_arch_dir != '': out_dir = '#platform/android/java/libs/' + lib_type_dir + '/' + lib_arch_dir env_android.Command(out_dir + '/libgodot_android.so', '#bin/libgodot' + env['SHLIBSUFFIX'], Move("$TARGET", "$SOURCE")) - ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"]) - if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"): - stl_lib_path = str(env['ANDROID_NDK_ROOT']) + '/sources/cxx-stl/llvm-libc++/libs/' + lib_arch_dir + '/libc++_shared.so' - env_android.Command(out_dir + '/libc++_shared.so', stl_lib_path, Copy("$TARGET", "$SOURCE")) + + stl_lib_path = str(env['ANDROID_NDK_ROOT']) + '/sources/cxx-stl/llvm-libc++/libs/' + lib_arch_dir + '/libc++_shared.so' + env_android.Command(out_dir + '/libc++_shared.so', stl_lib_path, Copy("$TARGET", "$SOURCE")) diff --git a/platform/android/detect.py b/platform/android/detect.py index 3f179e3a65..283791f336 100644 --- a/platform/android/detect.py +++ b/platform/android/detect.py @@ -28,7 +28,6 @@ def get_opts(): ('ndk_platform', 'Target platform (android-<api>, e.g. "android-18")', "android-18"), EnumVariable('android_arch', 'Target architecture', "armv7", ('armv7', 'arm64v8', 'x86', 'x86_64')), BoolVariable('android_neon', 'Enable NEON support (armv7 only)', True), - BoolVariable('android_stl', 'Enable Android STL support (for modules)', True) ] @@ -205,31 +204,29 @@ def configure(env): common_opts = ['-fno-integrated-as', '-gcc-toolchain', gcc_toolchain_path] - lib_sysroot = env["ANDROID_NDK_ROOT"] + "/platforms/" + env['ndk_platform'] + "/" + env['ARCH'] - ## Compile flags + + env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/include"]) + env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++abi/include"]) + env.Append(CXXFLAGS=["-std=gnu++14"]) + # Disable exceptions and rtti on non-tools (template) builds - if env['tools'] or env['android_stl']: - env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/include"]) - env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++abi/include"]) - env.Append(CXXFLAGS=['-frtti', "-std=gnu++14"]) + if env['tools']: + env.Append(CXXFLAGS=['-frtti']) else: env.Append(CXXFLAGS=['-fno-rtti', '-fno-exceptions']) # Don't use dynamic_cast, necessary with no-rtti. env.Append(CPPDEFINES=['NO_SAFE_CAST']) - ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"]) - if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"): - print("Using NDK unified headers") - sysroot = env["ANDROID_NDK_ROOT"] + "/sysroot" - env.Append(CPPFLAGS=["--sysroot=" + sysroot]) - env.Append(CPPFLAGS=["-isystem", sysroot + "/usr/include/" + abi_subpath]) - env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/android/support/include"]) - # For unified headers this define has to be set manually - env.Append(CPPDEFINES=[('__ANDROID_API__', str(get_platform(env['ndk_platform'])))]) - else: - print("Using NDK deprecated headers") - env.Append(CPPFLAGS=["-isystem", lib_sysroot + "/usr/include"]) + lib_sysroot = env["ANDROID_NDK_ROOT"] + "/platforms/" + env['ndk_platform'] + "/" + env['ARCH'] + + # Using NDK unified headers (NDK r15+) + sysroot = env["ANDROID_NDK_ROOT"] + "/sysroot" + env.Append(CPPFLAGS=["--sysroot=" + sysroot]) + env.Append(CPPFLAGS=["-isystem", sysroot + "/usr/include/" + abi_subpath]) + env.Append(CPPFLAGS=["-isystem", env["ANDROID_NDK_ROOT"] + "/sources/android/support/include"]) + # For unified headers this define has to be set manually + env.Append(CPPDEFINES=[('__ANDROID_API__', str(get_platform(env['ndk_platform'])))]) env.Append(CCFLAGS='-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -fvisibility=hidden -fno-strict-aliasing'.split()) env.Append(CPPDEFINES=['NO_STATVFS', 'GLES_ENABLED']) @@ -263,18 +260,15 @@ def configure(env): env.Append(CCFLAGS=common_opts) ## Link flags - if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("15.0.4075724"): - if LooseVersion(ndk_version) >= LooseVersion("17.1.4828580"): - env.Append(LINKFLAGS=['-Wl,--exclude-libs,libgcc.a', '-Wl,--exclude-libs,libatomic.a', '-nostdlib++']) - else: - env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libandroid_support.a"]) - env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel']) - env.Append(LIBPATH=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/"]) - env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] +"/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libc++_shared.so"]) + + ndk_version = get_ndk_version(env["ANDROID_NDK_ROOT"]) + if ndk_version != None and LooseVersion(ndk_version) >= LooseVersion("17.1.4828580"): + env.Append(LINKFLAGS=['-Wl,--exclude-libs,libgcc.a', '-Wl,--exclude-libs,libatomic.a', '-nostdlib++']) else: - env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel']) - if mt_link: - env.Append(LINKFLAGS=['-Wl,--threads']) + env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libandroid_support.a"]) + env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel']) + env.Append(LIBPATH=[env["ANDROID_NDK_ROOT"] + "/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/"]) + env.Append(LINKFLAGS=[env["ANDROID_NDK_ROOT"] +"/sources/cxx-stl/llvm-libc++/libs/" + arch_subpath + "/libc++_shared.so"]) if env["android_arch"] == "armv7": env.Append(LINKFLAGS='-Wl,--fix-cortex-a8'.split()) diff --git a/platform/iphone/camera_ios.mm b/platform/iphone/camera_ios.mm index 029ce6debf..ff84df66ff 100644 --- a/platform/iphone/camera_ios.mm +++ b/platform/iphone/camera_ios.mm @@ -158,7 +158,7 @@ } else if (dataCbCr == NULL) { print_line("Couldn't access CbCr pixel buffer data"); } else { - UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; Ref<Image> img[2]; { diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp index 85a45d62f8..a179b36bd5 100644 --- a/platform/iphone/export/export.cpp +++ b/platform/iphone/export/export.cpp @@ -768,7 +768,8 @@ Error EditorExportPlatformIOS::_export_additional_assets(const String &p_out_dir DirAccess *da = DirAccess::create_for_path(asset); if (!da) { memdelete(filesystem_da); - ERR_FAIL_COND_V(!da, ERR_CANT_CREATE); + ERR_EXPLAIN("Can't create directory: " + asset); + ERR_FAIL_V(ERR_CANT_CREATE); } bool file_exists = da->file_exists(asset); bool dir_exists = da->dir_exists(asset); diff --git a/platform/javascript/detect.py b/platform/javascript/detect.py index c6afa02c6d..ac43392700 100644 --- a/platform/javascript/detect.py +++ b/platform/javascript/detect.py @@ -69,9 +69,14 @@ def configure(env): exec(f.read(), em_config) except StandardError as e: raise RuntimeError("Emscripten configuration file '%s' is invalid:\n%s" % (em_config_file, e)) - if 'BINARYEN_ROOT' not in em_config and 'EMSCRIPTEN_ROOT' not in em_config: + if 'BINARYEN_ROOT' in em_config and os.path.isdir(os.path.join(em_config.get('BINARYEN_ROOT'), 'emscripten')): + # New style, emscripten path as a subfolder of BINARYEN_ROOT + env.PrependENVPath('PATH', os.path.join(em_config.get('BINARYEN_ROOT'), 'emscripten')) + elif 'EMSCRIPTEN_ROOT' in em_config: + # Old style (but can be there as a result from previous activation, so do last) + env.PrependENVPath('PATH', em_config.get('EMSCRIPTEN_ROOT')) + else: raise RuntimeError("'BINARYEN_ROOT' or 'EMSCRIPTEN_ROOT' missing in Emscripten configuration file '%s'" % em_config_file) - env.PrependENVPath('PATH', em_config.get('BINARYEN_ROOT', em_config.get('EMSCRIPTEN_ROOT'))) env['CC'] = 'emcc' env['CXX'] = 'em++' @@ -123,7 +128,6 @@ def configure(env): ## Link flags env.Append(LINKFLAGS=['-s', 'BINARYEN=1']) - env.Append(LINKFLAGS=['-s', 'BINARYEN_TRAP_MODE=\'clamp\'']) # Allow increasing memory buffer size during runtime. This is efficient # when using WebAssembly (in comparison to asm.js) and works well for diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp index d96ffc3a55..5363cd4af7 100644 --- a/platform/javascript/os_javascript.cpp +++ b/platform/javascript/os_javascript.cpp @@ -448,6 +448,18 @@ void OS_JavaScript::set_cursor_shape(CursorShape p_shape) { void OS_JavaScript::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { if (p_cursor.is_valid()) { + + Map<CursorShape, Vector<Variant> >::Element *cursor_c = cursors_cache.find(p_shape); + + if (cursor_c) { + if (cursor_c->get()[0] == p_cursor && cursor_c->get()[1] == p_hotspot) { + set_cursor_shape(p_shape); + return; + } + + cursors_cache.erase(p_shape); + } + Ref<Texture> texture = p_cursor; Ref<AtlasTexture> atlas_texture = p_cursor; Ref<Image> image; @@ -551,6 +563,11 @@ void OS_JavaScript::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_s cursors[p_shape] = url; + Vector<Variant> params; + params.push_back(p_cursor); + params.push_back(p_hotspot); + cursors_cache.insert(p_shape, params); + } else if (cursors[p_shape] != "") { /* clang-format off */ EM_ASM({ diff --git a/platform/javascript/os_javascript.h b/platform/javascript/os_javascript.h index 9635465c0d..10676c49f7 100644 --- a/platform/javascript/os_javascript.h +++ b/platform/javascript/os_javascript.h @@ -52,6 +52,7 @@ class OS_JavaScript : public OS_Unix { Ref<InputEventKey> deferred_key_event; CursorShape cursor_shape; String cursors[CURSOR_MAX]; + Map<CursorShape, Vector<Variant> > cursors_cache; Point2 touches[32]; Point2i last_click_pos; diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h index 1e996608af..a83d5084ed 100644 --- a/platform/osx/os_osx.h +++ b/platform/osx/os_osx.h @@ -119,6 +119,7 @@ public: CursorShape cursor_shape; NSCursor *cursors[CURSOR_MAX]; + Map<CursorShape, Vector<Variant> > cursors_cache; MouseMode mouse_mode; String title; diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 4f84ae9c50..a48f784529 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -1599,6 +1599,7 @@ void OS_OSX::finalize() { memdelete(joypad_osx); memdelete(input); + cursors_cache.clear(); visual_server->finish(); memdelete(visual_server); //memdelete(rasterizer); @@ -1770,7 +1771,20 @@ OS::CursorShape OS_OSX::get_cursor_shape() const { } void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { + if (p_cursor.is_valid()) { + + Map<CursorShape, Vector<Variant> >::Element *cursor_c = cursors_cache.find(p_shape); + + if (cursor_c) { + if (cursor_c->get()[0] == p_cursor && cursor_c->get()[1] == p_hotspot) { + set_cursor_shape(p_shape); + return; + } + + cursors_cache.erase(p_shape); + } + Ref<Texture> texture = p_cursor; Ref<AtlasTexture> atlas_texture = p_cursor; Ref<Image> image; @@ -1855,6 +1869,11 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c [cursors[p_shape] release]; cursors[p_shape] = cursor; + Vector<Variant> params; + params.push_back(p_cursor); + params.push_back(p_hotspot); + cursors_cache.insert(p_shape, params); + if (p_shape == cursor_shape) { if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) { [cursor set]; @@ -2392,7 +2411,7 @@ Size2 OS_OSX::get_min_window_size() const { void OS_OSX::set_min_window_size(const Size2 p_size) { if ((p_size != Size2()) && (max_size != Size2()) && ((p_size.x > max_size.x) || (p_size.y > max_size.y))) { - WARN_PRINT("Minimum window size can't be larger than maximum window size!"); + ERR_PRINT("Minimum window size can't be larger than maximum window size!"); return; } min_size = p_size; @@ -2408,7 +2427,7 @@ void OS_OSX::set_min_window_size(const Size2 p_size) { void OS_OSX::set_max_window_size(const Size2 p_size) { if ((p_size != Size2()) && ((p_size.x < min_size.x) || (p_size.y < min_size.y))) { - WARN_PRINT("Maximum window size can't be smaller than minimum window size!"); + ERR_PRINT("Maximum window size can't be smaller than minimum window size!"); return; } max_size = p_size; diff --git a/platform/server/os_server.cpp b/platform/server/os_server.cpp index 12e53054bc..87dc6421ac 100644 --- a/platform/server/os_server.cpp +++ b/platform/server/os_server.cpp @@ -88,6 +88,8 @@ Error OS_Server::initialize(const VideoMode &p_desired, int p_video_driver, int visual_server = memnew(VisualServerRaster); visual_server->init(); + camera_server = memnew(CameraServer); + AudioDriverManager::initialize(p_audio_driver); input = memnew(InputDefault); @@ -117,6 +119,8 @@ void OS_Server::finalize() { memdelete(input); + memdelete(camera_server); + memdelete(power_manager); ResourceLoader::remove_resource_format_loader(resource_loader_dummy); diff --git a/platform/server/os_server.h b/platform/server/os_server.h index e3488a693d..dbdae6afb1 100644 --- a/platform/server/os_server.h +++ b/platform/server/os_server.h @@ -74,6 +74,7 @@ class OS_Server : public OS_Unix { #endif CrashHandler crash_handler; + CameraServer *camera_server; int video_driver_index; diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp index abb7b391d3..75ce422e9e 100644 --- a/platform/uwp/export/export.cpp +++ b/platform/uwp/export/export.cpp @@ -519,7 +519,9 @@ Error AppxPackager::add_file(String p_file_name, const uint8_t *p_buffer, size_t int total_out_before = strm.total_out; - deflate(&strm, Z_FULL_FLUSH); + int err = deflate(&strm, Z_FULL_FLUSH); + ERR_FAIL_COND_V(err >= 0, ERR_BUG); // Negative means bug + bh.compressed_size = strm.total_out - total_out_before; //package->store_buffer(strm_out.ptr(), strm.total_out - total_out_before); diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 0a9cfc0214..07470cec92 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -1537,6 +1537,7 @@ void OS_Windows::finalize() { memdelete(camera_server); touch_state.clear(); + cursors_cache.clear(); visual_server->finish(); memdelete(visual_server); #ifdef OPENGL_ENABLED @@ -1812,7 +1813,7 @@ Size2 OS_Windows::get_min_window_size() const { void OS_Windows::set_min_window_size(const Size2 p_size) { if ((p_size != Size2()) && (max_size != Size2()) && ((p_size.x > max_size.x) || (p_size.y > max_size.y))) { - WARN_PRINT("Minimum window size can't be larger than maximum window size!"); + ERR_PRINT("Minimum window size can't be larger than maximum window size!"); return; } min_size = p_size; @@ -1821,7 +1822,7 @@ void OS_Windows::set_min_window_size(const Size2 p_size) { void OS_Windows::set_max_window_size(const Size2 p_size) { if ((p_size != Size2()) && ((p_size.x < min_size.x) || (p_size.y < min_size.y))) { - WARN_PRINT("Maximum window size can't be smaller than minimum window size!"); + ERR_PRINT("Maximum window size can't be smaller than minimum window size!"); return; } max_size = p_size; @@ -2251,9 +2252,17 @@ uint64_t OS_Windows::get_unix_time() const { FILETIME fep; SystemTimeToFileTime(&ep, &fep); - // FIXME: dereferencing type-punned pointer will break strict-aliasing rules (GCC warning) + // Type punning through unions (rather than pointer cast) as per: // https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime#remarks - return (*(uint64_t *)&ft - *(uint64_t *)&fep) / 10000000; + ULARGE_INTEGER ft_punning; + ft_punning.LowPart = ft.dwLowDateTime; + ft_punning.HighPart = ft.dwHighDateTime; + + ULARGE_INTEGER fep_punning; + fep_punning.LowPart = fep.dwLowDateTime; + fep_punning.HighPart = fep.dwHighDateTime; + + return (ft_punning.QuadPart - fep_punning.QuadPart) / 10000000; }; uint64_t OS_Windows::get_system_time_secs() const { @@ -2367,7 +2376,20 @@ OS::CursorShape OS_Windows::get_cursor_shape() const { } void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { + if (p_cursor.is_valid()) { + + Map<CursorShape, Vector<Variant> >::Element *cursor_c = cursors_cache.find(p_shape); + + if (cursor_c) { + if (cursor_c->get()[0] == p_cursor && cursor_c->get()[1] == p_hotspot) { + set_cursor_shape(p_shape); + return; + } + + cursors_cache.erase(p_shape); + } + Ref<Texture> texture = p_cursor; Ref<AtlasTexture> atlas_texture = p_cursor; Ref<Image> image; @@ -2450,6 +2472,11 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap cursors[p_shape] = CreateIconIndirect(&iconinfo); + Vector<Variant> params; + params.push_back(p_cursor); + params.push_back(p_hotspot); + cursors_cache.insert(p_shape, params); + if (p_shape == cursor_shape) { if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) { SetCursor(cursors[p_shape]); diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index fc8ad1b188..ce55328173 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -155,6 +155,7 @@ class OS_Windows : public OS { HCURSOR cursors[CURSOR_MAX] = { NULL }; CursorShape cursor_shape; + Map<CursorShape, Vector<Variant> > cursors_cache; InputDefault *input; JoypadWindows *joypad; diff --git a/platform/x11/joypad_linux.cpp b/platform/x11/joypad_linux.cpp index e6328ee14d..4242952374 100644 --- a/platform/x11/joypad_linux.cpp +++ b/platform/x11/joypad_linux.cpp @@ -513,6 +513,8 @@ void JoypadLinux::process_joypads() { break; default: + if (ev.code >= MAX_ABS) + return; if (joy->abs_map[ev.code] != -1 && joy->abs_info[ev.code]) { InputDefault::JoyAxis value = axis_correct(joy->abs_info[ev.code], ev.value); joy->curr_axis[joy->abs_map[ev.code]] = value; diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 624efe8815..0d1e702d04 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -788,6 +788,7 @@ void OS_X11::finalize() { memdelete(camera_server); + cursors_cache.clear(); visual_server->finish(); memdelete(visual_server); //memdelete(rasterizer); @@ -1265,7 +1266,7 @@ Size2 OS_X11::get_min_window_size() const { void OS_X11::set_min_window_size(const Size2 p_size) { if ((p_size != Size2()) && (max_size != Size2()) && ((p_size.x > max_size.x) || (p_size.y > max_size.y))) { - WARN_PRINT("Minimum window size can't be larger than maximum window size!"); + ERR_PRINT("Minimum window size can't be larger than maximum window size!"); return; } min_size = p_size; @@ -1294,7 +1295,7 @@ void OS_X11::set_min_window_size(const Size2 p_size) { void OS_X11::set_max_window_size(const Size2 p_size) { if ((p_size != Size2()) && ((p_size.x < min_size.x) || (p_size.y < min_size.y))) { - WARN_PRINT("Maximum window size can't be smaller than minimum window size!"); + ERR_PRINT("Maximum window size can't be smaller than minimum window size!"); return; } max_size = p_size; @@ -2878,7 +2879,20 @@ OS::CursorShape OS_X11::get_cursor_shape() const { } void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { + if (p_cursor.is_valid()) { + + Map<CursorShape, Vector<Variant> >::Element *cursor_c = cursors_cache.find(p_shape); + + if (cursor_c) { + if (cursor_c->get()[0] == p_cursor && cursor_c->get()[1] == p_hotspot) { + set_cursor_shape(p_shape); + return; + } + + cursors_cache.erase(p_shape); + } + Ref<Texture> texture = p_cursor; Ref<AtlasTexture> atlas_texture = p_cursor; Ref<Image> image; @@ -2947,6 +2961,11 @@ void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c // Save it for a further usage cursors[p_shape] = XcursorImageLoadCursor(x11_display, cursor_image); + Vector<Variant> params; + params.push_back(p_cursor); + params.push_back(p_hotspot); + cursors_cache.insert(p_shape, params); + if (p_shape == current_cursor) { if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) { XDefineCursor(x11_display, x11_window, cursors[p_shape]); diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index 510487b599..a4c22cf08a 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -170,6 +170,7 @@ class OS_X11 : public OS_Unix { Cursor cursors[CURSOR_MAX]; Cursor null_cursor; CursorShape current_cursor; + Map<CursorShape, Vector<Variant> > cursors_cache; InputDefault *input; diff --git a/platform/x11/power_x11.cpp b/platform/x11/power_x11.cpp index 758bd84114..c33c77e16b 100644 --- a/platform/x11/power_x11.cpp +++ b/platform/x11/power_x11.cpp @@ -268,9 +268,7 @@ bool PowerX11::GetPowerInfo_Linux_proc_acpi() { check_proc_acpi_battery(node.utf8().get_data(), &have_battery, &charging /*, seconds, percent*/); node = dirp->get_next(); } - memdelete(dirp); } - dirp->change_dir(proc_acpi_ac_adapter_path); err = dirp->list_dir_begin(); if (err != OK) { @@ -281,7 +279,6 @@ bool PowerX11::GetPowerInfo_Linux_proc_acpi() { check_proc_acpi_ac_adapter(node.utf8().get_data(), &have_ac); node = dirp->get_next(); } - memdelete(dirp); } if (!have_battery) { @@ -294,6 +291,7 @@ bool PowerX11::GetPowerInfo_Linux_proc_acpi() { this->power_state = OS::POWERSTATE_ON_BATTERY; } + memdelete(dirp); return true; /* definitive answer. */ } diff --git a/scene/2d/animated_sprite.cpp b/scene/2d/animated_sprite.cpp index b7ace804ef..83cc1eeb46 100644 --- a/scene/2d/animated_sprite.cpp +++ b/scene/2d/animated_sprite.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "animated_sprite.h" + #include "core/os/os.h" #include "scene/scene_string_names.h" @@ -356,12 +357,11 @@ void AnimatedSprite::_validate_property(PropertyInfo &property) const { } if (property.name == "frame") { - - property.hint = PROPERTY_HINT_SPRITE_FRAME; - + property.hint = PROPERTY_HINT_RANGE; if (frames->has_animation(animation) && frames->get_frame_count(animation) > 1) { property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; } + property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } } @@ -663,7 +663,7 @@ StringName AnimatedSprite::get_animation() const { String AnimatedSprite::get_configuration_warning() const { if (frames.is_null()) { - return TTR("A SpriteFrames resource must be created or set in the 'Frames' property in order for AnimatedSprite to display frames."); + return TTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite to display frames."); } return String(); @@ -709,7 +709,7 @@ void AnimatedSprite::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "animation"), "set_animation", "get_animation"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing"), "_set_playing", "_is_playing"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "centered"), "set_centered", "is_centered"); diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp index b701e84a9c..e9731f1cd4 100644 --- a/scene/2d/area_2d.cpp +++ b/scene/2d/area_2d.cpp @@ -672,8 +672,8 @@ void Area2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "gravity_distance_scale", PROPERTY_HINT_EXP_RANGE, "0,1024,0.001,or_greater"), "set_gravity_distance_scale", "get_gravity_distance_scale"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "gravity_vec"), "set_gravity_vector", "get_gravity_vector"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "gravity", PROPERTY_HINT_RANGE, "-1024,1024,0.001"), "set_gravity", "get_gravity"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "0,100,0.01,or_greater"), "set_linear_damp", "get_linear_damp"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_damp", PROPERTY_HINT_RANGE, "0,100,0.01,or_greater"), "set_angular_damp", "get_angular_damp"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "0,100,0.001,or_greater"), "set_linear_damp", "get_linear_damp"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_damp", PROPERTY_HINT_RANGE, "0,100,0.001,or_greater"), "set_angular_damp", "get_angular_damp"); ADD_PROPERTY(PropertyInfo(Variant::INT, "priority", PROPERTY_HINT_RANGE, "0,128,1"), "set_priority", "get_priority"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "monitoring"), "set_monitoring", "is_monitoring"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "monitorable"), "set_monitorable", "is_monitorable"); diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp index 23f6404e3e..7368efd21a 100644 --- a/scene/2d/canvas_item.cpp +++ b/scene/2d/canvas_item.cpp @@ -759,7 +759,7 @@ void CanvasItem::draw_multiline_colors(const Vector<Point2> &p_points, const Vec VisualServer::get_singleton()->canvas_item_add_multiline(canvas_item, p_points, p_colors, p_width, p_antialiased); } -void CanvasItem::draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled) { +void CanvasItem::draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled, float p_width, bool p_antialiased) { if (!drawing) { ERR_EXPLAIN("Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); @@ -767,13 +767,53 @@ void CanvasItem::draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_fil } if (p_filled) { + if (p_width != 1.0) { + WARN_PRINT("The draw_rect() \"width\" argument has no effect when \"filled\" is \"true\"."); + } + + if (p_antialiased) { + WARN_PRINT("The draw_rect() \"antialiased\" argument has no effect when \"filled\" is \"true\"."); + } VisualServer::get_singleton()->canvas_item_add_rect(canvas_item, p_rect, p_color); } else { - VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_rect.position, p_rect.position + Size2(p_rect.size.width, 0), p_color); - VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_rect.position, p_rect.position + Size2(0, p_rect.size.height), p_color); - VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_rect.position + Point2(0, p_rect.size.height), p_rect.position + p_rect.size, p_color); - VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_rect.position + Point2(p_rect.size.width, 0), p_rect.position + p_rect.size, p_color); + // Thick lines are offset depending on their width to avoid partial overlapping. + // Thin lines don't require an offset, so don't apply one in this case + float offset; + if (p_width >= 2) { + offset = p_width / 2.0; + } else { + offset = 0.0; + } + + VisualServer::get_singleton()->canvas_item_add_line( + canvas_item, + p_rect.position + Point2(-offset, 0), + p_rect.position + Size2(p_rect.size.width + offset, 0), + p_color, + p_width, + p_antialiased); + VisualServer::get_singleton()->canvas_item_add_line( + canvas_item, + p_rect.position + Point2(0, offset), + p_rect.position + Size2(0, p_rect.size.height - offset), + p_color, + p_width, + p_antialiased); + VisualServer::get_singleton()->canvas_item_add_line( + canvas_item, + p_rect.position + Point2(-offset, p_rect.size.height), + p_rect.position + Size2(p_rect.size.width + offset, p_rect.size.height), + p_color, + p_width, + p_antialiased); + VisualServer::get_singleton()->canvas_item_add_line( + canvas_item, + p_rect.position + Point2(p_rect.size.width, offset), + p_rect.position + Size2(p_rect.size.width, p_rect.size.height - offset), + p_color, + p_width, + p_antialiased); } } @@ -928,6 +968,9 @@ float CanvasItem::draw_char(const Ref<Font> &p_font, const Point2 &p_pos, const ERR_FAIL_COND_V(p_char.length() != 1, 0); ERR_FAIL_COND_V(p_font.is_null(), 0); + if (p_font->has_outline()) { + p_font->draw_char(canvas_item, p_pos, p_char[0], p_next.c_str()[0], Color(1, 1, 1), true); + } return p_font->draw_char(canvas_item, p_pos, p_char[0], p_next.c_str()[0], p_modulate); } @@ -1158,7 +1201,7 @@ void CanvasItem::_bind_methods() { ClassDB::bind_method(D_METHOD("draw_polyline_colors", "points", "colors", "width", "antialiased"), &CanvasItem::draw_polyline_colors, DEFVAL(1.0), DEFVAL(false)); ClassDB::bind_method(D_METHOD("draw_multiline", "points", "color", "width", "antialiased"), &CanvasItem::draw_multiline, DEFVAL(1.0), DEFVAL(false)); ClassDB::bind_method(D_METHOD("draw_multiline_colors", "points", "colors", "width", "antialiased"), &CanvasItem::draw_multiline_colors, DEFVAL(1.0), DEFVAL(false)); - ClassDB::bind_method(D_METHOD("draw_rect", "rect", "color", "filled"), &CanvasItem::draw_rect, DEFVAL(true)); + ClassDB::bind_method(D_METHOD("draw_rect", "rect", "color", "filled", "width", "antialiased"), &CanvasItem::draw_rect, DEFVAL(true), DEFVAL(1.0), DEFVAL(false)); ClassDB::bind_method(D_METHOD("draw_circle", "position", "radius", "color"), &CanvasItem::draw_circle); ClassDB::bind_method(D_METHOD("draw_texture", "texture", "position", "modulate", "normal_map"), &CanvasItem::draw_texture, DEFVAL(Color(1, 1, 1, 1)), DEFVAL(Variant())); ClassDB::bind_method(D_METHOD("draw_texture_rect", "texture", "rect", "tile", "modulate", "transpose", "normal_map"), &CanvasItem::draw_texture_rect, DEFVAL(Color(1, 1, 1)), DEFVAL(false), DEFVAL(Variant())); diff --git a/scene/2d/canvas_item.h b/scene/2d/canvas_item.h index 2604eb04e4..9c6799a441 100644 --- a/scene/2d/canvas_item.h +++ b/scene/2d/canvas_item.h @@ -307,7 +307,7 @@ public: void draw_polyline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false); void draw_multiline(const Vector<Point2> &p_points, const Color &p_color, float p_width = 1.0, bool p_antialiased = false); void draw_multiline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width = 1.0, bool p_antialiased = false); - void draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled = true); + void draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled = true, float p_width = 1.0, bool p_antialiased = false); void draw_circle(const Point2 &p_pos, float p_radius, const Color &p_color); void draw_texture(const Ref<Texture> &p_texture, const Point2 &p_pos, const Color &p_modulate = Color(1, 1, 1, 1), const Ref<Texture> &p_normal_map = Ref<Texture>()); void draw_texture_rect(const Ref<Texture> &p_texture, const Rect2 &p_rect, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, const Ref<Texture> &p_normal_map = Ref<Texture>()); diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp index 36c88e395a..202c7c9cf2 100644 --- a/scene/2d/collision_object_2d.cpp +++ b/scene/2d/collision_object_2d.cpp @@ -389,7 +389,7 @@ String CollisionObject2D::get_configuration_warning() const { if (shapes.empty()) { if (!warning.empty()) { - warning += "\n"; + warning += "\n\n"; } warning += TTR("This node has no shape, so it can't collide or interact with other objects.\nConsider adding a CollisionShape2D or CollisionPolygon2D as a child to define its shape."); } diff --git a/scene/2d/collision_shape_2d.cpp b/scene/2d/collision_shape_2d.cpp index 5440a1d8c3..f79d79d039 100644 --- a/scene/2d/collision_shape_2d.cpp +++ b/scene/2d/collision_shape_2d.cpp @@ -97,15 +97,8 @@ void CollisionShape2D::_notification(int p_what) { } owner_id = 0; parent = NULL; - } break; - /* - case NOTIFICATION_TRANSFORM_CHANGED: { - - if (!is_inside_scene()) - break; - _update_parent(); - } break;*/ + } break; case NOTIFICATION_DRAW: { if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { @@ -131,10 +124,13 @@ void CollisionShape2D::_notification(int p_what) { rect = rect.grow(3); if (one_way_collision) { - Color dcol = get_tree()->get_debug_collisions_color(); //0.9,0.2,0.2,0.4); - dcol.a = 1.0; + // Draw an arrow indicating the one-way collision direction + draw_col = get_tree()->get_debug_collisions_color().inverted(); + if (disabled) { + draw_col = draw_col.darkened(0.25); + } Vector2 line_to(0, 20); - draw_line(Vector2(), line_to, dcol, 3); + draw_line(Vector2(), line_to, draw_col, 2, true); Vector<Vector2> pts; float tsize = 8; pts.push_back(line_to + (Vector2(0, tsize))); @@ -142,9 +138,9 @@ void CollisionShape2D::_notification(int p_what) { pts.push_back(line_to + (Vector2(-0.707 * tsize, 0))); Vector<Color> cols; for (int i = 0; i < 3; i++) - cols.push_back(dcol); + cols.push_back(draw_col); - draw_primitive(pts, cols, Vector<Vector2>()); //small arrow + draw_primitive(pts, cols, Vector<Vector2>()); } } break; } diff --git a/scene/2d/cpu_particles_2d.cpp b/scene/2d/cpu_particles_2d.cpp index 591933d972..f9f273d494 100644 --- a/scene/2d/cpu_particles_2d.cpp +++ b/scene/2d/cpu_particles_2d.cpp @@ -83,6 +83,10 @@ void CPUParticles2D::set_randomness_ratio(float p_ratio) { randomness_ratio = p_ratio; } +void CPUParticles2D::set_lifetime_randomness(float p_random) { + + lifetime_randomness = p_random; +} void CPUParticles2D::set_use_local_coordinates(bool p_enable) { local_coords = p_enable; @@ -123,6 +127,10 @@ float CPUParticles2D::get_randomness_ratio() const { return randomness_ratio; } +float CPUParticles2D::get_lifetime_randomness() const { + + return lifetime_randomness; +} bool CPUParticles2D::get_use_local_coordinates() const { @@ -611,6 +619,10 @@ void CPUParticles2D::_particles_process(float p_delta) { } } + if (p.time * (1.0 - explosiveness_ratio) > p.lifetime) { + restart = true; + } + if (restart) { if (!emitting) { @@ -654,6 +666,7 @@ void CPUParticles2D::_particles_process(float p_delta) { p.custom[3] = 0.0; p.transform = Transform2D(); p.time = 0; + p.lifetime = lifetime * (1.0 - Math::randf() * lifetime_randomness); p.base_color = Color(1, 1, 1, 1); switch (emission_shape) { @@ -696,6 +709,8 @@ void CPUParticles2D::_particles_process(float p_delta) { } else if (!p.active) { continue; + } else if (p.time > p.lifetime) { + p.active = false; } else { uint32_t alt_seed = p.seed; @@ -947,9 +962,13 @@ void CPUParticles2D::_set_redraw(bool p_redraw) { if (redraw) { VS::get_singleton()->connect("frame_pre_draw", this, "_update_render_thread"); VS::get_singleton()->canvas_item_set_update_when_visible(get_canvas_item(), true); + + VS::get_singleton()->multimesh_set_visible_instances(multimesh, -1); } else { VS::get_singleton()->disconnect("frame_pre_draw", this, "_update_render_thread"); VS::get_singleton()->canvas_item_set_update_when_visible(get_canvas_item(), false); + + VS::get_singleton()->multimesh_set_visible_instances(multimesh, 0); } #ifndef NO_THREADS update_mutex->unlock(); @@ -980,9 +999,6 @@ void CPUParticles2D::_notification(int p_what) { _set_redraw(false); } - if (p_what == NOTIFICATION_PAUSED || p_what == NOTIFICATION_UNPAUSED) { - } - if (p_what == NOTIFICATION_DRAW) { if (!redraw) return; // don't add to render list @@ -1153,6 +1169,7 @@ void CPUParticles2D::convert_from_particles(Node *p_particles) { Vector2 gravity = Vector2(material->get_gravity().x, material->get_gravity().y); set_gravity(gravity); + set_lifetime_randomness(material->get_lifetime_randomness()); #define CONVERT_PARAM(m_param) \ set_param(m_param, material->get_param(ParticlesMaterial::m_param)); \ @@ -1187,6 +1204,7 @@ void CPUParticles2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_pre_process_time", "secs"), &CPUParticles2D::set_pre_process_time); ClassDB::bind_method(D_METHOD("set_explosiveness_ratio", "ratio"), &CPUParticles2D::set_explosiveness_ratio); ClassDB::bind_method(D_METHOD("set_randomness_ratio", "ratio"), &CPUParticles2D::set_randomness_ratio); + ClassDB::bind_method(D_METHOD("set_lifetime_randomness", "random"), &CPUParticles2D::set_lifetime_randomness); ClassDB::bind_method(D_METHOD("set_use_local_coordinates", "enable"), &CPUParticles2D::set_use_local_coordinates); ClassDB::bind_method(D_METHOD("set_fixed_fps", "fps"), &CPUParticles2D::set_fixed_fps); ClassDB::bind_method(D_METHOD("set_fractional_delta", "enable"), &CPUParticles2D::set_fractional_delta); @@ -1199,6 +1217,7 @@ void CPUParticles2D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_pre_process_time"), &CPUParticles2D::get_pre_process_time); ClassDB::bind_method(D_METHOD("get_explosiveness_ratio"), &CPUParticles2D::get_explosiveness_ratio); ClassDB::bind_method(D_METHOD("get_randomness_ratio"), &CPUParticles2D::get_randomness_ratio); + ClassDB::bind_method(D_METHOD("get_lifetime_randomness"), &CPUParticles2D::get_lifetime_randomness); ClassDB::bind_method(D_METHOD("get_use_local_coordinates"), &CPUParticles2D::get_use_local_coordinates); ClassDB::bind_method(D_METHOD("get_fixed_fps"), &CPUParticles2D::get_fixed_fps); ClassDB::bind_method(D_METHOD("get_fractional_delta"), &CPUParticles2D::get_fractional_delta); @@ -1225,6 +1244,7 @@ void CPUParticles2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale", PROPERTY_HINT_RANGE, "0,64,0.01"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "explosiveness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_explosiveness_ratio", "get_explosiveness_ratio"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_randomness_ratio", "get_randomness_ratio"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "lifetime_randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_lifetime_randomness", "get_lifetime_randomness"); ADD_PROPERTY(PropertyInfo(Variant::INT, "fixed_fps", PROPERTY_HINT_RANGE, "0,1000,1"), "set_fixed_fps", "get_fixed_fps"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fract_delta"), "set_fractional_delta", "get_fractional_delta"); ADD_GROUP("Drawing", ""); @@ -1404,6 +1424,7 @@ CPUParticles2D::CPUParticles2D() { set_pre_process_time(0); set_explosiveness_ratio(0); set_randomness_ratio(0); + set_lifetime_randomness(0); set_use_local_coordinates(true); set_draw_order(DRAW_ORDER_INDEX); diff --git a/scene/2d/cpu_particles_2d.h b/scene/2d/cpu_particles_2d.h index 8613a185b4..1cd22df9e7 100644 --- a/scene/2d/cpu_particles_2d.h +++ b/scene/2d/cpu_particles_2d.h @@ -96,6 +96,7 @@ private: float hue_rot_rand; float anim_offset_rand; float time; + float lifetime; Color base_color; uint32_t seed; @@ -139,6 +140,7 @@ private: float pre_process_time; float explosiveness_ratio; float randomness_ratio; + float lifetime_randomness; float speed_scale; bool local_coords; int fixed_fps; @@ -200,6 +202,7 @@ public: void set_pre_process_time(float p_time); void set_explosiveness_ratio(float p_ratio); void set_randomness_ratio(float p_ratio); + void set_lifetime_randomness(float p_random); void set_visibility_aabb(const Rect2 &p_aabb); void set_use_local_coordinates(bool p_enable); void set_speed_scale(float p_scale); @@ -211,6 +214,7 @@ public: float get_pre_process_time() const; float get_explosiveness_ratio() const; float get_randomness_ratio() const; + float get_lifetime_randomness() const; Rect2 get_visibility_aabb() const; bool get_use_local_coordinates() const; float get_speed_scale() const; diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp index 7f01ff8806..7b3eab175a 100644 --- a/scene/2d/light_2d.cpp +++ b/scene/2d/light_2d.cpp @@ -347,7 +347,7 @@ void Light2D::_notification(int p_what) { String Light2D::get_configuration_warning() const { if (!texture.is_valid()) { - return TTR("A texture with the shape of the light must be supplied to the 'texture' property."); + return TTR("A texture with the shape of the light must be supplied to the \"Texture\" property."); } return String(); diff --git a/scene/2d/light_occluder_2d.cpp b/scene/2d/light_occluder_2d.cpp index 3a3f90ac4b..313b23b9d4 100644 --- a/scene/2d/light_occluder_2d.cpp +++ b/scene/2d/light_occluder_2d.cpp @@ -268,7 +268,7 @@ String LightOccluder2D::get_configuration_warning() const { } if (occluder_polygon.is_valid() && occluder_polygon->get_polygon().size() == 0) { - return TTR("The occluder polygon for this occluder is empty. Please draw a polygon!"); + return TTR("The occluder polygon for this occluder is empty. Please draw a polygon."); } return String(); diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 95acf13fad..936ba777b5 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -963,7 +963,7 @@ String RigidBody2D::get_configuration_warning() const { if ((get_mode() == MODE_RIGID || get_mode() == MODE_CHARACTER) && (ABS(t.elements[0].length() - 1.0) > 0.05 || ABS(t.elements[1].length() - 1.0) > 0.05)) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } warning += TTR("Size changes to RigidBody2D (in character or rigid modes) will be overridden by the physics engine when running.\nChange the size in children collision shapes instead."); } @@ -1074,10 +1074,10 @@ void RigidBody2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "can_sleep"), "set_can_sleep", "is_able_to_sleep"); ADD_GROUP("Linear", "linear_"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "linear_velocity"), "set_linear_velocity", "get_linear_velocity"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "-1,128,0.01"), "set_linear_damp", "get_linear_damp"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), "set_linear_damp", "get_linear_damp"); ADD_GROUP("Angular", "angular_"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_velocity"), "set_angular_velocity", "get_angular_velocity"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_damp", PROPERTY_HINT_RANGE, "-1,128,0.01"), "set_angular_damp", "get_angular_damp"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), "set_angular_damp", "get_angular_damp"); ADD_GROUP("Applied Forces", "applied_"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "applied_force"), "set_applied_force", "get_applied_force"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "applied_torque"), "set_applied_torque", "get_applied_torque"); diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp index 57dfe5176d..bf8d008bb2 100644 --- a/scene/2d/ray_cast_2d.cpp +++ b/scene/2d/ray_cast_2d.cpp @@ -100,6 +100,7 @@ Vector2 RayCast2D::get_collision_normal() const { void RayCast2D::set_enabled(bool p_enabled) { enabled = p_enabled; + update(); if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) set_physics_process_internal(p_enabled); if (!p_enabled) @@ -167,19 +168,25 @@ void RayCast2D::_notification(int p_what) { xf.rotate(cast_to.angle()); xf.translate(Vector2(cast_to.length(), 0)); - //Vector2 tip = Vector2(0,s->get_length()); - Color dcol = get_tree()->get_debug_collisions_color(); //0.9,0.2,0.2,0.4); - draw_line(Vector2(), cast_to, dcol, 3); + // 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(), cast_to, draw_col, 2, true); Vector<Vector2> pts; - float tsize = 4; + float tsize = 8; pts.push_back(xf.xform(Vector2(tsize, 0))); pts.push_back(xf.xform(Vector2(0, 0.707 * tsize))); pts.push_back(xf.xform(Vector2(0, -0.707 * tsize))); Vector<Color> cols; for (int i = 0; i < 3; i++) - cols.push_back(dcol); + cols.push_back(draw_col); - draw_primitive(pts, cols, Vector<Vector2>()); //small arrow + draw_primitive(pts, cols, Vector<Vector2>()); } break; diff --git a/scene/2d/remote_transform_2d.cpp b/scene/2d/remote_transform_2d.cpp index 1c38a91877..fe8cc5a5fc 100644 --- a/scene/2d/remote_transform_2d.cpp +++ b/scene/2d/remote_transform_2d.cpp @@ -110,7 +110,7 @@ void RemoteTransform2D::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_READY: { + case NOTIFICATION_ENTER_TREE: { _update_cache(); @@ -180,6 +180,10 @@ bool RemoteTransform2D::get_update_scale() const { return update_remote_scale; } +void RemoteTransform2D::force_update_cache() { + _update_cache(); +} + String RemoteTransform2D::get_configuration_warning() const { if (!has_node(remote_node) || !Object::cast_to<Node2D>(get_node(remote_node))) { @@ -193,6 +197,7 @@ void RemoteTransform2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_remote_node", "path"), &RemoteTransform2D::set_remote_node); ClassDB::bind_method(D_METHOD("get_remote_node"), &RemoteTransform2D::get_remote_node); + ClassDB::bind_method(D_METHOD("force_update_cache"), &RemoteTransform2D::force_update_cache); ClassDB::bind_method(D_METHOD("set_use_global_coordinates", "use_global_coordinates"), &RemoteTransform2D::set_use_global_coordinates); ClassDB::bind_method(D_METHOD("get_use_global_coordinates"), &RemoteTransform2D::get_use_global_coordinates); diff --git a/scene/2d/remote_transform_2d.h b/scene/2d/remote_transform_2d.h index 16a5417592..e85fe33fc6 100644 --- a/scene/2d/remote_transform_2d.h +++ b/scene/2d/remote_transform_2d.h @@ -69,6 +69,8 @@ public: void set_update_scale(const bool p_update); bool get_update_scale() const; + void force_update_cache(); + virtual String get_configuration_warning() const; RemoteTransform2D(); diff --git a/scene/2d/skeleton_2d.cpp b/scene/2d/skeleton_2d.cpp index aa15255384..bf43fca864 100644 --- a/scene/2d/skeleton_2d.cpp +++ b/scene/2d/skeleton_2d.cpp @@ -137,7 +137,7 @@ String Bone2D::get_configuration_warning() const { String warning = Node2D::get_configuration_warning(); if (!skeleton) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } if (parent_bone) { warning += TTR("This Bone2D chain should end at a Skeleton2D node."); @@ -148,7 +148,7 @@ String Bone2D::get_configuration_warning() const { if (rest == Transform2D(0, 0, 0, 0, 0, 0)) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } warning += TTR("This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."); } diff --git a/scene/2d/sprite.cpp b/scene/2d/sprite.cpp index 6626fccf1c..d7a8005187 100644 --- a/scene/2d/sprite.cpp +++ b/scene/2d/sprite.cpp @@ -259,6 +259,7 @@ void Sprite::set_frame(int p_frame) { frame = p_frame; _change_notify("frame"); + _change_notify("frame_coords"); emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -267,6 +268,17 @@ int Sprite::get_frame() const { return frame; } +void Sprite::set_frame_coords(const Vector2 &p_coord) { + ERR_FAIL_INDEX(int(p_coord.x), vframes); + ERR_FAIL_INDEX(int(p_coord.y), hframes); + + set_frame(int(p_coord.y) * hframes + int(p_coord.x)); +} + +Vector2 Sprite::get_frame_coords() const { + return Vector2(frame % hframes, frame / hframes); +} + void Sprite::set_vframes(int p_amount) { ERR_FAIL_COND(p_amount < 1); @@ -371,10 +383,9 @@ Rect2 Sprite::get_rect() const { void Sprite::_validate_property(PropertyInfo &property) const { if (property.name == "frame") { - - property.hint = PROPERTY_HINT_SPRITE_FRAME; - + property.hint = PROPERTY_HINT_RANGE; property.hint_string = "0," + itos(vframes * hframes - 1) + ",1"; + property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } } @@ -421,6 +432,9 @@ void Sprite::_bind_methods() { ClassDB::bind_method(D_METHOD("set_frame", "frame"), &Sprite::set_frame); ClassDB::bind_method(D_METHOD("get_frame"), &Sprite::get_frame); + ClassDB::bind_method(D_METHOD("set_frame_coords", "coords"), &Sprite::set_frame_coords); + ClassDB::bind_method(D_METHOD("get_frame_coords"), &Sprite::get_frame_coords); + ClassDB::bind_method(D_METHOD("set_vframes", "vframes"), &Sprite::set_vframes); ClassDB::bind_method(D_METHOD("get_vframes"), &Sprite::get_vframes); @@ -442,7 +456,8 @@ void Sprite::_bind_methods() { ADD_GROUP("Animation", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "vframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_vframes", "get_vframes"); ADD_PROPERTY(PropertyInfo(Variant::INT, "hframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_hframes", "get_hframes"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "frame_coords", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_frame_coords", "get_frame_coords"); ADD_GROUP("Region", "region_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "region_enabled"), "set_region", "is_region"); diff --git a/scene/2d/sprite.h b/scene/2d/sprite.h index e38db3a299..490db31cdb 100644 --- a/scene/2d/sprite.h +++ b/scene/2d/sprite.h @@ -110,6 +110,9 @@ public: void set_frame(int p_frame); int get_frame() const; + void set_frame_coords(const Vector2 &p_row); + Vector2 get_frame_coords() const; + void set_vframes(int p_amount); int get_vframes() const; diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index cf544a5473..c79cd80e2e 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -1780,7 +1780,7 @@ String TileMap::get_configuration_warning() const { if (use_parent && !collision_parent) { if (!warning.empty()) { - warning += "\n"; + warning += "\n\n"; } return TTR("TileMap with Use Parent on needs a parent CollisionObject2D to give shapes to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."); } diff --git a/scene/2d/visibility_notifier_2d.cpp b/scene/2d/visibility_notifier_2d.cpp index 1cf037daf2..a1d074e6cd 100644 --- a/scene/2d/visibility_notifier_2d.cpp +++ b/scene/2d/visibility_notifier_2d.cpp @@ -327,7 +327,7 @@ void VisibilityEnabler2D::_node_removed(Node *p_node) { String VisibilityEnabler2D::get_configuration_warning() const { #ifdef TOOLS_ENABLED if (is_inside_tree() && get_parent() && (get_parent()->get_filename() == String() && get_parent() != get_tree()->get_edited_scene_root())) { - return TTR("VisibilityEnable2D works best when used with the edited scene root directly as parent."); + return TTR("VisibilityEnabler2D works best when used with the edited scene root directly as parent."); } #endif return String(); diff --git a/scene/3d/SCsub b/scene/3d/SCsub index 200cf4316f..31a443bad1 100644 --- a/scene/3d/SCsub +++ b/scene/3d/SCsub @@ -3,10 +3,10 @@ Import('env') if env['disable_3d']: - env.scene_sources.append("3d/spatial.cpp") - env.scene_sources.append("3d/skeleton.cpp") - env.scene_sources.append("3d/particles.cpp") - env.scene_sources.append("3d/visual_instance.cpp") - env.scene_sources.append("3d/world_environment.cpp") + env.add_source_files(env.scene_sources, "spatial.cpp") + env.add_source_files(env.scene_sources, "skeleton.cpp") + env.add_source_files(env.scene_sources, "particles.cpp") + env.add_source_files(env.scene_sources, "visual_instance.cpp") + env.add_source_files(env.scene_sources, "world_environment.cpp") else: env.add_source_files(env.scene_sources, "*.cpp") diff --git a/scene/3d/area.cpp b/scene/3d/area.cpp index 4247266e3d..19f43dd274 100644 --- a/scene/3d/area.cpp +++ b/scene/3d/area.cpp @@ -718,8 +718,8 @@ void Area::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "gravity_distance_scale", PROPERTY_HINT_EXP_RANGE, "0,1024,0.001,or_greater"), "set_gravity_distance_scale", "get_gravity_distance_scale"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "gravity_vec"), "set_gravity_vector", "get_gravity_vector"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "gravity", PROPERTY_HINT_RANGE, "-1024,1024,0.01"), "set_gravity", "get_gravity"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "0,1024,0.001"), "set_linear_damp", "get_linear_damp"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_damp", PROPERTY_HINT_RANGE, "0,1024,0.001"), "set_angular_damp", "get_angular_damp"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "0,100,0.001,or_greater"), "set_linear_damp", "get_linear_damp"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_damp", PROPERTY_HINT_RANGE, "0,100,0.001,or_greater"), "set_angular_damp", "get_angular_damp"); ADD_PROPERTY(PropertyInfo(Variant::INT, "priority", PROPERTY_HINT_RANGE, "0,128,1"), "set_priority", "get_priority"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "monitoring"), "set_monitoring", "is_monitoring"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "monitorable"), "set_monitorable", "is_monitorable"); diff --git a/scene/3d/arvr_nodes.cpp b/scene/3d/arvr_nodes.cpp index dfa8fce9be..263a2d8de6 100644 --- a/scene/3d/arvr_nodes.cpp +++ b/scene/3d/arvr_nodes.cpp @@ -61,7 +61,7 @@ String ARVRCamera::get_configuration_warning() const { // must be child node of ARVROrigin! ARVROrigin *origin = Object::cast_to<ARVROrigin>(get_parent()); if (origin == NULL) { - return TTR("ARVRCamera must have an ARVROrigin node as its parent"); + return TTR("ARVRCamera must have an ARVROrigin node as its parent."); }; return String(); diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp index ff28f60d4f..27f16f7601 100644 --- a/scene/3d/audio_stream_player_3d.cpp +++ b/scene/3d/audio_stream_player_3d.cpp @@ -35,6 +35,99 @@ #include "scene/3d/listener.h" #include "scene/main/viewport.h" +// Based on "A Novel Multichannel Panning Method for Standard and Arbitrary Loudspeaker Configurations" by Ramy Sadek and Chris Kyriakakis (2004) +// Speaker-Placement Correction Amplitude Panning (SPCAP) +class Spcap { +private: + struct Speaker { + Vector3 direction; + real_t effective_number_of_speakers; // precalculated + mutable real_t squared_gain; // temporary + }; + + PoolVector<Speaker> speakers; + +public: + Spcap(unsigned int speaker_count, const Vector3 *speaker_directions) { + this->speakers.resize(speaker_count); + PoolVector<Speaker>::Write w = this->speakers.write(); + for (unsigned int speaker_num = 0; speaker_num < speaker_count; speaker_num++) { + w[speaker_num].direction = speaker_directions[speaker_num]; + w[speaker_num].squared_gain = 0.0; + w[speaker_num].effective_number_of_speakers = 0.0; + for (unsigned int other_speaker_num = 0; other_speaker_num < speaker_count; other_speaker_num++) { + w[speaker_num].effective_number_of_speakers += 0.5 * (1.0 + w[speaker_num].direction.dot(w[other_speaker_num].direction)); + } + } + } + + unsigned int get_speaker_count() const { + return (unsigned int)this->speakers.size(); + } + + Vector3 get_speaker_direction(unsigned int index) const { + return this->speakers.read()[index].direction; + } + + void calculate(const Vector3 &source_direction, real_t tightness, unsigned int volume_count, real_t *volumes) const { + PoolVector<Speaker>::Read r = this->speakers.read(); + real_t sum_squared_gains = 0.0; + for (unsigned int speaker_num = 0; speaker_num < (unsigned int)this->speakers.size(); speaker_num++) { + real_t initial_gain = 0.5 * powf(1.0 + r[speaker_num].direction.dot(source_direction), tightness) / r[speaker_num].effective_number_of_speakers; + r[speaker_num].squared_gain = initial_gain * initial_gain; + sum_squared_gains += r[speaker_num].squared_gain; + } + + for (unsigned int speaker_num = 0; speaker_num < MIN(volume_count, (unsigned int)this->speakers.size()); speaker_num++) { + volumes[speaker_num] = sqrtf(r[speaker_num].squared_gain / sum_squared_gains); + } + } +}; + +//TODO: hardcoded main speaker directions for 2, 3.1, 5.1 and 7.1 setups - these are simplified and could also be made configurable +static const Vector3 speaker_directions[7] = { + Vector3(-1.0, 0.0, -1.0).normalized(), // front-left + Vector3(1.0, 0.0, -1.0).normalized(), // front-right + Vector3(0.0, 0.0, -1.0).normalized(), // center + Vector3(-1.0, 0.0, 1.0).normalized(), // rear-left + Vector3(1.0, 0.0, 1.0).normalized(), // rear-right + Vector3(-1.0, 0.0, 0.0).normalized(), // side-left + Vector3(1.0, 0.0, 0.0).normalized(), // side-right +}; + +void AudioStreamPlayer3D::_calc_output_vol(const Vector3 &source_dir, real_t tightness, AudioStreamPlayer3D::Output &output) { + unsigned int speaker_count; // only main speakers (no LFE) + switch (AudioServer::get_singleton()->get_speaker_mode()) { + default: //fallthrough + case AudioServer::SPEAKER_MODE_STEREO: speaker_count = 2; break; + case AudioServer::SPEAKER_SURROUND_31: speaker_count = 3; break; + case AudioServer::SPEAKER_SURROUND_51: speaker_count = 5; break; + case AudioServer::SPEAKER_SURROUND_71: speaker_count = 7; break; + } + + Spcap spcap(speaker_count, speaker_directions); //TODO: should only be created/recreated once the speaker mode / speaker positions changes + real_t volumes[7]; + spcap.calculate(source_dir, tightness, speaker_count, volumes); + + switch (AudioServer::get_singleton()->get_speaker_mode()) { + case AudioServer::SPEAKER_SURROUND_71: + output.vol[3].l = volumes[5]; // side-left + output.vol[3].r = volumes[6]; // side-right + //fallthrough + case AudioServer::SPEAKER_SURROUND_51: + output.vol[2].l = volumes[3]; // rear-left + output.vol[2].r = volumes[4]; // rear-right + //fallthrough + case AudioServer::SPEAKER_SURROUND_31: + output.vol[1].r = 1.0; // LFE - always full power + output.vol[1].l = volumes[2]; // center + //fallthrough + case AudioServer::SPEAKER_MODE_STEREO: + output.vol[0].r = volumes[1]; // front-right + output.vol[0].l = volumes[0]; // front-left + } +} + void AudioStreamPlayer3D::_mix_audio() { if (!stream_playback.is_valid() || !active || @@ -381,59 +474,11 @@ void AudioStreamPlayer3D::_notification(int p_what) { output.filter_gain = Math::db2linear(db_att); - Vector3 flat_pos = local_pos; - flat_pos.y = 0; - flat_pos.normalize(); + //TODO: The lower the second parameter (tightness) the more the sound will "enclose" the listener (more undirected / playing from + // speakers not facing the source) - this could be made distance dependent. + _calc_output_vol(local_pos.normalized(), 4.0, output); unsigned int cc = AudioServer::get_singleton()->get_channel_count(); - if (cc == 1) { - // Stereo pair - float c = flat_pos.x * 0.5 + 0.5; - - output.vol[0].l = 1.0 - c; - output.vol[0].r = c; - } else { - Vector3 listenertopos = global_pos - listener_node->get_global_transform().origin; - float c = listenertopos.normalized().dot(get_global_transform().basis.get_axis(2).normalized()); //it's z negative - float angle = Math::rad2deg(Math::acos(c)); - float av = angle * (flat_pos.x < 0 ? -1 : 1) / 180.0; - - if (cc >= 1) { - // Stereo pair - float fl = Math::abs(1.0 - Math::abs(-0.8 - av)); - float fr = Math::abs(1.0 - Math::abs(0.8 - av)); - - output.vol[0].l = fl; - output.vol[0].r = fr; - } - - if (cc >= 2) { - // Center pair - float center = 1.0 - Math::sin(Math::acos(c)); - - output.vol[1].l = center; - output.vol[1].r = center; - } - - if (cc >= 3) { - // Side pair - float sleft = Math::abs(1.0 - Math::abs(-0.4 - av)); - float sright = Math::abs(1.0 - Math::abs(0.4 - av)); - - output.vol[2].l = sleft; - output.vol[2].r = sright; - } - - if (cc >= 4) { - // Rear pair - float rleft = Math::abs(1.0 - Math::abs(-0.2 - av)); - float rright = Math::abs(1.0 - Math::abs(0.2 - av)); - - output.vol[3].l = rleft; - output.vol[3].r = rright; - } - } - for (unsigned int k = 0; k < cc; k++) { output.vol[k] *= multiplier; } @@ -974,7 +1019,7 @@ void AudioStreamPlayer3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "emission_angle_degrees", PROPERTY_HINT_RANGE, "0.1,90,0.1"), "set_emission_angle", "get_emission_angle"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "emission_angle_filter_attenuation_db", PROPERTY_HINT_RANGE, "-80,0,0.1"), "set_emission_angle_filter_attenuation_db", "get_emission_angle_filter_attenuation_db"); ADD_GROUP("Attenuation Filter", "attenuation_filter_"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "attenuation_filter_cutoff_hz", PROPERTY_HINT_RANGE, "50,50000,1"), "set_attenuation_filter_cutoff_hz", "get_attenuation_filter_cutoff_hz"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "attenuation_filter_cutoff_hz", PROPERTY_HINT_RANGE, "1,20500,1"), "set_attenuation_filter_cutoff_hz", "get_attenuation_filter_cutoff_hz"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "attenuation_filter_db", PROPERTY_HINT_RANGE, "-80,0,0.1"), "set_attenuation_filter_db", "get_attenuation_filter_db"); ADD_GROUP("Doppler", "doppler_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "doppler_tracking", PROPERTY_HINT_ENUM, "Disabled,Idle,Physics"), "set_doppler_tracking", "get_doppler_tracking"); diff --git a/scene/3d/audio_stream_player_3d.h b/scene/3d/audio_stream_player_3d.h index 93954e758a..494aa70097 100644 --- a/scene/3d/audio_stream_player_3d.h +++ b/scene/3d/audio_stream_player_3d.h @@ -115,6 +115,7 @@ private: bool stream_paused_fade_out; StringName bus; + static void _calc_output_vol(const Vector3 &source_dir, real_t tightness, Output &output); void _mix_audio(); static void _mix_audios(void *self) { reinterpret_cast<AudioStreamPlayer3D *>(self)->_mix_audio(); } diff --git a/scene/3d/collision_object.cpp b/scene/3d/collision_object.cpp index fc46cf5bdb..63301fc226 100644 --- a/scene/3d/collision_object.cpp +++ b/scene/3d/collision_object.cpp @@ -370,8 +370,8 @@ String CollisionObject::get_configuration_warning() const { String warning = Spatial::get_configuration_warning(); if (shapes.empty()) { - if (warning == String()) { - warning += "\n"; + if (!warning.empty()) { + warning += "\n\n"; } warning += TTR("This node has no shape, so it can't collide or interact with other objects.\nConsider adding a CollisionShape or CollisionPolygon as a child to define its shape."); } diff --git a/scene/3d/collision_shape.cpp b/scene/3d/collision_shape.cpp index 219ea56681..2b030641eb 100644 --- a/scene/3d/collision_shape.cpp +++ b/scene/3d/collision_shape.cpp @@ -120,7 +120,7 @@ String CollisionShape::get_configuration_warning() const { } if (!shape.is_valid()) { - return TTR("A shape must be provided for CollisionShape to function. Please create a shape resource for it!"); + return TTR("A shape must be provided for CollisionShape to function. Please create a shape resource for it."); } if (shape->is_class("PlaneShape")) { diff --git a/scene/3d/cpu_particles.cpp b/scene/3d/cpu_particles.cpp index 86b407b9e6..fc16bc36cb 100644 --- a/scene/3d/cpu_particles.cpp +++ b/scene/3d/cpu_particles.cpp @@ -92,6 +92,10 @@ void CPUParticles::set_randomness_ratio(float p_ratio) { randomness_ratio = p_ratio; } +void CPUParticles::set_lifetime_randomness(float p_random) { + + lifetime_randomness = p_random; +} void CPUParticles::set_use_local_coordinates(bool p_enable) { local_coords = p_enable; @@ -130,6 +134,10 @@ float CPUParticles::get_randomness_ratio() const { return randomness_ratio; } +float CPUParticles::get_lifetime_randomness() const { + + return lifetime_randomness; +} bool CPUParticles::get_use_local_coordinates() const { @@ -583,6 +591,10 @@ void CPUParticles::_particles_process(float p_delta) { } } + if (p.time * (1.0 - explosiveness_ratio) > p.lifetime) { + restart = true; + } + if (restart) { if (!emitting) { @@ -636,6 +648,7 @@ void CPUParticles::_particles_process(float p_delta) { p.custom[2] = (parameters[PARAM_ANIM_OFFSET] + tex_anim_offset) * Math::lerp(1.0f, p.anim_offset_rand, randomness[PARAM_ANIM_OFFSET]); //animation offset (0-1) p.transform = Transform(); p.time = 0; + p.lifetime = lifetime * (1.0 - Math::randf() * lifetime_randomness); p.base_color = Color(1, 1, 1, 1); switch (emission_shape) { @@ -701,6 +714,8 @@ void CPUParticles::_particles_process(float p_delta) { } else if (!p.active) { continue; + } else if (p.time > p.lifetime) { + p.active = false; } else { uint32_t alt_seed = p.seed; @@ -1059,9 +1074,6 @@ void CPUParticles::_notification(int p_what) { _set_redraw(false); } - if (p_what == NOTIFICATION_PAUSED || p_what == NOTIFICATION_UNPAUSED) { - } - if (p_what == NOTIFICATION_INTERNAL_PROCESS) { if (particles.size() == 0 || !is_visible_in_tree()) { @@ -1221,6 +1233,7 @@ void CPUParticles::convert_from_particles(Node *p_particles) { set_emission_box_extents(material->get_emission_box_extents()); set_gravity(material->get_gravity()); + set_lifetime_randomness(material->get_lifetime_randomness()); #define CONVERT_PARAM(m_param) \ set_param(m_param, material->get_param(ParticlesMaterial::m_param)); \ @@ -1255,6 +1268,7 @@ void CPUParticles::_bind_methods() { ClassDB::bind_method(D_METHOD("set_pre_process_time", "secs"), &CPUParticles::set_pre_process_time); ClassDB::bind_method(D_METHOD("set_explosiveness_ratio", "ratio"), &CPUParticles::set_explosiveness_ratio); ClassDB::bind_method(D_METHOD("set_randomness_ratio", "ratio"), &CPUParticles::set_randomness_ratio); + ClassDB::bind_method(D_METHOD("set_lifetime_randomness", "random"), &CPUParticles::set_lifetime_randomness); ClassDB::bind_method(D_METHOD("set_use_local_coordinates", "enable"), &CPUParticles::set_use_local_coordinates); ClassDB::bind_method(D_METHOD("set_fixed_fps", "fps"), &CPUParticles::set_fixed_fps); ClassDB::bind_method(D_METHOD("set_fractional_delta", "enable"), &CPUParticles::set_fractional_delta); @@ -1267,6 +1281,7 @@ void CPUParticles::_bind_methods() { ClassDB::bind_method(D_METHOD("get_pre_process_time"), &CPUParticles::get_pre_process_time); ClassDB::bind_method(D_METHOD("get_explosiveness_ratio"), &CPUParticles::get_explosiveness_ratio); ClassDB::bind_method(D_METHOD("get_randomness_ratio"), &CPUParticles::get_randomness_ratio); + ClassDB::bind_method(D_METHOD("get_lifetime_randomness"), &CPUParticles::get_lifetime_randomness); ClassDB::bind_method(D_METHOD("get_use_local_coordinates"), &CPUParticles::get_use_local_coordinates); ClassDB::bind_method(D_METHOD("get_fixed_fps"), &CPUParticles::get_fixed_fps); ClassDB::bind_method(D_METHOD("get_fractional_delta"), &CPUParticles::get_fractional_delta); @@ -1290,6 +1305,7 @@ void CPUParticles::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale", PROPERTY_HINT_RANGE, "0,64,0.01"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "explosiveness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_explosiveness_ratio", "get_explosiveness_ratio"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_randomness_ratio", "get_randomness_ratio"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "lifetime_randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_lifetime_randomness", "get_lifetime_randomness"); ADD_PROPERTY(PropertyInfo(Variant::INT, "fixed_fps", PROPERTY_HINT_RANGE, "0,1000,1"), "set_fixed_fps", "get_fixed_fps"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fract_delta"), "set_fractional_delta", "get_fractional_delta"); ADD_GROUP("Drawing", ""); @@ -1472,6 +1488,7 @@ CPUParticles::CPUParticles() { set_pre_process_time(0); set_explosiveness_ratio(0); set_randomness_ratio(0); + set_lifetime_randomness(0); set_use_local_coordinates(true); set_draw_order(DRAW_ORDER_INDEX); diff --git a/scene/3d/cpu_particles.h b/scene/3d/cpu_particles.h index 517df8490d..71de56f59e 100644 --- a/scene/3d/cpu_particles.h +++ b/scene/3d/cpu_particles.h @@ -95,6 +95,7 @@ private: float hue_rot_rand; float anim_offset_rand; float time; + float lifetime; Color base_color; uint32_t seed; @@ -137,6 +138,7 @@ private: float pre_process_time; float explosiveness_ratio; float randomness_ratio; + float lifetime_randomness; float speed_scale; bool local_coords; int fixed_fps; @@ -200,6 +202,7 @@ public: void set_pre_process_time(float p_time); void set_explosiveness_ratio(float p_ratio); void set_randomness_ratio(float p_ratio); + void set_lifetime_randomness(float p_random); void set_visibility_aabb(const AABB &p_aabb); void set_use_local_coordinates(bool p_enable); void set_speed_scale(float p_scale); @@ -211,6 +214,7 @@ public: float get_pre_process_time() const; float get_explosiveness_ratio() const; float get_randomness_ratio() const; + float get_lifetime_randomness() const; AABB get_visibility_aabb() const; bool get_use_local_coordinates() const; float get_speed_scale() const; diff --git a/scene/3d/light.cpp b/scene/3d/light.cpp index 2e64872616..85ee925248 100644 --- a/scene/3d/light.cpp +++ b/scene/3d/light.cpp @@ -51,6 +51,7 @@ void Light::set_param(Param p_param, float p_value) { if (p_param == PARAM_SPOT_ANGLE) { _change_notify("spot_angle"); + update_configuration_warning(); } else if (p_param == PARAM_RANGE) { _change_notify("omni_range"); _change_notify("spot_range"); @@ -68,6 +69,10 @@ void Light::set_shadow(bool p_enable) { shadow = p_enable; VS::get_singleton()->light_set_shadow(light, p_enable); + + if (type == VisualServer::LIGHT_SPOT) { + update_configuration_warning(); + } } bool Light::has_shadow() const { @@ -195,9 +200,6 @@ void Light::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE) { _update_visibility(); } - - if (p_what == NOTIFICATION_EXIT_TREE) { - } } void Light::set_editor_only(bool p_editor_only) { @@ -408,7 +410,7 @@ DirectionalLight::DirectionalLight() : set_param(PARAM_SHADOW_NORMAL_BIAS, 0.8); set_param(PARAM_SHADOW_BIAS, 0.1); - set_param(PARAM_SHADOW_MAX_DISTANCE, 200); + set_param(PARAM_SHADOW_MAX_DISTANCE, 100); set_param(PARAM_SHADOW_BIAS_SPLIT_SCALE, 0.25); set_shadow_mode(SHADOW_PARALLEL_4_SPLITS); set_shadow_depth_range(SHADOW_DEPTH_RANGE_STABLE); @@ -465,6 +467,20 @@ OmniLight::OmniLight() : set_shadow_detail(SHADOW_DETAIL_HORIZONTAL); } +String SpotLight::get_configuration_warning() const { + String warning = Light::get_configuration_warning(); + + if (has_shadow() && get_param(PARAM_SPOT_ANGLE) >= 90.0) { + if (warning != String()) { + warning += "\n\n"; + } + + warning += TTR("A SpotLight with an angle wider than 90 degrees cannot cast shadows."); + } + + return warning; +} + void SpotLight::_bind_methods() { ADD_GROUP("Spot", "spot_"); diff --git a/scene/3d/light.h b/scene/3d/light.h index ddd5bc6b3a..5d365758b5 100644 --- a/scene/3d/light.h +++ b/scene/3d/light.h @@ -221,6 +221,8 @@ protected: static void _bind_methods(); public: + virtual String get_configuration_warning() const; + SpotLight() : Light(VisualServer::LIGHT_SPOT) {} }; diff --git a/scene/3d/path.cpp b/scene/3d/path.cpp index 84078911cb..d55c795d38 100644 --- a/scene/3d/path.cpp +++ b/scene/3d/path.cpp @@ -270,7 +270,7 @@ String PathFollow::get_configuration_warning() const { } else { Path *path = Object::cast_to<Path>(get_parent()); if (path->get_curve().is_valid() && !path->get_curve()->is_up_vector_enabled() && rotation_mode == ROTATION_ORIENTED) { - return TTR("PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent Path's Curve resource."); + return TTR("PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its parent Path's Curve resource."); } } diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp index d3aad7000d..fa2bb300fa 100644 --- a/scene/3d/physics_body.cpp +++ b/scene/3d/physics_body.cpp @@ -934,7 +934,7 @@ String RigidBody::get_configuration_warning() const { if ((get_mode() == MODE_RIGID || get_mode() == MODE_CHARACTER) && (ABS(t.basis.get_axis(0).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(1).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(2).length() - 1.0) > 0.05)) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } warning += TTR("Size changes to RigidBody (in character or rigid modes) will be overridden by the physics engine when running.\nChange the size in children collision shapes instead."); } @@ -1044,10 +1044,10 @@ void RigidBody::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "axis_lock_angular_z"), "set_axis_lock", "get_axis_lock", PhysicsServer::BODY_AXIS_ANGULAR_Z); ADD_GROUP("Linear", "linear_"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "linear_velocity"), "set_linear_velocity", "get_linear_velocity"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "-1,128,0.01"), "set_linear_damp", "get_linear_damp"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "linear_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), "set_linear_damp", "get_linear_damp"); ADD_GROUP("Angular", "angular_"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "angular_velocity"), "set_angular_velocity", "get_angular_velocity"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_damp", PROPERTY_HINT_RANGE, "-1,128,0.01"), "set_angular_damp", "get_angular_damp"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "angular_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), "set_angular_damp", "get_angular_damp"); ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape"))); ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape"))); diff --git a/scene/3d/remote_transform.cpp b/scene/3d/remote_transform.cpp index add77e0272..76b0b0c92f 100644 --- a/scene/3d/remote_transform.cpp +++ b/scene/3d/remote_transform.cpp @@ -105,7 +105,7 @@ void RemoteTransform::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_READY: { + case NOTIFICATION_ENTER_TREE: { _update_cache(); @@ -174,10 +174,14 @@ bool RemoteTransform::get_update_scale() const { return update_remote_scale; } +void RemoteTransform::force_update_cache() { + _update_cache(); +} + String RemoteTransform::get_configuration_warning() const { if (!has_node(remote_node) || !Object::cast_to<Spatial>(get_node(remote_node))) { - return TTR("Path property must point to a valid Spatial node to work."); + return TTR("The \"Remote Path\" property must point to a valid Spatial or Spatial-derived node to work."); } return String(); @@ -187,6 +191,7 @@ void RemoteTransform::_bind_methods() { ClassDB::bind_method(D_METHOD("set_remote_node", "path"), &RemoteTransform::set_remote_node); ClassDB::bind_method(D_METHOD("get_remote_node"), &RemoteTransform::get_remote_node); + ClassDB::bind_method(D_METHOD("force_update_cache"), &RemoteTransform::force_update_cache); ClassDB::bind_method(D_METHOD("set_use_global_coordinates", "use_global_coordinates"), &RemoteTransform::set_use_global_coordinates); ClassDB::bind_method(D_METHOD("get_use_global_coordinates"), &RemoteTransform::get_use_global_coordinates); diff --git a/scene/3d/remote_transform.h b/scene/3d/remote_transform.h index b737a4f858..07e01284e5 100644 --- a/scene/3d/remote_transform.h +++ b/scene/3d/remote_transform.h @@ -68,6 +68,8 @@ public: void set_update_scale(const bool p_update); bool get_update_scale() const; + void force_update_cache(); + virtual String get_configuration_warning() const; RemoteTransform(); diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index d0f8799a64..fc5523633d 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -558,12 +558,15 @@ Rect2 Sprite3D::get_region_rect() const { void Sprite3D::set_frame(int p_frame) { - ERR_FAIL_INDEX(p_frame, vframes * hframes); + ERR_FAIL_INDEX(p_frame, int64_t(vframes) * hframes); if (frame != p_frame) frame = p_frame; _queue_update(); + + _change_notify("frame"); + _change_notify("frame_coords"); emit_signal(SceneStringNames::get_singleton()->frame_changed); } @@ -572,6 +575,17 @@ int Sprite3D::get_frame() const { return frame; } +void Sprite3D::set_frame_coords(const Vector2 &p_coord) { + ERR_FAIL_INDEX(int(p_coord.x), vframes); + ERR_FAIL_INDEX(int(p_coord.y), hframes); + + set_frame(int(p_coord.y) * hframes + int(p_coord.x)); +} + +Vector2 Sprite3D::get_frame_coords() const { + return Vector2(frame % hframes, frame / hframes); +} + void Sprite3D::set_vframes(int p_amount) { ERR_FAIL_COND(p_amount < 1); @@ -628,10 +642,9 @@ Rect2 Sprite3D::get_item_rect() const { void Sprite3D::_validate_property(PropertyInfo &property) const { if (property.name == "frame") { - - property.hint = PROPERTY_HINT_SPRITE_FRAME; - + property.hint = PROPERTY_HINT_RANGE; property.hint_string = "0," + itos(vframes * hframes - 1) + ",1"; + property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } } @@ -649,6 +662,9 @@ void Sprite3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_frame", "frame"), &Sprite3D::set_frame); ClassDB::bind_method(D_METHOD("get_frame"), &Sprite3D::get_frame); + ClassDB::bind_method(D_METHOD("set_frame_coords", "coords"), &Sprite3D::set_frame_coords); + ClassDB::bind_method(D_METHOD("get_frame_coords"), &Sprite3D::get_frame_coords); + ClassDB::bind_method(D_METHOD("set_vframes", "vframes"), &Sprite3D::set_vframes); ClassDB::bind_method(D_METHOD("get_vframes"), &Sprite3D::get_vframes); @@ -659,7 +675,8 @@ void Sprite3D::_bind_methods() { ADD_GROUP("Animation", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "vframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_vframes", "get_vframes"); ADD_PROPERTY(PropertyInfo(Variant::INT, "hframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_hframes", "get_hframes"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "frame_coords", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_frame_coords", "get_frame_coords"); ADD_GROUP("Region", "region_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "region_enabled"), "set_region", "is_region"); ADD_PROPERTY(PropertyInfo(Variant::RECT2, "region_rect"), "set_region_rect", "get_region_rect"); @@ -851,14 +868,11 @@ void AnimatedSprite3D::_validate_property(PropertyInfo &property) const { } if (property.name == "frame") { - property.hint = PROPERTY_HINT_RANGE; - - if (frames->has_animation(animation)) { + if (frames->has_animation(animation) && frames->get_frame_count(animation) > 1) { property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; - } else { - property.hint_string = "0,0,0"; } + property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } } @@ -1061,7 +1075,7 @@ StringName AnimatedSprite3D::get_animation() const { String AnimatedSprite3D::get_configuration_warning() const { if (frames.is_null()) { - return TTR("A SpriteFrames resource must be created or set in the 'Frames' property in order for AnimatedSprite3D to display frames."); + return TTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite3D to display frames."); } return String(); @@ -1091,7 +1105,7 @@ void AnimatedSprite3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "animation"), "set_animation", "get_animation"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing"), "_set_playing", "_is_playing"); } diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h index 0e086ef31e..5ae9b153f9 100644 --- a/scene/3d/sprite_3d.h +++ b/scene/3d/sprite_3d.h @@ -173,6 +173,9 @@ public: void set_frame(int p_frame); int get_frame() const; + void set_frame_coords(const Vector2 &p_row); + Vector2 get_frame_coords() const; + void set_vframes(int p_amount); int get_vframes() const; diff --git a/scene/3d/vehicle_body.cpp b/scene/3d/vehicle_body.cpp index 89e96e0227..98e68cfbda 100644 --- a/scene/3d/vehicle_body.cpp +++ b/scene/3d/vehicle_body.cpp @@ -272,6 +272,20 @@ void VehicleWheel::_bind_methods() { ClassDB::bind_method(D_METHOD("get_rpm"), &VehicleWheel::get_rpm); + ClassDB::bind_method(D_METHOD("set_engine_force", "engine_force"), &VehicleWheel::set_engine_force); + ClassDB::bind_method(D_METHOD("get_engine_force"), &VehicleWheel::get_engine_force); + + ClassDB::bind_method(D_METHOD("set_brake", "brake"), &VehicleWheel::set_brake); + ClassDB::bind_method(D_METHOD("get_brake"), &VehicleWheel::get_brake); + + ClassDB::bind_method(D_METHOD("set_steering", "steering"), &VehicleWheel::set_steering); + ClassDB::bind_method(D_METHOD("get_steering"), &VehicleWheel::get_steering); + + ADD_GROUP("Per-Wheel Motion", ""); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "engine_force", PROPERTY_HINT_RANGE, "0.00,1024.0,0.01,or_greater"), "set_engine_force", "get_engine_force"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "brake", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_brake", "get_brake"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "steering", PROPERTY_HINT_RANGE, "-180,180.0,0.01"), "set_steering", "get_steering"); + ADD_GROUP("VehicleBody Motion", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_as_traction"), "set_use_as_traction", "is_used_as_traction"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_as_steering"), "set_use_as_steering", "is_used_as_steering"); ADD_GROUP("Wheel", "wheel_"); @@ -288,6 +302,34 @@ void VehicleWheel::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "damping_relaxation"), "set_damping_relaxation", "get_damping_relaxation"); } +void VehicleWheel::set_engine_force(float p_engine_force) { + + m_engineForce = p_engine_force; +} + +float VehicleWheel::get_engine_force() const { + + return m_engineForce; +} + +void VehicleWheel::set_brake(float p_brake) { + + m_brake = p_brake; +} +float VehicleWheel::get_brake() const { + + return m_brake; +} + +void VehicleWheel::set_steering(float p_steering) { + + m_steering = p_steering; +} +float VehicleWheel::get_steering() const { + + return m_steering; +} + void VehicleWheel::set_use_as_traction(bool p_enable) { engine_traction = p_enable; @@ -374,10 +416,7 @@ void VehicleBody::_update_wheel(int p_idx, PhysicsDirectBodyState *s) { Vector3 fwd = up.cross(right); fwd = fwd.normalized(); - //rotate around steering over de wheelAxleWS - real_t steering = wheel.steers ? m_steeringValue : 0.0; - - Basis steeringMat(up, steering); + Basis steeringMat(up, wheel.m_steering); Basis rotatingMat(right, wheel.m_rotation); @@ -723,12 +762,11 @@ void VehicleBody::_update_friction(PhysicsDirectBodyState *s) { real_t rollingFriction = 0.f; if (wheelInfo.m_raycastInfo.m_isInContact) { - if (engine_force != 0.f && wheelInfo.engine_traction) { - rollingFriction = -engine_force * s->get_step(); + if (wheelInfo.m_engineForce != 0.f) { + rollingFriction = -wheelInfo.m_engineForce * s->get_step(); } else { real_t defaultRollingFrictionImpulse = 0.f; - float cbrake = MAX(wheelInfo.m_brake, brake); - real_t maxImpulse = cbrake ? cbrake : defaultRollingFrictionImpulse; + real_t maxImpulse = wheelInfo.m_brake ? wheelInfo.m_brake : defaultRollingFrictionImpulse; btVehicleWheelContactPoint contactPt(s, wheelInfo.m_raycastInfo.m_groundObject, wheelInfo.m_raycastInfo.m_contactPointWS, m_forwardWS[wheel], maxImpulse); rollingFriction = _calc_rolling_friction(contactPt); } @@ -886,6 +924,11 @@ void VehicleBody::_direct_state_changed(Object *p_state) { void VehicleBody::set_engine_force(float p_engine_force) { engine_force = p_engine_force; + for (int i = 0; i < wheels.size(); i++) { + VehicleWheel &wheelInfo = *wheels[i]; + if (wheelInfo.engine_traction) + wheelInfo.m_engineForce = p_engine_force; + } } float VehicleBody::get_engine_force() const { @@ -896,6 +939,10 @@ float VehicleBody::get_engine_force() const { void VehicleBody::set_brake(float p_brake) { brake = p_brake; + for (int i = 0; i < wheels.size(); i++) { + VehicleWheel &wheelInfo = *wheels[i]; + wheelInfo.m_brake = p_brake; + } } float VehicleBody::get_brake() const { @@ -905,6 +952,11 @@ float VehicleBody::get_brake() const { void VehicleBody::set_steering(float p_steering) { m_steeringValue = p_steering; + for (int i = 0; i < wheels.size(); i++) { + VehicleWheel &wheelInfo = *wheels[i]; + if (wheelInfo.steers) + wheelInfo.m_steering = p_steering; + } } float VehicleBody::get_steering() const { diff --git a/scene/3d/vehicle_body.h b/scene/3d/vehicle_body.h index 9e3fe72282..914bfd54bd 100644 --- a/scene/3d/vehicle_body.h +++ b/scene/3d/vehicle_body.h @@ -70,7 +70,7 @@ class VehicleWheel : public Spatial { real_t m_deltaRotation; real_t m_rpm; real_t m_rollInfluence; - //real_t m_engineForce; + real_t m_engineForce; real_t m_brake; real_t m_clippedInvContactDotSuspension; @@ -137,6 +137,15 @@ public: float get_rpm() const; + void set_engine_force(float p_engine_force); + float get_engine_force() const; + + void set_brake(float p_brake); + float get_brake() const; + + void set_steering(float p_steering); + float get_steering() const; + String get_configuration_warning() const; VehicleWheel(); diff --git a/scene/3d/visual_instance.cpp b/scene/3d/visual_instance.cpp index 5141c84803..d1de0c56a7 100644 --- a/scene/3d/visual_instance.cpp +++ b/scene/3d/visual_instance.cpp @@ -215,17 +215,6 @@ float GeometryInstance::get_lod_max_hysteresis() const { } void GeometryInstance::_notification(int p_what) { - - if (p_what == NOTIFICATION_ENTER_WORLD) { - - if (flags[FLAG_USE_BAKED_LIGHT]) { - } - - } else if (p_what == NOTIFICATION_EXIT_WORLD) { - - if (flags[FLAG_USE_BAKED_LIGHT]) { - } - } } void GeometryInstance::set_flag(Flags p_flag, bool p_value) { @@ -236,8 +225,6 @@ void GeometryInstance::set_flag(Flags p_flag, bool p_value) { flags[p_flag] = p_value; VS::get_singleton()->instance_geometry_set_flag(get_instance(), (VS::InstanceFlags)p_flag, p_value); - if (p_flag == FLAG_USE_BAKED_LIGHT) { - } } bool GeometryInstance::get_flag(Flags p_flag) const { diff --git a/scene/3d/world_environment.cpp b/scene/3d/world_environment.cpp index 3cd43cbf5b..8d46b4161d 100644 --- a/scene/3d/world_environment.cpp +++ b/scene/3d/world_environment.cpp @@ -80,7 +80,7 @@ Ref<Environment> WorldEnvironment::get_environment() const { String WorldEnvironment::get_configuration_warning() const { if (!environment.is_valid()) { - return TTR("WorldEnvironment needs an Environment resource."); + return TTR("WorldEnvironment requires its \"Environment\" property to contain an Environment to have a visible effect."); } if (/*!is_visible_in_tree() ||*/ !is_inside_tree()) diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index 54f0fdc26a..6745b57cff 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -1342,15 +1342,15 @@ String AnimationTree::get_configuration_warning() const { if (!root.is_valid()) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } - warning += TTR("A root AnimationNode for the graph is not set."); + warning += TTR("No root AnimationNode for the graph is set."); } if (!has_node(animation_player)) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } warning += TTR("Path to an AnimationPlayer node containing animations is not set."); @@ -1361,7 +1361,7 @@ String AnimationTree::get_configuration_warning() const { if (!player) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } warning += TTR("Path set for AnimationPlayer does not lead to an AnimationPlayer node."); @@ -1370,10 +1370,10 @@ String AnimationTree::get_configuration_warning() const { if (!player->has_node(player->get_root())) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } - warning += TTR("AnimationPlayer root is not a valid node."); + warning += TTR("The AnimationPlayer root node is not a valid node."); return warning; } diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index 52fcea2a71..4f71481280 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -115,9 +115,6 @@ void BaseButton::_notification(int p_what) { } } - if (p_what == NOTIFICATION_ENTER_TREE) { - } - if (p_what == NOTIFICATION_EXIT_TREE || (p_what == NOTIFICATION_VISIBILITY_CHANGED && !is_visible_in_tree())) { if (!toggle_mode) { diff --git a/scene/gui/container.cpp b/scene/gui/container.cpp index c9cf5f8308..449076f863 100644 --- a/scene/gui/container.cpp +++ b/scene/gui/container.cpp @@ -175,9 +175,9 @@ String Container::get_configuration_warning() const { if (get_class() == "Container" && get_script().is_null()) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } - warning += TTR("Container by itself serves no purpose unless a script configures its children placement behavior.\nIf you don't intend to add a script, then please use a plain 'Control' node instead."); + warning += TTR("Container by itself serves no purpose unless a script configures its children placement behavior.\nIf you don't intend to add a script, use a plain Control node instead."); } return warning; } diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index eccd42cb9f..5ec6c68163 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -289,7 +289,7 @@ void Control::_update_minimum_size() { Size2 minsize = get_combined_minimum_size(); if (minsize.x > data.size_cache.x || minsize.y > data.size_cache.y) { - set_size(data.size_cache); + _size_changed(); } data.updating_last_minimum_size = false; @@ -850,6 +850,12 @@ Ref<Texture> Control::get_icon(const StringName &p_name, const StringName &p_typ theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_icon(p_name, type)) { + return Theme::get_project_default()->get_icon(p_name, type); + } + } + return Theme::get_default()->get_icon(p_name, type); } @@ -886,6 +892,12 @@ Ref<Shader> Control::get_shader(const StringName &p_name, const StringName &p_ty theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_shader(p_name, type)) { + return Theme::get_project_default()->get_shader(p_name, type); + } + } + return Theme::get_default()->get_shader(p_name, type); } @@ -925,6 +937,9 @@ Ref<StyleBox> Control::get_stylebox(const StringName &p_name, const StringName & } while (class_name != StringName()) { + if (Theme::get_project_default().is_valid() && Theme::get_project_default()->has_stylebox(p_name, type)) + return Theme::get_project_default()->get_stylebox(p_name, type); + if (Theme::get_default()->has_stylebox(p_name, class_name)) return Theme::get_default()->get_stylebox(p_name, class_name); @@ -1001,6 +1016,11 @@ Color Control::get_color(const StringName &p_name, const StringName &p_type) con theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_color(p_name, type)) { + return Theme::get_project_default()->get_color(p_name, type); + } + } return Theme::get_default()->get_color(p_name, type); } @@ -1036,6 +1056,11 @@ int Control::get_constant(const StringName &p_name, const StringName &p_type) co theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_constant(p_name, type)) { + return Theme::get_project_default()->get_constant(p_name, type); + } + } return Theme::get_default()->get_constant(p_name, type); } @@ -1106,6 +1131,11 @@ bool Control::has_icon(const StringName &p_name, const StringName &p_type) const theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_color(p_name, type)) { + return true; + } + } return Theme::get_default()->has_icon(p_name, type); } @@ -1140,6 +1170,11 @@ bool Control::has_shader(const StringName &p_name, const StringName &p_type) con theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_shader(p_name, type)) { + return true; + } + } return Theme::get_default()->has_shader(p_name, type); } bool Control::has_stylebox(const StringName &p_name, const StringName &p_type) const { @@ -1173,6 +1208,11 @@ bool Control::has_stylebox(const StringName &p_name, const StringName &p_type) c theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_stylebox(p_name, type)) { + return true; + } + } return Theme::get_default()->has_stylebox(p_name, type); } bool Control::has_font(const StringName &p_name, const StringName &p_type) const { @@ -1206,6 +1246,11 @@ bool Control::has_font(const StringName &p_name, const StringName &p_type) const theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_font(p_name, type)) { + return true; + } + } return Theme::get_default()->has_font(p_name, type); } @@ -1240,6 +1285,11 @@ bool Control::has_color(const StringName &p_name, const StringName &p_type) cons theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_color(p_name, type)) { + return true; + } + } return Theme::get_default()->has_color(p_name, type); } @@ -1274,6 +1324,11 @@ bool Control::has_constant(const StringName &p_name, const StringName &p_type) c theme_owner = NULL; } + if (Theme::get_project_default().is_valid()) { + if (Theme::get_project_default()->has_constant(p_name, type)) { + return true; + } + } return Theme::get_default()->has_constant(p_name, type); } @@ -2711,7 +2766,7 @@ String Control::get_configuration_warning() const { if (data.mouse_filter == MOUSE_FILTER_IGNORE && data.tooltip != "") { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } warning += TTR("The Hint Tooltip won't be displayed as the control's Mouse Filter is set to \"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."); } diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 04fb991f78..f1bdbb5ff5 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -403,11 +403,10 @@ void FileDialog::update_file_list() { List<String> files; List<String> dirs; - bool is_dir; bool is_hidden; String item; - while ((item = dir_access->get_next(&is_dir)) != "") { + while ((item = dir_access->get_next()) != "") { if (item == "." || item == "..") continue; @@ -415,7 +414,7 @@ void FileDialog::update_file_list() { is_hidden = dir_access->current_is_hidden(); if (show_hidden_files || !is_hidden) { - if (!is_dir) + if (!dir_access->current_is_dir()) files.push_back(item); else dirs.push_back(item); @@ -880,14 +879,14 @@ FileDialog::FileDialog() { dir->set_h_size_flags(SIZE_EXPAND_FILL); refresh = memnew(ToolButton); - refresh->set_tooltip(RTR("Refresh")); + refresh->set_tooltip(RTR("Refresh files.")); refresh->connect("pressed", this, "_update_file_list"); hbc->add_child(refresh); show_hidden = memnew(ToolButton); show_hidden->set_toggle_mode(true); show_hidden->set_pressed(is_showing_hidden_files()); - show_hidden->set_tooltip(RTR("Toggle Hidden Files")); + show_hidden->set_tooltip(RTR("Toggle the visibility of hidden files.")); show_hidden->connect("toggled", this, "set_show_hidden_files"); hbc->add_child(show_hidden); diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index f238aeb392..38005f1322 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -1030,14 +1030,28 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { } Ref<InputEventKey> k = p_ev; - if (k.is_valid() && k->get_scancode() == KEY_D && k->is_pressed() && k->get_command()) { - emit_signal("duplicate_nodes_request"); - accept_event(); - } - if (k.is_valid() && k->get_scancode() == KEY_DELETE && k->is_pressed()) { - emit_signal("delete_nodes_request"); - accept_event(); + if (k.is_valid()) { + + if (k->get_scancode() == KEY_D && k->is_pressed() && k->get_command()) { + emit_signal("duplicate_nodes_request"); + accept_event(); + } + + if (k->get_scancode() == KEY_C && k->is_pressed() && k->get_command()) { + emit_signal("copy_nodes_request"); + accept_event(); + } + + if (k->get_scancode() == KEY_V && k->is_pressed() && k->get_command()) { + emit_signal("paste_nodes_request"); + accept_event(); + } + + if (k->get_scancode() == KEY_DELETE && k->is_pressed()) { + emit_signal("delete_nodes_request"); + accept_event(); + } } Ref<InputEventMagnifyGesture> magnify_gesture = p_ev; @@ -1297,6 +1311,8 @@ void GraphEdit::_bind_methods() { ADD_SIGNAL(MethodInfo("disconnection_request", PropertyInfo(Variant::STRING, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::STRING, "to"), PropertyInfo(Variant::INT, "to_slot"))); ADD_SIGNAL(MethodInfo("popup_request", PropertyInfo(Variant::VECTOR2, "position"))); ADD_SIGNAL(MethodInfo("duplicate_nodes_request")); + ADD_SIGNAL(MethodInfo("copy_nodes_request")); + ADD_SIGNAL(MethodInfo("paste_nodes_request")); ADD_SIGNAL(MethodInfo("node_selected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); ADD_SIGNAL(MethodInfo("connection_to_empty", PropertyInfo(Variant::STRING, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::VECTOR2, "release_position"))); ADD_SIGNAL(MethodInfo("connection_from_empty", PropertyInfo(Variant::STRING, "to"), PropertyInfo(Variant::INT, "to_slot"), PropertyInfo(Variant::VECTOR2, "release_position"))); diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp index 6463ee5ad5..222c75b21d 100644 --- a/scene/gui/graph_node.cpp +++ b/scene/gui/graph_node.cpp @@ -599,6 +599,8 @@ void GraphNode::_gui_input(const Ref<InputEvent> &p_ev) { Vector2 mpos = Vector2(mb->get_position().x, mb->get_position().y); if (close_rect.size != Size2() && close_rect.has_point(mpos)) { + //send focus to parent + get_parent_control()->grab_focus(); emit_signal("close_request"); accept_event(); return; @@ -615,9 +617,7 @@ void GraphNode::_gui_input(const Ref<InputEvent> &p_ev) { return; } - //send focus to parent emit_signal("raise_request"); - get_parent_control()->grab_focus(); } if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 3dcbf64e7c..d5347edb87 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -999,6 +999,8 @@ void LineEdit::set_cursor_at_pixel_pos(int p_x) { Ref<StyleBox> style = get_stylebox("normal"); int pixel_ofs = 0; Size2 size = get_size(); + bool display_clear_icon = !text.empty() && is_editable() && clear_button_enabled; + int r_icon_width = Control::get_icon("clear")->get_width(); switch (align) { @@ -1013,10 +1015,16 @@ void LineEdit::set_cursor_at_pixel_pos(int p_x) { pixel_ofs = int(style->get_offset().x); else pixel_ofs = int(size.width - (cached_width)) / 2; + + if (display_clear_icon) + pixel_ofs -= int(r_icon_width / 2 + style->get_margin(MARGIN_RIGHT)); } break; case ALIGN_RIGHT: { pixel_ofs = int(size.width - style->get_margin(MARGIN_RIGHT) - (cached_width)); + + if (display_clear_icon) + pixel_ofs -= int(r_icon_width + style->get_margin(MARGIN_RIGHT)); } break; } diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index 58671655dc..d1840e43a3 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -43,40 +43,42 @@ Size2 OptionButton::get_minimum_size() const { void OptionButton::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - - if (!has_icon("arrow")) - return; - - RID ci = get_canvas_item(); - Ref<Texture> arrow = Control::get_icon("arrow"); - Ref<StyleBox> normal = get_stylebox("normal"); - Color clr = Color(1, 1, 1); - if (get_constant("modulate_arrow")) { - switch (get_draw_mode()) { - case DRAW_PRESSED: - clr = get_color("font_color_pressed"); - break; - case DRAW_HOVER: - clr = get_color("font_color_hover"); - break; - case DRAW_DISABLED: - clr = get_color("font_color_disabled"); - break; - default: - clr = get_color("font_color"); + switch (p_what) { + case NOTIFICATION_DRAW: { + + if (!has_icon("arrow")) + return; + + RID ci = get_canvas_item(); + Ref<Texture> arrow = Control::get_icon("arrow"); + Color clr = Color(1, 1, 1); + if (get_constant("modulate_arrow")) { + switch (get_draw_mode()) { + case DRAW_PRESSED: + clr = get_color("font_color_pressed"); + break; + case DRAW_HOVER: + clr = get_color("font_color_hover"); + break; + case DRAW_DISABLED: + clr = get_color("font_color_disabled"); + break; + default: + clr = get_color("font_color"); + } } - } - Size2 size = get_size(); + Size2 size = get_size(); - Point2 ofs(size.width - arrow->get_width() - get_constant("arrow_margin"), int(Math::abs((size.height - arrow->get_height()) / 2))); - arrow->draw(ci, ofs, clr); - } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { + Point2 ofs(size.width - arrow->get_width() - get_constant("arrow_margin"), int(Math::abs((size.height - arrow->get_height()) / 2))); + arrow->draw(ci, ofs, clr); + } break; + case NOTIFICATION_VISIBILITY_CHANGED: { - if (!is_visible_in_tree()) { - popup->hide(); - } + if (!is_visible_in_tree()) { + popup->hide(); + } + } break; } } diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp index 9e996e5519..3e003af396 100644 --- a/scene/gui/popup.cpp +++ b/scene/gui/popup.cpp @@ -234,7 +234,7 @@ Popup::Popup() { String Popup::get_configuration_warning() const { if (is_visible_in_tree()) { - return TTR("Popups will hide by default unless you call popup() or any of the popup*() functions. Making them visible for editing is fine though, but they will hide upon running."); + return TTR("Popups will hide by default unless you call popup() or any of the popup*() functions. Making them visible for editing is fine, but they will hide upon running."); } return String(); diff --git a/scene/gui/progress_bar.cpp b/scene/gui/progress_bar.cpp index 264eda4035..0154a452ad 100644 --- a/scene/gui/progress_bar.cpp +++ b/scene/gui/progress_bar.cpp @@ -60,7 +60,7 @@ void ProgressBar::_notification(int p_what) { draw_style_box(bg, Rect2(Point2(), get_size())); float r = get_as_ratio(); int mp = fg->get_minimum_size().width; - int p = r * get_size().width - mp; + int p = r * (get_size().width - mp); if (p > 0) { draw_style_box(fg, Rect2(Point2(), Size2(p + fg->get_minimum_size().width, get_size().height))); diff --git a/scene/gui/range.cpp b/scene/gui/range.cpp index d00acaf08a..e709bac377 100644 --- a/scene/gui/range.cpp +++ b/scene/gui/range.cpp @@ -35,9 +35,9 @@ String Range::get_configuration_warning() const { if (shared->exp_ratio && shared->min <= 0) { if (warning != String()) { - warning += "\n"; + warning += "\n\n"; } - warning += TTR("If exp_edit is true min_value must be > 0."); + warning += TTR("If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0."); } return warning; diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 5b91299de6..8223ea6d1e 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -821,11 +821,7 @@ void RichTextLabel::_notification(int p_what) { } break; case NOTIFICATION_THEME_CHANGED: { - if (is_inside_tree() && use_bbcode) { - parse_bbcode(bbcode); - //first_invalid_line=0; //invalidate ALL - //update(); - } + update(); } break; case NOTIFICATION_DRAW: { @@ -1942,37 +1938,37 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { if (col.begins_with("#")) color = Color::html(col); else if (col == "aqua") - color = Color::html("#00FFFF"); + color = Color(0, 1, 1); else if (col == "black") - color = Color::html("#000000"); + color = Color(0, 0, 0); else if (col == "blue") - color = Color::html("#0000FF"); + color = Color(0, 0, 1); else if (col == "fuchsia") - color = Color::html("#FF00FF"); + color = Color(1, 0, 1); else if (col == "gray" || col == "grey") - color = Color::html("#808080"); + color = Color(0.5, 0.5, 0.5); else if (col == "green") - color = Color::html("#008000"); + color = Color(0, 0.5, 0); else if (col == "lime") - color = Color::html("#00FF00"); + color = Color(0, 1, 0); else if (col == "maroon") - color = Color::html("#800000"); + color = Color(0.5, 0, 0); else if (col == "navy") - color = Color::html("#000080"); + color = Color(0, 0, 0.5); else if (col == "olive") - color = Color::html("#808000"); + color = Color(0.5, 0.5, 0); else if (col == "purple") - color = Color::html("#800080"); + color = Color(0.5, 0, 0.5); else if (col == "red") - color = Color::html("#FF0000"); + color = Color(1, 0, 0); else if (col == "silver") - color = Color::html("#C0C0C0"); + color = Color(0.75, 0.75, 0.75); else if (col == "teal") - color = Color::html("#008008"); + color = Color(0, 0.5, 0.5); else if (col == "white") - color = Color::html("#FFFFFF"); + color = Color(1, 1, 1); else if (col == "yellow") - color = Color::html("#FFFF00"); + color = Color(1, 1, 0); else color = base_color; diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index d83ae47671..461281a4ed 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -486,7 +486,7 @@ String ScrollContainer::get_configuration_warning() const { } if (found != 1) - return TTR("ScrollContainer is intended to work with a single child control.\nUse a container as child (VBox,HBox,etc), or a Control and set the custom minimum size manually."); + return TTR("ScrollContainer is intended to work with a single child control.\nUse a container as child (VBox, HBox, etc.), or a Control and set the custom minimum size manually."); else return ""; } diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index e778af3ceb..db277d3705 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -40,7 +40,7 @@ Size2 SpinBox::get_minimum_size() const { void SpinBox::_value_changed(double) { - String value = String::num(get_value(), Math::step_decimals(get_step())); + String value = String::num(get_value(), Math::range_step_decimals(get_step())); if (prefix != "") value = prefix + " " + value; if (suffix != "") @@ -173,7 +173,7 @@ void SpinBox::_line_edit_focus_exit() { _text_entered(line_edit->get_text()); } -inline void SpinBox::_adjust_width_for_icon(const Ref<Texture> icon) { +inline void SpinBox::_adjust_width_for_icon(const Ref<Texture> &icon) { int w = icon->get_width(); if (w != last_w) { diff --git a/scene/gui/spin_box.h b/scene/gui/spin_box.h index 49dc6d950c..9cf977d2d6 100644 --- a/scene/gui/spin_box.h +++ b/scene/gui/spin_box.h @@ -62,7 +62,7 @@ class SpinBox : public Range { void _line_edit_focus_exit(); - inline void _adjust_width_for_icon(const Ref<Texture> icon); + inline void _adjust_width_for_icon(const Ref<Texture> &icon); protected: void _gui_input(const Ref<InputEvent> &p_event); diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index 39c76e6646..be8f1cf36e 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -303,7 +303,7 @@ void TabContainer::_notification(int p_what) { // Draw the tab contents. Control *control = Object::cast_to<Control>(tabs[i + first_tab_cache]); - String text = control->has_meta("_tab_name") ? String(tr(String(control->get_meta("_tab_name")))) : String(control->get_name()); + String text = control->has_meta("_tab_name") ? String(tr(String(control->get_meta("_tab_name")))) : String(tr(control->get_name())); int x_content = tab_rect.position.x + tab_style->get_margin(MARGIN_LEFT); int top_margin = tab_style->get_margin(MARGIN_TOP); diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index a7b4e08553..ff0c723141 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -683,7 +683,7 @@ void TextEdit::_notification(int p_what) { } if (line_length_guideline) { - int x = xmargin_beg + cache.font->get_char_size('0').width * line_length_guideline_col - cursor.x_ofs; + int x = xmargin_beg + (int)cache.font->get_char_size('0').width * line_length_guideline_col - cursor.x_ofs; if (x > xmargin_beg && x < xmargin_end) { VisualServer::get_singleton()->canvas_item_add_line(ci, Point2(x, 0), Point2(x, size.height), cache.line_length_guideline_color); } @@ -3287,28 +3287,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } break; - case KEY_U: { - if (!k->get_command() || k->get_shift()) { - scancode_handled = false; - break; - } else { - if (selection.active) { - int ini = selection.from_line; - int end = selection.to_line; - - for (int i = ini; i <= end; i++) { - _uncomment_line(i); - } - } else { - _uncomment_line(cursor.line); - if (cursor.column >= get_line(cursor.line).length()) { - cursor.column = MAX(0, get_line(cursor.line).length() - 1); - } - } - update(); - } - } break; - default: { scancode_handled = false; @@ -3367,24 +3345,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } -void TextEdit::_uncomment_line(int p_line) { - String line_text = get_line(p_line); - for (int i = 0; i < line_text.length(); i++) { - if (line_text[i] == '#') { - _remove_text(p_line, i, p_line, i + 1); - if (p_line == selection.to_line && selection.to_column > line_text.length() - 1) { - selection.to_column -= 1; - if (selection.to_column >= selection.from_column) { - selection.active = false; - } - } - return; - } else if (line_text[i] != '\t' && line_text[i] != ' ') { - return; - } - } -} - void TextEdit::_scroll_up(real_t p_delta) { if (scrolling && smooth_scroll_enabled && SGN(target_v_scroll - v_scroll->get_value()) != SGN(-p_delta)) diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index 9fb8e03288..b47dac0902 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -395,7 +395,6 @@ private: void _update_selection_mode_word(); void _update_selection_mode_line(); - void _uncomment_line(int p_line); void _scroll_up(real_t p_delta); void _scroll_down(real_t p_delta); diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 8624baa005..81f2f46a80 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -571,21 +571,7 @@ int TreeItem::get_button_by_id(int p_column, int p_id) const { return -1; } -void TreeItem::set_disable_button(int p_column, int p_idx, bool p_disabled) { - ERR_FAIL_INDEX(p_column, cells.size()); - ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); - - cells.write[p_column].buttons.write[p_idx].disabled = p_disabled; - _changed_notify(p_column); -} -bool TreeItem::is_button_disabled(int p_column, int p_idx) const { - - ERR_FAIL_INDEX_V(p_column, cells.size(), false); - ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), false); - - return cells[p_column].buttons[p_idx].disabled; -} void TreeItem::set_button(int p_column, int p_idx, const Ref<Texture> &p_button) { ERR_FAIL_COND(p_button.is_null()); @@ -603,6 +589,23 @@ void TreeItem::set_button_color(int p_column, int p_idx, const Color &p_color) { _changed_notify(p_column); } +void TreeItem::set_button_disabled(int p_column, int p_idx, bool p_disabled) { + + ERR_FAIL_INDEX(p_column, cells.size()); + ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); + + cells.write[p_column].buttons.write[p_idx].disabled = p_disabled; + _changed_notify(p_column); +} + +bool TreeItem::is_button_disabled(int p_column, int p_idx) const { + + ERR_FAIL_INDEX_V(p_column, cells.size(), false); + ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), false); + + return cells[p_column].buttons[p_idx].disabled; +} + void TreeItem::set_editable(int p_column, bool p_editable) { ERR_FAIL_INDEX(p_column, cells.size()); @@ -792,8 +795,8 @@ void TreeItem::_bind_methods() { ClassDB::bind_method(D_METHOD("get_button", "column", "button_idx"), &TreeItem::get_button); ClassDB::bind_method(D_METHOD("set_button", "column", "button_idx", "button"), &TreeItem::set_button); ClassDB::bind_method(D_METHOD("erase_button", "column", "button_idx"), &TreeItem::erase_button); + ClassDB::bind_method(D_METHOD("set_button_disabled", "column", "button_idx", "disabled"), &TreeItem::set_button_disabled); ClassDB::bind_method(D_METHOD("is_button_disabled", "column", "button_idx"), &TreeItem::is_button_disabled); - ClassDB::bind_method(D_METHOD("set_disable_button", "column", "button_idx", "disabled"), &TreeItem::set_disable_button); ClassDB::bind_method(D_METHOD("set_expand_right", "column", "enable"), &TreeItem::set_expand_right); ClassDB::bind_method(D_METHOD("get_expand_right", "column"), &TreeItem::get_expand_right); @@ -1312,7 +1315,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 Ref<Texture> updown = cache.updown; - String valtext = String::num(p_item->cells[i].val, Math::step_decimals(p_item->cells[i].step)); + String valtext = String::num(p_item->cells[i].val, Math::range_step_decimals(p_item->cells[i].step)); //String valtext = rtos( p_item->cells[i].val ); if (p_item->cells[i].suffix != String()) @@ -1923,7 +1926,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } else { - editor_text = String::num(p_item->cells[col].val, Math::step_decimals(p_item->cells[col].step)); + editor_text = String::num(p_item->cells[col].val, Math::range_step_decimals(p_item->cells[col].step)); if (select_mode == SELECT_MULTI && get_tree()->get_event_count() == focus_in_id) bring_up_editor = false; } @@ -2752,7 +2755,7 @@ bool Tree::edit_selected() { text_editor->set_position(textedpos); text_editor->set_size(rect.size); text_editor->clear(); - text_editor->set_text(c.mode == TreeItem::CELL_MODE_STRING ? c.text : String::num(c.val, Math::step_decimals(c.step))); + text_editor->set_text(c.mode == TreeItem::CELL_MODE_STRING ? c.text : String::num(c.val, Math::range_step_decimals(c.step))); text_editor->select_all(); if (c.mode == TreeItem::CELL_MODE_RANGE) { @@ -2918,8 +2921,6 @@ void Tree::_notification(int p_what) { drag_touching = false; drag_touching_deaccel = false; } - - } else { } } diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 6e5e2c1eba..b6cdab766f 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -209,10 +209,10 @@ public: int get_button_id(int p_column, int p_idx) const; void erase_button(int p_column, int p_idx); int get_button_by_id(int p_column, int p_id) const; - bool is_button_disabled(int p_column, int p_idx) const; void set_button(int p_column, int p_idx, const Ref<Texture> &p_button); void set_button_color(int p_column, int p_idx, const Color &p_color); - void set_disable_button(int p_column, int p_idx, bool p_disabled); + void set_button_disabled(int p_column, int p_idx, bool p_disabled); + bool is_button_disabled(int p_column, int p_idx) const; /* range works for mode number or mode combo */ diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp index 88b942ee45..05bd911014 100644 --- a/scene/main/http_request.cpp +++ b/scene/main/http_request.cpp @@ -96,6 +96,11 @@ Error HTTPRequest::request(const String &p_url, const Vector<String> &p_custom_h ERR_FAIL_V(ERR_BUSY); } + if (timeout > 0) { + timer->stop(); + timer->start(timeout); + } + method = p_method; Error err = _parse_url(p_url); @@ -153,6 +158,8 @@ void HTTPRequest::_thread_func(void *p_userdata) { void HTTPRequest::cancel_request() { + timer->stop(); + if (!requesting) return; @@ -479,6 +486,23 @@ int HTTPRequest::get_body_size() const { return body_len; } +void HTTPRequest::set_timeout(int p_timeout) { + + ERR_FAIL_COND(p_timeout < 0); + timeout = p_timeout; +} + +int HTTPRequest::get_timeout() { + + return timeout; +} + +void HTTPRequest::_timeout() { + + cancel_request(); + call_deferred("_request_done", RESULT_TIMEOUT, 0, PoolStringArray(), PoolByteArray()); +} + void HTTPRequest::_bind_methods() { ClassDB::bind_method(D_METHOD("request", "url", "custom_headers", "ssl_validate_domain", "method", "request_data"), &HTTPRequest::request, DEFVAL(PoolStringArray()), DEFVAL(true), DEFVAL(HTTPClient::METHOD_GET), DEFVAL(String())); @@ -504,10 +528,16 @@ void HTTPRequest::_bind_methods() { ClassDB::bind_method(D_METHOD("_redirect_request"), &HTTPRequest::_redirect_request); ClassDB::bind_method(D_METHOD("_request_done"), &HTTPRequest::_request_done); + ClassDB::bind_method(D_METHOD("set_timeout", "timeout"), &HTTPRequest::set_timeout); + ClassDB::bind_method(D_METHOD("get_timeout"), &HTTPRequest::get_timeout); + + ClassDB::bind_method(D_METHOD("_timeout"), &HTTPRequest::_timeout); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "download_file", PROPERTY_HINT_FILE), "set_download_file", "get_download_file"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_threads"), "set_use_threads", "is_using_threads"); ADD_PROPERTY(PropertyInfo(Variant::INT, "body_size_limit", PROPERTY_HINT_RANGE, "-1,2000000000"), "set_body_size_limit", "get_body_size_limit"); ADD_PROPERTY(PropertyInfo(Variant::INT, "max_redirects", PROPERTY_HINT_RANGE, "-1,64"), "set_max_redirects", "get_max_redirects"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "timeout", PROPERTY_HINT_RANGE, "0,86400"), "set_timeout", "get_timeout"); ADD_SIGNAL(MethodInfo("request_completed", PropertyInfo(Variant::INT, "result"), PropertyInfo(Variant::INT, "response_code"), PropertyInfo(Variant::POOL_STRING_ARRAY, "headers"), PropertyInfo(Variant::POOL_BYTE_ARRAY, "body"))); @@ -524,6 +554,7 @@ void HTTPRequest::_bind_methods() { BIND_ENUM_CONSTANT(RESULT_DOWNLOAD_FILE_CANT_OPEN); BIND_ENUM_CONSTANT(RESULT_DOWNLOAD_FILE_WRITE_ERROR); BIND_ENUM_CONSTANT(RESULT_REDIRECT_LIMIT_REACHED); + BIND_ENUM_CONSTANT(RESULT_TIMEOUT); } HTTPRequest::HTTPRequest() { @@ -546,6 +577,12 @@ HTTPRequest::HTTPRequest() { downloaded = 0; body_size_limit = -1; file = NULL; + + timer = memnew(Timer); + timer->set_one_shot(true); + timer->connect("timeout", this, "_timeout"); + add_child(timer); + timeout = 0; } HTTPRequest::~HTTPRequest() { diff --git a/scene/main/http_request.h b/scene/main/http_request.h index 2e58d579ba..f1f91235a6 100644 --- a/scene/main/http_request.h +++ b/scene/main/http_request.h @@ -35,6 +35,7 @@ #include "core/os/file_access.h" #include "core/os/thread.h" #include "node.h" +#include "scene/main/timer.h" class HTTPRequest : public Node { @@ -53,7 +54,8 @@ public: RESULT_REQUEST_FAILED, RESULT_DOWNLOAD_FILE_CANT_OPEN, RESULT_DOWNLOAD_FILE_WRITE_ERROR, - RESULT_REDIRECT_LIMIT_REACHED + RESULT_REDIRECT_LIMIT_REACHED, + RESULT_TIMEOUT }; @@ -92,6 +94,8 @@ private: int max_redirects; + int timeout; + void _redirect_request(const String &p_new_url); bool _handle_response(bool *ret_value); @@ -128,6 +132,13 @@ public: void set_max_redirects(int p_max); int get_max_redirects() const; + Timer *timer; + + void set_timeout(int p_timeout); + int get_timeout(); + + void _timeout(); + int get_downloaded_bytes() const; int get_body_size() const; diff --git a/scene/main/instance_placeholder.cpp b/scene/main/instance_placeholder.cpp index 71addd6fea..99ecc8bc37 100644 --- a/scene/main/instance_placeholder.cpp +++ b/scene/main/instance_placeholder.cpp @@ -92,6 +92,8 @@ Node *InstancePlaceholder::create_instance(bool p_replace, const Ref<PackedScene if (!ps.is_valid()) return NULL; Node *scene = ps->instance(); + if (!scene) + return NULL; scene->set_name(get_name()); int pos = get_position_in_parent(); diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 5888760973..caa0da5d1f 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -210,7 +210,7 @@ void Node::_propagate_enter_tree() { } data.viewport = Object::cast_to<Viewport>(this); - if (!data.viewport) + if (!data.viewport && data.parent) data.viewport = data.parent->data.viewport; data.inside_tree = true; @@ -1759,7 +1759,7 @@ bool Node::has_persistent_groups() const { return false; } -void Node::_print_tree_pretty(const String prefix, const bool last) { +void Node::_print_tree_pretty(const String &prefix, const bool last) { String new_prefix = last ? String::utf8(" â”–â•´") : String::utf8(" â” â•´"); print_line(prefix + new_prefix + String(get_name())); @@ -2487,7 +2487,7 @@ bool Node::has_node_and_resource(const NodePath &p_path) const { Vector<StringName> leftover_path; Node *node = get_node_and_resource(p_path, res, leftover_path, false); - return (node && res.is_valid()); + return node; } Array Node::_get_node_and_resource(const NodePath &p_path) { @@ -2525,9 +2525,15 @@ Node *Node::get_node_and_resource(const NodePath &p_path, RES &r_res, Vector<Str int j = 0; // If not p_last_is_property, we shouldn't consider the last one as part of the resource for (; j < p_path.get_subname_count() - (int)p_last_is_property; j++) { - RES new_res = j == 0 ? node->get(p_path.get_subname(j)) : r_res->get(p_path.get_subname(j)); + Variant new_res_v = j == 0 ? node->get(p_path.get_subname(j)) : r_res->get(p_path.get_subname(j)); + + if (new_res_v.get_type() == Variant::NIL) { // Found nothing on that path + return NULL; + } + + RES new_res = new_res_v; - if (new_res.is_null()) { + if (new_res.is_null()) { // No longer a resource, assume property break; } diff --git a/scene/main/node.h b/scene/main/node.h index 9b9ca06455..982bfcd620 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -152,7 +152,7 @@ private: Ref<MultiplayerAPI> multiplayer; - void _print_tree_pretty(const String prefix, const bool last); + void _print_tree_pretty(const String &prefix, const bool last); void _print_tree(const Node *p_node); Node *_get_child_by_name(const StringName &p_name) const; diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 0940a59a82..dbf3150ae0 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -1089,7 +1089,7 @@ void SceneTree::get_nodes_in_group(const StringName &p_group, List<Node *> *p_li static void _fill_array(Node *p_node, Array &array, int p_level) { - array.push_back(p_level); + array.push_back(p_node->get_child_count()); array.push_back(p_node->get_name()); array.push_back(p_node->get_class()); array.push_back(p_node->get_instance_id()); @@ -1249,7 +1249,7 @@ void SceneTree::_update_root_rect() { } } -void SceneTree::set_screen_stretch(StretchMode p_mode, StretchAspect p_aspect, const Size2 p_minsize, real_t p_shrink) { +void SceneTree::set_screen_stretch(StretchMode p_mode, StretchAspect p_aspect, const Size2 &p_minsize, real_t p_shrink) { stretch_mode = p_mode; stretch_aspect = p_aspect; @@ -1507,8 +1507,11 @@ void SceneTree::_live_edit_instance_node_func(const NodePath &p_parent, const St Node *n2 = n->get_node(p_parent); Node *no = ps->instance(); - no->set_name(p_name); + if (!no) { + continue; + } + no->set_name(p_name); n2->add_child(no); } } diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index 0bcb724929..98f2fe5e35 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -386,7 +386,7 @@ public: void get_nodes_in_group(const StringName &p_group, List<Node *> *p_list); bool has_group(const StringName &p_identifier) const; - void set_screen_stretch(StretchMode p_mode, StretchAspect p_aspect, const Size2 p_minsize, real_t p_shrink = 1); + void set_screen_stretch(StretchMode p_mode, StretchAspect p_aspect, const Size2 &p_minsize, real_t p_shrink = 1); void set_use_font_oversampling(bool p_oversampling); bool is_using_font_oversampling() const; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 334c49f7cc..9466b7c5c1 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -581,7 +581,7 @@ void Viewport::_notification(int p_what) { if (physics_object_capture != 0) { CollisionObject *co = Object::cast_to<CollisionObject>(ObjectDB::get_instance(physics_object_capture)); - if (co) { + if (co && camera) { _collision_object_input_event(co, camera, ev, Vector3(), Vector3(), 0); captured = true; if (mb.is_valid() && mb->get_button_index() == 1 && !mb->is_pressed()) { @@ -1431,6 +1431,7 @@ void Viewport::_gui_show_tooltip() { Control *which = NULL; String tooltip = _gui_get_tooltip(gui.tooltip, gui.tooltip->get_global_transform().xform_inv(gui.tooltip_pos), &which); + tooltip = tooltip.strip_edges(); if (tooltip.length() == 0) return; // bye @@ -1460,7 +1461,7 @@ void Viewport::_gui_show_tooltip() { gui.tooltip_label->set_anchor_and_margin(MARGIN_TOP, Control::ANCHOR_BEGIN, ttp->get_margin(MARGIN_TOP)); gui.tooltip_label->set_anchor_and_margin(MARGIN_RIGHT, Control::ANCHOR_END, -ttp->get_margin(MARGIN_RIGHT)); gui.tooltip_label->set_anchor_and_margin(MARGIN_BOTTOM, Control::ANCHOR_END, -ttp->get_margin(MARGIN_BOTTOM)); - gui.tooltip_label->set_text(tooltip.strip_edges()); + gui.tooltip_label->set_text(tooltip); } rp->add_child(gui.tooltip_popup); @@ -2578,7 +2579,7 @@ void Viewport::_drop_physics_mouseover() { List<Control *>::Element *Viewport::_gui_show_modal(Control *p_control) { - gui.modal_stack.push_back(p_control); + List<Control *>::Element *node = gui.modal_stack.push_back(p_control); if (gui.key_focus) p_control->_modal_set_prev_focus_owner(gui.key_focus->get_instance_id()); else @@ -2589,7 +2590,7 @@ List<Control *>::Element *Viewport::_gui_show_modal(Control *p_control) { _drop_mouse_focus(); } - return gui.modal_stack.back(); + return node; } Control *Viewport::_gui_get_focus_owner() { diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 0423fcb5f0..974c9771e0 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -522,11 +522,14 @@ void register_scene_types() { ClassDB::register_class<VisualShaderNodeVec3Uniform>(); ClassDB::register_class<VisualShaderNodeTransformUniform>(); ClassDB::register_class<VisualShaderNodeTextureUniform>(); + ClassDB::register_class<VisualShaderNodeTextureUniformTriplanar>(); ClassDB::register_class<VisualShaderNodeCubeMapUniform>(); ClassDB::register_class<VisualShaderNodeIf>(); ClassDB::register_class<VisualShaderNodeSwitch>(); ClassDB::register_class<VisualShaderNodeFresnel>(); ClassDB::register_class<VisualShaderNodeExpression>(); + ClassDB::register_class<VisualShaderNodeIs>(); + ClassDB::register_class<VisualShaderNodeCompare>(); ClassDB::register_class<ShaderMaterial>(); ClassDB::register_virtual_class<CanvasItem>(); @@ -604,6 +607,7 @@ void register_scene_types() { ClassDB::register_class<PrismMesh>(); ClassDB::register_class<QuadMesh>(); ClassDB::register_class<SphereMesh>(); + ClassDB::register_class<PointMesh>(); ClassDB::register_virtual_class<Material>(); ClassDB::register_class<SpatialMaterial>(); SceneTree::add_idle_callback(SpatialMaterial::flush_changes); @@ -748,7 +752,7 @@ void register_scene_types() { if (theme_path != String()) { Ref<Theme> theme = ResourceLoader::load(theme_path); if (theme.is_valid()) { - Theme::set_default(theme); + Theme::set_project_default(theme); if (font.is_valid()) { Theme::set_default_font(font); } diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp index af2a8c931f..8c8552ac54 100644 --- a/scene/resources/animation.cpp +++ b/scene/resources/animation.cpp @@ -863,7 +863,7 @@ Error Animation::transform_track_get_key(int p_track, int p_key, Vector3 *r_loc, return OK; } -int Animation::transform_track_insert_key(int p_track, float p_time, const Vector3 p_loc, const Quat &p_rot, const Vector3 &p_scale) { +int Animation::transform_track_insert_key(int p_track, float p_time, const Vector3 &p_loc, const Quat &p_rot, const Vector3 &p_scale) { ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; @@ -1667,8 +1667,7 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a Vector2 pb = p_post_b; return a.cubic_interpolate(b, pa, pb, p_c); - - } break; + } case Variant::RECT2: { Rect2 a = p_a; @@ -1679,8 +1678,7 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a return Rect2( a.position.cubic_interpolate(b.position, pa.position, pb.position, p_c), a.size.cubic_interpolate(b.size, pa.size, pb.size, p_c)); - - } break; + } case Variant::VECTOR3: { Vector3 a = p_a; @@ -1689,8 +1687,7 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a Vector3 pb = p_post_b; return a.cubic_interpolate(b, pa, pb, p_c); - - } break; + } case Variant::QUAT: { Quat a = p_a; @@ -1699,8 +1696,7 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a Quat pb = p_post_b; return a.cubic_slerp(b, pa, pb, p_c); - - } break; + } case Variant::AABB: { AABB a = p_a; @@ -1711,14 +1707,12 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a return AABB( a.position.cubic_interpolate(b.position, pa.position, pb.position, p_c), a.size.cubic_interpolate(b.size, pa.size, pb.size, p_c)); - } break; + } default: { return _interpolate(p_a, p_b, p_c); } } - - return Variant(); } float Animation::_cubic_interpolate(const float &p_pre_a, const float &p_a, const float &p_b, const float &p_post_b, float p_c) const { @@ -3028,7 +3022,6 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons //this could be done as a second pass and would be //able to optimize more erase = false; - } else { } } } diff --git a/scene/resources/animation.h b/scene/resources/animation.h index 59f2ae24c7..6fff77d746 100644 --- a/scene/resources/animation.h +++ b/scene/resources/animation.h @@ -314,7 +314,7 @@ public: float track_get_key_time(int p_track, int p_key_idx) const; float track_get_key_transition(int p_track, int p_key_idx) const; - int transform_track_insert_key(int p_track, float p_time, const Vector3 p_loc, const Quat &p_rot = Quat(), const Vector3 &p_scale = Vector3()); + int transform_track_insert_key(int p_track, float p_time, const Vector3 &p_loc, const Quat &p_rot = Quat(), const Vector3 &p_scale = Vector3()); Error transform_track_get_key(int p_track, int p_key, Vector3 *r_loc, Quat *r_rot, Vector3 *r_scale) const; void track_set_interpolation_type(int p_track, InterpolationType p_interp); InterpolationType track_get_interpolation_type(int p_track) const; diff --git a/scene/resources/audio_stream_sample.cpp b/scene/resources/audio_stream_sample.cpp index 4b3e392013..5b61654c5d 100644 --- a/scene/resources/audio_stream_sample.cpp +++ b/scene/resources/audio_stream_sample.cpp @@ -564,7 +564,8 @@ Error AudioStreamSample::save_to_wav(const String &p_path) { file->store_32(sub_chunk_2_size); //Subchunk2Size // Add data - PoolVector<uint8_t>::Read read_data = get_data().read(); + PoolVector<uint8_t> data = get_data(); + PoolVector<uint8_t>::Read read_data = data.read(); switch (format) { case AudioStreamSample::FORMAT_8_BITS: for (unsigned int i = 0; i < data_bytes; i++) { diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index cf6ce3a5ef..fb0fb4f8e3 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -177,13 +177,13 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const // Font Colors - Color control_font_color = Color::html("e0e0e0"); - Color control_font_color_lower = Color::html("a0a0a0"); - Color control_font_color_low = Color::html("b0b0b0"); - Color control_font_color_hover = Color::html("f0f0f0"); + Color control_font_color = Color(0.88, 0.88, 0.88); + Color control_font_color_lower = Color(0.63, 0.63, 0.63); + Color control_font_color_low = Color(0.69, 0.69, 0.69); + Color control_font_color_hover = Color(0.94, 0.94, 0.94); Color control_font_color_disabled = Color(0.9, 0.9, 0.9, 0.2); - Color control_font_color_pressed = Color::html("ffffff"); - Color font_color_selection = Color::html("7d7d7d"); + Color control_font_color_pressed = Color(1, 1, 1); + Color font_color_selection = Color(0.49, 0.49, 0.49); // Panel @@ -432,12 +432,12 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_font("font", "TextEdit", default_font); - theme->set_color("background_color", "TextEdit", Color(0, 0, 0, 0)); - theme->set_color("completion_background_color", "TextEdit", Color::html("2C2A32")); - theme->set_color("completion_selected_color", "TextEdit", Color::html("434244")); - theme->set_color("completion_existing_color", "TextEdit", Color::html("21dfdfdf")); + theme->set_color("background_color", "TextEdit", Color(0, 0, 0)); + theme->set_color("completion_background_color", "TextEdit", Color(0.17, 0.16, 0.2)); + theme->set_color("completion_selected_color", "TextEdit", Color(0.26, 0.26, 0.27)); + theme->set_color("completion_existing_color", "TextEdit", Color(0.87, 0.87, 0.87, 0.13)); theme->set_color("completion_scroll_color", "TextEdit", control_font_color_pressed); - theme->set_color("completion_font_color", "TextEdit", Color::html("aaaaaa")); + theme->set_color("completion_font_color", "TextEdit", Color(0.67, 0.67, 0.67)); theme->set_color("font_color", "TextEdit", control_font_color); theme->set_color("font_color_selected", "TextEdit", Color(0, 0, 0)); theme->set_color("font_color_readonly", "TextEdit", Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f)); @@ -449,14 +449,14 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_color("code_folding_color", "TextEdit", Color(0.8, 0.8, 0.8, 0.8)); theme->set_color("current_line_color", "TextEdit", Color(0.25, 0.25, 0.26, 0.8)); theme->set_color("caret_color", "TextEdit", control_font_color); - theme->set_color("caret_background_color", "TextEdit", Color::html("000000")); + theme->set_color("caret_background_color", "TextEdit", Color(0, 0, 0)); theme->set_color("symbol_color", "TextEdit", control_font_color_hover); theme->set_color("brace_mismatch_color", "TextEdit", Color(1, 0.2, 0.2)); - theme->set_color("line_number_color", "TextEdit", Color::html("66aaaaaa")); - theme->set_color("safe_line_number_color", "TextEdit", Color::html("99aac8aa")); - theme->set_color("function_color", "TextEdit", Color::html("66a2ce")); - theme->set_color("member_variable_color", "TextEdit", Color::html("e64e59")); - theme->set_color("number_color", "TextEdit", Color::html("EB9532")); + theme->set_color("line_number_color", "TextEdit", Color(0.67, 0.67, 0.67, 0.4)); + theme->set_color("safe_line_number_color", "TextEdit", Color(0.67, 0.78, 0.67, 0.6)); + theme->set_color("function_color", "TextEdit", Color(0.4, 0.64, 0.81)); + theme->set_color("member_variable_color", "TextEdit", Color(0.9, 0.31, 0.35)); + theme->set_color("number_color", "TextEdit", Color(0.92, 0.58, 0.2)); theme->set_color("word_highlighted_color", "TextEdit", Color(0.8, 0.9, 0.9, 0.15)); theme->set_constant("completion_lines", "TextEdit", 7); @@ -651,7 +651,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_color("cursor_color", "Tree", Color(0, 0, 0)); theme->set_color("guide_color", "Tree", Color(0, 0, 0, 0.1)); theme->set_color("drop_position_color", "Tree", Color(1, 0.3, 0.2)); - theme->set_color("relationship_line_color", "Tree", Color::html("464646")); + theme->set_color("relationship_line_color", "Tree", Color(0.27, 0.27, 0.27)); theme->set_color("custom_button_font_highlight", "Tree", control_font_color_hover); theme->set_constant("hseparation", "Tree", 4 * scale); diff --git a/scene/resources/default_theme/make_header.py b/scene/resources/default_theme/make_header.py index bd5a723b23..cf0ccf1c3a 100755 --- a/scene/resources/default_theme/make_header.py +++ b/scene/resources/default_theme/make_header.py @@ -1,9 +1,14 @@ #!/usr/bin/env python import glob +import os enc = "utf-8" +# Change to the directory where the script is located, +# so that the script can be run from any location +os.chdir(os.path.dirname(os.path.realpath(__file__))) + # Generate include files f = open("theme_data.h", "wb") diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index 197ff14b38..44bc862198 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -691,9 +691,9 @@ void SpatialMaterial::_update_shader() { code += "\tTANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.z);\n"; code += "\tTANGENT = normalize(TANGENT);\n"; - code += "\tBINORMAL = vec3(0.0,1.0,0.0) * abs(NORMAL.x);\n"; - code += "\tBINORMAL+= vec3(0.0,0.0,-1.0) * abs(NORMAL.y);\n"; - code += "\tBINORMAL+= vec3(0.0,1.0,0.0) * abs(NORMAL.z);\n"; + code += "\tBINORMAL = vec3(0.0,-1.0,0.0) * abs(NORMAL.x);\n"; + code += "\tBINORMAL+= vec3(0.0,0.0,1.0) * abs(NORMAL.y);\n"; + code += "\tBINORMAL+= vec3(0.0,-1.0,0.0) * abs(NORMAL.z);\n"; code += "\tBINORMAL = normalize(BINORMAL);\n"; } @@ -2353,8 +2353,8 @@ SpatialMaterial::SpatialMaterial() : set_ao_light_affect(0.0); - set_metallic_texture_channel(TEXTURE_CHANNEL_BLUE); - set_roughness_texture_channel(TEXTURE_CHANNEL_GREEN); + set_metallic_texture_channel(TEXTURE_CHANNEL_RED); + set_roughness_texture_channel(TEXTURE_CHANNEL_RED); set_ao_texture_channel(TEXTURE_CHANNEL_RED); set_refraction_texture_channel(TEXTURE_CHANNEL_RED); diff --git a/scene/resources/particles_material.cpp b/scene/resources/particles_material.cpp index b4818755b4..dc6ef2b49c 100644 --- a/scene/resources/particles_material.cpp +++ b/scene/resources/particles_material.cpp @@ -101,6 +101,8 @@ void ParticlesMaterial::init_shaders() { shader_names->trail_color_modifier = "trail_color_modifier"; shader_names->gravity = "gravity"; + + shader_names->lifetime_randomness = "lifetime_randomness"; } void ParticlesMaterial::finish_shaders() { @@ -173,6 +175,7 @@ void ParticlesMaterial::_update_shader() { code += "uniform float hue_variation_random;\n"; code += "uniform float anim_speed_random;\n"; code += "uniform float anim_offset_random;\n"; + code += "uniform float lifetime_randomness;\n"; switch (emission_shape) { case EMISSION_SHAPE_POINT: { @@ -285,7 +288,11 @@ void ParticlesMaterial::_update_shader() { code += " ivec2 emission_tex_size = textureSize(emission_texture_points, 0);\n"; code += " ivec2 emission_tex_ofs = ivec2(point % emission_tex_size.x, point / emission_tex_size.x);\n"; } - code += " if (RESTART) {\n"; + code += " bool restart = false;\n"; + code += " if (CUSTOM.y > CUSTOM.w) {\n"; + code += " restart = true;\n"; + code += " }\n\n"; + code += " if (RESTART || restart) {\n"; if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) code += " float tex_linear_velocity = textureLod(linear_velocity_texture, vec2(0.0, 0.0), 0.0).r;\n"; @@ -325,6 +332,7 @@ void ParticlesMaterial::_update_shader() { code += " float base_angle = (initial_angle + tex_angle) * mix(1.0, angle_rand, initial_angle_random);\n"; code += " CUSTOM.x = base_angle * degree_to_rad;\n"; // angle code += " CUSTOM.y = 0.0;\n"; // phase + code += " CUSTOM.w = LIFETIME * (1.0 - lifetime_randomness * rand_from_seed(alt_seed));\n"; code += " CUSTOM.z = (anim_offset + tex_anim_offset) * mix(1.0, anim_offset_rand, anim_offset_random);\n"; // animation offset (0-1) switch (emission_shape) { @@ -576,6 +584,9 @@ void ParticlesMaterial::_update_shader() { code += " VELOCITY.z = 0.0;\n"; code += " TRANSFORM[3].z = 0.0;\n"; } + code += " if (CUSTOM.y > CUSTOM.w) {"; + code += " ACTIVE = false;\n"; + code += " }\n"; code += "}\n"; code += "\n"; @@ -1014,6 +1025,17 @@ Vector3 ParticlesMaterial::get_gravity() const { return gravity; } +void ParticlesMaterial::set_lifetime_randomness(float p_lifetime) { + + lifetime_randomness = p_lifetime; + VisualServer::get_singleton()->material_set_param(_get_material(), shader_names->lifetime_randomness, lifetime_randomness); +} + +float ParticlesMaterial::get_lifetime_randomness() const { + + return lifetime_randomness; +} + RID ParticlesMaterial::get_shader_rid() const { ERR_FAIL_COND_V(!shader_map.has(current_key), RID()); @@ -1118,6 +1140,11 @@ void ParticlesMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("get_gravity"), &ParticlesMaterial::get_gravity); ClassDB::bind_method(D_METHOD("set_gravity", "accel_vec"), &ParticlesMaterial::set_gravity); + ClassDB::bind_method(D_METHOD("set_lifetime_randomness", "randomness"), &ParticlesMaterial::set_lifetime_randomness); + ClassDB::bind_method(D_METHOD("get_lifetime_randomness"), &ParticlesMaterial::get_lifetime_randomness); + + ADD_GROUP("Time", ""); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "lifetime_randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_lifetime_randomness", "get_lifetime_randomness"); ADD_GROUP("Trail", "trail_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "trail_divisor", PROPERTY_HINT_RANGE, "1,1000000,1"), "set_trail_divisor", "get_trail_divisor"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "trail_size_modifier", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_trail_size_modifier", "get_trail_size_modifier"); @@ -1240,6 +1267,7 @@ ParticlesMaterial::ParticlesMaterial() : set_emission_box_extents(Vector3(1, 1, 1)); set_trail_divisor(1); set_gravity(Vector3(0, -9.8, 0)); + set_lifetime_randomness(0); emission_point_count = 1; for (int i = 0; i < PARAM_MAX; i++) { diff --git a/scene/resources/particles_material.h b/scene/resources/particles_material.h index 7f11bd794b..6fe381db0a 100644 --- a/scene/resources/particles_material.h +++ b/scene/resources/particles_material.h @@ -185,6 +185,8 @@ private: StringName trail_color_modifier; StringName gravity; + + StringName lifetime_randomness; }; static ShaderNames *shader_names; @@ -225,6 +227,8 @@ private: Vector3 gravity; + float lifetime_randomness; + //do not save emission points here protected: @@ -287,6 +291,9 @@ public: void set_gravity(const Vector3 &p_gravity); Vector3 get_gravity() const; + void set_lifetime_randomness(float p_lifetime); + float get_lifetime_randomness() const; + static void init_shaders(); static void finish_shaders(); static void flush_changes(); diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp index 74a493d3b5..24fdaafbe1 100644 --- a/scene/resources/primitive_meshes.cpp +++ b/scene/resources/primitive_meshes.cpp @@ -1572,3 +1572,19 @@ SphereMesh::SphereMesh() { rings = 32; is_hemisphere = false; } + +/** + PointMesh +*/ + +void PointMesh::_create_mesh_array(Array &p_arr) const { + PoolVector<Vector3> faces; + faces.resize(1); + faces.set(0, Vector3(0.0, 0.0, 0.0)); + + p_arr[VS::ARRAY_VERTEX] = faces; +} + +PointMesh::PointMesh() { + primitive_type = PRIMITIVE_POINTS; +} diff --git a/scene/resources/primitive_meshes.h b/scene/resources/primitive_meshes.h index 312899c028..fad49f9642 100644 --- a/scene/resources/primitive_meshes.h +++ b/scene/resources/primitive_meshes.h @@ -322,4 +322,19 @@ public: SphereMesh(); }; +/** + A single point for use in particle systems +*/ + +class PointMesh : public PrimitiveMesh { + + GDCLASS(PointMesh, PrimitiveMesh) + +protected: + virtual void _create_mesh_array(Array &p_arr) const; + +public: + PointMesh(); +}; + #endif diff --git a/scene/resources/resource_format_text.cpp b/scene/resources/resource_format_text.cpp index 12bf007bb1..6212066c3c 100644 --- a/scene/resources/resource_format_text.cpp +++ b/scene/resources/resource_format_text.cpp @@ -1371,8 +1371,6 @@ String ResourceFormatSaverTextInstance::_write_resource(const RES &res) { //internal resource } } - - return "null"; } void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant, bool p_main) { @@ -1514,8 +1512,6 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r } } - ERR_FAIL_COND_V(err != OK, err); - { String title = packed_scene.is_valid() ? "[gd_scene " : "[gd_resource "; if (packed_scene.is_null()) diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp index 2588e41951..b294991248 100644 --- a/scene/resources/surface_tool.cpp +++ b/scene/resources/surface_tool.cpp @@ -769,7 +769,7 @@ void SurfaceTool::create_from(const Ref<Mesh> &p_existing, int p_surface) { material = p_existing->surface_get_material(p_surface); } -void SurfaceTool::create_from_blend_shape(const Ref<Mesh> &p_existing, int p_surface, const String p_blend_shape_name) { +void SurfaceTool::create_from_blend_shape(const Ref<Mesh> &p_existing, int p_surface, const String &p_blend_shape_name) { clear(); primitive = p_existing->surface_get_primitive_type(p_surface); Array arr = p_existing->surface_get_blend_shape_arrays(p_surface); diff --git a/scene/resources/surface_tool.h b/scene/resources/surface_tool.h index c4c71dca13..e3aec6ce0e 100644 --- a/scene/resources/surface_tool.h +++ b/scene/resources/surface_tool.h @@ -136,7 +136,7 @@ public: static Vector<Vertex> create_vertex_array_from_triangle_arrays(const Array &p_arrays); Array commit_to_arrays(); void create_from(const Ref<Mesh> &p_existing, int p_surface); - void create_from_blend_shape(const Ref<Mesh> &p_existing, int p_surface, const String p_blend_shape_name); + void create_from_blend_shape(const Ref<Mesh> &p_existing, int p_surface, const String &p_blend_shape_name); void append_from(const Ref<Mesh> &p_existing, int p_surface, const Transform &p_xform); Ref<ArrayMesh> commit(const Ref<ArrayMesh> &p_existing = Ref<ArrayMesh>(), uint32_t p_flags = Mesh::ARRAY_COMPRESS_DEFAULT); diff --git a/scene/resources/theme.cpp b/scene/resources/theme.cpp index 69258bc834..ae18be1695 100644 --- a/scene/resources/theme.cpp +++ b/scene/resources/theme.cpp @@ -32,8 +32,6 @@ #include "core/os/file_access.h" #include "core/print_string.h" -Ref<Theme> Theme::default_theme; - void Theme::_emit_theme_changed() { emit_changed(); @@ -186,11 +184,6 @@ void Theme::_get_property_list(List<PropertyInfo> *p_list) const { } } -Ref<Theme> Theme::get_default() { - - return default_theme; -} - void Theme::set_default_theme_font(const Ref<Font> &p_default_font) { if (default_theme_font == p_default_font) @@ -215,14 +208,31 @@ Ref<Font> Theme::get_default_theme_font() const { return default_theme_font; } +Ref<Theme> Theme::project_default_theme; +Ref<Theme> Theme::default_theme; +Ref<Texture> Theme::default_icon; +Ref<StyleBox> Theme::default_style; +Ref<Font> Theme::default_font; + +Ref<Theme> Theme::get_default() { + + return default_theme; +} + void Theme::set_default(const Ref<Theme> &p_default) { default_theme = p_default; } -Ref<Texture> Theme::default_icon; -Ref<StyleBox> Theme::default_style; -Ref<Font> Theme::default_font; +Ref<Theme> Theme::get_project_default() { + + return project_default_theme; +} + +void Theme::set_project_default(const Ref<Theme> &p_project_default) { + + project_default_theme = p_project_default; +} void Theme::set_default_icon(const Ref<Texture> &p_icon) { diff --git a/scene/resources/theme.h b/scene/resources/theme.h index fb59073cbe..4c4f9b5aba 100644 --- a/scene/resources/theme.h +++ b/scene/resources/theme.h @@ -46,7 +46,6 @@ class Theme : public Resource { GDCLASS(Theme, Resource); RES_BASE_EXTENSION("theme"); - static Ref<Theme> default_theme; void _emit_theme_changed(); HashMap<StringName, HashMap<StringName, Ref<Texture> > > icon_map; @@ -61,6 +60,8 @@ protected: bool _get(const StringName &p_name, Variant &r_ret) const; void _get_property_list(List<PropertyInfo> *p_list) const; + static Ref<Theme> project_default_theme; + static Ref<Theme> default_theme; static Ref<Texture> default_icon; static Ref<StyleBox> default_style; static Ref<Font> default_font; @@ -137,6 +138,9 @@ public: static Ref<Theme> get_default(); static void set_default(const Ref<Theme> &p_default); + static Ref<Theme> get_project_default(); + static void set_project_default(const Ref<Theme> &p_default); + static void set_default_icon(const Ref<Texture> &p_icon); static void set_default_style(const Ref<StyleBox> &p_style); static void set_default_font(const Ref<Font> &p_font); diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp index 7265c9b457..8475a34818 100644 --- a/scene/resources/visual_shader.cpp +++ b/scene/resources/visual_shader.cpp @@ -67,6 +67,14 @@ String VisualShaderNode::generate_global(Shader::Mode p_mode, VisualShader::Type return String(); } +String VisualShaderNode::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { + return String(); +} + +String VisualShaderNode::generate_global_per_func(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { + return String(); +} + Vector<StringName> VisualShaderNode::get_editable_properties() const { return Vector<StringName>(); } @@ -449,7 +457,10 @@ String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port ERR_FAIL_COND_V(node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_TRANSFORM, String()); StringBuilder global_code; + StringBuilder global_code_per_node; + Map<Type, StringBuilder> global_code_per_func; StringBuilder code; + Set<StringName> classes; global_code += String() + "shader_type canvas_item;\n"; @@ -474,7 +485,7 @@ String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port code += "\nvoid fragment() {\n"; Set<int> processed; - Error err = _write_node(p_type, global_code, code, default_tex_params, input_connections, output_connections, p_node, processed, true); + Error err = _write_node(p_type, global_code, global_code_per_node, global_code_per_func, code, default_tex_params, input_connections, output_connections, p_node, processed, true, classes); ERR_FAIL_COND_V(err != OK, String()); if (node->get_output_port_type(p_port) == VisualShaderNode::PORT_TYPE_SCALAR) { @@ -489,6 +500,7 @@ String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port //set code secretly global_code += "\n\n"; String final_code = global_code; + final_code += global_code_per_node; final_code += code; return final_code; } @@ -833,7 +845,7 @@ void VisualShader::_get_property_list(List<PropertyInfo> *p_list) const { } } -Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBuilder &code, Vector<VisualShader::DefaultTextureParam> &def_tex_params, const VMap<ConnectionKey, const List<Connection>::Element *> &input_connections, const VMap<ConnectionKey, const List<Connection>::Element *> &output_connections, int node, Set<int> &processed, bool for_preview) const { +Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBuilder &global_code_per_node, Map<Type, StringBuilder> &global_code_per_func, StringBuilder &code, Vector<VisualShader::DefaultTextureParam> &def_tex_params, const VMap<ConnectionKey, const List<Connection>::Element *> &input_connections, const VMap<ConnectionKey, const List<Connection>::Element *> &output_connections, int node, Set<int> &processed, bool for_preview, Set<StringName> &r_classes) const { const Ref<VisualShaderNode> vsnode = graph[type].nodes[node].node; @@ -850,7 +862,7 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui continue; } - Error err = _write_node(type, global_code, code, def_tex_params, input_connections, output_connections, from_node, processed, for_preview); + Error err = _write_node(type, global_code, global_code_per_node, global_code_per_func, code, def_tex_params, input_connections, output_connections, from_node, processed, for_preview, r_classes); if (err) return err; } @@ -958,6 +970,14 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui if (!skip_global) { global_code += vsnode->generate_global(get_mode(), type, node); + + if (!r_classes.has(vsnode->get_class_name())) { + global_code_per_node += vsnode->generate_global_per_node(get_mode(), type, node); + for (int i = 0; i < TYPE_MAX; i++) { + global_code_per_func[Type(i)] += vsnode->generate_global_per_func(get_mode(), Type(i), node); + } + r_classes.insert(vsnode->get_class_name()); + } } //handle normally @@ -976,8 +996,12 @@ void VisualShader::_update_shader() const { dirty = false; StringBuilder global_code; + StringBuilder global_code_per_node; + Map<Type, StringBuilder> global_code_per_func; StringBuilder code; Vector<VisualShader::DefaultTextureParam> default_tex_params; + Set<StringName> classes; + List<int> insertion_pos; static const char *shader_mode_str[Shader::MODE_MAX] = { "spatial", "canvas_item", "particles" }; global_code += String() + "shader_type " + shader_mode_str[shader_mode] + ";\n"; @@ -1056,8 +1080,9 @@ void VisualShader::_update_shader() const { code += "\nvoid " + String(func_name[i]) + "() {\n"; Set<int> processed; - Error err = _write_node(Type(i), global_code, code, default_tex_params, input_connections, output_connections, NODE_ID_OUTPUT, processed, false); + Error err = _write_node(Type(i), global_code, global_code_per_node, global_code_per_func, code, default_tex_params, input_connections, output_connections, NODE_ID_OUTPUT, processed, false, classes); ERR_FAIL_COND(err != OK); + insertion_pos.push_back(code.get_string_length()); code += "}\n"; } @@ -1065,7 +1090,13 @@ void VisualShader::_update_shader() const { //set code secretly global_code += "\n\n"; String final_code = global_code; - final_code += code; + final_code += global_code_per_node; + String tcode = code; + for (int i = 0; i < TYPE_MAX; i++) { + tcode = tcode.insert(insertion_pos[i], global_code_per_func[Type(i)]); + } + final_code += tcode; + const_cast<VisualShader *>(this)->set_code(final_code); for (int i = 0; i < default_tex_params.size(); i++) { const_cast<VisualShader *>(this)->set_default_texture_param(default_tex_params[i].name, default_tex_params[i].param); diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h index 83db51b1b0..b3c0ab6e0b 100644 --- a/scene/resources/visual_shader.h +++ b/scene/resources/visual_shader.h @@ -103,7 +103,7 @@ private: } }; - Error _write_node(Type p_type, StringBuilder &global_code, StringBuilder &code, Vector<DefaultTextureParam> &def_tex_params, const VMap<ConnectionKey, const List<Connection>::Element *> &input_connections, const VMap<ConnectionKey, const List<Connection>::Element *> &output_connections, int node, Set<int> &processed, bool for_preview) const; + Error _write_node(Type p_type, StringBuilder &global_code, StringBuilder &global_code_per_node, Map<Type, StringBuilder> &global_code_per_func, StringBuilder &code, Vector<DefaultTextureParam> &def_tex_params, const VMap<ConnectionKey, const List<Connection>::Element *> &input_connections, const VMap<ConnectionKey, const List<Connection>::Element *> &output_connections, int node, Set<int> &processed, bool for_preview, Set<StringName> &r_classes) const; void _input_type_changed(Type p_type, int p_id); @@ -208,6 +208,8 @@ public: virtual Vector<VisualShader::DefaultTextureParam> get_default_texture_parameters(VisualShader::Type p_type, int p_id) const; virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const; + virtual String generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const; + virtual String generate_global_per_func(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const; virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const = 0; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const; diff --git a/scene/resources/visual_shader_nodes.cpp b/scene/resources/visual_shader_nodes.cpp index 746edc65b0..a1a29ec950 100644 --- a/scene/resources/visual_shader_nodes.cpp +++ b/scene/resources/visual_shader_nodes.cpp @@ -2106,7 +2106,7 @@ String VisualShaderNodeOuterProduct::get_output_port_name(int p_port) const { } String VisualShaderNodeOuterProduct::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - return "\t" + p_output_vars[0] + " = outerProduct( " + p_input_vars[0] + ", " + p_input_vars[1] + " );\n"; + return "\t" + p_output_vars[0] + " = outerProduct( vec4(" + p_input_vars[0] + ", 0.0), vec4(" + p_input_vars[1] + ", 0.0) );\n"; } VisualShaderNodeOuterProduct::VisualShaderNodeOuterProduct() { @@ -2968,6 +2968,98 @@ VisualShaderNodeTextureUniform::VisualShaderNodeTextureUniform() { color_default = COLOR_DEFAULT_WHITE; } +////////////// Texture Uniform (Triplanar) + +String VisualShaderNodeTextureUniformTriplanar::get_caption() const { + return "TextureUniformTriplanar"; +} + +int VisualShaderNodeTextureUniformTriplanar::get_input_port_count() const { + return 2; +} + +VisualShaderNodeTextureUniform::PortType VisualShaderNodeTextureUniformTriplanar::get_input_port_type(int p_port) const { + if (p_port == 0) { + return PORT_TYPE_VECTOR; + } else if (p_port == 1) { + return PORT_TYPE_VECTOR; + } + return PORT_TYPE_SCALAR; +} + +String VisualShaderNodeTextureUniformTriplanar::get_input_port_name(int p_port) const { + if (p_port == 0) { + return "weights"; + } else if (p_port == 1) { + return "pos"; + } + return ""; +} + +String VisualShaderNodeTextureUniformTriplanar::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { + + String code; + + code += "// TRIPLANAR FUNCTION GLOBAL CODE\n"; + code += "\tvec4 triplanar_texture(sampler2D p_sampler, vec3 p_weights, vec3 p_triplanar_pos) {\n"; + code += "\t\tvec4 samp = vec4(0.0);\n"; + code += "\t\tsamp += texture(p_sampler, p_triplanar_pos.xy) * p_weights.z;\n"; + code += "\t\tsamp += texture(p_sampler, p_triplanar_pos.xz) * p_weights.y;\n"; + code += "\t\tsamp += texture(p_sampler, p_triplanar_pos.zy * vec2(-1.0, 1.0)) * p_weights.x;\n"; + code += "\t\treturn samp;\n"; + code += "\t}\n"; + code += "\n"; + code += "\tuniform vec3 triplanar_scale = vec3(1.0, 1.0, 1.0);\n"; + code += "\tuniform vec3 triplanar_offset;\n"; + code += "\tuniform float triplanar_sharpness = 0.5;\n"; + code += "\n"; + code += "\tvarying vec3 triplanar_power_normal;\n"; + code += "\tvarying vec3 triplanar_pos;\n"; + + return code; +} + +String VisualShaderNodeTextureUniformTriplanar::generate_global_per_func(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { + + String code; + + if (p_type == VisualShader::TYPE_VERTEX) { + + code += "\t// TRIPLANAR FUNCTION VERTEX CODE\n"; + code += "\t\ttriplanar_power_normal = pow(abs(NORMAL), vec3(triplanar_sharpness));\n"; + code += "\t\ttriplanar_power_normal /= dot(triplanar_power_normal, vec3(1.0));\n"; + code += "\t\ttriplanar_pos = VERTEX * triplanar_scale + triplanar_offset;\n"; + code += "\t\ttriplanar_pos *= vec3(1.0, -1.0, 1.0);\n"; + } + + return code; +} + +String VisualShaderNodeTextureUniformTriplanar::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { + + String id = get_uniform_name(); + String code = "\t{\n"; + + if (p_input_vars[0] == String() && p_input_vars[1] == String()) { + code += "\t\tvec4 n_tex_read = triplanar_texture( " + id + ", triplanar_power_normal, triplanar_pos );\n"; + } else if (p_input_vars[0] != String() && p_input_vars[1] == String()) { + code += "\t\tvec4 n_tex_read = triplanar_texture( " + id + ", " + p_input_vars[0] + ", triplanar_pos );\n"; + } else if (p_input_vars[0] == String() && p_input_vars[1] != String()) { + code += "\t\tvec4 n_tex_read = triplanar_texture( " + id + ", triplanar_power_normal," + p_input_vars[1] + " );\n"; + } else { + code += "\t\tvec4 n_tex_read = triplanar_texture( " + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + " );\n"; + } + + code += "\t\t" + p_output_vars[0] + " = n_tex_read.rgb;\n"; + code += "\t\t" + p_output_vars[1] + " = n_tex_read.a;\n"; + code += "\t}\n"; + + return code; +} + +VisualShaderNodeTextureUniformTriplanar::VisualShaderNodeTextureUniformTriplanar() { +} + ////////////// CubeMap Uniform String VisualShaderNodeCubeMapUniform::get_caption() const { @@ -3200,3 +3292,317 @@ VisualShaderNodeFresnel::VisualShaderNodeFresnel() { set_input_port_default_value(2, false); set_input_port_default_value(3, 1.0); } + +////////////// Is + +String VisualShaderNodeIs::get_caption() const { + + return "Is"; +} + +int VisualShaderNodeIs::get_input_port_count() const { + + return 1; +} + +VisualShaderNodeIs::PortType VisualShaderNodeIs::get_input_port_type(int p_port) const { + + return PORT_TYPE_SCALAR; +} + +String VisualShaderNodeIs::get_input_port_name(int p_port) const { + + return ""; +} + +int VisualShaderNodeIs::get_output_port_count() const { + + return 1; +} + +VisualShaderNodeIs::PortType VisualShaderNodeIs::get_output_port_type(int p_port) const { + + return PORT_TYPE_BOOLEAN; +} + +String VisualShaderNodeIs::get_output_port_name(int p_port) const { + + return ""; +} + +String VisualShaderNodeIs::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { + + static const char *funcs[FUNC_IS_NAN + 1] = { + "isinf($)", + "isnan($)" + }; + + String code; + code += "\t" + p_output_vars[0] + "=" + String(funcs[func]).replace("$", p_input_vars[0]) + ";\n"; + return code; +} + +void VisualShaderNodeIs::set_function(Function p_func) { + + func = p_func; + emit_changed(); +} + +VisualShaderNodeIs::Function VisualShaderNodeIs::get_function() const { + + return func; +} + +Vector<StringName> VisualShaderNodeIs::get_editable_properties() const { + + Vector<StringName> props; + props.push_back("function"); + return props; +} + +void VisualShaderNodeIs::_bind_methods() { + + ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeIs::set_function); + ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeIs::get_function); + + ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "Inf,NaN"), "set_function", "get_function"); + + BIND_ENUM_CONSTANT(FUNC_IS_INF); + BIND_ENUM_CONSTANT(FUNC_IS_NAN); +} + +VisualShaderNodeIs::VisualShaderNodeIs() { + + func = FUNC_IS_INF; + set_input_port_default_value(0, 0.0); +} + +////////////// Compare + +String VisualShaderNodeCompare::get_caption() const { + + return "Compare"; +} + +int VisualShaderNodeCompare::get_input_port_count() const { + + if (ctype == CTYPE_SCALAR && (func == FUNC_EQUAL || func == FUNC_NOT_EQUAL)) { + return 3; + } + return 2; +} + +VisualShaderNodeCompare::PortType VisualShaderNodeCompare::get_input_port_type(int p_port) const { + + if (p_port == 2) + return PORT_TYPE_SCALAR; + switch (ctype) { + case CTYPE_SCALAR: + return PORT_TYPE_SCALAR; + case CTYPE_VECTOR: + return PORT_TYPE_VECTOR; + case CTYPE_BOOLEAN: + return PORT_TYPE_BOOLEAN; + case CTYPE_TRANSFORM: + return PORT_TYPE_TRANSFORM; + } + return PORT_TYPE_VECTOR; +} + +String VisualShaderNodeCompare::get_input_port_name(int p_port) const { + if (p_port == 0) + return "a"; + else if (p_port == 1) + return "b"; + else if (p_port == 2) + return "tolerance"; + return ""; +} + +int VisualShaderNodeCompare::get_output_port_count() const { + return 1; +} + +VisualShaderNodeCompare::PortType VisualShaderNodeCompare::get_output_port_type(int p_port) const { + return PORT_TYPE_BOOLEAN; +} + +String VisualShaderNodeCompare::get_output_port_name(int p_port) const { + if (p_port == 0) + return "result"; + return ""; +} + +String VisualShaderNodeCompare::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const { + + if (ctype == CTYPE_BOOLEAN || ctype == CTYPE_TRANSFORM) { + if (func > FUNC_NOT_EQUAL) { + return TTR("Invalid comparison function for that type."); + } + } + + return ""; +} + +String VisualShaderNodeCompare::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { + + static const char *ops[FUNC_LESS_THAN_EQUAL + 1] = { + "==", + "!=", + ">", + ">=", + "<", + "<=", + }; + + static const char *funcs[FUNC_LESS_THAN_EQUAL + 1] = { + "equal($)", + "notEqual($)", + "greaterThan($)", + "greaterThanEqual($)", + "lessThan($)", + "lessThanEqual($)", + }; + + static const char *conds[COND_ANY + 1] = { + "all($)", + "any($)", + }; + + String code; + switch (ctype) { + case CTYPE_SCALAR: + if (func == FUNC_EQUAL) { + code += "\t" + p_output_vars[0] + "=(abs(" + p_input_vars[0] + "-" + p_input_vars[1] + ")<" + p_input_vars[2] + ");"; + } else if (func == FUNC_NOT_EQUAL) { + code += "\t" + p_output_vars[0] + "=!(abs(" + p_input_vars[0] + "-" + p_input_vars[1] + ")<" + p_input_vars[2] + ");"; + } else { + code += "\t" + p_output_vars[0] + "=" + (p_input_vars[0] + "$" + p_input_vars[1]).replace("$", ops[func]) + ";\n"; + } + break; + + case CTYPE_VECTOR: + code += "\t{\n"; + code += "\t\tbvec3 _bv=" + String(funcs[func]).replace("$", p_input_vars[0] + ", " + p_input_vars[1]) + ";\n"; + code += "\t\t" + p_output_vars[0] + "=" + String(conds[condition]).replace("$", "_bv") + ";\n"; + code += "\t}\n"; + break; + + case CTYPE_BOOLEAN: + if (func > FUNC_NOT_EQUAL) + return "\t" + p_output_vars[0] + "=false;\n"; + code += "\t" + p_output_vars[0] + "=" + (p_input_vars[0] + "$" + p_input_vars[1]).replace("$", ops[func]) + ";\n"; + break; + + case CTYPE_TRANSFORM: + if (func > FUNC_NOT_EQUAL) + return "\t" + p_output_vars[0] + "=false;\n"; + code += "\t" + p_output_vars[0] + "=" + (p_input_vars[0] + "$" + p_input_vars[1]).replace("$", ops[func]) + ";\n"; + break; + + default: + break; + } + return code; +} + +void VisualShaderNodeCompare::set_comparsion_type(ComparsionType p_type) { + + ctype = p_type; + + switch (ctype) { + case CTYPE_SCALAR: + set_input_port_default_value(0, 0.0); + set_input_port_default_value(1, 0.0); + break; + case CTYPE_VECTOR: + set_input_port_default_value(0, Vector3(0.0, 0.0, 0.0)); + set_input_port_default_value(1, Vector3(0.0, 0.0, 0.0)); + break; + case CTYPE_BOOLEAN: + set_input_port_default_value(0, false); + set_input_port_default_value(1, false); + break; + case CTYPE_TRANSFORM: + set_input_port_default_value(0, Transform()); + set_input_port_default_value(1, Transform()); + break; + } + emit_changed(); +} + +VisualShaderNodeCompare::ComparsionType VisualShaderNodeCompare::get_comparsion_type() const { + + return ctype; +} + +void VisualShaderNodeCompare::set_function(Function p_func) { + + func = p_func; + emit_changed(); +} + +VisualShaderNodeCompare::Function VisualShaderNodeCompare::get_function() const { + + return func; +} + +void VisualShaderNodeCompare::set_condition(Condition p_cond) { + + condition = p_cond; + emit_changed(); +} + +VisualShaderNodeCompare::Condition VisualShaderNodeCompare::get_condition() const { + + return condition; +} + +Vector<StringName> VisualShaderNodeCompare::get_editable_properties() const { + Vector<StringName> props; + props.push_back("type"); + props.push_back("function"); + if (ctype == CTYPE_VECTOR) + props.push_back("condition"); + return props; +} + +void VisualShaderNodeCompare::_bind_methods() { + + ClassDB::bind_method(D_METHOD("set_comparsion_type", "type"), &VisualShaderNodeCompare::set_comparsion_type); + ClassDB::bind_method(D_METHOD("get_comparsion_type"), &VisualShaderNodeCompare::get_comparsion_type); + + ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeCompare::set_function); + ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeCompare::get_function); + + ClassDB::bind_method(D_METHOD("set_condition", "condition"), &VisualShaderNodeCompare::set_condition); + ClassDB::bind_method(D_METHOD("get_condition"), &VisualShaderNodeCompare::get_condition); + + ADD_PROPERTY(PropertyInfo(Variant::INT, "type", PROPERTY_HINT_ENUM, "Scalar,Vector,Boolean,Transform"), "set_comparsion_type", "get_comparsion_type"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "function", PROPERTY_HINT_ENUM, "a == b,a != b,a > b,a >= b,a < b,a <= b"), "set_function", "get_function"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "condition", PROPERTY_HINT_ENUM, "All,Any"), "set_condition", "get_condition"); + + BIND_ENUM_CONSTANT(CTYPE_SCALAR); + BIND_ENUM_CONSTANT(CTYPE_VECTOR); + BIND_ENUM_CONSTANT(CTYPE_BOOLEAN); + BIND_ENUM_CONSTANT(CTYPE_TRANSFORM); + + BIND_ENUM_CONSTANT(FUNC_EQUAL); + BIND_ENUM_CONSTANT(FUNC_NOT_EQUAL); + BIND_ENUM_CONSTANT(FUNC_GREATER_THAN); + BIND_ENUM_CONSTANT(FUNC_GREATER_THAN_EQUAL); + BIND_ENUM_CONSTANT(FUNC_LESS_THAN); + BIND_ENUM_CONSTANT(FUNC_LESS_THAN_EQUAL); + + BIND_ENUM_CONSTANT(COND_ALL); + BIND_ENUM_CONSTANT(COND_ANY); +} + +VisualShaderNodeCompare::VisualShaderNodeCompare() { + ctype = CTYPE_SCALAR; + func = FUNC_EQUAL; + condition = COND_ALL; + set_input_port_default_value(0, 0.0); + set_input_port_default_value(1, 0.0); + set_input_port_default_value(2, CMP_EPSILON); +} diff --git a/scene/resources/visual_shader_nodes.h b/scene/resources/visual_shader_nodes.h index 235714f697..4585e7fdcc 100644 --- a/scene/resources/visual_shader_nodes.h +++ b/scene/resources/visual_shader_nodes.h @@ -1425,6 +1425,25 @@ VARIANT_ENUM_CAST(VisualShaderNodeTextureUniform::ColorDefault) /////////////////////////////////////// +class VisualShaderNodeTextureUniformTriplanar : public VisualShaderNodeTextureUniform { + GDCLASS(VisualShaderNodeTextureUniformTriplanar, VisualShaderNodeTextureUniform); + +public: + virtual String get_caption() const; + + virtual int get_input_port_count() const; + virtual PortType get_input_port_type(int p_port) const; + virtual String get_input_port_name(int p_port) const; + + virtual String generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const; + virtual String generate_global_per_func(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const; + virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty + + VisualShaderNodeTextureUniformTriplanar(); +}; + +/////////////////////////////////////// + class VisualShaderNodeCubeMapUniform : public VisualShaderNode { GDCLASS(VisualShaderNodeCubeMapUniform, VisualShaderNode); @@ -1513,4 +1532,115 @@ public: VisualShaderNodeFresnel(); }; +/////////////////////////////////////// +/// Is +/////////////////////////////////////// + +class VisualShaderNodeIs : public VisualShaderNode { + GDCLASS(VisualShaderNodeIs, VisualShaderNode); + +public: + enum Function { + FUNC_IS_INF, + FUNC_IS_NAN, + }; + +protected: + Function func; + +protected: + static void _bind_methods(); + +public: + virtual String get_caption() const; + + virtual int get_input_port_count() const; + virtual PortType get_input_port_type(int p_port) const; + virtual String get_input_port_name(int p_port) const; + + virtual int get_output_port_count() const; + virtual PortType get_output_port_type(int p_port) const; + virtual String get_output_port_name(int p_port) const; + + virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty + + void set_function(Function p_func); + Function get_function() const; + + virtual Vector<StringName> get_editable_properties() const; + + VisualShaderNodeIs(); +}; + +VARIANT_ENUM_CAST(VisualShaderNodeIs::Function) + +/////////////////////////////////////// +/// Compare +/////////////////////////////////////// + +class VisualShaderNodeCompare : public VisualShaderNode { + GDCLASS(VisualShaderNodeCompare, VisualShaderNode); + +public: + enum ComparsionType { + CTYPE_SCALAR, + CTYPE_VECTOR, + CTYPE_BOOLEAN, + CTYPE_TRANSFORM + }; + + enum Function { + FUNC_EQUAL, + FUNC_NOT_EQUAL, + FUNC_GREATER_THAN, + FUNC_GREATER_THAN_EQUAL, + FUNC_LESS_THAN, + FUNC_LESS_THAN_EQUAL, + }; + + enum Condition { + COND_ALL, + COND_ANY, + }; + +protected: + ComparsionType ctype; + Function func; + Condition condition; + +protected: + static void _bind_methods(); + +public: + virtual String get_caption() const; + + virtual int get_input_port_count() const; + virtual PortType get_input_port_type(int p_port) const; + virtual String get_input_port_name(int p_port) const; + + virtual int get_output_port_count() const; + virtual PortType get_output_port_type(int p_port) const; + virtual String get_output_port_name(int p_port) const; + + virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty + + void set_comparsion_type(ComparsionType p_type); + ComparsionType get_comparsion_type() const; + + void set_function(Function p_func); + Function get_function() const; + + void set_condition(Condition p_cond); + Condition get_condition() const; + + virtual Vector<StringName> get_editable_properties() const; + virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const; + + VisualShaderNodeCompare(); +}; + +VARIANT_ENUM_CAST(VisualShaderNodeCompare::ComparsionType) +VARIANT_ENUM_CAST(VisualShaderNodeCompare::Function) +VARIANT_ENUM_CAST(VisualShaderNodeCompare::Condition) + #endif // VISUAL_SHADER_NODES_H diff --git a/servers/arvr/arvr_positional_tracker.cpp b/servers/arvr/arvr_positional_tracker.cpp index aabe617a8a..cbda3556c5 100644 --- a/servers/arvr/arvr_positional_tracker.cpp +++ b/servers/arvr/arvr_positional_tracker.cpp @@ -79,7 +79,7 @@ ARVRServer::TrackerType ARVRPositionalTracker::get_type() const { return type; }; -void ARVRPositionalTracker::set_name(const String p_name) { +void ARVRPositionalTracker::set_name(const String &p_name) { name = p_name; }; diff --git a/servers/arvr/arvr_positional_tracker.h b/servers/arvr/arvr_positional_tracker.h index 0d6a69540f..775579b089 100644 --- a/servers/arvr/arvr_positional_tracker.h +++ b/servers/arvr/arvr_positional_tracker.h @@ -73,7 +73,7 @@ protected: public: void set_type(ARVRServer::TrackerType p_type); ARVRServer::TrackerType get_type() const; - void set_name(const String p_name); + void set_name(const String &p_name); StringName get_name() const; int get_tracker_id() const; void set_joy_id(int p_joy_id); diff --git a/servers/arvr_server.cpp b/servers/arvr_server.cpp index 7d89764d20..f7ce1d3c5d 100644 --- a/servers/arvr_server.cpp +++ b/servers/arvr_server.cpp @@ -100,7 +100,7 @@ Transform ARVRServer::get_world_origin() const { return world_origin; }; -void ARVRServer::set_world_origin(const Transform p_world_origin) { +void ARVRServer::set_world_origin(const Transform &p_world_origin) { world_origin = p_world_origin; }; diff --git a/servers/arvr_server.h b/servers/arvr_server.h index e7d635a8d9..c0301ebaab 100644 --- a/servers/arvr_server.h +++ b/servers/arvr_server.h @@ -123,7 +123,7 @@ public: and in the virtual world out of sync */ Transform get_world_origin() const; - void set_world_origin(const Transform p_world_origin); + void set_world_origin(const Transform &p_world_origin); /* center_on_hmd calculates a new reference frame. This ensures the HMD is positioned to 0,0,0 facing 0,0,-1 (need to verify this direction) diff --git a/servers/audio/effects/audio_effect_chorus.cpp b/servers/audio/effects/audio_effect_chorus.cpp index c2f8b97c1a..216a0a4aa6 100644 --- a/servers/audio/effects/audio_effect_chorus.cpp +++ b/servers/audio/effects/audio_effect_chorus.cpp @@ -333,28 +333,28 @@ void AudioEffectChorus::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/1/rate_hz", PROPERTY_HINT_RANGE, "0.1,20,0.1"), "set_voice_rate_hz", "get_voice_rate_hz", 0); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/1/depth_ms", PROPERTY_HINT_RANGE, "0,20,0.01"), "set_voice_depth_ms", "get_voice_depth_ms", 0); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/1/level_db", PROPERTY_HINT_RANGE, "-60,24,0.1"), "set_voice_level_db", "get_voice_level_db", 0); - ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/1/cutoff_hz", PROPERTY_HINT_RANGE, "1,16000,1"), "set_voice_cutoff_hz", "get_voice_cutoff_hz", 0); + ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/1/cutoff_hz", PROPERTY_HINT_RANGE, "1,20500,1"), "set_voice_cutoff_hz", "get_voice_cutoff_hz", 0); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/1/pan", PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_voice_pan", "get_voice_pan", 0); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/2/delay_ms", PROPERTY_HINT_RANGE, "0,50,0.01"), "set_voice_delay_ms", "get_voice_delay_ms", 1); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/2/rate_hz", PROPERTY_HINT_RANGE, "0.1,20,0.1"), "set_voice_rate_hz", "get_voice_rate_hz", 1); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/2/depth_ms", PROPERTY_HINT_RANGE, "0,20,0.01"), "set_voice_depth_ms", "get_voice_depth_ms", 1); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/2/level_db", PROPERTY_HINT_RANGE, "-60,24,0.1"), "set_voice_level_db", "get_voice_level_db", 1); - ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/2/cutoff_hz", PROPERTY_HINT_RANGE, "1,16000,1"), "set_voice_cutoff_hz", "get_voice_cutoff_hz", 1); + ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/2/cutoff_hz", PROPERTY_HINT_RANGE, "1,20500,1"), "set_voice_cutoff_hz", "get_voice_cutoff_hz", 1); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/2/pan", PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_voice_pan", "get_voice_pan", 1); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/3/delay_ms", PROPERTY_HINT_RANGE, "0,50,0.01"), "set_voice_delay_ms", "get_voice_delay_ms", 2); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/3/rate_hz", PROPERTY_HINT_RANGE, "0.1,20,0.1"), "set_voice_rate_hz", "get_voice_rate_hz", 2); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/3/depth_ms", PROPERTY_HINT_RANGE, "0,20,0.01"), "set_voice_depth_ms", "get_voice_depth_ms", 2); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/3/level_db", PROPERTY_HINT_RANGE, "-60,24,0.1"), "set_voice_level_db", "get_voice_level_db", 2); - ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/3/cutoff_hz", PROPERTY_HINT_RANGE, "1,16000,1"), "set_voice_cutoff_hz", "get_voice_cutoff_hz", 2); + ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/3/cutoff_hz", PROPERTY_HINT_RANGE, "1,20500,1"), "set_voice_cutoff_hz", "get_voice_cutoff_hz", 2); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/3/pan", PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_voice_pan", "get_voice_pan", 2); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/4/delay_ms", PROPERTY_HINT_RANGE, "0,50,0.01"), "set_voice_delay_ms", "get_voice_delay_ms", 3); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/4/rate_hz", PROPERTY_HINT_RANGE, "0.1,20,0.1"), "set_voice_rate_hz", "get_voice_rate_hz", 3); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/4/depth_ms", PROPERTY_HINT_RANGE, "0,20,0.01"), "set_voice_depth_ms", "get_voice_depth_ms", 3); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/4/level_db", PROPERTY_HINT_RANGE, "-60,24,0.1"), "set_voice_level_db", "get_voice_level_db", 3); - ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/4/cutoff_hz", PROPERTY_HINT_RANGE, "1,16000,1"), "set_voice_cutoff_hz", "get_voice_cutoff_hz", 3); + ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/4/cutoff_hz", PROPERTY_HINT_RANGE, "1,20500,1"), "set_voice_cutoff_hz", "get_voice_cutoff_hz", 3); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "voice/4/pan", PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_voice_pan", "get_voice_pan", 3); } diff --git a/servers/audio/effects/audio_effect_distortion.cpp b/servers/audio/effects/audio_effect_distortion.cpp index 37305bd7f4..278647c304 100644 --- a/servers/audio/effects/audio_effect_distortion.cpp +++ b/servers/audio/effects/audio_effect_distortion.cpp @@ -173,7 +173,7 @@ void AudioEffectDistortion::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Clip,ATan,LoFi,Overdrive,WaveShape"), "set_mode", "get_mode"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "pre_gain", PROPERTY_HINT_RANGE, "-60,60,0.01"), "set_pre_gain", "get_pre_gain"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "keep_hf_hz", PROPERTY_HINT_RANGE, "1,20000,1"), "set_keep_hf_hz", "get_keep_hf_hz"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "keep_hf_hz", PROPERTY_HINT_RANGE, "1,20500,1"), "set_keep_hf_hz", "get_keep_hf_hz"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "drive", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_drive", "get_drive"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "post_gain", PROPERTY_HINT_RANGE, "-80,24,0.01"), "set_post_gain", "get_post_gain"); diff --git a/servers/audio/effects/audio_effect_filter.cpp b/servers/audio/effects/audio_effect_filter.cpp index dc86d6ffbb..3841f2b5a0 100644 --- a/servers/audio/effects/audio_effect_filter.cpp +++ b/servers/audio/effects/audio_effect_filter.cpp @@ -156,7 +156,7 @@ void AudioEffectFilter::_bind_methods() { ClassDB::bind_method(D_METHOD("set_db", "amount"), &AudioEffectFilter::set_db); ClassDB::bind_method(D_METHOD("get_db"), &AudioEffectFilter::get_db); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "cutoff_hz", PROPERTY_HINT_RANGE, "1,40000,0.1"), "set_cutoff", "get_cutoff"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "cutoff_hz", PROPERTY_HINT_RANGE, "1,20500,1"), "set_cutoff", "get_cutoff"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "resonance", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_resonance", "get_resonance"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "gain", PROPERTY_HINT_RANGE, "0,4,0.01"), "set_gain", "get_gain"); ADD_PROPERTY(PropertyInfo(Variant::INT, "db", PROPERTY_HINT_ENUM, "6 dB,12 dB,18 dB,24 dB"), "set_db", "get_db"); diff --git a/servers/audio/effects/audio_effect_pitch_shift.cpp b/servers/audio/effects/audio_effect_pitch_shift.cpp index c250f2e2bd..ec3182685f 100644 --- a/servers/audio/effects/audio_effect_pitch_shift.cpp +++ b/servers/audio/effects/audio_effect_pitch_shift.cpp @@ -70,7 +70,7 @@ * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice and this license appear in all source copies. * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY OF -* ANY KIND. See http://www.dspguru.com/wol.htm for more information. +* ANY KIND. See https://dspguru.com/wide-open-license/ for more information. * *****************************************************************************/ diff --git a/servers/physics/collision_solver_sw.cpp b/servers/physics/collision_solver_sw.cpp index 0d10dae8cc..d970dd39fb 100644 --- a/servers/physics/collision_solver_sw.cpp +++ b/servers/physics/collision_solver_sw.cpp @@ -233,8 +233,6 @@ bool CollisionSolverSW::solve_static(const ShapeSW *p_shape_A, const Transform & return collision_solver(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false, r_sep_axis, p_margin_A, p_margin_B); } - - return false; } void CollisionSolverSW::concave_distance_callback(void *p_userdata, ShapeSW *p_convex) { @@ -371,6 +369,4 @@ bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A, const Transform return gjk_epa_calculate_distance(p_shape_A, p_transform_A, p_shape_B, p_transform_B, r_point_A, r_point_B); //should pass sepaxis.. } - - return false; } diff --git a/servers/physics/joints/hinge_joint_sw.cpp b/servers/physics/joints/hinge_joint_sw.cpp index 1d1b30286e..209cddda5e 100644 --- a/servers/physics/joints/hinge_joint_sw.cpp +++ b/servers/physics/joints/hinge_joint_sw.cpp @@ -198,7 +198,6 @@ bool HingeJointSW::setup(real_t p_step) { plane_space(m_rbAFrame.basis.get_axis(2), jointAxis0local, jointAxis1local); - A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(2)); Vector3 jointAxis0 = A->get_transform().basis.xform(jointAxis0local); Vector3 jointAxis1 = A->get_transform().basis.xform(jointAxis1local); Vector3 hingeAxisWorld = A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(2)); diff --git a/servers/physics/shape_sw.cpp b/servers/physics/shape_sw.cpp index 8a52f29729..f01caefdce 100644 --- a/servers/physics/shape_sw.cpp +++ b/servers/physics/shape_sw.cpp @@ -543,16 +543,6 @@ void CapsuleShapeSW::project_range(const Vector3 &p_normal, const Transform &p_t r_max = p_normal.dot(p_transform.xform(n)); r_min = p_normal.dot(p_transform.xform(-n)); - return; - - n = p_transform.basis.xform(n); - - real_t distance = p_normal.dot(p_transform.origin); - real_t length = Math::abs(p_normal.dot(n)); - r_min = distance - length; - r_max = distance + length; - - ERR_FAIL_COND(r_max < r_min); } Vector3 CapsuleShapeSW::get_support(const Vector3 &p_normal) const { diff --git a/servers/physics_2d/body_2d_sw.cpp b/servers/physics_2d/body_2d_sw.cpp index 60bbcef4b6..5dff655ea1 100644 --- a/servers/physics_2d/body_2d_sw.cpp +++ b/servers/physics_2d/body_2d_sw.cpp @@ -185,28 +185,28 @@ real_t Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const { case Physics2DServer::BODY_PARAM_BOUNCE: { return bounce; - } break; + } case Physics2DServer::BODY_PARAM_FRICTION: { return friction; - } break; + } case Physics2DServer::BODY_PARAM_MASS: { return mass; - } break; + } case Physics2DServer::BODY_PARAM_INERTIA: { return _inv_inertia == 0 ? 0 : 1.0 / _inv_inertia; - } break; + } case Physics2DServer::BODY_PARAM_GRAVITY_SCALE: { return gravity_scale; - } break; + } case Physics2DServer::BODY_PARAM_LINEAR_DAMP: { return linear_damp; - } break; + } case Physics2DServer::BODY_PARAM_ANGULAR_DAMP: { return angular_damp; - } break; + } default: { } } @@ -343,19 +343,19 @@ Variant Body2DSW::get_state(Physics2DServer::BodyState p_state) const { switch (p_state) { case Physics2DServer::BODY_STATE_TRANSFORM: { return get_transform(); - } break; + } case Physics2DServer::BODY_STATE_LINEAR_VELOCITY: { return linear_velocity; - } break; + } case Physics2DServer::BODY_STATE_ANGULAR_VELOCITY: { return angular_velocity; - } break; + } case Physics2DServer::BODY_STATE_SLEEPING: { return !is_active(); - } break; + } case Physics2DServer::BODY_STATE_CAN_SLEEP: { return can_sleep; - } break; + } } return Variant(); diff --git a/servers/physics_2d/broad_phase_2d_hash_grid.cpp b/servers/physics_2d/broad_phase_2d_hash_grid.cpp index 1bbb50c974..6dd19c2868 100644 --- a/servers/physics_2d/broad_phase_2d_hash_grid.cpp +++ b/servers/physics_2d/broad_phase_2d_hash_grid.cpp @@ -673,7 +673,7 @@ public IEnumerable<Point3D> GetCellsOnRay(Ray ray, int maxDepth) // "A Fast Voxel Traversal Algorithm for Ray Tracing" // John Amanatides, Andrew Woo // http://www.cse.yorku.ca/~amana/research/grid.pdf - // http://www.devmaster.net/articles/raytracing_series/A%20faster%20voxel%20traversal%20algorithm%20for%20ray%20tracing.pdf + // https://web.archive.org/web/20100616193049/http://www.devmaster.net/articles/raytracing_series/A%20faster%20voxel%20traversal%20algorithm%20for%20ray%20tracing.pdf // NOTES: // * This code assumes that the ray's position and direction are in 'cell coordinates', which means diff --git a/servers/physics_2d/collision_solver_2d_sat.cpp b/servers/physics_2d/collision_solver_2d_sat.cpp index f4bff66389..19e4b8c1d9 100644 --- a/servers/physics_2d/collision_solver_2d_sat.cpp +++ b/servers/physics_2d/collision_solver_2d_sat.cpp @@ -172,8 +172,8 @@ static void _generate_contacts_from_supports(const Vector2 *p_points_A, int p_po points_B = p_points_B; } - int version_A = (pointcount_A > 3 ? 3 : pointcount_A) - 1; - int version_B = (pointcount_B > 3 ? 3 : pointcount_B) - 1; + int version_A = (pointcount_A > 2 ? 2 : pointcount_A) - 1; + int version_B = (pointcount_B > 2 ? 2 : pointcount_B) - 1; GenerateContactsFunc contacts_func = generate_contacts_func_table[version_A][version_B]; ERR_FAIL_COND(!contacts_func); @@ -313,10 +313,12 @@ public: if (best_axis == Vector2(0.0, 0.0)) return; - callback->collided = true; + if (callback) { + callback->collided = true; - if (!callback->callback) - return; //only collide, no callback + if (!callback->callback) + return; //only collide, no callback + } static const int max_supports = 2; Vector2 supports_A[max_supports]; @@ -354,12 +356,13 @@ public: supports_B[i] += best_axis * margin_B; } } + if (callback) { + callback->normal = best_axis; + _generate_contacts_from_supports(supports_A, support_count_A, supports_B, support_count_B, callback); - callback->normal = best_axis; - _generate_contacts_from_supports(supports_A, support_count_A, supports_B, support_count_B, callback); - - if (callback && callback->sep_axis && *callback->sep_axis != Vector2()) - *callback->sep_axis = Vector2(); //invalidate previous axis (no test) + if (callback->sep_axis && *callback->sep_axis != Vector2()) + *callback->sep_axis = Vector2(); //invalidate previous axis (no test) + } } _FORCE_INLINE_ SeparatorAxisTest2D(const ShapeA *p_shape_A, const Transform2D &p_transform_a, const ShapeB *p_shape_B, const Transform2D &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_A = Vector2(), const Vector2 &p_motion_B = Vector2(), real_t p_margin_A = 0, real_t p_margin_B = 0) { diff --git a/servers/physics_2d/collision_solver_2d_sw.cpp b/servers/physics_2d/collision_solver_2d_sw.cpp index e49961c048..03c0fd5981 100644 --- a/servers/physics_2d/collision_solver_2d_sw.cpp +++ b/servers/physics_2d/collision_solver_2d_sw.cpp @@ -249,6 +249,4 @@ bool CollisionSolver2DSW::solve(const Shape2DSW *p_shape_A, const Transform2D &p return collision_solver(p_shape_A, p_transform_A, p_motion_A, p_shape_B, p_transform_B, p_motion_B, p_result_callback, p_userdata, false, sep_axis, margin_A, margin_B); } - - return false; } diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.cpp b/servers/physics_2d/physics_2d_server_wrap_mt.cpp index 71c00c0abf..c698290fd9 100644 --- a/servers/physics_2d/physics_2d_server_wrap_mt.cpp +++ b/servers/physics_2d/physics_2d_server_wrap_mt.cpp @@ -54,8 +54,6 @@ void Physics2DServerWrapMT::thread_loop() { server_thread = Thread::get_caller_id(); - OS::get_singleton()->make_rendering_thread(); - physics_2d_server->init(); exit = false; diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.h b/servers/physics_2d/physics_2d_server_wrap_mt.h index b61e1faad2..33a184ba3f 100644 --- a/servers/physics_2d/physics_2d_server_wrap_mt.h +++ b/servers/physics_2d/physics_2d_server_wrap_mt.h @@ -327,11 +327,11 @@ public: static Physics2DServer *init_server() { int tm = GLOBAL_DEF("physics/2d/thread_model", 1); - if (tm == 0) //single unsafe + if (tm == 0) // single unsafe return memnew(T); - else if (tm == 1) //single saef + else if (tm == 1) // single safe return memnew(Physics2DServerWrapMT(memnew(T), false)); - else //single unsafe + else // multi threaded return memnew(Physics2DServerWrapMT(memnew(T), true)); } diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp index 63b5f206f2..25973aa295 100644 --- a/servers/visual/shader_language.cpp +++ b/servers/visual/shader_language.cpp @@ -785,6 +785,17 @@ ShaderLanguage::DataPrecision ShaderLanguage::get_token_precision(TokenType p_ty return PRECISION_MEDIUMP; } +String ShaderLanguage::get_precision_name(DataPrecision p_type) { + switch (p_type) { + case PRECISION_LOWP: return "lowp"; + case PRECISION_MEDIUMP: return "mediump"; + case PRECISION_HIGHP: return "highp"; + default: + break; + } + return ""; +} + String ShaderLanguage::get_datatype_name(DataType p_type) { switch (p_type) { @@ -849,7 +860,7 @@ void ShaderLanguage::clear() { } } -bool ShaderLanguage::_find_identifier(const BlockNode *p_block, const Map<StringName, BuiltInInfo> &p_builtin_types, const StringName &p_identifier, DataType *r_data_type, IdentifierType *r_type) { +bool ShaderLanguage::_find_identifier(const BlockNode *p_block, const Map<StringName, BuiltInInfo> &p_builtin_types, const StringName &p_identifier, DataType *r_data_type, IdentifierType *r_type, int *r_array_size) { if (p_builtin_types.has(p_identifier)) { @@ -871,6 +882,9 @@ bool ShaderLanguage::_find_identifier(const BlockNode *p_block, const Map<String if (r_data_type) { *r_data_type = p_block->variables[p_identifier].type; } + if (r_array_size) { + *r_array_size = p_block->variables[p_identifier].array_size; + } if (r_type) { *r_type = IDENTIFIER_LOCAL_VAR; } @@ -953,7 +967,7 @@ bool ShaderLanguage::_find_identifier(const BlockNode *p_block, const Map<String bool ShaderLanguage::_validate_operator(OperatorNode *p_op, DataType *r_ret_type) { bool valid = false; - DataType ret_type; + DataType ret_type = TYPE_VOID; switch (p_op->op) { case OP_EQUAL: @@ -1328,725 +1342,730 @@ bool ShaderLanguage::_validate_operator(OperatorNode *p_op, DataType *r_ret_type const ShaderLanguage::BuiltinFuncDef ShaderLanguage::builtin_func_defs[] = { //constructors - { "bool", TYPE_BOOL, { TYPE_BOOL, TYPE_VOID } }, - { "bvec2", TYPE_BVEC2, { TYPE_BOOL, TYPE_VOID } }, - { "bvec2", TYPE_BVEC2, { TYPE_BOOL, TYPE_BOOL, TYPE_VOID } }, - { "bvec3", TYPE_BVEC3, { TYPE_BOOL, TYPE_VOID } }, - { "bvec3", TYPE_BVEC3, { TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_VOID } }, - { "bvec3", TYPE_BVEC3, { TYPE_BVEC2, TYPE_BOOL, TYPE_VOID } }, - { "bvec3", TYPE_BVEC3, { TYPE_BOOL, TYPE_BVEC2, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_BVEC2, TYPE_BOOL, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_BVEC2, TYPE_BOOL, TYPE_BOOL, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_BOOL, TYPE_BVEC2, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_BVEC3, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_BVEC3, TYPE_BOOL, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_BVEC2, TYPE_BVEC2, TYPE_VOID } }, - - { "float", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "vec2", TYPE_VEC2, { TYPE_FLOAT, TYPE_VOID } }, - { "vec2", TYPE_VEC2, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_VOID } }, - { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "vec3", TYPE_VEC3, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_VEC2, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_VEC2, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC2, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC3, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - - { "int", TYPE_INT, { TYPE_INT, TYPE_VOID } }, - { "ivec2", TYPE_IVEC2, { TYPE_INT, TYPE_VOID } }, - { "ivec2", TYPE_IVEC2, { TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "ivec3", TYPE_IVEC3, { TYPE_INT, TYPE_VOID } }, - { "ivec3", TYPE_IVEC3, { TYPE_INT, TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "ivec3", TYPE_IVEC3, { TYPE_IVEC2, TYPE_INT, TYPE_VOID } }, - { "ivec3", TYPE_IVEC3, { TYPE_INT, TYPE_IVEC2, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_IVEC2, TYPE_INT, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_IVEC2, TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_INT, TYPE_IVEC2, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_IVEC3, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - - { "uint", TYPE_UINT, { TYPE_UINT, TYPE_VOID } }, - { "uvec2", TYPE_UVEC2, { TYPE_UINT, TYPE_VOID } }, - { "uvec2", TYPE_UVEC2, { TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "uvec3", TYPE_UVEC3, { TYPE_UINT, TYPE_VOID } }, - { "uvec3", TYPE_UVEC3, { TYPE_UINT, TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "uvec3", TYPE_UVEC3, { TYPE_UVEC2, TYPE_UINT, TYPE_VOID } }, - { "uvec3", TYPE_UVEC3, { TYPE_UINT, TYPE_UVEC2, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_UINT, TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_UVEC2, TYPE_UINT, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UVEC2, TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_UINT, TYPE_UVEC2, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_UVEC3, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UVEC3, TYPE_UINT, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - - { "mat2", TYPE_MAT2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "mat3", TYPE_MAT3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "mat4", TYPE_MAT4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "mat2", TYPE_MAT2, { TYPE_FLOAT, TYPE_VOID } }, - { "mat3", TYPE_MAT3, { TYPE_FLOAT, TYPE_VOID } }, - { "mat4", TYPE_MAT4, { TYPE_FLOAT, TYPE_VOID } }, + { "bool", TYPE_BOOL, { TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec2", TYPE_BVEC2, { TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec2", TYPE_BVEC2, { TYPE_BOOL, TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec3", TYPE_BVEC3, { TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec3", TYPE_BVEC3, { TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec3", TYPE_BVEC3, { TYPE_BVEC2, TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec3", TYPE_BVEC3, { TYPE_BOOL, TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_BVEC2, TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_BVEC2, TYPE_BOOL, TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_BOOL, TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_BOOL, TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_BVEC3, TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_BVEC2, TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + + { "float", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec2", TYPE_VEC2, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec2", TYPE_VEC2, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec3", TYPE_VEC3, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_VEC2, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + + { "int", TYPE_INT, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec2", TYPE_IVEC2, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec2", TYPE_IVEC2, { TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec3", TYPE_IVEC3, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec3", TYPE_IVEC3, { TYPE_INT, TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec3", TYPE_IVEC3, { TYPE_IVEC2, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec3", TYPE_IVEC3, { TYPE_INT, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_IVEC2, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_IVEC2, TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_INT, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_INT, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + + { "uint", TYPE_UINT, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec2", TYPE_UVEC2, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec2", TYPE_UVEC2, { TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec3", TYPE_UVEC3, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec3", TYPE_UVEC3, { TYPE_UINT, TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec3", TYPE_UVEC3, { TYPE_UVEC2, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec3", TYPE_UVEC3, { TYPE_UINT, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_UINT, TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_UVEC2, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UVEC2, TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_UINT, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UINT, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UVEC3, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + + { "mat2", TYPE_MAT2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "mat3", TYPE_MAT3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "mat4", TYPE_MAT4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "mat2", TYPE_MAT2, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mat3", TYPE_MAT3, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mat4", TYPE_MAT4, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, //conversion scalars - { "int", TYPE_INT, { TYPE_BOOL, TYPE_VOID } }, - { "int", TYPE_INT, { TYPE_INT, TYPE_VOID } }, - { "int", TYPE_INT, { TYPE_UINT, TYPE_VOID } }, - { "int", TYPE_INT, { TYPE_FLOAT, TYPE_VOID } }, + { "int", TYPE_INT, { TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "int", TYPE_INT, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "int", TYPE_INT, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "int", TYPE_INT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, - { "float", TYPE_FLOAT, { TYPE_BOOL, TYPE_VOID } }, - { "float", TYPE_FLOAT, { TYPE_INT, TYPE_VOID } }, - { "float", TYPE_FLOAT, { TYPE_UINT, TYPE_VOID } }, - { "float", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, + { "float", TYPE_FLOAT, { TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "float", TYPE_FLOAT, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "float", TYPE_FLOAT, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "float", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, - { "uint", TYPE_UINT, { TYPE_BOOL, TYPE_VOID } }, - { "uint", TYPE_UINT, { TYPE_INT, TYPE_VOID } }, - { "uint", TYPE_UINT, { TYPE_UINT, TYPE_VOID } }, - { "uint", TYPE_UINT, { TYPE_FLOAT, TYPE_VOID } }, + { "uint", TYPE_UINT, { TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "uint", TYPE_UINT, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "uint", TYPE_UINT, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uint", TYPE_UINT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, - { "bool", TYPE_BOOL, { TYPE_BOOL, TYPE_VOID } }, - { "bool", TYPE_BOOL, { TYPE_INT, TYPE_VOID } }, - { "bool", TYPE_BOOL, { TYPE_UINT, TYPE_VOID } }, - { "bool", TYPE_BOOL, { TYPE_FLOAT, TYPE_VOID } }, + { "bool", TYPE_BOOL, { TYPE_BOOL, TYPE_VOID }, TAG_GLOBAL }, + { "bool", TYPE_BOOL, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "bool", TYPE_BOOL, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "bool", TYPE_BOOL, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, //conversion vectors - { "ivec2", TYPE_IVEC2, { TYPE_BVEC2, TYPE_VOID } }, - { "ivec2", TYPE_IVEC2, { TYPE_IVEC2, TYPE_VOID } }, - { "ivec2", TYPE_IVEC2, { TYPE_UVEC2, TYPE_VOID } }, - { "ivec2", TYPE_IVEC2, { TYPE_VEC2, TYPE_VOID } }, - - { "vec2", TYPE_VEC2, { TYPE_BVEC2, TYPE_VOID } }, - { "vec2", TYPE_VEC2, { TYPE_IVEC2, TYPE_VOID } }, - { "vec2", TYPE_VEC2, { TYPE_UVEC2, TYPE_VOID } }, - { "vec2", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - - { "uvec2", TYPE_UVEC2, { TYPE_BVEC2, TYPE_VOID } }, - { "uvec2", TYPE_UVEC2, { TYPE_IVEC2, TYPE_VOID } }, - { "uvec2", TYPE_UVEC2, { TYPE_UVEC2, TYPE_VOID } }, - { "uvec2", TYPE_UVEC2, { TYPE_VEC2, TYPE_VOID } }, - - { "bvec2", TYPE_BVEC2, { TYPE_BVEC2, TYPE_VOID } }, - { "bvec2", TYPE_BVEC2, { TYPE_IVEC2, TYPE_VOID } }, - { "bvec2", TYPE_BVEC2, { TYPE_UVEC2, TYPE_VOID } }, - { "bvec2", TYPE_BVEC2, { TYPE_VEC2, TYPE_VOID } }, - - { "ivec3", TYPE_IVEC3, { TYPE_BVEC3, TYPE_VOID } }, - { "ivec3", TYPE_IVEC3, { TYPE_IVEC3, TYPE_VOID } }, - { "ivec3", TYPE_IVEC3, { TYPE_UVEC3, TYPE_VOID } }, - { "ivec3", TYPE_IVEC3, { TYPE_VEC3, TYPE_VOID } }, - - { "vec3", TYPE_VEC3, { TYPE_BVEC3, TYPE_VOID } }, - { "vec3", TYPE_VEC3, { TYPE_IVEC3, TYPE_VOID } }, - { "vec3", TYPE_VEC3, { TYPE_UVEC3, TYPE_VOID } }, - { "vec3", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - - { "uvec3", TYPE_UVEC3, { TYPE_BVEC3, TYPE_VOID } }, - { "uvec3", TYPE_UVEC3, { TYPE_IVEC3, TYPE_VOID } }, - { "uvec3", TYPE_UVEC3, { TYPE_UVEC3, TYPE_VOID } }, - { "uvec3", TYPE_UVEC3, { TYPE_VEC3, TYPE_VOID } }, - - { "bvec3", TYPE_BVEC3, { TYPE_BVEC3, TYPE_VOID } }, - { "bvec3", TYPE_BVEC3, { TYPE_IVEC3, TYPE_VOID } }, - { "bvec3", TYPE_BVEC3, { TYPE_UVEC3, TYPE_VOID } }, - { "bvec3", TYPE_BVEC3, { TYPE_VEC3, TYPE_VOID } }, - - { "ivec4", TYPE_IVEC4, { TYPE_BVEC4, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_IVEC4, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_UVEC4, TYPE_VOID } }, - { "ivec4", TYPE_IVEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "vec4", TYPE_VEC4, { TYPE_BVEC4, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_IVEC4, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_UVEC4, TYPE_VOID } }, - { "vec4", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "uvec4", TYPE_UVEC4, { TYPE_BVEC4, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_IVEC4, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_UVEC4, TYPE_VOID } }, - { "uvec4", TYPE_UVEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "bvec4", TYPE_BVEC4, { TYPE_BVEC4, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_IVEC4, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_UVEC4, TYPE_VOID } }, - { "bvec4", TYPE_BVEC4, { TYPE_VEC4, TYPE_VOID } }, + { "ivec2", TYPE_IVEC2, { TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "ivec2", TYPE_IVEC2, { TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "ivec2", TYPE_IVEC2, { TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "ivec2", TYPE_IVEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + + { "vec2", TYPE_VEC2, { TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "vec2", TYPE_VEC2, { TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "vec2", TYPE_VEC2, { TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "vec2", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + + { "uvec2", TYPE_UVEC2, { TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "uvec2", TYPE_UVEC2, { TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "uvec2", TYPE_UVEC2, { TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "uvec2", TYPE_UVEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + + { "bvec2", TYPE_BVEC2, { TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "bvec2", TYPE_BVEC2, { TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "bvec2", TYPE_BVEC2, { TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "bvec2", TYPE_BVEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + + { "ivec3", TYPE_IVEC3, { TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "ivec3", TYPE_IVEC3, { TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "ivec3", TYPE_IVEC3, { TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "ivec3", TYPE_IVEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + + { "vec3", TYPE_VEC3, { TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "vec3", TYPE_VEC3, { TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "vec3", TYPE_VEC3, { TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "vec3", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + + { "uvec3", TYPE_UVEC3, { TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "uvec3", TYPE_UVEC3, { TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "uvec3", TYPE_UVEC3, { TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "uvec3", TYPE_UVEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + + { "bvec3", TYPE_BVEC3, { TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "bvec3", TYPE_BVEC3, { TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "bvec3", TYPE_BVEC3, { TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "bvec3", TYPE_BVEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + + { "ivec4", TYPE_IVEC4, { TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "ivec4", TYPE_IVEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "vec4", TYPE_VEC4, { TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "vec4", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "uvec4", TYPE_UVEC4, { TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "uvec4", TYPE_UVEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "bvec4", TYPE_BVEC4, { TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "bvec4", TYPE_BVEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, //conversion between matrixes - { "mat2", TYPE_MAT2, { TYPE_MAT3, TYPE_VOID } }, - { "mat2", TYPE_MAT2, { TYPE_MAT4, TYPE_VOID } }, - { "mat3", TYPE_MAT3, { TYPE_MAT2, TYPE_VOID } }, - { "mat3", TYPE_MAT3, { TYPE_MAT4, TYPE_VOID } }, - { "mat4", TYPE_MAT4, { TYPE_MAT2, TYPE_VOID } }, - { "mat4", TYPE_MAT4, { TYPE_MAT3, TYPE_VOID } }, + { "mat2", TYPE_MAT2, { TYPE_MAT3, TYPE_VOID }, TAG_GLOBAL }, + { "mat2", TYPE_MAT2, { TYPE_MAT4, TYPE_VOID }, TAG_GLOBAL }, + { "mat3", TYPE_MAT3, { TYPE_MAT2, TYPE_VOID }, TAG_GLOBAL }, + { "mat3", TYPE_MAT3, { TYPE_MAT4, TYPE_VOID }, TAG_GLOBAL }, + { "mat4", TYPE_MAT4, { TYPE_MAT2, TYPE_VOID }, TAG_GLOBAL }, + { "mat4", TYPE_MAT4, { TYPE_MAT3, TYPE_VOID }, TAG_GLOBAL }, //builtins - trigonometry - { "radians", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "radians", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "radians", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "radians", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "degrees", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "degrees", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "degrees", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "degrees", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "sin", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "sin", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "sin", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "sin", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "cos", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "cos", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "cos", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "cos", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "tan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "tan", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "tan", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "tan", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "asin", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "asin", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "asin", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "asin", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "acos", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "acos", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "acos", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "acos", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "atan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "atan", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "atan", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "atan", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "atan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "atan", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "atan", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "atan", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "sinh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "sinh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "sinh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "sinh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "cosh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "cosh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "cosh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "cosh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "tanh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "tanh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "tanh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "tanh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "asinh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "asinh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "asinh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "asinh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "acosh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "acosh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "acosh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "acosh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "atanh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "atanh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "atanh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "atanh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "radians", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "radians", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "radians", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "radians", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "degrees", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "degrees", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "degrees", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "degrees", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "sin", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "sin", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "sin", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "sin", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "cos", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "cos", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "cos", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "cos", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "tan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "tan", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "tan", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "tan", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "asin", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "asin", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "asin", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "asin", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "acos", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "acos", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "acos", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "acos", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "atan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "atan", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "atan", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "atan", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "atan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "atan", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "atan", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "atan", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "sinh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "sinh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "sinh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "sinh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "cosh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "cosh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "cosh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "cosh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "tanh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "tanh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "tanh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "tanh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "asinh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "asinh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "asinh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "asinh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "acosh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "acosh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "acosh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "acosh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "atanh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "atanh", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "atanh", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "atanh", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, //builtins - exponential - { "pow", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "pow", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "pow", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "pow", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "exp", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "exp", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "exp", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "exp", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "log", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "log", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "log", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "log", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "exp2", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "exp2", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "exp2", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "exp2", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "log2", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "log2", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "log2", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "log2", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "sqrt", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "sqrt", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "sqrt", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "sqrt", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "inversesqrt", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "inversesqrt", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "inversesqrt", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "inversesqrt", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "pow", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "pow", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "pow", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "pow", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "exp", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "exp", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "exp", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "exp", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "log", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "log", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "log", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "log", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "exp2", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "exp2", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "exp2", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "exp2", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "log2", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "log2", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "log2", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "log2", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "sqrt", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "sqrt", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "sqrt", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "sqrt", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "inversesqrt", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "inversesqrt", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "inversesqrt", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "inversesqrt", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, //builtins - common - { "abs", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "abs", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "abs", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "abs", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "abs", TYPE_INT, { TYPE_INT, TYPE_VOID } }, - { "abs", TYPE_IVEC2, { TYPE_IVEC2, TYPE_VOID } }, - { "abs", TYPE_IVEC3, { TYPE_IVEC3, TYPE_VOID } }, - { "abs", TYPE_IVEC4, { TYPE_IVEC4, TYPE_VOID } }, - - { "sign", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "sign", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "sign", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "sign", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "sign", TYPE_INT, { TYPE_INT, TYPE_VOID } }, - { "sign", TYPE_IVEC2, { TYPE_IVEC2, TYPE_VOID } }, - { "sign", TYPE_IVEC3, { TYPE_IVEC3, TYPE_VOID } }, - { "sign", TYPE_IVEC4, { TYPE_IVEC4, TYPE_VOID } }, - - { "floor", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "floor", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "floor", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "floor", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "trunc", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "trunc", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "trunc", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "trunc", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "round", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "round", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "round", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "round", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "roundEven", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "roundEven", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "roundEven", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "roundEven", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "ceil", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "ceil", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "ceil", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "ceil", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "fract", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "fract", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "fract", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "fract", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "mod", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "mod", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "mod", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "mod", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "mod", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "mod", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "mod", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "modf", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "modf", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "modf", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "modf", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "min", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "min", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "min", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "min", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "min", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "min", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "min", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "min", TYPE_INT, { TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "min", TYPE_IVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "min", TYPE_IVEC2, { TYPE_IVEC2, TYPE_INT, TYPE_VOID } }, - { "min", TYPE_IVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "min", TYPE_IVEC3, { TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - { "min", TYPE_IVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, - { "min", TYPE_IVEC4, { TYPE_IVEC4, TYPE_INT, TYPE_VOID } }, - - { "min", TYPE_UINT, { TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "min", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "min", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UINT, TYPE_VOID } }, - { "min", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "min", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UINT, TYPE_VOID } }, - { "min", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, - { "min", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UINT, TYPE_VOID } }, - - { "max", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "max", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "max", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "max", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "max", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "max", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "max", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "max", TYPE_INT, { TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "max", TYPE_IVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "max", TYPE_IVEC2, { TYPE_IVEC2, TYPE_INT, TYPE_VOID } }, - { "max", TYPE_IVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "max", TYPE_IVEC3, { TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - { "max", TYPE_IVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, - { "max", TYPE_IVEC4, { TYPE_IVEC4, TYPE_INT, TYPE_VOID } }, - - { "max", TYPE_UINT, { TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "max", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "max", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UINT, TYPE_VOID } }, - { "max", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "max", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UINT, TYPE_VOID } }, - { "max", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, - { "max", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UINT, TYPE_VOID } }, - - { "clamp", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "clamp", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "clamp", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "clamp", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "clamp", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "clamp", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "clamp", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - - { "clamp", TYPE_INT, { TYPE_INT, TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "clamp", TYPE_IVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "clamp", TYPE_IVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "clamp", TYPE_IVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, - { "clamp", TYPE_IVEC2, { TYPE_IVEC2, TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "clamp", TYPE_IVEC3, { TYPE_IVEC3, TYPE_INT, TYPE_INT, TYPE_VOID } }, - { "clamp", TYPE_IVEC4, { TYPE_IVEC4, TYPE_INT, TYPE_INT, TYPE_VOID } }, - - { "clamp", TYPE_UINT, { TYPE_UINT, TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "clamp", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "clamp", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "clamp", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, - { "clamp", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "clamp", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - { "clamp", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UINT, TYPE_UINT, TYPE_VOID } }, - - { "mix", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "mix", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_BOOL, TYPE_VOID } }, - { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_BOOL, TYPE_VOID } }, - { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_BVEC2, TYPE_VOID } }, - { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_BOOL, TYPE_VOID } }, - { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_BVEC3, TYPE_VOID } }, - { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_BOOL, TYPE_VOID } }, - { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_BVEC4, TYPE_VOID } }, - { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "step", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "step", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "step", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "step", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "step", TYPE_VEC2, { TYPE_FLOAT, TYPE_VEC2, TYPE_VOID } }, - { "step", TYPE_VEC3, { TYPE_FLOAT, TYPE_VEC3, TYPE_VOID } }, - { "step", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC4, TYPE_VOID } }, - { "smoothstep", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } }, - { "smoothstep", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "smoothstep", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "smoothstep", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "smoothstep", TYPE_VEC2, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC2, TYPE_VOID } }, - { "smoothstep", TYPE_VEC3, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC3, TYPE_VOID } }, - { "smoothstep", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC4, TYPE_VOID } }, - - { "isnan", TYPE_BOOL, { TYPE_FLOAT, TYPE_VOID } }, - { "isnan", TYPE_BVEC2, { TYPE_VEC2, TYPE_VOID } }, - { "isnan", TYPE_BVEC3, { TYPE_VEC3, TYPE_VOID } }, - { "isnan", TYPE_BVEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "isinf", TYPE_BOOL, { TYPE_FLOAT, TYPE_VOID } }, - { "isinf", TYPE_BVEC2, { TYPE_VEC2, TYPE_VOID } }, - { "isinf", TYPE_BVEC3, { TYPE_VEC3, TYPE_VOID } }, - { "isinf", TYPE_BVEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "floatBitsToInt", TYPE_INT, { TYPE_FLOAT, TYPE_VOID } }, - { "floatBitsToInt", TYPE_IVEC2, { TYPE_VEC2, TYPE_VOID } }, - { "floatBitsToInt", TYPE_IVEC3, { TYPE_VEC3, TYPE_VOID } }, - { "floatBitsToInt", TYPE_IVEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "floatBitsToUint", TYPE_UINT, { TYPE_FLOAT, TYPE_VOID } }, - { "floatBitsToUint", TYPE_UVEC2, { TYPE_VEC2, TYPE_VOID } }, - { "floatBitsToUint", TYPE_UVEC3, { TYPE_VEC3, TYPE_VOID } }, - { "floatBitsToUint", TYPE_UVEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "intBitsToFloat", TYPE_FLOAT, { TYPE_INT, TYPE_VOID } }, - { "intBitsToFloat", TYPE_VEC2, { TYPE_IVEC2, TYPE_VOID } }, - { "intBitsToFloat", TYPE_VEC3, { TYPE_IVEC3, TYPE_VOID } }, - { "intBitsToFloat", TYPE_VEC4, { TYPE_IVEC4, TYPE_VOID } }, - - { "uintBitsToFloat", TYPE_FLOAT, { TYPE_UINT, TYPE_VOID } }, - { "uintBitsToFloat", TYPE_VEC2, { TYPE_UVEC2, TYPE_VOID } }, - { "uintBitsToFloat", TYPE_VEC3, { TYPE_UVEC3, TYPE_VOID } }, - { "uintBitsToFloat", TYPE_VEC4, { TYPE_UVEC4, TYPE_VOID } }, + { "abs", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "abs", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "abs", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "abs", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "abs", TYPE_INT, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "abs", TYPE_IVEC2, { TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "abs", TYPE_IVEC3, { TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "abs", TYPE_IVEC4, { TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "sign", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "sign", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "sign", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "sign", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "sign", TYPE_INT, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "sign", TYPE_IVEC2, { TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "sign", TYPE_IVEC3, { TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "sign", TYPE_IVEC4, { TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "floor", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "floor", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "floor", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "floor", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "trunc", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "trunc", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "trunc", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "trunc", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "round", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "round", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "round", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "round", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "roundEven", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "roundEven", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "roundEven", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "roundEven", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "ceil", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "ceil", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "ceil", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "ceil", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "fract", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "fract", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "fract", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "fract", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "mod", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mod", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "mod", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mod", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "mod", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mod", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "mod", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "modf", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "modf", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "modf", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "modf", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "min", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "min", TYPE_INT, { TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_IVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_IVEC2, { TYPE_IVEC2, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_IVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_IVEC3, { TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_IVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_IVEC4, { TYPE_IVEC4, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + + { "min", TYPE_UINT, { TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "min", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + + { "max", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "max", TYPE_INT, { TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_IVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_IVEC2, { TYPE_IVEC2, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_IVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_IVEC3, { TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_IVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_IVEC4, { TYPE_IVEC4, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + + { "max", TYPE_UINT, { TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "max", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + + { "clamp", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "clamp", TYPE_INT, { TYPE_INT, TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_IVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_IVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_IVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_IVEC2, { TYPE_IVEC2, TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_IVEC3, { TYPE_IVEC3, TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_IVEC4, { TYPE_IVEC4, TYPE_INT, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + + { "clamp", TYPE_UINT, { TYPE_UINT, TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_UVEC2, { TYPE_UVEC2, TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_UVEC3, { TYPE_UVEC3, TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "clamp", TYPE_UVEC4, { TYPE_UVEC4, TYPE_UINT, TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + + { "mix", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, + { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "step", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "step", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "step", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "step", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "step", TYPE_VEC2, { TYPE_FLOAT, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "step", TYPE_VEC3, { TYPE_FLOAT, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "step", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "smoothstep", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "smoothstep", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "smoothstep", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "smoothstep", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "smoothstep", TYPE_VEC2, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "smoothstep", TYPE_VEC3, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "smoothstep", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "isnan", TYPE_BOOL, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "isnan", TYPE_BVEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "isnan", TYPE_BVEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "isnan", TYPE_BVEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "isinf", TYPE_BOOL, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "isinf", TYPE_BVEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "isinf", TYPE_BVEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "isinf", TYPE_BVEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "floatBitsToInt", TYPE_INT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "floatBitsToInt", TYPE_IVEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "floatBitsToInt", TYPE_IVEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "floatBitsToInt", TYPE_IVEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "floatBitsToUint", TYPE_UINT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "floatBitsToUint", TYPE_UVEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "floatBitsToUint", TYPE_UVEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "floatBitsToUint", TYPE_UVEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "intBitsToFloat", TYPE_FLOAT, { TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "intBitsToFloat", TYPE_VEC2, { TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "intBitsToFloat", TYPE_VEC3, { TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "intBitsToFloat", TYPE_VEC4, { TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "uintBitsToFloat", TYPE_FLOAT, { TYPE_UINT, TYPE_VOID }, TAG_GLOBAL }, + { "uintBitsToFloat", TYPE_VEC2, { TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "uintBitsToFloat", TYPE_VEC3, { TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "uintBitsToFloat", TYPE_VEC4, { TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, //builtins - geometric - { "length", TYPE_FLOAT, { TYPE_VEC2, TYPE_VOID } }, - { "length", TYPE_FLOAT, { TYPE_VEC3, TYPE_VOID } }, - { "length", TYPE_FLOAT, { TYPE_VEC4, TYPE_VOID } }, - { "distance", TYPE_FLOAT, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "distance", TYPE_FLOAT, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "distance", TYPE_FLOAT, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "dot", TYPE_FLOAT, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "dot", TYPE_FLOAT, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "dot", TYPE_FLOAT, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - { "cross", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "normalize", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "normalize", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "normalize", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - { "reflect", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "refract", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "faceforward", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "faceforward", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "faceforward", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "matrixCompMult", TYPE_MAT2, { TYPE_MAT2, TYPE_MAT2, TYPE_VOID } }, - { "matrixCompMult", TYPE_MAT3, { TYPE_MAT3, TYPE_MAT3, TYPE_VOID } }, - { "matrixCompMult", TYPE_MAT4, { TYPE_MAT4, TYPE_MAT4, TYPE_VOID } }, - - { "outerProduct", TYPE_MAT2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "outerProduct", TYPE_MAT3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "outerProduct", TYPE_MAT4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "transpose", TYPE_MAT2, { TYPE_MAT2, TYPE_VOID } }, - { "transpose", TYPE_MAT3, { TYPE_MAT3, TYPE_VOID } }, - { "transpose", TYPE_MAT4, { TYPE_MAT4, TYPE_VOID } }, - - { "determinant", TYPE_FLOAT, { TYPE_MAT2, TYPE_VOID } }, - { "determinant", TYPE_FLOAT, { TYPE_MAT3, TYPE_VOID } }, - { "determinant", TYPE_FLOAT, { TYPE_MAT4, TYPE_VOID } }, - - { "inverse", TYPE_MAT2, { TYPE_MAT2, TYPE_VOID } }, - { "inverse", TYPE_MAT3, { TYPE_MAT3, TYPE_VOID } }, - { "inverse", TYPE_MAT4, { TYPE_MAT4, TYPE_VOID } }, - - { "lessThan", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "lessThan", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "lessThan", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "lessThan", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "lessThan", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "lessThan", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, - - { "lessThan", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "lessThan", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "lessThan", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, - - { "greaterThan", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "greaterThan", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "greaterThan", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "greaterThan", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "greaterThan", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "greaterThan", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, - - { "greaterThan", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "greaterThan", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "greaterThan", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, - - { "lessThanEqual", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "lessThanEqual", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "lessThanEqual", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "lessThanEqual", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "lessThanEqual", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "lessThanEqual", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, - - { "lessThanEqual", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "lessThanEqual", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "lessThanEqual", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, - - { "greaterThanEqual", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "greaterThanEqual", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "greaterThanEqual", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "greaterThanEqual", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "greaterThanEqual", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "greaterThanEqual", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, - - { "greaterThanEqual", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "greaterThanEqual", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "greaterThanEqual", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, - - { "equal", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "equal", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "equal", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "equal", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "equal", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "equal", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, - - { "equal", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "equal", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "equal", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, - - { "equal", TYPE_BVEC2, { TYPE_BVEC2, TYPE_BVEC2, TYPE_VOID } }, - { "equal", TYPE_BVEC3, { TYPE_BVEC3, TYPE_BVEC3, TYPE_VOID } }, - { "equal", TYPE_BVEC4, { TYPE_BVEC4, TYPE_BVEC4, TYPE_VOID } }, - - { "notEqual", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "notEqual", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "notEqual", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } }, - - { "notEqual", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID } }, - { "notEqual", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID } }, - { "notEqual", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID } }, + { "length", TYPE_FLOAT, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "length", TYPE_FLOAT, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "length", TYPE_FLOAT, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "distance", TYPE_FLOAT, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "distance", TYPE_FLOAT, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "distance", TYPE_FLOAT, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "dot", TYPE_FLOAT, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "dot", TYPE_FLOAT, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "dot", TYPE_FLOAT, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "cross", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "normalize", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "normalize", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "normalize", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "reflect", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "refract", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "faceforward", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "faceforward", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "faceforward", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "matrixCompMult", TYPE_MAT2, { TYPE_MAT2, TYPE_MAT2, TYPE_VOID }, TAG_GLOBAL }, + { "matrixCompMult", TYPE_MAT3, { TYPE_MAT3, TYPE_MAT3, TYPE_VOID }, TAG_GLOBAL }, + { "matrixCompMult", TYPE_MAT4, { TYPE_MAT4, TYPE_MAT4, TYPE_VOID }, TAG_GLOBAL }, + + { "outerProduct", TYPE_MAT2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "outerProduct", TYPE_MAT3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "outerProduct", TYPE_MAT4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "transpose", TYPE_MAT2, { TYPE_MAT2, TYPE_VOID }, TAG_GLOBAL }, + { "transpose", TYPE_MAT3, { TYPE_MAT3, TYPE_VOID }, TAG_GLOBAL }, + { "transpose", TYPE_MAT4, { TYPE_MAT4, TYPE_VOID }, TAG_GLOBAL }, + + { "determinant", TYPE_FLOAT, { TYPE_MAT2, TYPE_VOID }, TAG_GLOBAL }, + { "determinant", TYPE_FLOAT, { TYPE_MAT3, TYPE_VOID }, TAG_GLOBAL }, + { "determinant", TYPE_FLOAT, { TYPE_MAT4, TYPE_VOID }, TAG_GLOBAL }, + + { "inverse", TYPE_MAT2, { TYPE_MAT2, TYPE_VOID }, TAG_GLOBAL }, + { "inverse", TYPE_MAT3, { TYPE_MAT3, TYPE_VOID }, TAG_GLOBAL }, + { "inverse", TYPE_MAT4, { TYPE_MAT4, TYPE_VOID }, TAG_GLOBAL }, + + { "lessThan", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "lessThan", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "lessThan", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "lessThan", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "lessThan", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "lessThan", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "lessThan", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "lessThan", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "lessThan", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "greaterThan", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThan", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThan", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "greaterThan", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThan", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThan", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "greaterThan", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThan", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThan", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "lessThanEqual", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "lessThanEqual", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "lessThanEqual", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "lessThanEqual", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "lessThanEqual", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "lessThanEqual", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "lessThanEqual", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "lessThanEqual", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "lessThanEqual", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "greaterThanEqual", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThanEqual", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThanEqual", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "greaterThanEqual", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThanEqual", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThanEqual", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "greaterThanEqual", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThanEqual", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "greaterThanEqual", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "equal", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "equal", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "equal", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "equal", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "equal", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "equal", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "equal", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "equal", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "equal", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "equal", TYPE_BVEC2, { TYPE_BVEC2, TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "equal", TYPE_BVEC3, { TYPE_BVEC3, TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "equal", TYPE_BVEC4, { TYPE_BVEC4, TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "notEqual", TYPE_BVEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "notEqual", TYPE_BVEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "notEqual", TYPE_BVEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + { "notEqual", TYPE_BVEC2, { TYPE_IVEC2, TYPE_IVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "notEqual", TYPE_BVEC3, { TYPE_IVEC3, TYPE_IVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "notEqual", TYPE_BVEC4, { TYPE_IVEC4, TYPE_IVEC4, TYPE_VOID }, TAG_GLOBAL }, - { "notEqual", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID } }, - { "notEqual", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID } }, - { "notEqual", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID } }, + { "notEqual", TYPE_BVEC2, { TYPE_UVEC2, TYPE_UVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "notEqual", TYPE_BVEC3, { TYPE_UVEC3, TYPE_UVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "notEqual", TYPE_BVEC4, { TYPE_UVEC4, TYPE_UVEC4, TYPE_VOID }, TAG_GLOBAL }, - { "notEqual", TYPE_BVEC2, { TYPE_BVEC2, TYPE_BVEC2, TYPE_VOID } }, - { "notEqual", TYPE_BVEC3, { TYPE_BVEC3, TYPE_BVEC3, TYPE_VOID } }, - { "notEqual", TYPE_BVEC4, { TYPE_BVEC4, TYPE_BVEC4, TYPE_VOID } }, + { "notEqual", TYPE_BVEC2, { TYPE_BVEC2, TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "notEqual", TYPE_BVEC3, { TYPE_BVEC3, TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "notEqual", TYPE_BVEC4, { TYPE_BVEC4, TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, - { "any", TYPE_BOOL, { TYPE_BVEC2, TYPE_VOID } }, - { "any", TYPE_BOOL, { TYPE_BVEC3, TYPE_VOID } }, - { "any", TYPE_BOOL, { TYPE_BVEC4, TYPE_VOID } }, + { "any", TYPE_BOOL, { TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "any", TYPE_BOOL, { TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "any", TYPE_BOOL, { TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, - { "all", TYPE_BOOL, { TYPE_BVEC2, TYPE_VOID } }, - { "all", TYPE_BOOL, { TYPE_BVEC3, TYPE_VOID } }, - { "all", TYPE_BOOL, { TYPE_BVEC4, TYPE_VOID } }, + { "all", TYPE_BOOL, { TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "all", TYPE_BOOL, { TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "all", TYPE_BOOL, { TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, - { "not", TYPE_BOOL, { TYPE_BVEC2, TYPE_VOID } }, - { "not", TYPE_BOOL, { TYPE_BVEC3, TYPE_VOID } }, - { "not", TYPE_BOOL, { TYPE_BVEC4, TYPE_VOID } }, + { "not", TYPE_BVEC2, { TYPE_BVEC2, TYPE_VOID }, TAG_GLOBAL }, + { "not", TYPE_BVEC3, { TYPE_BVEC3, TYPE_VOID }, TAG_GLOBAL }, + { "not", TYPE_BVEC4, { TYPE_BVEC4, TYPE_VOID }, TAG_GLOBAL }, //builtins - texture - { "textureSize", TYPE_IVEC2, { TYPE_SAMPLER2D, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC2, { TYPE_ISAMPLER2D, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC2, { TYPE_USAMPLER2D, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC3, { TYPE_SAMPLER2DARRAY, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC3, { TYPE_ISAMPLER2DARRAY, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC3, { TYPE_USAMPLER2DARRAY, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC3, { TYPE_SAMPLER3D, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC3, { TYPE_ISAMPLER3D, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC3, { TYPE_USAMPLER3D, TYPE_INT, TYPE_VOID } }, - { "textureSize", TYPE_IVEC2, { TYPE_SAMPLERCUBE, TYPE_INT, TYPE_VOID } }, - - { "texture", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC2, TYPE_VOID } }, - { "texture", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC2, TYPE_VOID } }, - { "texture", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC2, TYPE_VOID } }, - { "texture", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_VEC3, TYPE_VOID } }, - { "texture", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_VEC3, TYPE_VOID } }, - { "texture", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_VEC3, TYPE_VOID } }, - { "texture", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC3, TYPE_VOID } }, - { "texture", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC3, TYPE_VOID } }, - { "texture", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC3, TYPE_VOID } }, - { "texture", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "texture", TYPE_VEC4, { TYPE_SAMPLERCUBE, TYPE_VEC3, TYPE_VOID } }, - { "texture", TYPE_VEC4, { TYPE_SAMPLERCUBE, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "textureProj", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC3, TYPE_VOID } }, - { "textureProj", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC4, TYPE_VOID } }, - { "textureProj", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureProj", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC3, TYPE_VOID } }, - { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC4, TYPE_VOID } }, - { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC3, TYPE_VOID } }, - { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC4, TYPE_VOID } }, - { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureProj", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC4, TYPE_VOID } }, - { "textureProj", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC4, TYPE_VOID } }, - { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC4, TYPE_VOID } }, - { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureLod", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureLod", TYPE_VEC4, { TYPE_SAMPLERCUBE, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - - { "texelFetch", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_IVEC2, TYPE_INT, TYPE_VOID } }, - { "texelFetch", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_IVEC2, TYPE_INT, TYPE_VOID } }, - { "texelFetch", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_IVEC2, TYPE_INT, TYPE_VOID } }, - - { "texelFetch", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - { "texelFetch", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - { "texelFetch", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - - { "texelFetch", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - { "texelFetch", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - { "texelFetch", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_IVEC3, TYPE_INT, TYPE_VOID } }, - - { "textureProjLod", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureProjLod", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureProjLod", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureProjLod", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureProjLod", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } }, - { "textureProjLod", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } }, - - { "textureGrad", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "textureGrad", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "textureGrad", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "textureGrad", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_VEC3, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "textureGrad", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_VEC3, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "textureGrad", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_VEC3, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } }, - { "textureGrad", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "textureGrad", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "textureGrad", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, - { "textureGrad", TYPE_VEC4, { TYPE_SAMPLERCUBE, TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } }, + { "textureSize", TYPE_IVEC2, { TYPE_SAMPLER2D, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC2, { TYPE_ISAMPLER2D, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC2, { TYPE_USAMPLER2D, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC3, { TYPE_SAMPLER2DARRAY, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC3, { TYPE_ISAMPLER2DARRAY, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC3, { TYPE_USAMPLER2DARRAY, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC3, { TYPE_SAMPLER3D, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC3, { TYPE_ISAMPLER3D, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC3, { TYPE_USAMPLER3D, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "textureSize", TYPE_IVEC2, { TYPE_SAMPLERCUBE, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texture", TYPE_VEC4, { TYPE_SAMPLERCUBE, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "texture", TYPE_VEC4, { TYPE_SAMPLERCUBE, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProj", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProj", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + { "textureProj", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureLod", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureLod", TYPE_VEC4, { TYPE_SAMPLERCUBE, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "texelFetch", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_IVEC2, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "texelFetch", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_IVEC2, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "texelFetch", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_IVEC2, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + + { "texelFetch", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "texelFetch", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "texelFetch", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + + { "texelFetch", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "texelFetch", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + { "texelFetch", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_IVEC3, TYPE_INT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProjLod", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureProjLod", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProjLod", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureProjLod", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProjLod", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureProjLod", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureProjLod", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureProjLod", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "textureProjLod", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + + { "textureGrad", TYPE_VEC4, { TYPE_SAMPLER2D, TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_IVEC4, { TYPE_ISAMPLER2D, TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_UVEC4, { TYPE_USAMPLER2D, TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_VEC4, { TYPE_SAMPLER2DARRAY, TYPE_VEC3, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_IVEC4, { TYPE_ISAMPLER2DARRAY, TYPE_VEC3, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_UVEC4, { TYPE_USAMPLER2DARRAY, TYPE_VEC3, TYPE_VEC2, TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_VEC4, { TYPE_SAMPLER3D, TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_IVEC4, { TYPE_ISAMPLER3D, TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_UVEC4, { TYPE_USAMPLER3D, TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "textureGrad", TYPE_VEC4, { TYPE_SAMPLERCUBE, TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + + { "dFdx", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "dFdx", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "dFdx", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "dFdx", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, - { "dFdx", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "dFdx", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "dFdx", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "dFdx", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "dFdy", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "dFdy", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "dFdy", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "dFdy", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, - { "dFdy", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "dFdy", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "dFdy", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "dFdy", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, - - { "fwidth", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } }, - { "fwidth", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } }, - { "fwidth", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } }, - { "fwidth", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } }, + { "fwidth", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID }, TAG_GLOBAL }, + { "fwidth", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID }, TAG_GLOBAL }, + { "fwidth", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID }, TAG_GLOBAL }, + { "fwidth", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID }, TAG_GLOBAL }, + + //sub-functions - { NULL, TYPE_VOID, { TYPE_VOID } } + //array + { "length", TYPE_INT, { TYPE_VOID }, TAG_ARRAY }, + + { NULL, TYPE_VOID, { TYPE_VOID }, TAG_GLOBAL } }; @@ -2058,11 +2077,11 @@ const ShaderLanguage::BuiltinFuncOutArgs ShaderLanguage::builtin_func_out_args[] bool ShaderLanguage::_validate_function_call(BlockNode *p_block, OperatorNode *p_func, DataType *r_ret_type) { - ERR_FAIL_COND_V(p_func->op != OP_CALL && p_func->op != OP_CONSTRUCT, NULL); + ERR_FAIL_COND_V(p_func->op != OP_CALL && p_func->op != OP_CONSTRUCT, false); Vector<DataType> args; - ERR_FAIL_COND_V(p_func->arguments[0]->type != Node::TYPE_VARIABLE, NULL); + ERR_FAIL_COND_V(p_func->arguments[0]->type != Node::TYPE_VARIABLE, false); StringName name = static_cast<VariableNode *>(p_func->arguments[0])->name.operator String(); @@ -2080,6 +2099,11 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, OperatorNode *p while (builtin_func_defs[idx].name) { + if (completion_class != builtin_func_defs[idx].tag) { + idx++; + continue; + } + if (name == builtin_func_defs[idx].name) { failed_builtin = true; @@ -2720,6 +2744,8 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const Map<StringName, BuiltI if (!(p_builtin_types.has(var->name) && p_builtin_types[var->name].constant)) { return true; } + } else if (p_node->type == Node::TYPE_ARRAY) { + return true; } if (r_message) @@ -2730,6 +2756,7 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const Map<StringName, BuiltI ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, const Map<StringName, BuiltInInfo> &p_builtin_types) { Vector<Expression> expression; + //Vector<TokenType> operators; while (true) { @@ -2838,7 +2865,6 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons _set_error("No matching constructor found for: '" + String(funcname->name) + "'"); return NULL; } - //validate_Function_call() expr = _reduce_expression(p_block, func); @@ -2894,6 +2920,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons _set_error("No matching function found for: '" + String(funcname->name) + "'"); return NULL; } + completion_class = TAG_GLOBAL; // reset sub-class expr = func; @@ -2904,8 +2931,9 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons DataType data_type; IdentifierType ident_type; + int array_size = 0; - if (!_find_identifier(p_block, p_builtin_types, identifier, &data_type, &ident_type)) { + if (!_find_identifier(p_block, p_builtin_types, identifier, &data_type, &ident_type, &array_size)) { _set_error("Unknown identifier in expression: " + String(identifier)); return NULL; } @@ -2915,10 +2943,68 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons return NULL; } - VariableNode *varname = alloc_node<VariableNode>(); - varname->name = identifier; - varname->datatype_cache = data_type; - expr = varname; + Node *index_expression = NULL; + Node *call_expression = NULL; + + if (array_size > 0) { + tk = _get_token(); + + if (tk.type != TK_BRACKET_OPEN && tk.type != TK_PERIOD) { + _set_error("Expected '[' or '.'"); + return NULL; + } + + if (tk.type == TK_PERIOD) { + completion_class = TAG_ARRAY; + call_expression = _parse_and_reduce_expression(p_block, p_builtin_types); + if (!call_expression) + return NULL; + data_type = call_expression->get_datatype(); + } else { // indexing + + index_expression = _parse_and_reduce_expression(p_block, p_builtin_types); + if (!index_expression) + return NULL; + + if (index_expression->get_datatype() != TYPE_INT && index_expression->get_datatype() != TYPE_UINT) { + _set_error("Only integer expressions are allowed for indexing"); + return NULL; + } + + if (index_expression->type == Node::TYPE_CONSTANT) { + ConstantNode *cnode = (ConstantNode *)index_expression; + if (cnode) { + if (!cnode->values.empty()) { + int value = cnode->values[0].sint; + if (value < 0 || value >= array_size) { + _set_error(vformat("Index [%s] out of range [%s..%s]", value, 0, array_size - 1)); + return NULL; + } + } + } + } + + tk = _get_token(); + if (tk.type != TK_BRACKET_CLOSE) { + _set_error("Expected ']'"); + return NULL; + } + } + + ArrayNode *arrname = alloc_node<ArrayNode>(); + arrname->name = identifier; + arrname->datatype_cache = data_type; + arrname->index_expression = index_expression; + arrname->call_expression = call_expression; + expr = arrname; + + } else { + + VariableNode *varname = alloc_node<VariableNode>(); + varname->name = identifier; + varname->datatype_cache = data_type; + expr = varname; + } } } else if (tk.type == TK_OP_ADD) { @@ -2969,12 +3055,11 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons _set_error("Expected identifier as member"); return NULL; } - DataType dt = expr->get_datatype(); String ident = identifier; bool ok = true; - DataType member_type; + DataType member_type = TYPE_VOID; switch (dt) { case TYPE_BVEC2: case TYPE_IVEC2: @@ -3705,11 +3790,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui tk = _get_token(); - VariableDeclarationNode *vardecl = alloc_node<VariableDeclarationNode>(); - vardecl->datatype = type; - vardecl->precision = precision; - - p_block->statements.push_back(vardecl); + Node *vardecl = NULL; while (true) { @@ -3728,15 +3809,207 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui var.type = type; var.precision = precision; var.line = tk_line; + var.array_size = 0; - VariableDeclarationNode::Declaration decl; + tk = _get_token(); - decl.name = name; - decl.initializer = NULL; + if (tk.type == TK_BRACKET_OPEN) { + bool unknown_size = false; - tk = _get_token(); + ArrayDeclarationNode *node = alloc_node<ArrayDeclarationNode>(); + node->datatype = type; + node->precision = precision; + vardecl = (Node *)node; + + ArrayDeclarationNode::Declaration decl; + decl.name = name; + decl.size = 0U; + + tk = _get_token(); + + if (tk.type == TK_BRACKET_CLOSE) { + unknown_size = true; + } else { + + if (tk.type != TK_INT_CONSTANT || ((int)tk.constant) <= 0) { + _set_error("Expected integer constant > 0 or ']'"); + return ERR_PARSE_ERROR; + } + + tk = _get_token(); + + if (tk.type != TK_BRACKET_CLOSE) { + _set_error("Expected ']'"); + return ERR_PARSE_ERROR; + } + + decl.size = ((uint32_t)tk.constant); + var.array_size = decl.size; + } + + bool full_def = false; + + tk = _get_token(); + if (tk.type == TK_OP_ASSIGN) { + tk = _get_token(); + + if (tk.type != TK_CURLY_BRACKET_OPEN) { + + if (unknown_size) { + _set_error("Expected '{'"); + return ERR_PARSE_ERROR; + } + + full_def = true; + + DataPrecision precision2 = PRECISION_DEFAULT; + if (is_token_precision(tk.type)) { + precision2 = get_token_precision(tk.type); + tk = _get_token(); + if (!is_token_nonvoid_datatype(tk.type)) { + _set_error("Expected datatype after precision"); + return ERR_PARSE_ERROR; + } + } + if (!is_token_variable_datatype(tk.type)) { + _set_error("Invalid data type for array"); + return ERR_PARSE_ERROR; + } + DataType type2 = get_token_datatype(tk.type); + + int array_size2 = 0; + + tk = _get_token(); + if (tk.type == TK_BRACKET_OPEN) { + Node *n = _parse_and_reduce_expression(p_block, p_builtin_types); + if (!n || n->type != Node::TYPE_CONSTANT || n->get_datatype() != TYPE_INT) { + _set_error("Expected single integer constant > 0"); + return ERR_PARSE_ERROR; + } + + ConstantNode *cnode = (ConstantNode *)n; + if (cnode->values.size() == 1) { + array_size2 = cnode->values[0].sint; + if (array_size2 <= 0) { + _set_error("Expected single integer constant > 0"); + return ERR_PARSE_ERROR; + } + } else { + _set_error("Expected single integer constant > 0"); + return ERR_PARSE_ERROR; + } + + tk = _get_token(); + if (tk.type != TK_BRACKET_CLOSE) { + _set_error("Expected ']"); + return ERR_PARSE_ERROR; + } else { + tk = _get_token(); + } + } else { + _set_error("Expected '["); + return ERR_PARSE_ERROR; + } + + if (precision != precision2 || type != type2 || var.array_size != array_size2) { + String error_str = "Cannot convert from '"; + if (precision2 != PRECISION_DEFAULT) { + error_str += get_precision_name(precision2); + error_str += " "; + } + error_str += get_datatype_name(type2); + error_str += "["; + error_str += itos(array_size2); + error_str += "]'"; + error_str += " to '"; + if (precision != PRECISION_DEFAULT) { + error_str += get_precision_name(precision); + error_str += " "; + } + error_str += get_datatype_name(type); + error_str += "["; + error_str += itos(var.array_size); + error_str += "]'"; + _set_error(error_str); + return ERR_PARSE_ERROR; + } + } + + bool curly = tk.type == TK_CURLY_BRACKET_OPEN; + + if (unknown_size) { + if (!curly) { + _set_error("Expected '{'"); + return ERR_PARSE_ERROR; + } + } else { + if (full_def) { + if (curly) { + _set_error("Expected '('"); + return ERR_PARSE_ERROR; + } + } + } + + if (tk.type == TK_PARENTHESIS_OPEN || curly) { // initialization + while (true) { + + Node *n = _parse_and_reduce_expression(p_block, p_builtin_types); + if (!n) { + return ERR_PARSE_ERROR; + } + + if (var.type != n->get_datatype()) { + _set_error("Invalid assignment of '" + get_datatype_name(n->get_datatype()) + "' to '" + get_datatype_name(var.type) + "'"); + return ERR_PARSE_ERROR; + } + + tk = _get_token(); + if (tk.type == TK_COMMA) { + decl.initializer.push_back(n); + continue; + } else if (!curly && tk.type == TK_PARENTHESIS_CLOSE) { + decl.initializer.push_back(n); + break; + } else if (curly && tk.type == TK_CURLY_BRACKET_CLOSE) { + decl.initializer.push_back(n); + break; + } else { + if (curly) + _set_error("Expected '}' or ','"); + else + _set_error("Expected ')' or ','"); + return ERR_PARSE_ERROR; + } + } + if (unknown_size) { + decl.size = decl.initializer.size(); + var.array_size = decl.initializer.size(); + } else if (decl.initializer.size() != var.array_size) { + _set_error("Array size mismatch"); + return ERR_PARSE_ERROR; + } + tk = _get_token(); + } + } else { + if (unknown_size) { + _set_error("Expected array initialization"); + return ERR_PARSE_ERROR; + } + } + + node->declarations.push_back(decl); + } else if (tk.type == TK_OP_ASSIGN) { + + VariableDeclarationNode *node = alloc_node<VariableDeclarationNode>(); + node->datatype = type; + node->precision = precision; + vardecl = (Node *)node; + + VariableDeclarationNode::Declaration decl; + decl.name = name; + decl.initializer = NULL; - if (tk.type == TK_OP_ASSIGN) { //variable created with assignment! must parse an expression Node *n = _parse_and_reduce_expression(p_block, p_builtin_types); if (!n) @@ -3749,11 +4022,22 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui return ERR_PARSE_ERROR; } tk = _get_token(); + node->declarations.push_back(decl); + } else { + VariableDeclarationNode *node = alloc_node<VariableDeclarationNode>(); + node->datatype = type; + node->precision = precision; + vardecl = (Node *)node; + + VariableDeclarationNode::Declaration decl; + decl.name = name; + decl.initializer = NULL; + node->declarations.push_back(decl); } - p_block->variables[name] = var; + p_block->statements.push_back(vardecl); - vardecl->declarations.push_back(decl); + p_block->variables[name] = var; if (tk.type == TK_COMMA) { tk = _get_token(); @@ -4369,6 +4653,14 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct type = get_token_datatype(tk.type); + TkPos prev_pos = _get_tkpos(); + tk = _get_token(); + if (tk.type == TK_BRACKET_OPEN) { + _set_error("Cannot use arrays as return types"); + return ERR_PARSE_ERROR; + } + _set_tkpos(prev_pos); + _get_completable_identifier(NULL, COMPLETION_MAIN_FUNCTION, name); if (name == StringName()) { @@ -4522,6 +4814,10 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct tk = _get_token(); + if (tk.type == TK_BRACKET_OPEN) { + _set_error("Arrays as parameters are not implemented yet"); + return ERR_PARSE_ERROR; + } if (tk.type != TK_IDENTIFIER) { _set_error("Expected identifier for argument name"); return ERR_PARSE_ERROR; @@ -4542,6 +4838,10 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct func_node->arguments.push_back(arg); tk = _get_token(); + if (tk.type == TK_BRACKET_OPEN) { + _set_error("Arrays as parameters are not implemented yet"); + return ERR_PARSE_ERROR; + } if (tk.type == TK_COMMA) { tk = _get_token(); @@ -4728,60 +5028,71 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct StringName skip_function; BlockNode *block = completion_block; - while (block) { - - if (comp_ident) { - for (const Map<StringName, BlockNode::Variable>::Element *E = block->variables.front(); E; E = E->next()) { + if (completion_class == TAG_GLOBAL) { + while (block) { + if (comp_ident) { + for (const Map<StringName, BlockNode::Variable>::Element *E = block->variables.front(); E; E = E->next()) { - if (E->get().line < completion_line) { - matches.insert(E->key(), ScriptCodeCompletionOption::KIND_VARIABLE); + if (E->get().line < completion_line) { + matches.insert(E->key(), ScriptCodeCompletionOption::KIND_VARIABLE); + } } } - } - if (block->parent_function) { - if (comp_ident) { - for (int i = 0; i < block->parent_function->arguments.size(); i++) { - matches.insert(block->parent_function->arguments[i].name, ScriptCodeCompletionOption::KIND_FUNCTION); + if (block->parent_function) { + if (comp_ident) { + for (int i = 0; i < block->parent_function->arguments.size(); i++) { + matches.insert(block->parent_function->arguments[i].name, ScriptCodeCompletionOption::KIND_FUNCTION); + } } + skip_function = block->parent_function->name; } - skip_function = block->parent_function->name; + block = block->parent_block; } - block = block->parent_block; - } - if (comp_ident && skip_function != StringName() && p_functions.has(skip_function)) { + if (comp_ident && skip_function != StringName() && p_functions.has(skip_function)) { - for (Map<StringName, BuiltInInfo>::Element *E = p_functions[skip_function].built_ins.front(); E; E = E->next()) { - ScriptCodeCompletionOption::Kind kind = ScriptCodeCompletionOption::KIND_MEMBER; - if (E->get().constant) { - kind = ScriptCodeCompletionOption::KIND_CONSTANT; + for (Map<StringName, BuiltInInfo>::Element *E = p_functions[skip_function].built_ins.front(); E; E = E->next()) { + ScriptCodeCompletionOption::Kind kind = ScriptCodeCompletionOption::KIND_MEMBER; + if (E->get().constant) { + kind = ScriptCodeCompletionOption::KIND_CONSTANT; + } + matches.insert(E->key(), kind); } - matches.insert(E->key(), kind); } - } - if (comp_ident) { - for (const Map<StringName, ShaderNode::Varying>::Element *E = shader->varyings.front(); E; E = E->next()) { - matches.insert(E->key(), ScriptCodeCompletionOption::KIND_VARIABLE); + if (comp_ident) { + for (const Map<StringName, ShaderNode::Varying>::Element *E = shader->varyings.front(); E; E = E->next()) { + matches.insert(E->key(), ScriptCodeCompletionOption::KIND_VARIABLE); + } + for (const Map<StringName, ShaderNode::Uniform>::Element *E = shader->uniforms.front(); E; E = E->next()) { + matches.insert(E->key(), ScriptCodeCompletionOption::KIND_MEMBER); + } } - for (const Map<StringName, ShaderNode::Uniform>::Element *E = shader->uniforms.front(); E; E = E->next()) { - matches.insert(E->key(), ScriptCodeCompletionOption::KIND_MEMBER); + + for (int i = 0; i < shader->functions.size(); i++) { + if (!shader->functions[i].callable || shader->functions[i].name == skip_function) + continue; + matches.insert(String(shader->functions[i].name), ScriptCodeCompletionOption::KIND_FUNCTION); } - } - for (int i = 0; i < shader->functions.size(); i++) { - if (!shader->functions[i].callable || shader->functions[i].name == skip_function) - continue; - matches.insert(String(shader->functions[i].name), ScriptCodeCompletionOption::KIND_FUNCTION); - } + int idx = 0; - int idx = 0; + while (builtin_func_defs[idx].name) { - while (builtin_func_defs[idx].name) { + matches.insert(String(builtin_func_defs[idx].name), ScriptCodeCompletionOption::KIND_FUNCTION); + idx++; + } - matches.insert(String(builtin_func_defs[idx].name), ScriptCodeCompletionOption::KIND_FUNCTION); - idx++; + } else { // sub-class + int idx = 0; + + while (builtin_func_defs[idx].name) { + if (builtin_func_defs[idx].tag == completion_class) { + matches.insert(String(builtin_func_defs[idx].name), ScriptCodeCompletionOption::KIND_FUNCTION); + } + idx++; + } } for (Map<String, ScriptCodeCompletionOption::Kind>::Element *E = matches.front(); E; E = E->next()) { @@ -4793,7 +5104,6 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct } return OK; - } break; case COMPLETION_CALL_ARGUMENTS: { @@ -4846,6 +5156,11 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct if (completion_function == builtin_func_defs[idx].name) { + if (builtin_func_defs[idx].tag != completion_class) { + idx++; + continue; + } + if (calltip.length()) calltip += "\n"; @@ -4957,6 +5272,7 @@ ShaderLanguage::ShaderNode *ShaderLanguage::get_shader() { ShaderLanguage::ShaderLanguage() { nodes = NULL; + completion_class = TAG_GLOBAL; } ShaderLanguage::~ShaderLanguage() { diff --git a/servers/visual/shader_language.h b/servers/visual/shader_language.h index 65bf78bddd..8253bce468 100644 --- a/servers/visual/shader_language.h +++ b/servers/visual/shader_language.h @@ -288,7 +288,9 @@ public: TYPE_CONSTANT, TYPE_OPERATOR, TYPE_CONTROL_FLOW, - TYPE_MEMBER + TYPE_MEMBER, + TYPE_ARRAY, + TYPE_ARRAY_DECLARATION, }; Type type; @@ -352,6 +354,40 @@ public: datatype(TYPE_VOID) {} }; + struct ArrayNode : public Node { + DataType datatype_cache; + StringName name; + Node *index_expression; + Node *call_expression; + + virtual DataType get_datatype() const { return datatype_cache; } + + ArrayNode() : + Node(TYPE_ARRAY), + datatype_cache(TYPE_VOID), + index_expression(NULL), + call_expression(NULL) {} + }; + + struct ArrayDeclarationNode : public Node { + DataPrecision precision; + DataType datatype; + + struct Declaration { + StringName name; + uint32_t size; + Vector<Node *> initializer; + }; + + Vector<Declaration> declarations; + virtual DataType get_datatype() const { return datatype; } + + ArrayDeclarationNode() : + Node(TYPE_ARRAY_DECLARATION), + precision(PRECISION_DEFAULT), + datatype(TYPE_VOID) {} + }; + struct ConstantNode : public Node { DataType datatype; @@ -380,6 +416,7 @@ public: DataType type; DataPrecision precision; int line; //for completion + int array_size; }; Map<StringName, Variable> variables; @@ -552,6 +589,7 @@ public: static DataInterpolation get_token_interpolation(TokenType p_type); static bool is_token_precision(TokenType p_type); static DataPrecision get_token_precision(TokenType p_type); + static String get_precision_name(DataPrecision p_type); static String get_datatype_name(DataType p_type); static bool is_token_nonvoid_datatype(TokenType p_type); static bool is_token_operator(TokenType p_type); @@ -645,16 +683,22 @@ private: IDENTIFIER_CONSTANT, }; - bool _find_identifier(const BlockNode *p_block, const Map<StringName, BuiltInInfo> &p_builtin_types, const StringName &p_identifier, DataType *r_data_type = NULL, IdentifierType *r_type = NULL); + bool _find_identifier(const BlockNode *p_block, const Map<StringName, BuiltInInfo> &p_builtin_types, const StringName &p_identifier, DataType *r_data_type = NULL, IdentifierType *r_type = NULL, int *r_array_size = NULL); bool _is_operator_assign(Operator p_op) const; bool _validate_assign(Node *p_node, const Map<StringName, BuiltInInfo> &p_builtin_types, String *r_message = NULL); bool _validate_operator(OperatorNode *p_op, DataType *r_ret_type = NULL); + enum SubClassTag { + TAG_GLOBAL, + TAG_ARRAY + }; + struct BuiltinFuncDef { enum { MAX_ARGS = 5 }; const char *name; DataType rettype; const DataType args[MAX_ARGS]; + SubClassTag tag; }; struct BuiltinFuncOutArgs { //arguments used as out in built in functions @@ -666,6 +710,7 @@ private: int completion_line; BlockNode *completion_block; DataType completion_base; + SubClassTag completion_class; StringName completion_function; int completion_argument; diff --git a/servers/visual/visual_server_viewport.cpp b/servers/visual/visual_server_viewport.cpp index f8ed035766..86c5227f30 100644 --- a/servers/visual/visual_server_viewport.cpp +++ b/servers/visual/visual_server_viewport.cpp @@ -63,7 +63,10 @@ static Transform2D _canvas_get_transform(VisualServerViewport::Viewport *p_viewp } void VisualServerViewport::_draw_3d(Viewport *p_viewport, ARVRInterface::Eyes p_eye) { - Ref<ARVRInterface> arvr_interface = ARVRServer::get_singleton()->get_primary_interface(); + Ref<ARVRInterface> arvr_interface; + if (ARVRServer::get_singleton() != NULL) { + arvr_interface = ARVRServer::get_singleton()->get_primary_interface(); + } if (p_viewport->use_arvr && arvr_interface.is_valid()) { VSG::scene->render_camera(arvr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas); @@ -260,11 +263,16 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::E } void VisualServerViewport::draw_viewports() { + // get our arvr interface in case we need it - Ref<ARVRInterface> arvr_interface = ARVRServer::get_singleton()->get_primary_interface(); + Ref<ARVRInterface> arvr_interface; - // process all our active interfaces - ARVRServer::get_singleton()->_process(); + if (ARVRServer::get_singleton() != NULL) { + arvr_interface = ARVRServer::get_singleton()->get_primary_interface(); + + // process all our active interfaces + ARVRServer::get_singleton()->_process(); + } if (Engine::get_singleton()->is_editor_hint()) { clear_color = GLOBAL_GET("rendering/environment/default_clear_color"); diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index c6468694fd..25e18d0623 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -1118,7 +1118,7 @@ void VisualServer::mesh_add_surface_from_arrays(RID p_mesh, PrimitiveType p_prim } offsets[i] = elem_size; continue; - } break; + } default: { ERR_FAIL(); } @@ -1286,7 +1286,7 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format, PoolVector<uint8_ } offsets[i] = elem_size; continue; - } break; + } default: { ERR_FAIL_V(Array()); } diff --git a/thirdparty/README.md b/thirdparty/README.md index dbdf9bbf4f..99f917dbc1 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -4,7 +4,7 @@ ## assimp - Upstream: http://github.com/assimp/assimp -- Version: git (d3d98a7ec0c8d38e1952b46dfe53f7e9233dc92d) +- Version: git (1d565b0aab5a2ee00462f18c5b8a81f6a5454a48) - License: BSD-3-Clause @@ -122,20 +122,20 @@ Use UI font variant if available, because it has tight vertical metrics and good ## freetype - Upstream: https://www.freetype.org -- Version: 2.10.0 +- Version: 2.10.1 - License: FreeType License (BSD-like) Files extracted from upstream source: -- the src/ folder, stripped of the `Jamfile` files -- the include/ folder +- the `src/` folder, stripped of the `Jamfile` files and the `tools` subfolder +- the `include/` folder - `docs/{FTL.TXT,LICENSE.TXT}` ## glad - Upstream: https://github.com/Dav1dde/glad -- Version: 0.1.29 +- Version: 0.1.31 - License: MIT The files we package are automatically generated. @@ -200,6 +200,7 @@ Important: Some files have Godot-made changes. They are marked with `// -- GODOT start --` and `// -- GODOT end --` comments. + ## libtheora - Upstream: https://www.theora.org @@ -262,25 +263,13 @@ changes to ensure they build for Javascript/HTML5. Those changes are marked with `// -- GODOT --` comments. -## wslay - -- Upstream: https://github.com/tatsuhiro-t/wslay -- Version: 1.1.0 -- License: MIT - -File extracted from upstream releaze tarball: - -- All `*.c` and `*.h` in `lib/` and `lib/includes/` -- `wslay.h` has a small Godot addition to fix MSVC build. - See `thirdparty/wslay/msvcfix.diff` - ## mbedtls - Upstream: https://tls.mbed.org/ -- Version: 2.16.0 +- Version: 2.16.2 - License: Apache 2.0 -File extracted from upstream release tarball `mbedtls-2.16.0-apache.tgz`: +File extracted from upstream release tarball (`-apache.tgz` variant): - All `*.h` from `include/mbedtls/` to `thirdparty/mbedtls/include/mbedtls/` - All `*.c` from `library/` to `thirdparty/mbedtls/library/` - Applied the patch in `thirdparty/mbedtls/1453.diff` (PR 1453). @@ -391,7 +380,7 @@ Collection of single-file libraries used in Godot components. * License: Public Domain (Unlicense) or MIT - `stb_vorbis.c` * Upstream: https://github.com/nothings/stb - * Version: 1.15 + * Version: 1.16 * License: Public Domain (Unlicense) or MIT @@ -426,8 +415,8 @@ Files extracted from upstream source: ## pcre2 -- Upstream: http://www.pcre.org/ -- Version: 10.32 +- Upstream: http://www.pcre.org +- Version: 10.33 - License: BSD-3-Clause Files extracted from upstream source: @@ -508,10 +497,23 @@ They can be reapplied using the patches included in the `vhacd` folder. +## wslay + +- Upstream: https://github.com/tatsuhiro-t/wslay +- Version: 1.1.0 +- License: MIT + +File extracted from upstream release tarball: + +- All `*.c` and `*.h` in `lib/` and `lib/includes/` +- `wslay.h` has a small Godot addition to fix MSVC build. + See `thirdparty/wslay/msvcfix.diff` + + ## xatlas - Upstream: https://github.com/jpcy/xatlas -- Version: git (b8ec29b, 2018) +- Version: git (f65a664, 2019) - License: MIT Files extracted from upstream source: @@ -536,7 +538,7 @@ Files extracted from upstream source: ## zstd - Upstream: https://github.com/facebook/zstd -- Version: 1.4.0 +- Version: 1.4.1 - License: BSD-3-Clause Files extracted from upstream source: diff --git a/thirdparty/assimp/assimp/config.h b/thirdparty/assimp/assimp/config.h index 8b0634d28b..382a698268 100644 --- a/thirdparty/assimp/assimp/config.h +++ b/thirdparty/assimp/assimp/config.h @@ -647,6 +647,21 @@ enum aiComponent { "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" // --------------------------------------------------------------------------- +/** @brief Set wether the FBX importer shall not remove empty bones. + * + * + * Empty bone are often used to define connections for other models. + */ +#define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ + "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" + +// --------------------------------------------------------------------------- +/** @brief Set wether the FBX importer shall convert the unit from cm to m. + */ +#define AI_CONFIG_FBX_CONVERT_TO_M \ + "AI_CONFIG_FBX_CONVERT_TO_M" + +// --------------------------------------------------------------------------- /** @brief Set the vertex animation keyframe to be imported * * ASSIMP does not support vertex keyframes (only bone animation is supported). @@ -978,3 +993,4 @@ enum aiComponent { /* #cmakedefine ASSIMP_DOUBLE_PRECISION 1 */ #endif // !! AI_CONFIG_H_INC + diff --git a/thirdparty/assimp/code/CApi/AssimpCExport.cpp b/thirdparty/assimp/code/CApi/AssimpCExport.cpp new file mode 100644 index 0000000000..7557edcfc6 --- /dev/null +++ b/thirdparty/assimp/code/CApi/AssimpCExport.cpp @@ -0,0 +1,156 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +/** @file AssimpCExport.cpp +Assimp C export interface. See Exporter.cpp for some notes. +*/ + +#ifndef ASSIMP_BUILD_NO_EXPORT + +#include "CInterfaceIOWrapper.h" +#include <assimp/SceneCombiner.h> +#include "Common/ScenePrivate.h" +#include <assimp/Exporter.hpp> + +using namespace Assimp; + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API size_t aiGetExportFormatCount(void) +{ + return Exporter().GetExportFormatCount(); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API const aiExportFormatDesc* aiGetExportFormatDescription( size_t index) +{ + // Note: this is valid as the index always pertains to a built-in exporter, + // for which the returned structure is guaranteed to be of static storage duration. + Exporter exporter; + const aiExportFormatDesc* orig( exporter.GetExportFormatDescription( index ) ); + if (NULL == orig) { + return NULL; + } + + aiExportFormatDesc *desc = new aiExportFormatDesc; + desc->description = new char[ strlen( orig->description ) + 1 ](); + ::strncpy( (char*) desc->description, orig->description, strlen( orig->description ) ); + desc->fileExtension = new char[ strlen( orig->fileExtension ) + 1 ](); + ::strncpy( ( char* ) desc->fileExtension, orig->fileExtension, strlen( orig->fileExtension ) ); + desc->id = new char[ strlen( orig->id ) + 1 ](); + ::strncpy( ( char* ) desc->id, orig->id, strlen( orig->id ) ); + + return desc; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiReleaseExportFormatDescription( const aiExportFormatDesc *desc ) { + if (NULL == desc) { + return; + } + + delete [] desc->description; + delete [] desc->fileExtension; + delete [] desc->id; + delete desc; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiCopyScene(const aiScene* pIn, aiScene** pOut) +{ + if (!pOut || !pIn) { + return; + } + + SceneCombiner::CopyScene(pOut,pIn,true); + ScenePriv(*pOut)->mIsCopy = true; +} + + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiFreeScene(const C_STRUCT aiScene* pIn) +{ + // note: aiReleaseImport() is also able to delete scene copies, but in addition + // it also handles scenes with import metadata. + delete pIn; +} + + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiReturn aiExportScene( const aiScene* pScene, const char* pFormatId, const char* pFileName, unsigned int pPreprocessing ) +{ + return ::aiExportSceneEx(pScene,pFormatId,pFileName,NULL,pPreprocessing); +} + + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiReturn aiExportSceneEx( const aiScene* pScene, const char* pFormatId, const char* pFileName, aiFileIO* pIO, unsigned int pPreprocessing ) +{ + Exporter exp; + + if (pIO) { + exp.SetIOHandler(new CIOSystemWrapper(pIO)); + } + return exp.Export(pScene,pFormatId,pFileName,pPreprocessing); +} + + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API const C_STRUCT aiExportDataBlob* aiExportSceneToBlob( const aiScene* pScene, const char* pFormatId, unsigned int pPreprocessing ) +{ + Exporter exp; + if (!exp.ExportToBlob(pScene,pFormatId,pPreprocessing)) { + return NULL; + } + const aiExportDataBlob* blob = exp.GetOrphanedBlob(); + ai_assert(blob); + + return blob; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API C_STRUCT void aiReleaseExportBlob( const aiExportDataBlob* pData ) +{ + delete pData; +} + +#endif // !ASSIMP_BUILD_NO_EXPORT diff --git a/thirdparty/assimp/code/CInterfaceIOWrapper.cpp b/thirdparty/assimp/code/CApi/CInterfaceIOWrapper.cpp index 5a3a49565a..5a3a49565a 100644 --- a/thirdparty/assimp/code/CInterfaceIOWrapper.cpp +++ b/thirdparty/assimp/code/CApi/CInterfaceIOWrapper.cpp diff --git a/thirdparty/assimp/code/CInterfaceIOWrapper.h b/thirdparty/assimp/code/CApi/CInterfaceIOWrapper.h index 2162320302..2162320302 100644 --- a/thirdparty/assimp/code/CInterfaceIOWrapper.h +++ b/thirdparty/assimp/code/CApi/CInterfaceIOWrapper.h diff --git a/thirdparty/assimp/code/Common/Assimp.cpp b/thirdparty/assimp/code/Common/Assimp.cpp new file mode 100644 index 0000000000..178b2c01d0 --- /dev/null +++ b/thirdparty/assimp/code/Common/Assimp.cpp @@ -0,0 +1,695 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +/** @file Assimp.cpp + * @brief Implementation of the Plain-C API + */ + +#include <assimp/cimport.h> +#include <assimp/LogStream.hpp> +#include <assimp/DefaultLogger.hpp> +#include <assimp/Importer.hpp> +#include <assimp/importerdesc.h> +#include <assimp/scene.h> +#include <assimp/GenericProperty.h> +#include <assimp/Exceptional.h> +#include <assimp/BaseImporter.h> + +#include "CApi/CInterfaceIOWrapper.h" +#include "Importer.h" +#include "ScenePrivate.h" + +#include <list> + +// ------------------------------------------------------------------------------------------------ +#ifndef ASSIMP_BUILD_SINGLETHREADED +# include <thread> +# include <mutex> +#endif +// ------------------------------------------------------------------------------------------------ +using namespace Assimp; + +namespace Assimp { + // underlying structure for aiPropertyStore + typedef BatchLoader::PropertyMap PropertyMap; + + /** Stores the LogStream objects for all active C log streams */ + struct mpred { + bool operator () (const aiLogStream& s0, const aiLogStream& s1) const { + return s0.callback<s1.callback&&s0.user<s1.user; + } + }; + typedef std::map<aiLogStream, Assimp::LogStream*, mpred> LogStreamMap; + + /** Stores the LogStream objects allocated by #aiGetPredefinedLogStream */ + typedef std::list<Assimp::LogStream*> PredefLogStreamMap; + + /** Local storage of all active log streams */ + static LogStreamMap gActiveLogStreams; + + /** Local storage of LogStreams allocated by #aiGetPredefinedLogStream */ + static PredefLogStreamMap gPredefinedStreams; + + /** Error message of the last failed import process */ + static std::string gLastErrorString; + + /** Verbose logging active or not? */ + static aiBool gVerboseLogging = false; + + /** will return all registered importers. */ + void GetImporterInstanceList(std::vector< BaseImporter* >& out); + + /** will delete all registered importers. */ + void DeleteImporterInstanceList(std::vector< BaseImporter* >& out); +} // namespace assimp + + +#ifndef ASSIMP_BUILD_SINGLETHREADED +/** Global mutex to manage the access to the log-stream map */ +static std::mutex gLogStreamMutex; +#endif + +// ------------------------------------------------------------------------------------------------ +// Custom LogStream implementation for the C-API +class LogToCallbackRedirector : public LogStream { +public: + explicit LogToCallbackRedirector(const aiLogStream& s) + : stream (s) { + ai_assert(NULL != s.callback); + } + + ~LogToCallbackRedirector() { +#ifndef ASSIMP_BUILD_SINGLETHREADED + std::lock_guard<std::mutex> lock(gLogStreamMutex); +#endif + // (HACK) Check whether the 'stream.user' pointer points to a + // custom LogStream allocated by #aiGetPredefinedLogStream. + // In this case, we need to delete it, too. Of course, this + // might cause strange problems, but the chance is quite low. + + PredefLogStreamMap::iterator it = std::find(gPredefinedStreams.begin(), + gPredefinedStreams.end(), (Assimp::LogStream*)stream.user); + + if (it != gPredefinedStreams.end()) { + delete *it; + gPredefinedStreams.erase(it); + } + } + + /** @copydoc LogStream::write */ + void write(const char* message) { + stream.callback(message,stream.user); + } + +private: + aiLogStream stream; +}; + +// ------------------------------------------------------------------------------------------------ +void ReportSceneNotFoundError() { + ASSIMP_LOG_ERROR("Unable to find the Assimp::Importer for this aiScene. " + "The C-API does not accept scenes produced by the C++ API and vice versa"); + + ai_assert(false); +} + +// ------------------------------------------------------------------------------------------------ +// Reads the given file and returns its content. +const aiScene* aiImportFile( const char* pFile, unsigned int pFlags) { + return aiImportFileEx(pFile,pFlags,NULL); +} + +// ------------------------------------------------------------------------------------------------ +const aiScene* aiImportFileEx( const char* pFile, unsigned int pFlags, aiFileIO* pFS) { + return aiImportFileExWithProperties(pFile, pFlags, pFS, NULL); +} + +// ------------------------------------------------------------------------------------------------ +const aiScene* aiImportFileExWithProperties( const char* pFile, unsigned int pFlags, + aiFileIO* pFS, const aiPropertyStore* props) { + ai_assert(NULL != pFile); + + const aiScene* scene = NULL; + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // create an Importer for this file + Assimp::Importer* imp = new Assimp::Importer(); + + // copy properties + if(props) { + const PropertyMap* pp = reinterpret_cast<const PropertyMap*>(props); + ImporterPimpl* pimpl = imp->Pimpl(); + pimpl->mIntProperties = pp->ints; + pimpl->mFloatProperties = pp->floats; + pimpl->mStringProperties = pp->strings; + pimpl->mMatrixProperties = pp->matrices; + } + // setup a custom IO system if necessary + if (pFS) { + imp->SetIOHandler( new CIOSystemWrapper (pFS) ); + } + + // and have it read the file + scene = imp->ReadFile( pFile, pFlags); + + // if succeeded, store the importer in the scene and keep it alive + if( scene) { + ScenePrivateData* priv = const_cast<ScenePrivateData*>( ScenePriv(scene) ); + priv->mOrigImporter = imp; + } else { + // if failed, extract error code and destroy the import + gLastErrorString = imp->GetErrorString(); + delete imp; + } + + // return imported data. If the import failed the pointer is NULL anyways + ASSIMP_END_EXCEPTION_REGION(const aiScene*); + + return scene; +} + +// ------------------------------------------------------------------------------------------------ +const aiScene* aiImportFileFromMemory( + const char* pBuffer, + unsigned int pLength, + unsigned int pFlags, + const char* pHint) +{ + return aiImportFileFromMemoryWithProperties(pBuffer, pLength, pFlags, pHint, NULL); +} + +// ------------------------------------------------------------------------------------------------ +const aiScene* aiImportFileFromMemoryWithProperties( + const char* pBuffer, + unsigned int pLength, + unsigned int pFlags, + const char* pHint, + const aiPropertyStore* props) +{ + ai_assert( NULL != pBuffer ); + ai_assert( 0 != pLength ); + + const aiScene* scene = NULL; + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // create an Importer for this file + Assimp::Importer* imp = new Assimp::Importer(); + + // copy properties + if(props) { + const PropertyMap* pp = reinterpret_cast<const PropertyMap*>(props); + ImporterPimpl* pimpl = imp->Pimpl(); + pimpl->mIntProperties = pp->ints; + pimpl->mFloatProperties = pp->floats; + pimpl->mStringProperties = pp->strings; + pimpl->mMatrixProperties = pp->matrices; + } + + // and have it read the file from the memory buffer + scene = imp->ReadFileFromMemory( pBuffer, pLength, pFlags,pHint); + + // if succeeded, store the importer in the scene and keep it alive + if( scene) { + ScenePrivateData* priv = const_cast<ScenePrivateData*>( ScenePriv(scene) ); + priv->mOrigImporter = imp; + } + else { + // if failed, extract error code and destroy the import + gLastErrorString = imp->GetErrorString(); + delete imp; + } + // return imported data. If the import failed the pointer is NULL anyways + ASSIMP_END_EXCEPTION_REGION(const aiScene*); + return scene; +} + +// ------------------------------------------------------------------------------------------------ +// Releases all resources associated with the given import process. +void aiReleaseImport( const aiScene* pScene) +{ + if (!pScene) { + return; + } + + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // find the importer associated with this data + const ScenePrivateData* priv = ScenePriv(pScene); + if( !priv || !priv->mOrigImporter) { + delete pScene; + } + else { + // deleting the Importer also deletes the scene + // Note: the reason that this is not written as 'delete priv->mOrigImporter' + // is a suspected bug in gcc 4.4+ (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52339) + Importer* importer = priv->mOrigImporter; + delete importer; + } + + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API const aiScene* aiApplyPostProcessing(const aiScene* pScene, + unsigned int pFlags) +{ + const aiScene* sc = NULL; + + + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // find the importer associated with this data + const ScenePrivateData* priv = ScenePriv(pScene); + if( !priv || !priv->mOrigImporter) { + ReportSceneNotFoundError(); + return NULL; + } + + sc = priv->mOrigImporter->ApplyPostProcessing(pFlags); + + if (!sc) { + aiReleaseImport(pScene); + return NULL; + } + + ASSIMP_END_EXCEPTION_REGION(const aiScene*); + return sc; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API const aiScene *aiApplyCustomizedPostProcessing( const aiScene *scene, + BaseProcess* process, + bool requestValidation ) { + const aiScene* sc( NULL ); + + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // find the importer associated with this data + const ScenePrivateData* priv = ScenePriv( scene ); + if ( NULL == priv || NULL == priv->mOrigImporter ) { + ReportSceneNotFoundError(); + return NULL; + } + + sc = priv->mOrigImporter->ApplyCustomizedPostProcessing( process, requestValidation ); + + if ( !sc ) { + aiReleaseImport( scene ); + return NULL; + } + + ASSIMP_END_EXCEPTION_REGION( const aiScene* ); + + return sc; +} + +// ------------------------------------------------------------------------------------------------ +void CallbackToLogRedirector (const char* msg, char* dt) +{ + ai_assert( NULL != msg ); + ai_assert( NULL != dt ); + LogStream* s = (LogStream*)dt; + + s->write(msg); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiLogStream aiGetPredefinedLogStream(aiDefaultLogStream pStream,const char* file) +{ + aiLogStream sout; + + ASSIMP_BEGIN_EXCEPTION_REGION(); + LogStream* stream = LogStream::createDefaultStream(pStream,file); + if (!stream) { + sout.callback = NULL; + sout.user = NULL; + } + else { + sout.callback = &CallbackToLogRedirector; + sout.user = (char*)stream; + } + gPredefinedStreams.push_back(stream); + ASSIMP_END_EXCEPTION_REGION(aiLogStream); + return sout; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiAttachLogStream( const aiLogStream* stream ) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + +#ifndef ASSIMP_BUILD_SINGLETHREADED + std::lock_guard<std::mutex> lock(gLogStreamMutex); +#endif + + LogStream* lg = new LogToCallbackRedirector(*stream); + gActiveLogStreams[*stream] = lg; + + if (DefaultLogger::isNullLogger()) { + DefaultLogger::create(NULL,(gVerboseLogging == AI_TRUE ? Logger::VERBOSE : Logger::NORMAL)); + } + DefaultLogger::get()->attachStream(lg); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiReturn aiDetachLogStream( const aiLogStream* stream) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + +#ifndef ASSIMP_BUILD_SINGLETHREADED + std::lock_guard<std::mutex> lock(gLogStreamMutex); +#endif + // find the log-stream associated with this data + LogStreamMap::iterator it = gActiveLogStreams.find( *stream); + // it should be there... else the user is playing fools with us + if( it == gActiveLogStreams.end()) { + return AI_FAILURE; + } + DefaultLogger::get()->detatchStream( it->second ); + delete it->second; + + gActiveLogStreams.erase( it); + + if (gActiveLogStreams.empty()) { + DefaultLogger::kill(); + } + ASSIMP_END_EXCEPTION_REGION(aiReturn); + return AI_SUCCESS; +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiDetachAllLogStreams(void) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); +#ifndef ASSIMP_BUILD_SINGLETHREADED + std::lock_guard<std::mutex> lock(gLogStreamMutex); +#endif + Logger *logger( DefaultLogger::get() ); + if ( NULL == logger ) { + return; + } + + for (LogStreamMap::iterator it = gActiveLogStreams.begin(); it != gActiveLogStreams.end(); ++it) { + logger->detatchStream( it->second ); + delete it->second; + } + gActiveLogStreams.clear(); + DefaultLogger::kill(); + + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiEnableVerboseLogging(aiBool d) +{ + if (!DefaultLogger::isNullLogger()) { + DefaultLogger::get()->setLogSeverity((d == AI_TRUE ? Logger::VERBOSE : Logger::NORMAL)); + } + gVerboseLogging = d; +} + +// ------------------------------------------------------------------------------------------------ +// Returns the error text of the last failed import process. +const char* aiGetErrorString() +{ + return gLastErrorString.c_str(); +} + +// ----------------------------------------------------------------------------------------------- +// Return the description of a importer given its index +const aiImporterDesc* aiGetImportFormatDescription( size_t pIndex) +{ + return Importer().GetImporterInfo(pIndex); +} + +// ----------------------------------------------------------------------------------------------- +// Return the number of importers +size_t aiGetImportFormatCount(void) +{ + return Importer().GetImporterCount(); +} + +// ------------------------------------------------------------------------------------------------ +// Returns the error text of the last failed import process. +aiBool aiIsExtensionSupported(const char* szExtension) +{ + ai_assert(NULL != szExtension); + aiBool candoit=AI_FALSE; + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // FIXME: no need to create a temporary Importer instance just for that .. + Assimp::Importer tmp; + candoit = tmp.IsExtensionSupported(std::string(szExtension)) ? AI_TRUE : AI_FALSE; + + ASSIMP_END_EXCEPTION_REGION(aiBool); + return candoit; +} + +// ------------------------------------------------------------------------------------------------ +// Get a list of all file extensions supported by ASSIMP +void aiGetExtensionList(aiString* szOut) +{ + ai_assert(NULL != szOut); + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // FIXME: no need to create a temporary Importer instance just for that .. + Assimp::Importer tmp; + tmp.GetExtensionList(*szOut); + + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Get the memory requirements for a particular import. +void aiGetMemoryRequirements(const C_STRUCT aiScene* pIn, + C_STRUCT aiMemoryInfo* in) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + + // find the importer associated with this data + const ScenePrivateData* priv = ScenePriv(pIn); + if( !priv || !priv->mOrigImporter) { + ReportSceneNotFoundError(); + return; + } + + return priv->mOrigImporter->GetMemoryRequirements(*in); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API aiPropertyStore* aiCreatePropertyStore(void) +{ + return reinterpret_cast<aiPropertyStore*>( new PropertyMap() ); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiReleasePropertyStore(aiPropertyStore* p) +{ + delete reinterpret_cast<PropertyMap*>(p); +} + +// ------------------------------------------------------------------------------------------------ +// Importer::SetPropertyInteger +ASSIMP_API void aiSetImportPropertyInteger(aiPropertyStore* p, const char* szName, int value) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + PropertyMap* pp = reinterpret_cast<PropertyMap*>(p); + SetGenericProperty<int>(pp->ints,szName,value); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Importer::SetPropertyFloat +ASSIMP_API void aiSetImportPropertyFloat(aiPropertyStore* p, const char* szName, ai_real value) +{ + ASSIMP_BEGIN_EXCEPTION_REGION(); + PropertyMap* pp = reinterpret_cast<PropertyMap*>(p); + SetGenericProperty<ai_real>(pp->floats,szName,value); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Importer::SetPropertyString +ASSIMP_API void aiSetImportPropertyString(aiPropertyStore* p, const char* szName, + const C_STRUCT aiString* st) +{ + if (!st) { + return; + } + ASSIMP_BEGIN_EXCEPTION_REGION(); + PropertyMap* pp = reinterpret_cast<PropertyMap*>(p); + SetGenericProperty<std::string>(pp->strings,szName,std::string(st->C_Str())); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Importer::SetPropertyMatrix +ASSIMP_API void aiSetImportPropertyMatrix(aiPropertyStore* p, const char* szName, + const C_STRUCT aiMatrix4x4* mat) +{ + if (!mat) { + return; + } + ASSIMP_BEGIN_EXCEPTION_REGION(); + PropertyMap* pp = reinterpret_cast<PropertyMap*>(p); + SetGenericProperty<aiMatrix4x4>(pp->matrices,szName,*mat); + ASSIMP_END_EXCEPTION_REGION(void); +} + +// ------------------------------------------------------------------------------------------------ +// Rotation matrix to quaternion +ASSIMP_API void aiCreateQuaternionFromMatrix(aiQuaternion* quat,const aiMatrix3x3* mat) +{ + ai_assert( NULL != quat ); + ai_assert( NULL != mat ); + *quat = aiQuaternion(*mat); +} + +// ------------------------------------------------------------------------------------------------ +// Matrix decomposition +ASSIMP_API void aiDecomposeMatrix(const aiMatrix4x4* mat,aiVector3D* scaling, + aiQuaternion* rotation, + aiVector3D* position) +{ + ai_assert( NULL != rotation ); + ai_assert( NULL != position ); + ai_assert( NULL != scaling ); + ai_assert( NULL != mat ); + mat->Decompose(*scaling,*rotation,*position); +} + +// ------------------------------------------------------------------------------------------------ +// Matrix transpose +ASSIMP_API void aiTransposeMatrix3(aiMatrix3x3* mat) +{ + ai_assert(NULL != mat); + mat->Transpose(); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiTransposeMatrix4(aiMatrix4x4* mat) +{ + ai_assert(NULL != mat); + mat->Transpose(); +} + +// ------------------------------------------------------------------------------------------------ +// Vector transformation +ASSIMP_API void aiTransformVecByMatrix3(aiVector3D* vec, + const aiMatrix3x3* mat) +{ + ai_assert( NULL != mat ); + ai_assert( NULL != vec); + *vec *= (*mat); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiTransformVecByMatrix4(aiVector3D* vec, + const aiMatrix4x4* mat) +{ + ai_assert( NULL != mat ); + ai_assert( NULL != vec ); + + *vec *= (*mat); +} + +// ------------------------------------------------------------------------------------------------ +// Matrix multiplication +ASSIMP_API void aiMultiplyMatrix4( + aiMatrix4x4* dst, + const aiMatrix4x4* src) +{ + ai_assert( NULL != dst ); + ai_assert( NULL != src ); + *dst = (*dst) * (*src); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiMultiplyMatrix3( + aiMatrix3x3* dst, + const aiMatrix3x3* src) +{ + ai_assert( NULL != dst ); + ai_assert( NULL != src ); + *dst = (*dst) * (*src); +} + +// ------------------------------------------------------------------------------------------------ +// Matrix identity +ASSIMP_API void aiIdentityMatrix3( + aiMatrix3x3* mat) +{ + ai_assert(NULL != mat); + *mat = aiMatrix3x3(); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API void aiIdentityMatrix4( + aiMatrix4x4* mat) +{ + ai_assert(NULL != mat); + *mat = aiMatrix4x4(); +} + +// ------------------------------------------------------------------------------------------------ +ASSIMP_API C_STRUCT const aiImporterDesc* aiGetImporterDesc( const char *extension ) { + if( NULL == extension ) { + return NULL; + } + const aiImporterDesc *desc( NULL ); + std::vector< BaseImporter* > out; + GetImporterInstanceList( out ); + for( size_t i = 0; i < out.size(); ++i ) { + if( 0 == strncmp( out[ i ]->GetInfo()->mFileExtensions, extension, strlen( extension ) ) ) { + desc = out[ i ]->GetInfo(); + break; + } + } + + DeleteImporterInstanceList(out); + + return desc; +} + +// ------------------------------------------------------------------------------------------------ diff --git a/thirdparty/assimp/code/BaseImporter.cpp b/thirdparty/assimp/code/Common/BaseImporter.cpp index 4803c6d6f2..0a5694aa0e 100644 --- a/thirdparty/assimp/code/BaseImporter.cpp +++ b/thirdparty/assimp/code/Common/BaseImporter.cpp @@ -320,7 +320,11 @@ std::string BaseImporter::GetExtension( const std::string& file ) { return false; } -#include "../contrib/utf8cpp/source/utf8.h" +#ifdef ASSIMP_USE_HUNTER +# include <utf8/utf8.h> +#else +# include "../contrib/utf8cpp/source/utf8.h" +#endif // ------------------------------------------------------------------------------------------------ // Convert to UTF8 data diff --git a/thirdparty/assimp/code/BaseProcess.cpp b/thirdparty/assimp/code/Common/BaseProcess.cpp index 18872c3693..e247be418d 100644 --- a/thirdparty/assimp/code/BaseProcess.cpp +++ b/thirdparty/assimp/code/Common/BaseProcess.cpp @@ -89,7 +89,7 @@ void BaseProcess::ExecuteOnScene( Importer* pImp) // and kill the partially imported data delete pImp->Pimpl()->mScene; - pImp->Pimpl()->mScene = NULL; + pImp->Pimpl()->mScene = nullptr; } } diff --git a/thirdparty/assimp/code/BaseProcess.h b/thirdparty/assimp/code/Common/BaseProcess.h index 4d5c7a76be..4d5c7a76be 100644 --- a/thirdparty/assimp/code/BaseProcess.h +++ b/thirdparty/assimp/code/Common/BaseProcess.h diff --git a/thirdparty/assimp/code/Bitmap.cpp b/thirdparty/assimp/code/Common/Bitmap.cpp index b22b71ea9e..b22b71ea9e 100644 --- a/thirdparty/assimp/code/Bitmap.cpp +++ b/thirdparty/assimp/code/Common/Bitmap.cpp diff --git a/thirdparty/assimp/code/CreateAnimMesh.cpp b/thirdparty/assimp/code/Common/CreateAnimMesh.cpp index 1a052849bb..98b60e5319 100644 --- a/thirdparty/assimp/code/CreateAnimMesh.cpp +++ b/thirdparty/assimp/code/Common/CreateAnimMesh.cpp @@ -47,10 +47,6 @@ namespace Assimp { aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh) { aiAnimMesh *animesh = new aiAnimMesh; - animesh->mVertices = NULL; - animesh->mNormals = NULL; - animesh->mTangents = NULL; - animesh->mBitangents = NULL; animesh->mNumVertices = mesh->mNumVertices; if (mesh->mVertices) { animesh->mVertices = new aiVector3D[animesh->mNumVertices]; diff --git a/thirdparty/assimp/code/DefaultIOStream.cpp b/thirdparty/assimp/code/Common/DefaultIOStream.cpp index 1c100b6189..1c100b6189 100644 --- a/thirdparty/assimp/code/DefaultIOStream.cpp +++ b/thirdparty/assimp/code/Common/DefaultIOStream.cpp diff --git a/thirdparty/assimp/code/DefaultIOSystem.cpp b/thirdparty/assimp/code/Common/DefaultIOSystem.cpp index d40b67de32..d40b67de32 100644 --- a/thirdparty/assimp/code/DefaultIOSystem.cpp +++ b/thirdparty/assimp/code/Common/DefaultIOSystem.cpp diff --git a/thirdparty/assimp/code/DefaultLogger.cpp b/thirdparty/assimp/code/Common/DefaultLogger.cpp index de3528d2b4..de3528d2b4 100644 --- a/thirdparty/assimp/code/DefaultLogger.cpp +++ b/thirdparty/assimp/code/Common/DefaultLogger.cpp diff --git a/thirdparty/assimp/code/DefaultProgressHandler.h b/thirdparty/assimp/code/Common/DefaultProgressHandler.h index bd2cce00be..bd2cce00be 100644 --- a/thirdparty/assimp/code/DefaultProgressHandler.h +++ b/thirdparty/assimp/code/Common/DefaultProgressHandler.h diff --git a/thirdparty/assimp/code/Exporter.cpp b/thirdparty/assimp/code/Common/Exporter.cpp index 8848e87f5b..090b561ae0 100644 --- a/thirdparty/assimp/code/Exporter.cpp +++ b/thirdparty/assimp/code/Common/Exporter.cpp @@ -61,15 +61,16 @@ Here we implement only the C++ interface (Assimp::Exporter). #include <assimp/mesh.h> #include <assimp/postprocess.h> #include <assimp/scene.h> - -#include "DefaultProgressHandler.h" -#include "BaseProcess.h" -#include "JoinVerticesProcess.h" -#include "MakeVerboseFormat.h" -#include "ConvertToLHProcess.h" -#include "PretransformVertices.h" #include <assimp/Exceptional.h> -#include "ScenePrivate.h" + +#include "Common/DefaultProgressHandler.h" +#include "Common/BaseProcess.h" +#include "Common/ScenePrivate.h" +#include "PostProcessing/CalcTangentsProcess.h" +#include "PostProcessing/MakeVerboseFormat.h" +#include "PostProcessing/JoinVerticesProcess.h" +#include "PostProcessing/ConvertToLHProcess.h" +#include "PostProcessing/PretransformVertices.h" #include <memory> @@ -101,6 +102,7 @@ void ExportSceneX3D(const char*, IOSystem*, const aiScene*, const ExportProperti void ExportSceneFBX(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportSceneFBXA(const char*, IOSystem*, const aiScene*, const ExportProperties*); void ExportScene3MF( const char*, IOSystem*, const aiScene*, const ExportProperties* ); +void ExportAssimp2Json(const char* , IOSystem*, const aiScene* , const Assimp::ExportProperties*); // ------------------------------------------------------------------------------------------------ // global array of all export formats which Assimp supports in its current build @@ -161,11 +163,11 @@ Exporter::ExportFormatEntry gExporters[] = #endif #ifndef ASSIMP_BUILD_NO_ASSBIN_EXPORTER - Exporter::ExportFormatEntry( "assbin", "Assimp Binary", "assbin" , &ExportSceneAssbin, 0 ), + Exporter::ExportFormatEntry( "assbin", "Assimp Binary File", "assbin" , &ExportSceneAssbin, 0 ), #endif #ifndef ASSIMP_BUILD_NO_ASSXML_EXPORTER - Exporter::ExportFormatEntry( "assxml", "Assxml Document", "assxml" , &ExportSceneAssxml, 0 ), + Exporter::ExportFormatEntry( "assxml", "Assimp XML Document", "assxml" , &ExportSceneAssxml, 0 ), #endif #ifndef ASSIMP_BUILD_NO_X3D_EXPORTER @@ -178,7 +180,11 @@ Exporter::ExportFormatEntry gExporters[] = #endif #ifndef ASSIMP_BUILD_NO_3MF_EXPORTER - Exporter::ExportFormatEntry( "3mf", "The 3MF-File-Format", "3mf", &ExportScene3MF, 0 ) + Exporter::ExportFormatEntry( "3mf", "The 3MF-File-Format", "3mf", &ExportScene3MF, 0 ), +#endif + +#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER + Exporter::ExportFormatEntry( "assjson", "Assimp JSON Document", "json", &ExportAssimp2Json, 0) #endif }; @@ -288,7 +294,7 @@ void Exporter::SetProgressHandler(ProgressHandler* pHandler) { // ------------------------------------------------------------------------------------------------ const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const char* pFormatId, - unsigned int, const ExportProperties* /*pProperties*/ ) { + unsigned int pPreprocessing, const ExportProperties* pProperties) { if (pimpl->blob) { delete pimpl->blob; pimpl->blob = nullptr; @@ -298,7 +304,7 @@ const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const cha BlobIOSystem* blobio = new BlobIOSystem(); pimpl->mIOSystem = std::shared_ptr<IOSystem>( blobio ); - if (AI_SUCCESS != Export(pScene,pFormatId,blobio->GetMagicFileName())) { + if (AI_SUCCESS != Export(pScene,pFormatId,blobio->GetMagicFileName(), pPreprocessing, pProperties)) { pimpl->mIOSystem = old; return nullptr; } diff --git a/thirdparty/assimp/code/FileLogStream.h b/thirdparty/assimp/code/Common/FileLogStream.h index 740c503192..740c503192 100644 --- a/thirdparty/assimp/code/FileLogStream.h +++ b/thirdparty/assimp/code/Common/FileLogStream.h diff --git a/thirdparty/assimp/code/FileSystemFilter.h b/thirdparty/assimp/code/Common/FileSystemFilter.h index 9923cdbdd3..9923cdbdd3 100644 --- a/thirdparty/assimp/code/FileSystemFilter.h +++ b/thirdparty/assimp/code/Common/FileSystemFilter.h diff --git a/thirdparty/assimp/code/Common/IFF.h b/thirdparty/assimp/code/Common/IFF.h new file mode 100644 index 0000000000..91d7d48289 --- /dev/null +++ b/thirdparty/assimp/code/Common/IFF.h @@ -0,0 +1,102 @@ +// Definitions for the Interchange File Format (IFF) +// Alexander Gessler, 2006 +// Adapted to Assimp August 2008 + +#ifndef AI_IFF_H_INCLUDED +#define AI_IFF_H_INCLUDED + +#include <assimp/ByteSwapper.h> + +namespace Assimp { +namespace IFF { + +///////////////////////////////////////////////////////////////////////////////// +//! Describes an IFF chunk header +///////////////////////////////////////////////////////////////////////////////// +struct ChunkHeader +{ + //! Type of the chunk header - FourCC + uint32_t type; + + //! Length of the chunk data, in bytes + uint32_t length; +}; + + +///////////////////////////////////////////////////////////////////////////////// +//! Describes an IFF sub chunk header +///////////////////////////////////////////////////////////////////////////////// +struct SubChunkHeader +{ + //! Type of the chunk header - FourCC + uint32_t type; + + //! Length of the chunk data, in bytes + uint16_t length; +}; + + +#define AI_IFF_FOURCC(a,b,c,d) ((uint32_t) (((uint8_t)a << 24u) | \ + ((uint8_t)b << 16u) | ((uint8_t)c << 8u) | ((uint8_t)d))) + + +#define AI_IFF_FOURCC_FORM AI_IFF_FOURCC('F','O','R','M') + + +///////////////////////////////////////////////////////////////////////////////// +//! Load a chunk header +//! @param outFile Pointer to the file data - points to the chunk data afterwards +//! @return Copy of the chunk header +///////////////////////////////////////////////////////////////////////////////// +inline ChunkHeader LoadChunk(uint8_t*& outFile) +{ + ChunkHeader head; + ::memcpy(&head.type, outFile, 4); + outFile += 4; + ::memcpy(&head.length, outFile, 4); + outFile += 4; + AI_LSWAP4(head.length); + AI_LSWAP4(head.type); + return head; +} + +///////////////////////////////////////////////////////////////////////////////// +//! Load a sub chunk header +//! @param outFile Pointer to the file data - points to the chunk data afterwards +//! @return Copy of the sub chunk header +///////////////////////////////////////////////////////////////////////////////// +inline SubChunkHeader LoadSubChunk(uint8_t*& outFile) +{ + SubChunkHeader head; + ::memcpy(&head.type, outFile, 4); + outFile += 4; + ::memcpy(&head.length, outFile, 2); + outFile += 2; + AI_LSWAP2(head.length); + AI_LSWAP4(head.type); + return head; +} + +///////////////////////////////////////////////////////////////////////////////// +//! Read the file header and return the type of the file and its size +//! @param outFile Pointer to the file data. The buffer must at +//! least be 12 bytes large. +//! @param fileType Receives the type of the file +//! @return 0 if everything was OK, otherwise an error message +///////////////////////////////////////////////////////////////////////////////// +inline const char* ReadHeader(uint8_t* outFile, uint32_t& fileType) +{ + ChunkHeader head = LoadChunk(outFile); + if(AI_IFF_FOURCC_FORM != head.type) + { + return "The file is not an IFF file: FORM chunk is missing"; + } + ::memcpy(&fileType, outFile, 4); + AI_LSWAP4(fileType); + return 0; +} + + +}} + +#endif // !! AI_IFF_H_INCLUDED diff --git a/thirdparty/assimp/code/Importer.cpp b/thirdparty/assimp/code/Common/Importer.cpp index 65b16471cc..91b50859a0 100644 --- a/thirdparty/assimp/code/Importer.cpp +++ b/thirdparty/assimp/code/Common/Importer.cpp @@ -64,15 +64,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ------------------------------------------------------------------------------------------------ // Internal headers // ------------------------------------------------------------------------------------------------ -#include "Importer.h" -#include <assimp/BaseImporter.h> -#include "BaseProcess.h" +#include "Common/Importer.h" +#include "Common/BaseProcess.h" +#include "Common/DefaultProgressHandler.h" +#include "PostProcessing/ProcessHelper.h" +#include "Common/ScenePreprocessor.h" +#include "Common/ScenePrivate.h" -#include "DefaultProgressHandler.h" +#include <assimp/BaseImporter.h> #include <assimp/GenericProperty.h> -#include "ProcessHelper.h" -#include "ScenePreprocessor.h" -#include "ScenePrivate.h" #include <assimp/MemoryIOWrapper.h> #include <assimp/Profiler.h> #include <assimp/TinyFormatter.h> @@ -86,7 +86,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/DefaultIOSystem.h> #ifndef ASSIMP_BUILD_NO_VALIDATEDS_PROCESS -# include "ValidateDataStructure.h" +# include "PostProcessing/ValidateDataStructure.h" #endif using namespace Assimp::Profiling; @@ -590,10 +590,12 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) // Find an worker class which can handle the file BaseImporter* imp = NULL; + SetPropertyInteger("importerIndex", -1); for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) { if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, false)) { imp = pimpl->mImporter[a]; + SetPropertyInteger("importerIndex", a); break; } } @@ -606,6 +608,7 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) { if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, true)) { imp = pimpl->mImporter[a]; + SetPropertyInteger("importerIndex", a); break; } } diff --git a/thirdparty/assimp/code/Importer.h b/thirdparty/assimp/code/Common/Importer.h index a439d99c2f..a439d99c2f 100644 --- a/thirdparty/assimp/code/Importer.h +++ b/thirdparty/assimp/code/Common/Importer.h diff --git a/thirdparty/assimp/code/ImporterRegistry.cpp b/thirdparty/assimp/code/Common/ImporterRegistry.cpp index 747815fa6f..32ac3b4168 100644 --- a/thirdparty/assimp/code/ImporterRegistry.cpp +++ b/thirdparty/assimp/code/Common/ImporterRegistry.cpp @@ -56,146 +56,146 @@ corresponding preprocessor flag to selectively disable formats. // (include_new_importers_here) // ------------------------------------------------------------------------------------------------ #ifndef ASSIMP_BUILD_NO_X_IMPORTER -# include "XFileImporter.h" +# include "X/XFileImporter.h" #endif #ifndef ASSIMP_BUILD_NO_AMF_IMPORTER -# include "AMFImporter.hpp" +# include "AMF/AMFImporter.hpp" #endif #ifndef ASSIMP_BUILD_NO_3DS_IMPORTER -# include "3DSLoader.h" +# include "3DS/3DSLoader.h" #endif #ifndef ASSIMP_BUILD_NO_MD3_IMPORTER -# include "MD3Loader.h" +# include "MD3/MD3Loader.h" #endif #ifndef ASSIMP_BUILD_NO_MDL_IMPORTER -# include "MDLLoader.h" +# include "MDL/MDLLoader.h" #endif #ifndef ASSIMP_BUILD_NO_MD2_IMPORTER -# include "MD2Loader.h" +# include "MD2/MD2Loader.h" #endif #ifndef ASSIMP_BUILD_NO_PLY_IMPORTER -# include "PlyLoader.h" +# include "Ply/PlyLoader.h" #endif #ifndef ASSIMP_BUILD_NO_ASE_IMPORTER -# include "ASELoader.h" +# include "ASE/ASELoader.h" #endif #ifndef ASSIMP_BUILD_NO_OBJ_IMPORTER -# include "ObjFileImporter.h" +# include "Obj/ObjFileImporter.h" #endif #ifndef ASSIMP_BUILD_NO_HMP_IMPORTER -# include "HMPLoader.h" +# include "HMP/HMPLoader.h" #endif #ifndef ASSIMP_BUILD_NO_SMD_IMPORTER -# include "SMDLoader.h" +# include "SMD/SMDLoader.h" #endif #ifndef ASSIMP_BUILD_NO_MDC_IMPORTER -# include "MDCLoader.h" +# include "MDC/MDCLoader.h" #endif #ifndef ASSIMP_BUILD_NO_MD5_IMPORTER -# include "MD5Loader.h" +# include "MD5/MD5Loader.h" #endif #ifndef ASSIMP_BUILD_NO_STL_IMPORTER -# include "STLLoader.h" +# include "STL/STLLoader.h" #endif #ifndef ASSIMP_BUILD_NO_LWO_IMPORTER -# include "LWOLoader.h" +# include "LWO/LWOLoader.h" #endif #ifndef ASSIMP_BUILD_NO_DXF_IMPORTER -# include "DXFLoader.h" +# include "DXF/DXFLoader.h" #endif #ifndef ASSIMP_BUILD_NO_NFF_IMPORTER -# include "NFFLoader.h" +# include "NFF/NFFLoader.h" #endif #ifndef ASSIMP_BUILD_NO_RAW_IMPORTER -# include "RawLoader.h" +# include "Raw/RawLoader.h" #endif #ifndef ASSIMP_BUILD_NO_SIB_IMPORTER -# include "SIBImporter.h" +# include "SIB/SIBImporter.h" #endif #ifndef ASSIMP_BUILD_NO_OFF_IMPORTER -# include "OFFLoader.h" +# include "OFF/OFFLoader.h" #endif #ifndef ASSIMP_BUILD_NO_AC_IMPORTER -# include "ACLoader.h" +# include "AC/ACLoader.h" #endif #ifndef ASSIMP_BUILD_NO_BVH_IMPORTER -# include "BVHLoader.h" +# include "BVH/BVHLoader.h" #endif #ifndef ASSIMP_BUILD_NO_IRRMESH_IMPORTER -# include "IRRMeshLoader.h" +# include "Irr/IRRMeshLoader.h" #endif #ifndef ASSIMP_BUILD_NO_IRR_IMPORTER -# include "IRRLoader.h" +# include "Irr/IRRLoader.h" #endif #ifndef ASSIMP_BUILD_NO_Q3D_IMPORTER -# include "Q3DLoader.h" +# include "Q3D/Q3DLoader.h" #endif #ifndef ASSIMP_BUILD_NO_B3D_IMPORTER -# include "B3DImporter.h" +# include "B3D/B3DImporter.h" #endif #ifndef ASSIMP_BUILD_NO_COLLADA_IMPORTER -# include "ColladaLoader.h" +# include "Collada/ColladaLoader.h" #endif #ifndef ASSIMP_BUILD_NO_TERRAGEN_IMPORTER -# include "TerragenLoader.h" +# include "Terragen/TerragenLoader.h" #endif #ifndef ASSIMP_BUILD_NO_CSM_IMPORTER -# include "CSMLoader.h" +# include "CSM/CSMLoader.h" #endif #ifndef ASSIMP_BUILD_NO_3D_IMPORTER -# include "UnrealLoader.h" +# include "Unreal/UnrealLoader.h" #endif #ifndef ASSIMP_BUILD_NO_LWS_IMPORTER -# include "LWSLoader.h" +# include "LWS/LWSLoader.h" #endif #ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER -# include "OgreImporter.h" +# include "Ogre/OgreImporter.h" #endif #ifndef ASSIMP_BUILD_NO_OPENGEX_IMPORTER -# include "OpenGEXImporter.h" +# include "OpenGEX/OpenGEXImporter.h" #endif #ifndef ASSIMP_BUILD_NO_MS3D_IMPORTER -# include "MS3DLoader.h" +# include "MS3D/MS3DLoader.h" #endif #ifndef ASSIMP_BUILD_NO_COB_IMPORTER -# include "COBLoader.h" +# include "COB/COBLoader.h" #endif #ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER -# include "BlenderLoader.h" +# include "Blender/BlenderLoader.h" #endif #ifndef ASSIMP_BUILD_NO_Q3BSP_IMPORTER -# include "Q3BSPFileImporter.h" +# include "Q3BSP/Q3BSPFileImporter.h" #endif #ifndef ASSIMP_BUILD_NO_NDO_IMPORTER -# include "NDOLoader.h" +# include "NDO/NDOLoader.h" #endif #ifndef ASSIMP_BUILD_NO_IFC_IMPORTER # include "Importer/IFC/IFCLoader.h" #endif #ifndef ASSIMP_BUILD_NO_XGL_IMPORTER -# include "XGLLoader.h" +# include "XGL/XGLLoader.h" #endif #ifndef ASSIMP_BUILD_NO_FBX_IMPORTER -# include "FBXImporter.h" +# include "FBX/FBXImporter.h" #endif #ifndef ASSIMP_BUILD_NO_ASSBIN_IMPORTER -# include "AssbinLoader.h" +# include "Assbin/AssbinLoader.h" #endif #ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER -# include "glTFImporter.h" -# include "glTF2Importer.h" +# include "glTF/glTFImporter.h" +# include "glTF2/glTF2Importer.h" #endif #ifndef ASSIMP_BUILD_NO_C4D_IMPORTER -# include "C4DImporter.h" +# include "C4D/C4DImporter.h" #endif #ifndef ASSIMP_BUILD_NO_3MF_IMPORTER -# include "D3MFImporter.h" +# include "3MF/D3MFImporter.h" #endif #ifndef ASSIMP_BUILD_NO_X3D_IMPORTER -# include "X3DImporter.hpp" +# include "X3D/X3DImporter.hpp" #endif #ifndef ASSIMP_BUILD_NO_MMD_IMPORTER -# include "MMDImporter.h" +# include "MMD/MMDImporter.h" #endif #ifndef ASSIMP_BUILD_NO_STEP_IMPORTER # include "Importer/StepFile/StepFileImporter.h" @@ -364,7 +364,7 @@ void GetImporterInstanceList(std::vector< BaseImporter* >& out) void DeleteImporterInstanceList(std::vector< BaseImporter* >& deleteList){ for(size_t i= 0; i<deleteList.size();++i){ delete deleteList[i]; - deleteList[i]=NULL; + deleteList[i]=nullptr; }//for } diff --git a/thirdparty/assimp/code/PolyTools.h b/thirdparty/assimp/code/Common/PolyTools.h index fbbda0e7d1..fbbda0e7d1 100644 --- a/thirdparty/assimp/code/PolyTools.h +++ b/thirdparty/assimp/code/Common/PolyTools.h diff --git a/thirdparty/assimp/code/PostStepRegistry.cpp b/thirdparty/assimp/code/Common/PostStepRegistry.cpp index 15b4a28843..ef58f8ddfd 100644 --- a/thirdparty/assimp/code/PostStepRegistry.cpp +++ b/thirdparty/assimp/code/Common/PostStepRegistry.cpp @@ -48,89 +48,93 @@ directly (unless you are adding new steps), instead use the corresponding preprocessor flag to selectively disable steps. */ -#include "ProcessHelper.h" +#include "PostProcessing/ProcessHelper.h" #ifndef ASSIMP_BUILD_NO_CALCTANGENTS_PROCESS -# include "CalcTangentsProcess.h" +# include "PostProcessing/CalcTangentsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_JOINVERTICES_PROCESS -# include "JoinVerticesProcess.h" +# include "PostProcessing/JoinVerticesProcess.h" #endif #if !(defined ASSIMP_BUILD_NO_MAKELEFTHANDED_PROCESS && defined ASSIMP_BUILD_NO_FLIPUVS_PROCESS && defined ASSIMP_BUILD_NO_FLIPWINDINGORDER_PROCESS) -# include "ConvertToLHProcess.h" +# include "PostProcessing/ConvertToLHProcess.h" #endif #ifndef ASSIMP_BUILD_NO_TRIANGULATE_PROCESS -# include "TriangulateProcess.h" +# include "PostProcessing/TriangulateProcess.h" #endif #ifndef ASSIMP_BUILD_NO_DROPFACENORMALS_PROCESS -# include "DropFaceNormalsProcess.h" +# include "PostProcessing/DropFaceNormalsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_GENFACENORMALS_PROCESS -# include "GenFaceNormalsProcess.h" +# include "PostProcessing/GenFaceNormalsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_GENVERTEXNORMALS_PROCESS -# include "GenVertexNormalsProcess.h" +# include "PostProcessing/GenVertexNormalsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_REMOVEVC_PROCESS -# include "RemoveVCProcess.h" +# include "PostProcessing/RemoveVCProcess.h" #endif #ifndef ASSIMP_BUILD_NO_SPLITLARGEMESHES_PROCESS -# include "SplitLargeMeshes.h" +# include "PostProcessing/SplitLargeMeshes.h" #endif #ifndef ASSIMP_BUILD_NO_PRETRANSFORMVERTICES_PROCESS -# include "PretransformVertices.h" +# include "PostProcessing/PretransformVertices.h" #endif #ifndef ASSIMP_BUILD_NO_LIMITBONEWEIGHTS_PROCESS -# include "LimitBoneWeightsProcess.h" +# include "PostProcessing/LimitBoneWeightsProcess.h" #endif #ifndef ASSIMP_BUILD_NO_VALIDATEDS_PROCESS -# include "ValidateDataStructure.h" +# include "PostProcessing/ValidateDataStructure.h" #endif #ifndef ASSIMP_BUILD_NO_IMPROVECACHELOCALITY_PROCESS -# include "ImproveCacheLocality.h" +# include "PostProcessing/ImproveCacheLocality.h" #endif #ifndef ASSIMP_BUILD_NO_FIXINFACINGNORMALS_PROCESS -# include "FixNormalsStep.h" +# include "PostProcessing/FixNormalsStep.h" #endif #ifndef ASSIMP_BUILD_NO_REMOVE_REDUNDANTMATERIALS_PROCESS -# include "RemoveRedundantMaterials.h" +# include "PostProcessing/RemoveRedundantMaterials.h" #endif #if (!defined ASSIMP_BUILD_NO_EMBEDTEXTURES_PROCESS) -# include "EmbedTexturesProcess.h" +# include "PostProcessing/EmbedTexturesProcess.h" #endif #ifndef ASSIMP_BUILD_NO_FINDINVALIDDATA_PROCESS -# include "FindInvalidDataProcess.h" +# include "PostProcessing/FindInvalidDataProcess.h" #endif #ifndef ASSIMP_BUILD_NO_FINDDEGENERATES_PROCESS -# include "FindDegenerates.h" +# include "PostProcessing/FindDegenerates.h" #endif #ifndef ASSIMP_BUILD_NO_SORTBYPTYPE_PROCESS -# include "SortByPTypeProcess.h" +# include "PostProcessing/SortByPTypeProcess.h" #endif #ifndef ASSIMP_BUILD_NO_GENUVCOORDS_PROCESS -# include "ComputeUVMappingProcess.h" +# include "PostProcessing/ComputeUVMappingProcess.h" #endif #ifndef ASSIMP_BUILD_NO_TRANSFORMTEXCOORDS_PROCESS -# include "TextureTransform.h" +# include "PostProcessing/TextureTransform.h" #endif #ifndef ASSIMP_BUILD_NO_FINDINSTANCES_PROCESS -# include "FindInstancesProcess.h" +# include "PostProcessing/FindInstancesProcess.h" #endif #ifndef ASSIMP_BUILD_NO_OPTIMIZEMESHES_PROCESS -# include "OptimizeMeshes.h" +# include "PostProcessing/OptimizeMeshes.h" #endif #ifndef ASSIMP_BUILD_NO_OPTIMIZEGRAPH_PROCESS -# include "OptimizeGraph.h" +# include "PostProcessing/OptimizeGraph.h" #endif #ifndef ASSIMP_BUILD_NO_SPLITBYBONECOUNT_PROCESS -# include "SplitByBoneCountProcess.h" +# include "Common/SplitByBoneCountProcess.h" #endif #ifndef ASSIMP_BUILD_NO_DEBONE_PROCESS -# include "DeboneProcess.h" +# include "PostProcessing/DeboneProcess.h" #endif #if (!defined ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS) -# include "ScaleProcess.h" +# include "PostProcessing/ScaleProcess.h" #endif +#if (!defined ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS) +# include "PostProcessing/GenBoundingBoxesProcess.h" +#endif + namespace Assimp { @@ -246,6 +250,9 @@ void GetPostProcessingStepInstanceList(std::vector< BaseProcess* >& out) #if (!defined ASSIMP_BUILD_NO_IMPROVECACHELOCALITY_PROCESS) out.push_back( new ImproveCacheLocalityProcess()); #endif +#if (!defined ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS) + out.push_back(new GenBoundingBoxesProcess); +#endif } } diff --git a/thirdparty/assimp/code/RemoveComments.cpp b/thirdparty/assimp/code/Common/RemoveComments.cpp index 91700a7699..91700a7699 100644 --- a/thirdparty/assimp/code/RemoveComments.cpp +++ b/thirdparty/assimp/code/Common/RemoveComments.cpp diff --git a/thirdparty/assimp/code/SGSpatialSort.cpp b/thirdparty/assimp/code/Common/SGSpatialSort.cpp index 120070b0aa..120070b0aa 100644 --- a/thirdparty/assimp/code/SGSpatialSort.cpp +++ b/thirdparty/assimp/code/Common/SGSpatialSort.cpp diff --git a/thirdparty/assimp/code/SceneCombiner.cpp b/thirdparty/assimp/code/Common/SceneCombiner.cpp index e445bd7434..e445bd7434 100644 --- a/thirdparty/assimp/code/SceneCombiner.cpp +++ b/thirdparty/assimp/code/Common/SceneCombiner.cpp diff --git a/thirdparty/assimp/code/ScenePreprocessor.cpp b/thirdparty/assimp/code/Common/ScenePreprocessor.cpp index 432a3d7666..432a3d7666 100644 --- a/thirdparty/assimp/code/ScenePreprocessor.cpp +++ b/thirdparty/assimp/code/Common/ScenePreprocessor.cpp diff --git a/thirdparty/assimp/code/ScenePreprocessor.h b/thirdparty/assimp/code/Common/ScenePreprocessor.h index 3f4c8d7c3f..3f4c8d7c3f 100644 --- a/thirdparty/assimp/code/ScenePreprocessor.h +++ b/thirdparty/assimp/code/Common/ScenePreprocessor.h diff --git a/thirdparty/assimp/code/ScenePrivate.h b/thirdparty/assimp/code/Common/ScenePrivate.h index f336aafc9a..f336aafc9a 100644 --- a/thirdparty/assimp/code/ScenePrivate.h +++ b/thirdparty/assimp/code/Common/ScenePrivate.h diff --git a/thirdparty/assimp/code/SkeletonMeshBuilder.cpp b/thirdparty/assimp/code/Common/SkeletonMeshBuilder.cpp index 06cfe034e9..06cfe034e9 100644 --- a/thirdparty/assimp/code/SkeletonMeshBuilder.cpp +++ b/thirdparty/assimp/code/Common/SkeletonMeshBuilder.cpp diff --git a/thirdparty/assimp/code/SpatialSort.cpp b/thirdparty/assimp/code/Common/SpatialSort.cpp index a4f3a4e4b8..a4f3a4e4b8 100644 --- a/thirdparty/assimp/code/SpatialSort.cpp +++ b/thirdparty/assimp/code/Common/SpatialSort.cpp diff --git a/thirdparty/assimp/code/SplitByBoneCountProcess.cpp b/thirdparty/assimp/code/Common/SplitByBoneCountProcess.cpp index 2ef66a9afc..2ef66a9afc 100644 --- a/thirdparty/assimp/code/SplitByBoneCountProcess.cpp +++ b/thirdparty/assimp/code/Common/SplitByBoneCountProcess.cpp diff --git a/thirdparty/assimp/code/SplitByBoneCountProcess.h b/thirdparty/assimp/code/Common/SplitByBoneCountProcess.h index 6c904a9df4..6c904a9df4 100644 --- a/thirdparty/assimp/code/SplitByBoneCountProcess.h +++ b/thirdparty/assimp/code/Common/SplitByBoneCountProcess.h diff --git a/thirdparty/assimp/code/StandardShapes.cpp b/thirdparty/assimp/code/Common/StandardShapes.cpp index 2e5100130f..2e5100130f 100644 --- a/thirdparty/assimp/code/StandardShapes.cpp +++ b/thirdparty/assimp/code/Common/StandardShapes.cpp diff --git a/thirdparty/assimp/code/StdOStreamLogStream.h b/thirdparty/assimp/code/Common/StdOStreamLogStream.h index 893e261a2b..893e261a2b 100644 --- a/thirdparty/assimp/code/StdOStreamLogStream.h +++ b/thirdparty/assimp/code/Common/StdOStreamLogStream.h diff --git a/thirdparty/assimp/code/Subdivision.cpp b/thirdparty/assimp/code/Common/Subdivision.cpp index 19db223a55..60c54939f5 100644 --- a/thirdparty/assimp/code/Subdivision.cpp +++ b/thirdparty/assimp/code/Common/Subdivision.cpp @@ -43,9 +43,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/Subdivision.h> #include <assimp/SceneCombiner.h> #include <assimp/SpatialSort.h> -#include "ProcessHelper.h" #include <assimp/Vertex.h> #include <assimp/ai_assert.h> + +#include "PostProcessing/ProcessHelper.h" + #include <stdio.h> using namespace Assimp; @@ -56,8 +58,7 @@ void mydummy() {} * implementation is basing on recursive refinement. Directly evaluating the result is also * possible and much quicker, but it depends on lengthy matrix lookup tables. */ // ------------------------------------------------------------------------------------------------ -class CatmullClarkSubdivider : public Subdivider -{ +class CatmullClarkSubdivider : public Subdivider { public: void Subdivide (aiMesh* mesh, aiMesh*& out, unsigned int num, bool discard_input); void Subdivide (aiMesh** smesh, size_t nmesh, diff --git a/thirdparty/assimp/code/TargetAnimation.cpp b/thirdparty/assimp/code/Common/TargetAnimation.cpp index b8062499ff..b8062499ff 100644 --- a/thirdparty/assimp/code/TargetAnimation.cpp +++ b/thirdparty/assimp/code/Common/TargetAnimation.cpp diff --git a/thirdparty/assimp/code/TargetAnimation.h b/thirdparty/assimp/code/Common/TargetAnimation.h index 91634ab5aa..91634ab5aa 100644 --- a/thirdparty/assimp/code/TargetAnimation.h +++ b/thirdparty/assimp/code/Common/TargetAnimation.h diff --git a/thirdparty/assimp/code/Version.cpp b/thirdparty/assimp/code/Common/Version.cpp index 0381037ff1..cc94340ac8 100644 --- a/thirdparty/assimp/code/Version.cpp +++ b/thirdparty/assimp/code/Common/Version.cpp @@ -134,7 +134,7 @@ ASSIMP_API aiScene::aiScene() , mCameras(nullptr) , mMetaData(nullptr) , mPrivate(new Assimp::ScenePrivateData()) { - // empty + // empty } // ------------------------------------------------------------------------------------------------ diff --git a/thirdparty/assimp/code/VertexTriangleAdjacency.cpp b/thirdparty/assimp/code/Common/VertexTriangleAdjacency.cpp index 7cfd1a3505..7cfd1a3505 100644 --- a/thirdparty/assimp/code/VertexTriangleAdjacency.cpp +++ b/thirdparty/assimp/code/Common/VertexTriangleAdjacency.cpp diff --git a/thirdparty/assimp/code/VertexTriangleAdjacency.h b/thirdparty/assimp/code/Common/VertexTriangleAdjacency.h index f3be47612d..f3be47612d 100644 --- a/thirdparty/assimp/code/VertexTriangleAdjacency.h +++ b/thirdparty/assimp/code/Common/VertexTriangleAdjacency.h diff --git a/thirdparty/assimp/code/Win32DebugLogStream.h b/thirdparty/assimp/code/Common/Win32DebugLogStream.h index a6063a261e..a6063a261e 100644 --- a/thirdparty/assimp/code/Win32DebugLogStream.h +++ b/thirdparty/assimp/code/Common/Win32DebugLogStream.h diff --git a/thirdparty/assimp/code/Common/assbin_chunks.h b/thirdparty/assimp/code/Common/assbin_chunks.h new file mode 100644 index 0000000000..15e4af5e7d --- /dev/null +++ b/thirdparty/assimp/code/Common/assbin_chunks.h @@ -0,0 +1,196 @@ +#ifndef INCLUDED_ASSBIN_CHUNKS_H +#define INCLUDED_ASSBIN_CHUNKS_H + +#define ASSBIN_VERSION_MAJOR 1 +#define ASSBIN_VERSION_MINOR 0 + +/** +@page assfile .ASS File formats + +@section over Overview +Assimp provides its own interchange format, which is intended to applications which need +to serialize 3D-models and to reload them quickly. Assimp's file formats are designed to +be read by Assimp itself. They encode additional information needed by Assimp to optimize +its postprocessing pipeline. If you once apply specific steps to a scene, then save it +and reread it from an ASS format using the same post processing settings, they won't +be executed again. + +The format comes in two flavours: XML and binary - both of them hold a complete dump of +the 'aiScene' data structure returned by the APIs. The focus for the binary format +(<tt>.assbin</tt>) is fast loading. Optional deflate compression helps reduce file size. The XML +flavour, <tt>.assxml</tt> or simply .xml, is just a plain-to-xml conversion of aiScene. + +ASSBIN is Assimp's binary interchange format. assimp_cmd (<tt><root>/tools/assimp_cmd</tt>) is able to +write it and the core library provides a loader for it. + +@section assxml XML File format + +The format is pretty much self-explanatory due to its similarity to the in-memory aiScene structure. +With few exceptions, C structures are wrapped in XML elements. + +The DTD for ASSXML can be found in <tt><root>/doc/AssXML_Scheme.xml</tt>. Or have look +at the output files generated by assimp_cmd. + +@section assbin Binary file format + +The ASSBIN file format is composed of chunks to represent the hierarchical aiScene data structure. +This makes the format extensible and allows backward-compatibility with future data structure +versions. The <tt><root>/code/assbin_chunks.h</tt> header contains some magic constants +for use by stand-alone ASSBIN loaders. Also, Assimp's own file writer can be found +in <tt><root>/tools/assimp_cmd/WriteDumb.cpp</tt> (yes, the 'b' is no typo ...). + +@verbatim + +------------------------------------------------------------------------------- +1. File structure: +------------------------------------------------------------------------------- + +---------------------- +| Header (512 bytes) | +---------------------- +| Variable chunks | +---------------------- + +------------------------------------------------------------------------------- +2. Definitions: +------------------------------------------------------------------------------- + +integer is four bytes wide, stored in little-endian byte order. +short is two bytes wide, stored in little-endian byte order. +byte is a single byte. +string is an integer n followed by n UTF-8 characters, not terminated by zero +float is an IEEE 754 single-precision floating-point value +double is an IEEE 754 double-precision floating-point value +t[n] is an array of n elements of type t + +------------------------------------------------------------------------------- +2. Header: +------------------------------------------------------------------------------- + +byte[44] Magic identification string for ASSBIN files. + 'ASSIMP.binary' + +integer Major version of the Assimp library which wrote the file +integer Minor version of the Assimp library which wrote the file + match these against ASSBIN_VERSION_MAJOR and ASSBIN_VERSION_MINOR + +integer SVN revision of the Assimp library (intended for our internal + debugging - if you write Ass files from your own APPs, set this value to 0. +integer Assimp compile flags + +short 0 for normal files, 1 for shortened dumps for regression tests + these should have the file extension assbin.regress + +short 1 if the data after the header is compressed with the DEFLATE algorithm, + 0 for uncompressed files. + For compressed files, the first integer after the header is + always the uncompressed data size + +byte[256] Zero-terminated source file name, UTF-8 +byte[128] Zero-terminated command line parameters passed to assimp_cmd, UTF-8 + +byte[64] Reserved for future use +---> Total length: 512 bytes + +------------------------------------------------------------------------------- +3. Chunks: +------------------------------------------------------------------------------- + +integer Magic chunk ID (ASSBIN_CHUNK_XXX) +integer Chunk data length, in bytes + (unknown chunks are possible, a good reader skips over them) + (chunk-data-length does not include the first two integers) + +byte[n] chunk-data-length bytes of data, depending on the chunk type + +Chunks can contain nested chunks. Nested chunks are ALWAYS at the end of the chunk, +their size is included in chunk-data-length. + +The chunk layout for all ASSIMP data structures is derived from their C declarations. +The general 'rule' to get from Assimp headers to the serialized layout is: + + 1. POD members (i.e. aiMesh::mPrimitiveTypes, aiMesh::mNumVertices), + in order of declaration. + + 2. Array-members (aiMesh::mFaces, aiMesh::mVertices, aiBone::mWeights), + in order of declaration. + + 2. Object array members (i.e aiMesh::mBones, aiScene::mMeshes) are stored in + subchunks directly following the data written in 1.) and 2.) + + + Of course, there are some exceptions to this general order: + +[[aiScene]] + + - The root node holding the scene structure is naturally stored in + a ASSBIN_CHUNK_AINODE subchunk following 1.) and 2.) (which is + empty for aiScene). + +[[aiMesh]] + + - mTextureCoords and mNumUVComponents are serialized as follows: + + [number of used uv channels times] + integer mNumUVComponents[n] + float mTextureCoords[n][3] + + -> more than AI_MAX_TEXCOORD_CHANNELS can be stored. This allows Assimp + builds with different settings for AI_MAX_TEXCOORD_CHANNELS to exchange + data. + -> the on-disk format always uses 3 floats to write UV coordinates. + If mNumUVComponents[0] is 1, the corresponding mTextureCoords array + consists of 3 floats. + + - The array member block of aiMesh is prefixed with an integer that specifies + the kinds of vertex components actually present in the mesh. This is a + bitwise combination of the ASSBIN_MESH_HAS_xxx constants. + +[[aiFace]] + + - mNumIndices is stored as short + - mIndices are written as short, if aiMesh::mNumVertices<65536 + +[[aiNode]] + + - mParent is omitted + +[[aiLight]] + + - mAttenuationXXX not written if aiLight::mType == aiLightSource_DIRECTIONAL + - mAngleXXX not written if aiLight::mType != aiLightSource_SPOT + +[[aiMaterial]] + + - mNumAllocated is omitted, for obvious reasons :-) + + + @endverbatim*/ + + +#define ASSBIN_HEADER_LENGTH 512 + +// these are the magic chunk identifiers for the binary ASS file format +#define ASSBIN_CHUNK_AICAMERA 0x1234 +#define ASSBIN_CHUNK_AILIGHT 0x1235 +#define ASSBIN_CHUNK_AITEXTURE 0x1236 +#define ASSBIN_CHUNK_AIMESH 0x1237 +#define ASSBIN_CHUNK_AINODEANIM 0x1238 +#define ASSBIN_CHUNK_AISCENE 0x1239 +#define ASSBIN_CHUNK_AIBONE 0x123a +#define ASSBIN_CHUNK_AIANIMATION 0x123b +#define ASSBIN_CHUNK_AINODE 0x123c +#define ASSBIN_CHUNK_AIMATERIAL 0x123d +#define ASSBIN_CHUNK_AIMATERIALPROPERTY 0x123e + +#define ASSBIN_MESH_HAS_POSITIONS 0x1 +#define ASSBIN_MESH_HAS_NORMALS 0x2 +#define ASSBIN_MESH_HAS_TANGENTS_AND_BITANGENTS 0x4 +#define ASSBIN_MESH_HAS_TEXCOORD_BASE 0x100 +#define ASSBIN_MESH_HAS_COLOR_BASE 0x10000 + +#define ASSBIN_MESH_HAS_TEXCOORD(n) (ASSBIN_MESH_HAS_TEXCOORD_BASE << n) +#define ASSBIN_MESH_HAS_COLOR(n) (ASSBIN_MESH_HAS_COLOR_BASE << n) + + +#endif // INCLUDED_ASSBIN_CHUNKS_H diff --git a/thirdparty/assimp/code/scene.cpp b/thirdparty/assimp/code/Common/scene.cpp index 2acb348d81..2acb348d81 100644 --- a/thirdparty/assimp/code/scene.cpp +++ b/thirdparty/assimp/code/Common/scene.cpp diff --git a/thirdparty/assimp/code/simd.cpp b/thirdparty/assimp/code/Common/simd.cpp index 04615f408e..04615f408e 100644 --- a/thirdparty/assimp/code/simd.cpp +++ b/thirdparty/assimp/code/Common/simd.cpp diff --git a/thirdparty/assimp/code/simd.h b/thirdparty/assimp/code/Common/simd.h index 3eecdd4581..3eecdd4581 100644 --- a/thirdparty/assimp/code/simd.h +++ b/thirdparty/assimp/code/Common/simd.h diff --git a/thirdparty/assimp/code/FBXAnimation.cpp b/thirdparty/assimp/code/FBX/FBXAnimation.cpp index 874914431b..874914431b 100644 --- a/thirdparty/assimp/code/FBXAnimation.cpp +++ b/thirdparty/assimp/code/FBX/FBXAnimation.cpp diff --git a/thirdparty/assimp/code/FBXBinaryTokenizer.cpp b/thirdparty/assimp/code/FBX/FBXBinaryTokenizer.cpp index 7138df4315..a4a2bc8e79 100644 --- a/thirdparty/assimp/code/FBXBinaryTokenizer.cpp +++ b/thirdparty/assimp/code/FBX/FBXBinaryTokenizer.cpp @@ -98,7 +98,7 @@ namespace FBX { // return (flags & to_check) != 0; //} // ------------------------------------------------------------------------------------------------ -Token::Token(const char* sbegin, const char* send, TokenType type, unsigned int offset) +Token::Token(const char* sbegin, const char* send, TokenType type, size_t offset) : #ifdef DEBUG contents(sbegin, static_cast<size_t>(send-sbegin)), @@ -122,18 +122,18 @@ namespace { // ------------------------------------------------------------------------------------------------ // signal tokenization error, this is always unrecoverable. Throws DeadlyImportError. -AI_WONT_RETURN void TokenizeError(const std::string& message, unsigned int offset) AI_WONT_RETURN_SUFFIX; -AI_WONT_RETURN void TokenizeError(const std::string& message, unsigned int offset) +AI_WONT_RETURN void TokenizeError(const std::string& message, size_t offset) AI_WONT_RETURN_SUFFIX; +AI_WONT_RETURN void TokenizeError(const std::string& message, size_t offset) { throw DeadlyImportError(Util::AddOffset("FBX-Tokenize",message,offset)); } // ------------------------------------------------------------------------------------------------ -uint32_t Offset(const char* begin, const char* cursor) { +size_t Offset(const char* begin, const char* cursor) { ai_assert(begin <= cursor); - return static_cast<unsigned int>(cursor - begin); + return cursor - begin; } // ------------------------------------------------------------------------------------------------ @@ -424,7 +424,7 @@ bool ReadScope(TokenList& output_tokens, const char* input, const char*& cursor, // ------------------------------------------------------------------------------------------------ // TODO: Test FBX Binary files newer than the 7500 version to check if the 64 bits address behaviour is consistent -void TokenizeBinary(TokenList& output_tokens, const char* input, unsigned int length) +void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length) { ai_assert(input); diff --git a/thirdparty/assimp/code/FBXCommon.h b/thirdparty/assimp/code/FBX/FBXCommon.h index fcb20a5cad..e516449130 100644 --- a/thirdparty/assimp/code/FBXCommon.h +++ b/thirdparty/assimp/code/FBX/FBXCommon.h @@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_FBX_EXPORTER - +namespace Assimp { namespace FBX { const std::string NULL_RECORD = { // 13 null bytes @@ -80,7 +80,7 @@ namespace FBX TransformInheritance_MAX // end-of-enum sentinel }; } - +} #endif // ASSIMP_BUILD_NO_FBX_EXPORTER #endif // AI_FBXCOMMON_H_INC diff --git a/thirdparty/assimp/code/FBXCompileConfig.h b/thirdparty/assimp/code/FBX/FBXCompileConfig.h index 3a3841fa5b..3a3841fa5b 100644 --- a/thirdparty/assimp/code/FBXCompileConfig.h +++ b/thirdparty/assimp/code/FBX/FBXCompileConfig.h diff --git a/thirdparty/assimp/code/FBXConverter.cpp b/thirdparty/assimp/code/FBX/FBXConverter.cpp index 09ae06a64f..9f940d3226 100644 --- a/thirdparty/assimp/code/FBXConverter.cpp +++ b/thirdparty/assimp/code/FBX/FBXConverter.cpp @@ -67,6 +67,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <sstream> #include <iomanip> + namespace Assimp { namespace FBX { @@ -76,20 +77,21 @@ namespace Assimp { #define CONVERT_FBX_TIME(time) static_cast<double>(time) / 46186158000L - FBXConverter::FBXConverter(aiScene* out, const Document& doc) - : defaultMaterialIndex() - , lights() - , cameras() - , textures() - , materials_converted() - , textures_converted() - , meshes_converted() - , node_anim_chain_bits() - , mNodeNameInstances() - , mNodeNames() - , anim_fps() - , out(out) - , doc(doc) { + FBXConverter::FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit ) + : defaultMaterialIndex() + , lights() + , cameras() + , textures() + , materials_converted() + , textures_converted() + , meshes_converted() + , node_anim_chain_bits() + , mNodeNames() + , anim_fps() + , out(out) + , doc(doc) + , mRemoveEmptyBones( removeEmptyBones ) + , mCurrentUnit(FbxUnit::cm) { // animations need to be converted first since this will // populate the node_anim_chain_bits map, which is needed // to determine which nodes need to be generated. @@ -117,6 +119,7 @@ namespace Assimp { ConvertGlobalSettings(); TransferDataToScene(); + ConvertToUnitScale(unit); // if we didn't read any meshes set the AI_SCENE_FLAGS_INCOMPLETE // to make sure the scene passes assimp's validation. FBX files @@ -138,12 +141,46 @@ namespace Assimp { void FBXConverter::ConvertRootNode() { out->mRootNode = new aiNode(); - out->mRootNode->mName.Set("RootNode"); + std::string unique_name; + GetUniqueName("RootNode", unique_name); + out->mRootNode->mName.Set(unique_name); // root has ID 0 ConvertNodes(0L, *out->mRootNode); } + static std::string getAncestorBaseName(const aiNode* node) + { + const char* nodeName = nullptr; + size_t length = 0; + while (node && (!nodeName || length == 0)) + { + nodeName = node->mName.C_Str(); + length = node->mName.length; + node = node->mParent; + } + + if (!nodeName || length == 0) + { + return {}; + } + // could be std::string_view if c++17 available + return std::string(nodeName, length); + } + + // Make unique name + std::string FBXConverter::MakeUniqueNodeName(const Model* const model, const aiNode& parent) + { + std::string original_name = FixNodeName(model->Name()); + if (original_name.empty()) + { + original_name = getAncestorBaseName(&parent); + } + std::string unique_name; + GetUniqueName(original_name, unique_name); + return unique_name; + } + void FBXConverter::ConvertNodes(uint64_t id, aiNode& parent, const aiMatrix4x4& parent_transform) { const std::vector<const Connection*>& conns = doc.GetConnectionsByDestinationSequenced(id, "Model"); @@ -175,35 +212,18 @@ namespace Assimp { aiMatrix4x4 new_abs_transform = parent_transform; + std::string unique_name = MakeUniqueNodeName(model, parent); + // even though there is only a single input node, the design of // assimp (or rather: the complicated transformation chain that // is employed by fbx) means that we may need multiple aiNode's // to represent a fbx node's transformation. - GenerateTransformationNodeChain(*model, nodes_chain, post_nodes_chain); + const bool need_additional_node = GenerateTransformationNodeChain(*model, unique_name, nodes_chain, post_nodes_chain); ai_assert(nodes_chain.size()); - std::string original_name = FixNodeName(model->Name()); - - // check if any of the nodes in the chain has the name the fbx node - // is supposed to have. If there is none, add another node to - // preserve the name - people might have scripts etc. that rely - // on specific node names. - aiNode* name_carrier = NULL; - for (aiNode* prenode : nodes_chain) { - if (!strcmp(prenode->mName.C_Str(), original_name.c_str())) { - name_carrier = prenode; - break; - } - } - - if (!name_carrier) { - std::string old_original_name = original_name; - GetUniqueName(old_original_name, original_name); - nodes_chain.push_back(new aiNode(original_name)); - } - else { - original_name = nodes_chain.back()->mName.C_Str(); + if (need_additional_node) { + nodes_chain.push_back(new aiNode(unique_name)); } //setup metadata on newest node @@ -265,11 +285,11 @@ namespace Assimp { ConvertNodes(model->ID(), *last_parent, new_abs_transform); if (doc.Settings().readLights) { - ConvertLights(*model, original_name); + ConvertLights(*model, unique_name); } if (doc.Settings().readCameras) { - ConvertCameras(*model, original_name); + ConvertCameras(*model, unique_name); } nodes.push_back(nodes_chain.front()); @@ -387,6 +407,7 @@ namespace Assimp { break; default: ai_assert(false); + break; } } @@ -399,11 +420,6 @@ namespace Assimp { out_camera->mAspect = cam.AspectWidth() / cam.AspectHeight(); - //cameras are defined along positive x direction - /*out_camera->mPosition = cam.Position(); - out_camera->mLookAt = (cam.InterestPosition() - out_camera->mPosition).Normalize(); - out_camera->mUp = cam.UpVector();*/ - out_camera->mPosition = aiVector3D(0.0f); out_camera->mLookAt = aiVector3D(1.0f, 0.0f, 0.0f); out_camera->mUp = aiVector3D(0.0f, 1.0f, 0.0f); @@ -421,21 +437,16 @@ namespace Assimp { void FBXConverter::GetUniqueName(const std::string &name, std::string &uniqueName) { uniqueName = name; - int i = 0; - auto it = mNodeNameInstances.find(name); // duplicate node name instance count - if (it != mNodeNameInstances.end()) + auto it_pair = mNodeNames.insert({ name, 0 }); // duplicate node name instance count + unsigned int& i = it_pair.first->second; + while (!it_pair.second) { - i = it->second; - while (mNodeNames.find(uniqueName) != mNodeNames.end()) - { - i++; - std::stringstream ext; - ext << name << std::setfill('0') << std::setw(3) << i; - uniqueName = ext.str(); - } + i++; + std::ostringstream ext; + ext << name << std::setfill('0') << std::setw(3) << i; + uniqueName = ext.str(); + it_pair = mNodeNames.insert({ uniqueName, 0 }); } - mNodeNameInstances[name] = i; - mNodeNames.insert(uniqueName); } const char* FBXConverter::NameTransformationComp(TransformationComp comp) { @@ -651,8 +662,7 @@ namespace Assimp { if ((v - all_ones).SquareLength() > zero_epsilon) { return true; } - } - else if (ok) { + } else if (ok) { if (v.SquareLength() > zero_epsilon) { return true; } @@ -667,7 +677,7 @@ namespace Assimp { return name + std::string(MAGIC_NODE_TAG) + "_" + NameTransformationComp(comp); } - void FBXConverter::GenerateTransformationNodeChain(const Model& model, std::vector<aiNode*>& output_nodes, + bool FBXConverter::GenerateTransformationNodeChain(const Model& model, const std::string& name, std::vector<aiNode*>& output_nodes, std::vector<aiNode*>& post_output_nodes) { const PropertyTable& props = model.Props(); const Model::RotOrder rot = model.RotationOrder(); @@ -782,8 +792,6 @@ namespace Assimp { // not be guaranteed. ai_assert(NeedsComplexTransformationChain(model) == is_complex); - std::string name = FixNodeName(model.Name()); - // now, if we have more than just Translation, Scaling and Rotation, // we need to generate a full node chain to accommodate for assimp's // lack to express pivots and offsets. @@ -825,20 +833,20 @@ namespace Assimp { } ai_assert(output_nodes.size()); - return; + return true; } // else, we can just multiply the matrices together aiNode* nd = new aiNode(); output_nodes.push_back(nd); - std::string uniqueName; - GetUniqueName(name, uniqueName); - nd->mName.Set(uniqueName); + // name passed to the method is already unique + nd->mName.Set(name); for (const auto &transform : chain) { nd->mTransformation = nd->mTransformation * transform; } + return false; } void FBXConverter::SetupNodeMetadata(const Model& model, aiNode& nd) @@ -977,7 +985,9 @@ namespace Assimp { unsigned int epcount = 0; for (unsigned i = 0; i < indices.size(); i++) { - if (indices[i] < 0) epcount++; + if (indices[i] < 0) { + epcount++; + } } unsigned int pcount = static_cast<unsigned int>( indices.size() ); unsigned int scount = out_mesh->mNumFaces = pcount - epcount; @@ -1237,10 +1247,10 @@ namespace Assimp { ai_assert(count_faces); ai_assert(count_vertices); - // mapping from output indices to DOM indexing, needed to resolve weights + // mapping from output indices to DOM indexing, needed to resolve weights or blendshapes std::vector<unsigned int> reverseMapping; - - if (process_weights) { + std::map<unsigned int, unsigned int> translateIndexMap; + if (process_weights || mesh.GetBlendShapes().size() > 0) { reverseMapping.resize(count_vertices); } @@ -1347,6 +1357,7 @@ namespace Assimp { if (reverseMapping.size()) { reverseMapping[cursor] = in_cursor; + translateIndexMap[in_cursor] = cursor; } out_mesh->mVertices[cursor] = vertices[in_cursor]; @@ -1378,6 +1389,50 @@ namespace Assimp { ConvertWeights(out_mesh, model, mesh, node_global_transform, index, &reverseMapping); } + std::vector<aiAnimMesh*> animMeshes; + for (const BlendShape* blendShape : mesh.GetBlendShapes()) { + for (const BlendShapeChannel* blendShapeChannel : blendShape->BlendShapeChannels()) { + const std::vector<const ShapeGeometry*>& shapeGeometries = blendShapeChannel->GetShapeGeometries(); + for (size_t i = 0; i < shapeGeometries.size(); i++) { + aiAnimMesh* animMesh = aiCreateAnimMesh(out_mesh); + const ShapeGeometry* shapeGeometry = shapeGeometries.at(i); + const std::vector<aiVector3D>& vertices = shapeGeometry->GetVertices(); + const std::vector<aiVector3D>& normals = shapeGeometry->GetNormals(); + const std::vector<unsigned int>& indices = shapeGeometry->GetIndices(); + animMesh->mName.Set(FixAnimMeshName(shapeGeometry->Name())); + for (size_t j = 0; j < indices.size(); j++) { + unsigned int index = indices.at(j); + aiVector3D vertex = vertices.at(j); + aiVector3D normal = normals.at(j); + unsigned int count = 0; + const unsigned int* outIndices = mesh.ToOutputVertexIndex(index, count); + for (unsigned int k = 0; k < count; k++) { + unsigned int outIndex = outIndices[k]; + if (translateIndexMap.find(outIndex) == translateIndexMap.end()) + continue; + unsigned int index = translateIndexMap[outIndex]; + animMesh->mVertices[index] += vertex; + if (animMesh->mNormals != nullptr) { + animMesh->mNormals[index] += normal; + animMesh->mNormals[index].NormalizeSafe(); + } + } + } + animMesh->mWeight = shapeGeometries.size() > 1 ? blendShapeChannel->DeformPercent() / 100.0f : 1.0f; + animMeshes.push_back(animMesh); + } + } + } + + const size_t numAnimMeshes = animMeshes.size(); + if (numAnimMeshes > 0) { + out_mesh->mNumAnimMeshes = static_cast<unsigned int>(numAnimMeshes); + out_mesh->mAnimMeshes = new aiAnimMesh*[numAnimMeshes]; + for (size_t i = 0; i < numAnimMeshes; i++) { + out_mesh->mAnimMeshes[i] = animMeshes.at(i); + } + } + return static_cast<unsigned int>(meshes.size() - 1); } @@ -1407,7 +1462,7 @@ namespace Assimp { const WeightIndexArray& indices = cluster->GetIndices(); - if (indices.empty()) { + if (indices.empty() && mRemoveEmptyBones ) { continue; } @@ -1439,13 +1494,11 @@ namespace Assimp { if (index_out_indices.back() == no_index_sentinel) { index_out_indices.back() = out_indices.size(); - } if (no_mat_check) { out_indices.push_back(out_idx[i]); - } - else { + } else { // this extra lookup is in O(logn), so the entire algorithm becomes O(nlogn) const std::vector<unsigned int>::iterator it = std::lower_bound( outputVertStartIndices->begin(), @@ -1461,11 +1514,11 @@ namespace Assimp { } } } - + // if we found at least one, generate the output bones // XXX this could be heavily simplified by collecting the bone // data in a single step. - if (ok) { + if (ok && mRemoveEmptyBones) { ConvertCluster(bones, model, *cluster, out_indices, index_out_indices, count_out_indices, node_global_transform); } @@ -1596,6 +1649,13 @@ namespace Assimp { out_mat->AddProperty(&str, AI_MATKEY_NAME); } + // Set the shading mode as best we can: The FBX specification only mentions Lambert and Phong, and only Phong is mentioned in Assimp's aiShadingMode enum. + if (material.GetShadingModel() == "phong") + { + aiShadingMode shadingMode = aiShadingMode_Phong; + out_mat->AddProperty<aiShadingMode>(&shadingMode, 1, AI_MATKEY_SHADING_MODEL); + } + // shading stuff and colors SetShadingPropertiesCommon(out_mat, props); SetShadingPropertiesRaw( out_mat, props, material.Textures(), mesh ); @@ -1621,7 +1681,7 @@ namespace Assimp { out_tex->pcData = reinterpret_cast<aiTexel*>(const_cast<Video&>(video).RelinquishContent()); // try to extract a hint from the file extension - const std::string& filename = video.FileName().empty() ? video.RelativeFilename() : video.FileName(); + const std::string& filename = video.RelativeFilename().empty() ? video.FileName() : video.RelativeFilename(); std::string ext = BaseImporter::GetExtension(filename); if (ext == "jpeg") { @@ -1632,7 +1692,7 @@ namespace Assimp { memcpy(out_tex->achFormatHint, ext.c_str(), ext.size()); } - out_tex->mFilename.Set(video.FileName().c_str()); + out_tex->mFilename.Set(filename.c_str()); return static_cast<unsigned int>(textures.size() - 1); } @@ -1678,9 +1738,8 @@ namespace Assimp { } void FBXConverter::TrySetTextureProperties(aiMaterial* out_mat, const TextureMap& textures, - const std::string& propName, - aiTextureType target, const MeshGeometry* const mesh) - { + const std::string& propName, + aiTextureType target, const MeshGeometry* const mesh) { TextureMap::const_iterator it = textures.find(propName); if (it == textures.end()) { return; @@ -3407,8 +3466,9 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa na->mNumScalingKeys = static_cast<unsigned int>(keys.size()); na->mScalingKeys = new aiVectorKey[keys.size()]; - if (keys.size() > 0) + if (keys.size() > 0) { InterpolateKeys(na->mScalingKeys, keys, inputs, aiVector3D(1.0f, 1.0f, 1.0f), maxTime, minTime); + } } void FBXConverter::ConvertTranslationKeys(aiNodeAnim* na, const std::vector<const AnimationCurveNode*>& nodes, @@ -3472,6 +3532,46 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa out->mMetaData->Set(14, "CustomFrameRate", doc.GlobalSettings().CustomFrameRate()); } + void FBXConverter::ConvertToUnitScale( FbxUnit unit ) { + if (mCurrentUnit == unit) { + return; + } + + ai_real scale = 1.0; + if (mCurrentUnit == FbxUnit::cm) { + if (unit == FbxUnit::m) { + scale = (ai_real)0.01; + } else if (unit == FbxUnit::km) { + scale = (ai_real)0.00001; + } + } else if (mCurrentUnit == FbxUnit::m) { + if (unit == FbxUnit::cm) { + scale = (ai_real)100.0; + } else if (unit == FbxUnit::km) { + scale = (ai_real)0.001; + } + } else if (mCurrentUnit == FbxUnit::km) { + if (unit == FbxUnit::cm) { + scale = (ai_real)100000.0; + } else if (unit == FbxUnit::m) { + scale = (ai_real)1000.0; + } + } + + for (auto mesh : meshes) { + if (nullptr == mesh) { + continue; + } + + if (mesh->HasPositions()) { + for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { + aiVector3D &pos = mesh->mVertices[i]; + pos *= scale; + } + } + } + } + void FBXConverter::TransferDataToScene() { ai_assert(!out->mMeshes); @@ -3525,9 +3625,9 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa } // ------------------------------------------------------------------------------------------------ - void ConvertToAssimpScene(aiScene* out, const Document& doc) + void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit) { - FBXConverter converter(out, doc); + FBXConverter converter(out, doc, removeEmptyBones, unit); } } // !FBX diff --git a/thirdparty/assimp/code/FBXConverter.h b/thirdparty/assimp/code/FBX/FBXConverter.h index 50637468b9..17a7bc56b7 100644 --- a/thirdparty/assimp/code/FBXConverter.h +++ b/thirdparty/assimp/code/FBX/FBXConverter.h @@ -52,6 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "FBXUtil.h" #include "FBXProperties.h" #include "FBXImporter.h" + #include <assimp/anim.h> #include <assimp/material.h> #include <assimp/light.h> @@ -76,12 +77,22 @@ namespace FBX { class Document; +enum class FbxUnit { + cm = 0, + m, + km, + NumUnits, + + Undefined +}; + /** * Convert a FBX #Document to #aiScene * @param out Empty scene to be populated - * @param doc Parsed FBX document + * @param doc Parsed FBX document + * @param removeEmptyBones Will remove bones, which do not have any references to vertices. */ -void ConvertToAssimpScene(aiScene* out, const Document& doc); +void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit); /** Dummy class to encapsulate the conversion process */ class FBXConverter { @@ -112,7 +123,7 @@ public: }; public: - FBXConverter(aiScene* out, const Document& doc); + FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit); ~FBXConverter(); private: @@ -145,6 +156,11 @@ private: const char* NameTransformationComp(TransformationComp comp); // ------------------------------------------------------------------------------------------------ + // Returns an unique name for a node or traverses up a hierarchy until a non-empty name is found and + // then makes this name unique + std::string MakeUniqueNodeName(const Model* const model, const aiNode& parent); + + // ------------------------------------------------------------------------------------------------ // note: this returns the REAL fbx property names const char* NameTransformationCompProperty(TransformationComp comp); @@ -167,7 +183,7 @@ private: /** * note: memory for output_nodes will be managed by the caller */ - void GenerateTransformationNodeChain(const Model& model, std::vector<aiNode*>& output_nodes, std::vector<aiNode*>& post_output_nodes); + bool GenerateTransformationNodeChain(const Model& model, const std::string& name, std::vector<aiNode*>& output_nodes, std::vector<aiNode*>& post_output_nodes); // ------------------------------------------------------------------------------------------------ void SetupNodeMetadata(const Model& model, aiNode& nd); @@ -415,6 +431,10 @@ private: void ConvertGlobalSettings(); // ------------------------------------------------------------------------------------------------ + // Will perform the conversion from a given unit to the requested unit. + void ConvertToUnitScale(FbxUnit unit); + + // ------------------------------------------------------------------------------------------------ // copy generated meshes, animations, lights, cameras and textures to the output scene void TransferDataToScene(); @@ -443,16 +463,17 @@ private: NodeAnimBitMap node_anim_chain_bits; // number of nodes with the same name - using NodeAnimNameMap = std::unordered_map<std::string, unsigned int>; - NodeAnimNameMap mNodeNameInstances; - - using NodeNameCache = std::unordered_set<std::string>; + using NodeNameCache = std::unordered_map<std::string, unsigned int>; NodeNameCache mNodeNames; double anim_fps; aiScene* const out; const FBX::Document& doc; + + bool mRemoveEmptyBones; + + FbxUnit mCurrentUnit; }; } diff --git a/thirdparty/assimp/code/FBXDeformer.cpp b/thirdparty/assimp/code/FBX/FBXDeformer.cpp index 6927553450..6927553450 100644 --- a/thirdparty/assimp/code/FBXDeformer.cpp +++ b/thirdparty/assimp/code/FBX/FBXDeformer.cpp diff --git a/thirdparty/assimp/code/FBXDocument.cpp b/thirdparty/assimp/code/FBX/FBXDocument.cpp index 1af08fe6d8..1af08fe6d8 100644 --- a/thirdparty/assimp/code/FBXDocument.cpp +++ b/thirdparty/assimp/code/FBX/FBXDocument.cpp diff --git a/thirdparty/assimp/code/FBXDocument.h b/thirdparty/assimp/code/FBX/FBXDocument.h index c849defdcd..18e5c38f13 100644 --- a/thirdparty/assimp/code/FBXDocument.h +++ b/thirdparty/assimp/code/FBX/FBXDocument.h @@ -627,7 +627,7 @@ public: return content; } - uint32_t ContentLength() const { + uint64_t ContentLength() const { return contentLength; } @@ -643,7 +643,7 @@ private: std::string fileName; std::shared_ptr<const PropertyTable> props; - uint32_t contentLength; + uint64_t contentLength; uint8_t* content; }; diff --git a/thirdparty/assimp/code/FBXDocumentUtil.cpp b/thirdparty/assimp/code/FBX/FBXDocumentUtil.cpp index f84691479a..f84691479a 100644 --- a/thirdparty/assimp/code/FBXDocumentUtil.cpp +++ b/thirdparty/assimp/code/FBX/FBXDocumentUtil.cpp diff --git a/thirdparty/assimp/code/FBXDocumentUtil.h b/thirdparty/assimp/code/FBX/FBXDocumentUtil.h index 2450109e59..2450109e59 100644 --- a/thirdparty/assimp/code/FBXDocumentUtil.h +++ b/thirdparty/assimp/code/FBX/FBXDocumentUtil.h diff --git a/thirdparty/assimp/code/FBXExportNode.cpp b/thirdparty/assimp/code/FBX/FBXExportNode.cpp index e5215466a1..06c89cee46 100644 --- a/thirdparty/assimp/code/FBXExportNode.cpp +++ b/thirdparty/assimp/code/FBX/FBXExportNode.cpp @@ -54,6 +54,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <sstream> // ostringstream #include <memory> // shared_ptr +namespace Assimp { // AddP70<type> helpers... there's no usable pattern here, // so all are defined as separate functions. // Even "animatable" properties are often completely different @@ -252,7 +253,8 @@ void FBX::Node::DumpChildren( } else { std::ostringstream ss; DumpChildrenAscii(ss, indent); - s.PutString(ss.str()); + if (ss.tellp() > 0) + s.PutString(ss.str()); } } @@ -266,7 +268,8 @@ void FBX::Node::End( } else { std::ostringstream ss; EndAscii(ss, indent, has_children); - s.PutString(ss.str()); + if (ss.tellp() > 0) + s.PutString(ss.str()); } } @@ -367,7 +370,7 @@ void FBX::Node::EndBinary( bool has_children ) { // if there were children, add a null record - if (has_children) { s.PutString(FBX::NULL_RECORD); } + if (has_children) { s.PutString(Assimp::FBX::NULL_RECORD); } // now go back and write initial pos this->end_pos = s.Tell(); @@ -563,6 +566,6 @@ void FBX::Node::WritePropertyNode( FBX::Node::WritePropertyNodeAscii(name, v, s, indent); } } - +} #endif // ASSIMP_BUILD_NO_FBX_EXPORTER #endif // ASSIMP_BUILD_NO_EXPORT diff --git a/thirdparty/assimp/code/FBXExportNode.h b/thirdparty/assimp/code/FBX/FBXExportNode.h index e1ebc36969..ef3bc781a4 100644 --- a/thirdparty/assimp/code/FBXExportNode.h +++ b/thirdparty/assimp/code/FBX/FBXExportNode.h @@ -54,16 +54,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <string> #include <vector> +namespace Assimp { namespace FBX { class Node; } -class FBX::Node -{ -public: // public data members +class FBX::Node { +public: // TODO: accessors std::string name; // node name - std::vector<FBX::Property> properties; // node properties + std::vector<FBX::FBXExportProperty> properties; // node properties std::vector<FBX::Node> children; // child nodes // some nodes always pretend they have children... @@ -214,7 +214,7 @@ public: // static member functions Assimp::StreamWriterLE& s, bool binary, int indent ) { - FBX::Property p(value); + FBX::FBXExportProperty p(value); FBX::Node node(name, p); node.Dump(s, binary, indent); } @@ -264,7 +264,7 @@ private: // static helper functions ); }; - +} #endif // ASSIMP_BUILD_NO_FBX_EXPORTER diff --git a/thirdparty/assimp/code/FBXExportProperty.cpp b/thirdparty/assimp/code/FBX/FBXExportProperty.cpp index 9981d6b1c6..f8593e6295 100644 --- a/thirdparty/assimp/code/FBXExportProperty.cpp +++ b/thirdparty/assimp/code/FBX/FBXExportProperty.cpp @@ -52,187 +52,210 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <locale> #include <sstream> // ostringstream +namespace Assimp { +namespace FBX { // constructors for single element properties -FBX::Property::Property(bool v) - : type('C'), data(1) -{ - data = {uint8_t(v)}; +FBXExportProperty::FBXExportProperty(bool v) +: type('C') +, data(1) { + data = { + uint8_t(v) + }; } -FBX::Property::Property(int16_t v) : type('Y'), data(2) -{ +FBXExportProperty::FBXExportProperty(int16_t v) +: type('Y') +, data(2) { uint8_t* d = data.data(); (reinterpret_cast<int16_t*>(d))[0] = v; } -FBX::Property::Property(int32_t v) : type('I'), data(4) -{ +FBXExportProperty::FBXExportProperty(int32_t v) +: type('I') +, data(4) { uint8_t* d = data.data(); (reinterpret_cast<int32_t*>(d))[0] = v; } -FBX::Property::Property(float v) : type('F'), data(4) -{ +FBXExportProperty::FBXExportProperty(float v) +: type('F') +, data(4) { uint8_t* d = data.data(); (reinterpret_cast<float*>(d))[0] = v; } -FBX::Property::Property(double v) : type('D'), data(8) -{ +FBXExportProperty::FBXExportProperty(double v) +: type('D') +, data(8) { uint8_t* d = data.data(); (reinterpret_cast<double*>(d))[0] = v; } -FBX::Property::Property(int64_t v) : type('L'), data(8) -{ +FBXExportProperty::FBXExportProperty(int64_t v) +: type('L') +, data(8) { uint8_t* d = data.data(); (reinterpret_cast<int64_t*>(d))[0] = v; } - // constructors for array-type properties -FBX::Property::Property(const char* c, bool raw) - : Property(std::string(c), raw) -{} +FBXExportProperty::FBXExportProperty(const char* c, bool raw) +: FBXExportProperty(std::string(c), raw) { + // empty +} // strings can either be saved as "raw" (R) data, or "string" (S) data -FBX::Property::Property(const std::string& s, bool raw) - : type(raw ? 'R' : 'S'), data(s.size()) -{ +FBXExportProperty::FBXExportProperty(const std::string& s, bool raw) +: type(raw ? 'R' : 'S') +, data(s.size()) { for (size_t i = 0; i < s.size(); ++i) { data[i] = uint8_t(s[i]); } } -FBX::Property::Property(const std::vector<uint8_t>& r) - : type('R'), data(r) -{} +FBXExportProperty::FBXExportProperty(const std::vector<uint8_t>& r) +: type('R') +, data(r) { + // empty +} -FBX::Property::Property(const std::vector<int32_t>& va) - : type('i'), data(4*va.size()) -{ +FBXExportProperty::FBXExportProperty(const std::vector<int32_t>& va) +: type('i') +, data(4 * va.size() ) { int32_t* d = reinterpret_cast<int32_t*>(data.data()); - for (size_t i = 0; i < va.size(); ++i) { d[i] = va[i]; } + for (size_t i = 0; i < va.size(); ++i) { + d[i] = va[i]; + } } -FBX::Property::Property(const std::vector<int64_t>& va) - : type('l'), data(8*va.size()) -{ +FBXExportProperty::FBXExportProperty(const std::vector<int64_t>& va) +: type('l') +, data(8 * va.size()) { int64_t* d = reinterpret_cast<int64_t*>(data.data()); - for (size_t i = 0; i < va.size(); ++i) { d[i] = va[i]; } + for (size_t i = 0; i < va.size(); ++i) { + d[i] = va[i]; + } } -FBX::Property::Property(const std::vector<float>& va) - : type('f'), data(4*va.size()) -{ +FBXExportProperty::FBXExportProperty(const std::vector<float>& va) +: type('f') +, data(4 * va.size()) { float* d = reinterpret_cast<float*>(data.data()); - for (size_t i = 0; i < va.size(); ++i) { d[i] = va[i]; } + for (size_t i = 0; i < va.size(); ++i) { + d[i] = va[i]; + } } -FBX::Property::Property(const std::vector<double>& va) - : type('d'), data(8*va.size()) -{ +FBXExportProperty::FBXExportProperty(const std::vector<double>& va) +: type('d') +, data(8 * va.size()) { double* d = reinterpret_cast<double*>(data.data()); - for (size_t i = 0; i < va.size(); ++i) { d[i] = va[i]; } + for (size_t i = 0; i < va.size(); ++i) { + d[i] = va[i]; + } } -FBX::Property::Property(const aiMatrix4x4& vm) - : type('d'), data(8*16) -{ +FBXExportProperty::FBXExportProperty(const aiMatrix4x4& vm) +: type('d') +, data(8 * 16) { double* d = reinterpret_cast<double*>(data.data()); for (unsigned int c = 0; c < 4; ++c) { for (unsigned int r = 0; r < 4; ++r) { - d[4*c+r] = vm[r][c]; + d[4 * c + r] = vm[r][c]; } } } // public member functions -size_t FBX::Property::size() -{ +size_t FBXExportProperty::size() { switch (type) { - case 'C': case 'Y': case 'I': case 'F': case 'D': case 'L': - return data.size() + 1; - case 'S': case 'R': - return data.size() + 5; - case 'i': case 'd': - return data.size() + 13; - default: - throw DeadlyExportError("Requested size on property of unknown type"); + case 'C': + case 'Y': + case 'I': + case 'F': + case 'D': + case 'L': + return data.size() + 1; + case 'S': + case 'R': + return data.size() + 5; + case 'i': + case 'd': + return data.size() + 13; + default: + throw DeadlyExportError("Requested size on property of unknown type"); } } -void FBX::Property::DumpBinary(Assimp::StreamWriterLE &s) -{ +void FBXExportProperty::DumpBinary(Assimp::StreamWriterLE& s) { s.PutU1(type); uint8_t* d = data.data(); size_t N; switch (type) { - case 'C': s.PutU1(*(reinterpret_cast<uint8_t*>(d))); return; - case 'Y': s.PutI2(*(reinterpret_cast<int16_t*>(d))); return; - case 'I': s.PutI4(*(reinterpret_cast<int32_t*>(d))); return; - case 'F': s.PutF4(*(reinterpret_cast<float*>(d))); return; - case 'D': s.PutF8(*(reinterpret_cast<double*>(d))); return; - case 'L': s.PutI8(*(reinterpret_cast<int64_t*>(d))); return; - case 'S': - case 'R': - s.PutU4(uint32_t(data.size())); - for (size_t i = 0; i < data.size(); ++i) { s.PutU1(data[i]); } - return; - case 'i': - N = data.size() / 4; - s.PutU4(uint32_t(N)); // number of elements - s.PutU4(0); // no encoding (1 would be zip-compressed) - // TODO: compress if large? - s.PutU4(uint32_t(data.size())); // data size - for (size_t i = 0; i < N; ++i) { - s.PutI4((reinterpret_cast<int32_t*>(d))[i]); - } - return; - case 'l': - N = data.size() / 8; - s.PutU4(uint32_t(N)); // number of elements - s.PutU4(0); // no encoding (1 would be zip-compressed) - // TODO: compress if large? - s.PutU4(uint32_t(data.size())); // data size - for (size_t i = 0; i < N; ++i) { - s.PutI8((reinterpret_cast<int64_t*>(d))[i]); - } - return; - case 'f': - N = data.size() / 4; - s.PutU4(uint32_t(N)); // number of elements - s.PutU4(0); // no encoding (1 would be zip-compressed) - // TODO: compress if large? - s.PutU4(uint32_t(data.size())); // data size - for (size_t i = 0; i < N; ++i) { - s.PutF4((reinterpret_cast<float*>(d))[i]); - } - return; - case 'd': - N = data.size() / 8; - s.PutU4(uint32_t(N)); // number of elements - s.PutU4(0); // no encoding (1 would be zip-compressed) - // TODO: compress if large? - s.PutU4(uint32_t(data.size())); // data size - for (size_t i = 0; i < N; ++i) { - s.PutF8((reinterpret_cast<double*>(d))[i]); - } - return; - default: - std::ostringstream err; - err << "Tried to dump property with invalid type '"; - err << type << "'!"; - throw DeadlyExportError(err.str()); + case 'C': s.PutU1(*(reinterpret_cast<uint8_t*>(d))); return; + case 'Y': s.PutI2(*(reinterpret_cast<int16_t*>(d))); return; + case 'I': s.PutI4(*(reinterpret_cast<int32_t*>(d))); return; + case 'F': s.PutF4(*(reinterpret_cast<float*>(d))); return; + case 'D': s.PutF8(*(reinterpret_cast<double*>(d))); return; + case 'L': s.PutI8(*(reinterpret_cast<int64_t*>(d))); return; + case 'S': + case 'R': + s.PutU4(uint32_t(data.size())); + for (size_t i = 0; i < data.size(); ++i) { s.PutU1(data[i]); } + return; + case 'i': + N = data.size() / 4; + s.PutU4(uint32_t(N)); // number of elements + s.PutU4(0); // no encoding (1 would be zip-compressed) + // TODO: compress if large? + s.PutU4(uint32_t(data.size())); // data size + for (size_t i = 0; i < N; ++i) { + s.PutI4((reinterpret_cast<int32_t*>(d))[i]); + } + return; + case 'l': + N = data.size() / 8; + s.PutU4(uint32_t(N)); // number of elements + s.PutU4(0); // no encoding (1 would be zip-compressed) + // TODO: compress if large? + s.PutU4(uint32_t(data.size())); // data size + for (size_t i = 0; i < N; ++i) { + s.PutI8((reinterpret_cast<int64_t*>(d))[i]); + } + return; + case 'f': + N = data.size() / 4; + s.PutU4(uint32_t(N)); // number of elements + s.PutU4(0); // no encoding (1 would be zip-compressed) + // TODO: compress if large? + s.PutU4(uint32_t(data.size())); // data size + for (size_t i = 0; i < N; ++i) { + s.PutF4((reinterpret_cast<float*>(d))[i]); + } + return; + case 'd': + N = data.size() / 8; + s.PutU4(uint32_t(N)); // number of elements + s.PutU4(0); // no encoding (1 would be zip-compressed) + // TODO: compress if large? + s.PutU4(uint32_t(data.size())); // data size + for (size_t i = 0; i < N; ++i) { + s.PutF8((reinterpret_cast<double*>(d))[i]); + } + return; + default: + std::ostringstream err; + err << "Tried to dump property with invalid type '"; + err << type << "'!"; + throw DeadlyExportError(err.str()); } } -void FBX::Property::DumpAscii(Assimp::StreamWriterLE &outstream, int indent) -{ +void FBXExportProperty::DumpAscii(Assimp::StreamWriterLE& outstream, int indent) { std::ostringstream ss; ss.imbue(std::locale::classic()); ss.precision(15); // this seems to match official FBX SDK exports @@ -240,8 +263,7 @@ void FBX::Property::DumpAscii(Assimp::StreamWriterLE &outstream, int indent) outstream.PutString(ss.str()); } -void FBX::Property::DumpAscii(std::ostream& s, int indent) -{ +void FBXExportProperty::DumpAscii(std::ostream& s, int indent) { // no writing type... or anything. just shove it into the stream. uint8_t* d = data.data(); size_t N; @@ -360,5 +382,8 @@ void FBX::Property::DumpAscii(std::ostream& s, int indent) } } +} // Namespace FBX +} // Namespace Assimp + #endif // ASSIMP_BUILD_NO_FBX_EXPORTER #endif // ASSIMP_BUILD_NO_EXPORT diff --git a/thirdparty/assimp/code/FBXExportProperty.h b/thirdparty/assimp/code/FBX/FBXExportProperty.h index 9c9d37c362..d692fe6ee3 100644 --- a/thirdparty/assimp/code/FBXExportProperty.h +++ b/thirdparty/assimp/code/FBX/FBXExportProperty.h @@ -47,7 +47,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_FBX_EXPORTER - #include <assimp/types.h> // aiMatrix4x4 #include <assimp/StreamWriter.h> // StreamWriterLE @@ -56,11 +55,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <ostream> #include <type_traits> // is_void +namespace Assimp { namespace FBX { - class Property; -} -/** FBX::Property +/** @brief FBX::Property * * Holds a value of any of FBX's recognized types, * each represented by a particular one-character code. @@ -78,35 +76,34 @@ namespace FBX { * S : string (array of 1-byte char) * R : raw data (array of bytes) */ -class FBX::Property -{ +class FBXExportProperty { public: // constructors for basic types. // all explicit to avoid accidental typecasting - explicit Property(bool v); + explicit FBXExportProperty(bool v); // TODO: determine if there is actually a byte type, // or if this always means <bool>. 'C' seems to imply <char>, // so possibly the above was intended to represent both. - explicit Property(int16_t v); - explicit Property(int32_t v); - explicit Property(float v); - explicit Property(double v); - explicit Property(int64_t v); + explicit FBXExportProperty(int16_t v); + explicit FBXExportProperty(int32_t v); + explicit FBXExportProperty(float v); + explicit FBXExportProperty(double v); + explicit FBXExportProperty(int64_t v); // strings can either be stored as 'R' (raw) or 'S' (string) type - explicit Property(const char* c, bool raw=false); - explicit Property(const std::string& s, bool raw=false); - explicit Property(const std::vector<uint8_t>& r); - explicit Property(const std::vector<int32_t>& va); - explicit Property(const std::vector<int64_t>& va); - explicit Property(const std::vector<double>& va); - explicit Property(const std::vector<float>& va); - explicit Property(const aiMatrix4x4& vm); + explicit FBXExportProperty(const char* c, bool raw = false); + explicit FBXExportProperty(const std::string& s, bool raw = false); + explicit FBXExportProperty(const std::vector<uint8_t>& r); + explicit FBXExportProperty(const std::vector<int32_t>& va); + explicit FBXExportProperty(const std::vector<int64_t>& va); + explicit FBXExportProperty(const std::vector<double>& va); + explicit FBXExportProperty(const std::vector<float>& va); + explicit FBXExportProperty(const aiMatrix4x4& vm); // this will catch any type not defined above, // so that we don't accidentally convert something we don't want. // for example (const char*) --> (bool)... seriously wtf C++ template <class T> - explicit Property(T v) : type('X') { + explicit FBXExportProperty(T v) : type('X') { static_assert(std::is_void<T>::value, "TRIED TO CREATE FBX PROPERTY WITH UNSUPPORTED TYPE, CHECK YOUR PROPERTY INSTANTIATION"); } // note: no line wrap so it appears verbatim on the compiler error @@ -114,9 +111,9 @@ public: size_t size(); // write this property node as binary data to the given stream - void DumpBinary(Assimp::StreamWriterLE &s); - void DumpAscii(Assimp::StreamWriterLE &s, int indent=0); - void DumpAscii(std::ostream &s, int indent=0); + void DumpBinary(Assimp::StreamWriterLE& s); + void DumpAscii(Assimp::StreamWriterLE& s, int indent = 0); + void DumpAscii(std::ostream& s, int indent = 0); // note: make sure the ostream is in classic "C" locale private: @@ -124,6 +121,9 @@ private: std::vector<uint8_t> data; }; +} // Namespace FBX +} // Namespace Assimp + #endif // ASSIMP_BUILD_NO_FBX_EXPORTER #endif // AI_FBXEXPORTPROPERTY_H_INC diff --git a/thirdparty/assimp/code/FBXExporter.cpp b/thirdparty/assimp/code/FBX/FBXExporter.cpp index acb1227144..153e676506 100644 --- a/thirdparty/assimp/code/FBXExporter.cpp +++ b/thirdparty/assimp/code/FBX/FBXExporter.cpp @@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "FBXExportNode.h" #include "FBXExportProperty.h" #include "FBXCommon.h" +#include "FBXUtil.h" #include <assimp/version.h> // aiGetVersion #include <assimp/IOSystem.hpp> @@ -73,7 +74,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. const ai_real DEG = ai_real( 57.29577951308232087679815481 ); // degrees per radian +using namespace Assimp; +using namespace Assimp::FBX; + // some constants that we'll use for writing metadata +namespace Assimp { namespace FBX { const std::string EXPORT_VERSION_STR = "7.4.0"; const uint32_t EXPORT_VERSION_INT = 7400; // 7.4 == 2014/2015 @@ -92,11 +97,6 @@ namespace FBX { ";------------------------------------------------------------------"; } -using namespace Assimp; -using namespace FBX; - -namespace Assimp { - // --------------------------------------------------------------------- // Worker function for exporting a scene to binary FBX. // Prototyped and registered in Exporter.cpp @@ -121,6 +121,7 @@ namespace Assimp { IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties + ){ // initialize the exporter FBXExporter exporter(pScene, pProperties); @@ -1218,6 +1219,16 @@ void FBXExporter::WriteObjects () layer.AddChild(le); layer.Dump(outstream, binary, indent); + for(unsigned int lr = 1; lr < m->GetNumUVChannels(); ++ lr) + { + FBX::Node layerExtra("Layer", int32_t(1)); + layerExtra.AddChild("Version", int32_t(100)); + FBX::Node leExtra("LayerElement"); + leExtra.AddChild("Type", "LayerElementUV"); + leExtra.AddChild("TypedIndex", int32_t(lr)); + layerExtra.AddChild(leExtra); + layerExtra.Dump(outstream, binary, indent); + } // finish the node record indent = 1; n.End(outstream, binary, indent, true); @@ -1393,10 +1404,6 @@ void FBXExporter::WriteObjects () // FbxVideo - stores images used by textures. for (const auto &it : uid_by_image) { - if (it.first.compare(0, 1, "*") == 0) { - // TODO: embedded textures - continue; - } FBX::Node n("Video"); const int64_t& uid = it.second; const std::string name = ""; // TODO: ... name??? @@ -1406,7 +1413,33 @@ void FBXExporter::WriteObjects () // TODO: get full path... relative path... etc... ugh... // for now just use the same path for everything, // and hopefully one of them will work out. - const std::string& path = it.first; + std::string path = it.first; + // try get embedded texture + const aiTexture* embedded_texture = mScene->GetEmbeddedTexture(it.first.c_str()); + if (embedded_texture != nullptr) { + // change the path (use original filename, if available. If name is empty, concatenate texture index with file extension) + std::stringstream newPath; + if (embedded_texture->mFilename.length > 0) { + newPath << embedded_texture->mFilename.C_Str(); + } else if (embedded_texture->achFormatHint[0]) { + int texture_index = std::stoi(path.substr(1, path.size() - 1)); + newPath << texture_index << "." << embedded_texture->achFormatHint; + } + path = newPath.str(); + // embed the texture + size_t texture_size = static_cast<size_t>(embedded_texture->mWidth * std::max(embedded_texture->mHeight, 1u)); + if (binary) { + // embed texture as binary data + std::vector<uint8_t> tex_data; + tex_data.resize(texture_size); + memcpy(&tex_data[0], (char*)embedded_texture->pcData, texture_size); + n.AddChild("Content", tex_data); + } else { + // embed texture in base64 encoding + std::string encoded_texture = FBX::Util::EncodeBase64((char*)embedded_texture->pcData, texture_size); + n.AddChild("Content", encoded_texture); + } + } p.AddP70("Path", "KString", "XRefUrl", "", path); n.AddChild(p); n.AddChild("UseMipMap", int32_t(0)); @@ -1419,17 +1452,17 @@ void FBXExporter::WriteObjects () // referenced by material_index/texture_type pairs. std::map<std::pair<size_t,size_t>,int64_t> texture_uids; const std::map<aiTextureType,std::string> prop_name_by_tt = { - {aiTextureType_DIFFUSE, "DiffuseColor"}, - {aiTextureType_SPECULAR, "SpecularColor"}, - {aiTextureType_AMBIENT, "AmbientColor"}, - {aiTextureType_EMISSIVE, "EmissiveColor"}, - {aiTextureType_HEIGHT, "Bump"}, - {aiTextureType_NORMALS, "NormalMap"}, - {aiTextureType_SHININESS, "ShininessExponent"}, - {aiTextureType_OPACITY, "TransparentColor"}, + {aiTextureType_DIFFUSE, "DiffuseColor"}, + {aiTextureType_SPECULAR, "SpecularColor"}, + {aiTextureType_AMBIENT, "AmbientColor"}, + {aiTextureType_EMISSIVE, "EmissiveColor"}, + {aiTextureType_HEIGHT, "Bump"}, + {aiTextureType_NORMALS, "NormalMap"}, + {aiTextureType_SHININESS, "ShininessExponent"}, + {aiTextureType_OPACITY, "TransparentColor"}, {aiTextureType_DISPLACEMENT, "DisplacementColor"}, //{aiTextureType_LIGHTMAP, "???"}, - {aiTextureType_REFLECTION, "ReflectionColor"} + {aiTextureType_REFLECTION, "ReflectionColor"} //{aiTextureType_UNKNOWN, ""} }; for (size_t i = 0; i < mScene->mNumMaterials; ++i) { @@ -1575,19 +1608,41 @@ void FBXExporter::WriteObjects () // one sticky point is that the number of vertices may not match, // because assimp splits vertices by normal, uv, etc. + // functor for aiNode sorting + struct SortNodeByName + { + bool operator()(const aiNode *lhs, const aiNode *rhs) const + { + return strcmp(lhs->mName.C_Str(), rhs->mName.C_Str()) < 0; + } + }; + // first we should mark the skeleton for each mesh. // the skeleton must include not only the aiBones, // but also all their parent nodes. // anything that affects the position of any bone node must be included. - std::vector<std::set<const aiNode*>> skeleton_by_mesh(mScene->mNumMeshes); + // Use SorNodeByName to make sure the exported result will be the same across all systems + // Otherwise the aiNodes of the skeleton would be sorted based on the pointer address, which isn't consistent + std::vector<std::set<const aiNode*, SortNodeByName>> skeleton_by_mesh(mScene->mNumMeshes); // at the same time we can build a list of all the skeleton nodes, // which will be used later to mark them as type "limbNode". std::unordered_set<const aiNode*> limbnodes; + + //actual bone nodes in fbx, without parenting-up + std::unordered_set<std::string> setAllBoneNamesInScene; + for(unsigned int m = 0; m < mScene->mNumMeshes; ++ m) + { + aiMesh* pMesh = mScene->mMeshes[m]; + for(unsigned int b = 0; b < pMesh->mNumBones; ++ b) + setAllBoneNamesInScene.insert(pMesh->mBones[b]->mName.data); + } + aiMatrix4x4 mxTransIdentity; + // and a map of nodes by bone name, as finding them is annoying. std::map<std::string,aiNode*> node_by_bone; for (size_t mi = 0; mi < mScene->mNumMeshes; ++mi) { const aiMesh* m = mScene->mMeshes[mi]; - std::set<const aiNode*> skeleton; + std::set<const aiNode*, SortNodeByName> skeleton; for (size_t bi =0; bi < m->mNumBones; ++bi) { const aiBone* b = m->mBones[bi]; const std::string name(b->mName.C_Str()); @@ -1626,6 +1681,11 @@ void FBXExporter::WriteObjects () if (node_name.find(MAGIC_NODE_TAG) != std::string::npos) { continue; } + //not a bone in scene && no effect in transform + if(setAllBoneNamesInScene.find(node_name)==setAllBoneNamesInScene.end() + && parent->mTransformation == mxTransIdentity) { + continue; + } // otherwise check if this is the root of the skeleton bool end = false; // is the mesh part of this node? @@ -1728,7 +1788,7 @@ void FBXExporter::WriteObjects () aiMatrix4x4 mesh_xform = get_world_transform(mesh_node, mScene); // now make a subdeformer for each bone in the skeleton - const std::set<const aiNode*> &skeleton = skeleton_by_mesh[mi]; + const std::set<const aiNode*, SortNodeByName> skeleton= skeleton_by_mesh[mi]; for (const aiNode* bone_node : skeleton) { // if there's a bone for this node, find it const aiBone* b = nullptr; @@ -1790,7 +1850,10 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. - const float epsilon = 1e-4f; // some error is to be expected + float epsilon = 1e-4f; // some error is to be expected + float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1); + if(epsilon_custom > 0) + epsilon = epsilon_custom; bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); @@ -2237,8 +2300,8 @@ void FBXExporter::WriteModelNode( // not sure what these are for, // but they seem to be omnipresent - m.AddChild("Shading", Property(true)); - m.AddChild("Culling", Property("CullingOff")); + m.AddChild("Shading", FBXExportProperty(true)); + m.AddChild("Culling", FBXExportProperty("CullingOff")); m.Dump(outstream, binary, 1); } @@ -2351,7 +2414,7 @@ void FBXExporter::WriteModelNodes( na.AddProperties( node_attribute_uid, FBX::SEPARATOR + "NodeAttribute", "LimbNode" ); - na.AddChild("TypeFlags", Property("Skeleton")); + na.AddChild("TypeFlags", FBXExportProperty("Skeleton")); na.Dump(outstream, binary, 1); // and connect them connections.emplace_back("C", "OO", node_attribute_uid, node_uid); diff --git a/thirdparty/assimp/code/FBXExporter.h b/thirdparty/assimp/code/FBX/FBXExporter.h index 71fb55c57f..71fb55c57f 100644 --- a/thirdparty/assimp/code/FBXExporter.h +++ b/thirdparty/assimp/code/FBX/FBXExporter.h diff --git a/thirdparty/assimp/code/FBXImportSettings.h b/thirdparty/assimp/code/FBX/FBXImportSettings.h index d5e1c20608..1a4c80f8b2 100644 --- a/thirdparty/assimp/code/FBXImportSettings.h +++ b/thirdparty/assimp/code/FBX/FBXImportSettings.h @@ -53,19 +53,22 @@ namespace FBX { struct ImportSettings { ImportSettings() - : strictMode(true) - , readAllLayers(true) - , readAllMaterials(false) - , readMaterials(true) - , readTextures(true) - , readCameras(true) - , readLights(true) - , readAnimations(true) - , readWeights(true) - , preservePivots(true) - , optimizeEmptyAnimationCurves(true) - , useLegacyEmbeddedTextureNaming(false) - {} + : strictMode(true) + , readAllLayers(true) + , readAllMaterials(false) + , readMaterials(true) + , readTextures(true) + , readCameras(true) + , readLights(true) + , readAnimations(true) + , readWeights(true) + , preservePivots(true) + , optimizeEmptyAnimationCurves(true) + , useLegacyEmbeddedTextureNaming(false) + , removeEmptyBones( true ) + , convertToMeters( false ) { + // empty + } /** enable strict mode: @@ -141,8 +144,16 @@ struct ImportSettings bool optimizeEmptyAnimationCurves; /** use legacy naming for embedded textures eg: (*0, *1, *2) - **/ + */ bool useLegacyEmbeddedTextureNaming; + + /** Empty bones shall be removed + */ + bool removeEmptyBones; + + /** Set to true to perform a conversion from cm to meter after the import + */ + bool convertToMeters; }; diff --git a/thirdparty/assimp/code/FBXImporter.cpp b/thirdparty/assimp/code/FBX/FBXImporter.cpp index 2cc8bffc29..ec8bbd2b47 100644 --- a/thirdparty/assimp/code/FBXImporter.cpp +++ b/thirdparty/assimp/code/FBX/FBXImporter.cpp @@ -140,6 +140,8 @@ void FBXImporter::SetupProperties(const Importer* pImp) settings.preservePivots = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, true); settings.optimizeEmptyAnimationCurves = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES, true); settings.useLegacyEmbeddedTextureNaming = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING, false); + settings.removeEmptyBones = pImp->GetPropertyBool(AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES, true); + settings.convertToMeters = pImp->GetPropertyBool(AI_CONFIG_FBX_CONVERT_TO_M, false); } // ------------------------------------------------------------------------------------------------ @@ -170,7 +172,7 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS bool is_binary = false; if (!strncmp(begin,"Kaydara FBX Binary",18)) { is_binary = true; - TokenizeBinary(tokens,begin,static_cast<unsigned int>(contents.size())); + TokenizeBinary(tokens,begin,contents.size()); } else { Tokenize(tokens,begin); @@ -183,8 +185,12 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS // take the raw parse-tree and convert it to a FBX DOM Document doc(parser,settings); + FbxUnit unit(FbxUnit::cm); + if (settings.convertToMeters) { + unit = FbxUnit::m; + } // convert the FBX DOM to aiScene - ConvertToAssimpScene(pScene,doc); + ConvertToAssimpScene(pScene,doc, settings.removeEmptyBones, unit); std::for_each(tokens.begin(),tokens.end(),Util::delete_fun<Token>()); } diff --git a/thirdparty/assimp/code/FBXImporter.h b/thirdparty/assimp/code/FBX/FBXImporter.h index c365b2cddf..c365b2cddf 100644 --- a/thirdparty/assimp/code/FBXImporter.h +++ b/thirdparty/assimp/code/FBX/FBXImporter.h diff --git a/thirdparty/assimp/code/FBXMaterial.cpp b/thirdparty/assimp/code/FBX/FBXMaterial.cpp index f16f134404..f43a8b84b0 100644 --- a/thirdparty/assimp/code/FBXMaterial.cpp +++ b/thirdparty/assimp/code/FBX/FBXMaterial.cpp @@ -316,7 +316,7 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std relativeFileName = ParseTokenAsString(GetRequiredToken(*RelativeFilename,0)); } - if(Content) { + if(Content && !Content->Tokens().empty()) { //this field is omitted when the embedded texture is already loaded, let's ignore if it's not found try { const Token& token = GetRequiredToken(*Content, 0); @@ -326,16 +326,40 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std DOMError("embedded content is not surrounded by quotation marks", &element); } else { - const char* encodedData = data + 1; - size_t encodedDataLen = static_cast<size_t>(token.end() - token.begin()); - // search for last quotation mark - while (encodedDataLen > 1 && encodedData[encodedDataLen] != '"') - encodedDataLen--; - if (encodedDataLen % 4 != 0) { - DOMError("embedded content is invalid, needs to be in base64", &element); + size_t targetLength = 0; + auto numTokens = Content->Tokens().size(); + // First time compute size (it could be large like 64Gb and it is good to allocate it once) + for (uint32_t tokenIdx = 0; tokenIdx < numTokens; ++tokenIdx) + { + const Token& dataToken = GetRequiredToken(*Content, tokenIdx); + size_t tokenLength = dataToken.end() - dataToken.begin() - 2; // ignore double quotes + const char* base64data = dataToken.begin() + 1; + const size_t outLength = Util::ComputeDecodedSizeBase64(base64data, tokenLength); + if (outLength == 0) + { + DOMError("Corrupted embedded content found", &element); + } + targetLength += outLength; } - else { - contentLength = Util::DecodeBase64(encodedData, encodedDataLen, content); + if (targetLength == 0) + { + DOMError("Corrupted embedded content found", &element); + } + content = new uint8_t[targetLength]; + contentLength = static_cast<uint64_t>(targetLength); + size_t dst_offset = 0; + for (uint32_t tokenIdx = 0; tokenIdx < numTokens; ++tokenIdx) + { + const Token& dataToken = GetRequiredToken(*Content, tokenIdx); + size_t tokenLength = dataToken.end() - dataToken.begin() - 2; // ignore double quotes + const char* base64data = dataToken.begin() + 1; + dst_offset += Util::DecodeBase64(base64data, tokenLength, content + dst_offset, targetLength - dst_offset); + } + if (targetLength != dst_offset) + { + delete[] content; + contentLength = 0; + DOMError("Corrupted embedded content found", &element); } } } diff --git a/thirdparty/assimp/code/FBXMeshGeometry.cpp b/thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp index d75476b826..44a0264ca0 100644 --- a/thirdparty/assimp/code/FBXMeshGeometry.cpp +++ b/thirdparty/assimp/code/FBX/FBXMeshGeometry.cpp @@ -568,15 +568,15 @@ void MeshGeometry::ReadVertexDataColors(std::vector<aiColor4D>& colors_out, cons } // ------------------------------------------------------------------------------------------------ -static const std::string TangentIndexToken = "TangentIndex"; -static const std::string TangentsIndexToken = "TangentsIndex"; +static const char *TangentIndexToken = "TangentIndex"; +static const char *TangentsIndexToken = "TangentsIndex"; void MeshGeometry::ReadVertexDataTangents(std::vector<aiVector3D>& tangents_out, const Scope& source, const std::string& MappingInformationType, const std::string& ReferenceInformationType) { const char * str = source.Elements().count( "Tangents" ) > 0 ? "Tangents" : "Tangent"; - const char * strIdx = source.Elements().count( "Tangents" ) > 0 ? TangentsIndexToken.c_str() : TangentIndexToken.c_str(); + const char * strIdx = source.Elements().count( "Tangents" ) > 0 ? TangentsIndexToken : TangentIndexToken; ResolveVertexDataArray(tangents_out,source,MappingInformationType,ReferenceInformationType, str, strIdx, @@ -630,10 +630,11 @@ void MeshGeometry::ReadVertexDataMaterials(std::vector<int>& materials_out, cons materials_out.clear(); } - m_materials.assign(m_vertices.size(),materials_out[0]); + materials_out.resize(m_vertices.size()); + std::fill(materials_out.begin(), materials_out.end(), materials_out.at(0)); } else if (MappingInformationType == "ByPolygon" && ReferenceInformationType == "IndexToDirect") { - m_materials.resize(face_count); + materials_out.resize(face_count); if(materials_out.size() != face_count) { FBXImporter::LogError(Formatter::format("length of input data unexpected for ByPolygon mapping: ") diff --git a/thirdparty/assimp/code/FBXMeshGeometry.h b/thirdparty/assimp/code/FBX/FBXMeshGeometry.h index d6d4512177..d6d4512177 100644 --- a/thirdparty/assimp/code/FBXMeshGeometry.h +++ b/thirdparty/assimp/code/FBX/FBXMeshGeometry.h diff --git a/thirdparty/assimp/code/FBXModel.cpp b/thirdparty/assimp/code/FBX/FBXModel.cpp index 589af36ac7..589af36ac7 100644 --- a/thirdparty/assimp/code/FBXModel.cpp +++ b/thirdparty/assimp/code/FBX/FBXModel.cpp diff --git a/thirdparty/assimp/code/FBXNodeAttribute.cpp b/thirdparty/assimp/code/FBX/FBXNodeAttribute.cpp index b72e5637ee..b72e5637ee 100644 --- a/thirdparty/assimp/code/FBXNodeAttribute.cpp +++ b/thirdparty/assimp/code/FBX/FBXNodeAttribute.cpp diff --git a/thirdparty/assimp/code/FBXParser.cpp b/thirdparty/assimp/code/FBX/FBXParser.cpp index b255c47347..4a9346040d 100644 --- a/thirdparty/assimp/code/FBXParser.cpp +++ b/thirdparty/assimp/code/FBX/FBXParser.cpp @@ -117,7 +117,7 @@ namespace FBX { Element::Element(const Token& key_token, Parser& parser) : key_token(key_token) { - TokenPtr n = NULL; + TokenPtr n = nullptr; do { n = parser.AdvanceToNextToken(); if(!n) { @@ -643,9 +643,9 @@ void ParseVectorDataArray(std::vector<aiVector3D>& out, const Element& el) if (type == 'd') { const double* d = reinterpret_cast<const double*>(&buff[0]); for (unsigned int i = 0; i < count3; ++i, d += 3) { - out.push_back(aiVector3D(static_cast<float>(d[0]), - static_cast<float>(d[1]), - static_cast<float>(d[2]))); + out.push_back(aiVector3D(static_cast<ai_real>(d[0]), + static_cast<ai_real>(d[1]), + static_cast<ai_real>(d[2]))); } // for debugging /*for ( size_t i = 0; i < out.size(); i++ ) { @@ -963,7 +963,6 @@ void ParseVectorDataArray(std::vector<float>& out, const Element& el) } } - // ------------------------------------------------------------------------------------------------ // read an array of uints void ParseVectorDataArray(std::vector<unsigned int>& out, const Element& el) @@ -1280,7 +1279,6 @@ float ParseTokenAsFloat(const Token& t) return i; } - // ------------------------------------------------------------------------------------------------ // wrapper around ParseTokenAsInt() with ParseError handling int ParseTokenAsInt(const Token& t) @@ -1293,8 +1291,6 @@ int ParseTokenAsInt(const Token& t) return i; } - - // ------------------------------------------------------------------------------------------------ // wrapper around ParseTokenAsInt64() with ParseError handling int64_t ParseTokenAsInt64(const Token& t) diff --git a/thirdparty/assimp/code/FBXParser.h b/thirdparty/assimp/code/FBX/FBXParser.h index 7b0cf72039..7b0cf72039 100644 --- a/thirdparty/assimp/code/FBXParser.h +++ b/thirdparty/assimp/code/FBX/FBXParser.h diff --git a/thirdparty/assimp/code/FBXProperties.cpp b/thirdparty/assimp/code/FBX/FBXProperties.cpp index 8d7036b6a9..8d7036b6a9 100644 --- a/thirdparty/assimp/code/FBXProperties.cpp +++ b/thirdparty/assimp/code/FBX/FBXProperties.cpp diff --git a/thirdparty/assimp/code/FBXProperties.h b/thirdparty/assimp/code/FBX/FBXProperties.h index 58755542fc..58755542fc 100644 --- a/thirdparty/assimp/code/FBXProperties.h +++ b/thirdparty/assimp/code/FBX/FBXProperties.h diff --git a/thirdparty/assimp/code/FBXTokenizer.cpp b/thirdparty/assimp/code/FBX/FBXTokenizer.cpp index 252cce3557..252cce3557 100644 --- a/thirdparty/assimp/code/FBXTokenizer.cpp +++ b/thirdparty/assimp/code/FBX/FBXTokenizer.cpp diff --git a/thirdparty/assimp/code/FBXTokenizer.h b/thirdparty/assimp/code/FBX/FBXTokenizer.h index 2af29743f4..afa588a470 100644 --- a/thirdparty/assimp/code/FBXTokenizer.h +++ b/thirdparty/assimp/code/FBX/FBXTokenizer.h @@ -93,7 +93,7 @@ public: Token(const char* sbegin, const char* send, TokenType type, unsigned int line, unsigned int column); /** construct a binary token */ - Token(const char* sbegin, const char* send, TokenType type, unsigned int offset); + Token(const char* sbegin, const char* send, TokenType type, size_t offset); ~Token(); @@ -118,14 +118,14 @@ public: return type; } - unsigned int Offset() const { + size_t Offset() const { ai_assert(IsBinary()); return offset; } unsigned int Line() const { ai_assert(!IsBinary()); - return line; + return static_cast<unsigned int>(line); } unsigned int Column() const { @@ -147,8 +147,8 @@ private: const TokenType type; union { - const unsigned int line; - unsigned int offset; + size_t line; + size_t offset; }; const unsigned int column; }; @@ -178,7 +178,7 @@ void Tokenize(TokenList& output_tokens, const char* input); * @param input_buffer Binary input buffer to be processed. * @param length Length of input buffer, in bytes. There is no 0-terminal. * @throw DeadlyImportError if something goes wrong */ -void TokenizeBinary(TokenList& output_tokens, const char* input, unsigned int length); +void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length); } // ! FBX diff --git a/thirdparty/assimp/code/FBXUtil.cpp b/thirdparty/assimp/code/FBX/FBXUtil.cpp index fb483161b2..c10e057c8c 100644 --- a/thirdparty/assimp/code/FBXUtil.cpp +++ b/thirdparty/assimp/code/FBX/FBXUtil.cpp @@ -86,7 +86,7 @@ const char* TokenTypeString(TokenType t) // ------------------------------------------------------------------------------------------------ -std::string AddOffset(const std::string& prefix, const std::string& text, unsigned int offset) +std::string AddOffset(const std::string& prefix, const std::string& text, size_t offset) { return static_cast<std::string>( (Formatter::format() << prefix << " (offset 0x" << std::hex << offset << ") " << text) ); } @@ -114,47 +114,126 @@ std::string AddTokenText(const std::string& prefix, const std::string& text, con text) ); } +// Generated by this formula: T["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i; static const uint8_t base64DecodeTable[128] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 64, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, - 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0 + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 255, 255, 255, + 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, + 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255 }; uint8_t DecodeBase64(char ch) { - return base64DecodeTable[size_t(ch)]; + const auto idx = static_cast<uint8_t>(ch); + if (idx > 127) + return 255; + return base64DecodeTable[idx]; } -size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out) +size_t ComputeDecodedSizeBase64(const char* in, size_t inLength) { - if (inLength < 4) { - out = 0; + if (inLength < 2) + { + return 0; + } + const size_t equals = size_t(in[inLength - 1] == '=') + size_t(in[inLength - 2] == '='); + const size_t full_length = (inLength * 3) >> 2; // div by 4 + if (full_length < equals) + { + return 0; + } + return full_length - equals; +} + +size_t DecodeBase64(const char* in, size_t inLength, uint8_t* out, size_t maxOutLength) +{ + if (maxOutLength == 0 || inLength < 2) { return 0; } + const size_t realLength = inLength - size_t(in[inLength - 1] == '=') - size_t(in[inLength - 2] == '='); + size_t dst_offset = 0; + int val = 0, valb = -8; + for (size_t src_offset = 0; src_offset < realLength; ++src_offset) + { + const uint8_t table_value = Util::DecodeBase64(in[src_offset]); + if (table_value == 255) + { + return 0; + } + val = (val << 6) + table_value; + valb += 6; + if (valb >= 0) + { + out[dst_offset++] = static_cast<uint8_t>((val >> valb) & 0xFF); + valb -= 8; + val &= 0xFFF; + } + } + return dst_offset; +} - const size_t outLength = (inLength * 3) / 4; - out = new uint8_t[outLength]; - memset(out, 0, outLength); +static const char to_base64_string[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +char EncodeBase64(char byte) +{ + return to_base64_string[(size_t)byte]; +} - size_t i = 0; - size_t j = 0; - for (i = 0; i < inLength - 4; i += 4) +/** Encodes a block of 4 bytes to base64 encoding +* +* @param bytes Bytes to encode. +* @param out_string String to write encoded values to. +* @param string_pos Position in out_string.*/ +void EncodeByteBlock(const char* bytes, std::string& out_string, size_t string_pos) +{ + char b0 = (bytes[0] & 0xFC) >> 2; + char b1 = (bytes[0] & 0x03) << 4 | ((bytes[1] & 0xF0) >> 4); + char b2 = (bytes[1] & 0x0F) << 2 | ((bytes[2] & 0xC0) >> 6); + char b3 = (bytes[2] & 0x3F); + + out_string[string_pos + 0] = EncodeBase64(b0); + out_string[string_pos + 1] = EncodeBase64(b1); + out_string[string_pos + 2] = EncodeBase64(b2); + out_string[string_pos + 3] = EncodeBase64(b3); +} + +std::string EncodeBase64(const char* data, size_t length) +{ + // calculate extra bytes needed to get a multiple of 3 + size_t extraBytes = 3 - length % 3; + + // number of base64 bytes + size_t encodedBytes = 4 * (length + extraBytes) / 3; + + std::string encoded_string(encodedBytes, '='); + + // read blocks of 3 bytes + for (size_t ib3 = 0; ib3 < length / 3; ib3++) { - uint8_t b0 = Util::DecodeBase64(in[i]); - uint8_t b1 = Util::DecodeBase64(in[i + 1]); - uint8_t b2 = Util::DecodeBase64(in[i + 2]); - uint8_t b3 = Util::DecodeBase64(in[i + 3]); - - out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); - out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); - out[j++] = (uint8_t)((b2 << 6) | b3); + const size_t iByte = ib3 * 3; + const size_t iEncodedByte = ib3 * 4; + const char* currData = &data[iByte]; + + EncodeByteBlock(currData, encoded_string, iEncodedByte); + } + + // if size of data is not a multiple of 3, also encode the final bytes (and add zeros where needed) + if (extraBytes > 0) + { + char finalBytes[4] = { 0,0,0,0 }; + memcpy(&finalBytes[0], &data[length - length % 3], length % 3); + + const size_t iEncodedByte = encodedBytes - 4; + EncodeByteBlock(&finalBytes[0], encoded_string, iEncodedByte); + + // add '=' at the end + for (size_t i = 0; i < 4 * extraBytes / 3; i++) + encoded_string[encodedBytes - i - 1] = '='; } - return outLength; + return encoded_string; } } // !Util diff --git a/thirdparty/assimp/code/FBXUtil.h b/thirdparty/assimp/code/FBX/FBXUtil.h index 6890e015ba..b634418858 100644 --- a/thirdparty/assimp/code/FBXUtil.h +++ b/thirdparty/assimp/code/FBX/FBXUtil.h @@ -78,7 +78,7 @@ const char* TokenTypeString(TokenType t); * @param line Line index, 1-based * @param column Column index, 1-based * @return A string of the following format: {prefix} (offset 0x{offset}) {text}*/ -std::string AddOffset(const std::string& prefix, const std::string& text, unsigned int offset); +std::string AddOffset(const std::string& prefix, const std::string& text, size_t offset); /** Format log/error messages using a given line location in the source file. @@ -105,13 +105,30 @@ std::string AddTokenText(const std::string& prefix, const std::string& text, con * @return decoded byte value*/ uint8_t DecodeBase64(char ch); +/** Compute decoded size of a Base64-encoded string +* +* @param in Characters to decode. +* @param inLength Number of characters to decode. +* @return size of the decoded data (number of bytes)*/ +size_t ComputeDecodedSizeBase64(const char* in, size_t inLength); + /** Decode a Base64-encoded string * * @param in Characters to decode. * @param inLength Number of characters to decode. -* @param out Reference to pointer where we will store the decoded data. +* @param out Pointer where we will store the decoded data. +* @param maxOutLength Size of output buffer. * @return size of the decoded data (number of bytes)*/ -size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out); +size_t DecodeBase64(const char* in, size_t inLength, uint8_t* out, size_t maxOutLength); + +char EncodeBase64(char byte); + +/** Encode bytes in base64-encoding +* +* @param data Binary data to encode. +* @param inLength Number of bytes to encode. +* @return base64-encoded string*/ +std::string EncodeBase64(const char* data, size_t length); } } diff --git a/thirdparty/assimp/code/FIReader.cpp b/thirdparty/assimp/code/FIReader.cpp deleted file mode 100644 index 2116316ca3..0000000000 --- a/thirdparty/assimp/code/FIReader.cpp +++ /dev/null @@ -1,1834 +0,0 @@ -/* -Open Asset Import Library (assimp) ----------------------------------------------------------------------- - -Copyright (c) 2006-2019, assimp team - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the -following conditions are met: - -* Redistributions of source code must retain the above -copyright notice, this list of conditions and the -following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the -following disclaimer in the documentation and/or other -materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its -contributors may be used to endorse or promote products -derived from this software without specific prior -written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ----------------------------------------------------------------------- -*/ -/// \file FIReader.cpp -/// \brief Reader for Fast Infoset encoded binary XML files. -/// \date 2017 -/// \author Patrick Daehne - -#ifndef ASSIMP_BUILD_NO_X3D_IMPORTER - -#include "FIReader.hpp" -#include <assimp/StringUtils.h> - -// Workaround for issue #1361 -// https://github.com/assimp/assimp/issues/1361 -#ifdef __ANDROID__ -# define _GLIBCXX_USE_C99 1 -#endif - -#include <assimp/Exceptional.h> -#include <assimp/IOStream.hpp> -#include <assimp/types.h> -#include <assimp/MemoryIOWrapper.h> -#include <assimp/irrXMLWrapper.h> -#include "../contrib/utf8cpp/source/utf8.h" -#include <assimp/fast_atof.h> -#include <stack> -#include <map> -#include <iostream> -#include <sstream> -#include <iomanip> - -namespace Assimp { - -static const std::string parseErrorMessage = "Fast Infoset parse error"; - -static const char *xmlDeclarations[] = { - "<?xml encoding='finf'?>", - "<?xml encoding='finf' standalone='yes'?>", - "<?xml encoding='finf' standalone='no'?>", - "<?xml version='1.0' encoding='finf'?>", - "<?xml version='1.0' encoding='finf' standalone='yes'?>", - "<?xml version='1.0' encoding='finf' standalone='no'?>", - "<?xml version='1.1' encoding='finf'?>", - "<?xml version='1.1' encoding='finf' standalone='yes'?>", - "<?xml version='1.1' encoding='finf' standalone='no'?>" -}; - -static size_t parseMagic(const uint8_t *data, const uint8_t *dataEnd) { - if (dataEnd - data < 4) { - return 0; - } - uint32_t magic = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; - switch (magic) { - case 0xe0000001: - return 4; - case 0x3c3f786d: // "<?xm" - { - size_t xmlDeclarationsLength = sizeof(xmlDeclarations) / sizeof(xmlDeclarations[0]); - for (size_t i = 0; i < xmlDeclarationsLength; ++i) { - auto xmlDeclaration = xmlDeclarations[i]; - ptrdiff_t xmlDeclarationLength = strlen(xmlDeclaration); - if ((dataEnd - data >= xmlDeclarationLength) && (memcmp(xmlDeclaration, data, xmlDeclarationLength) == 0)) { - data += xmlDeclarationLength; - if (dataEnd - data < 4) { - return 0; - } - magic = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; - return magic == 0xe0000001 ? xmlDeclarationLength + 4 : 0; - } - } - return 0; - } - default: - return 0; - } -} - -static std::string parseUTF8String(const uint8_t *data, size_t len) { - return std::string((char*)data, len); -} - -static std::string parseUTF16String(const uint8_t *data, size_t len) { - if (len & 1) { - throw DeadlyImportError(parseErrorMessage); - } - size_t numShorts = len / 2; - std::vector<short> utf16; - utf16.reserve(numShorts); - for (size_t i = 0; i < numShorts; ++i) { - short v = (data[0] << 8) | data[1]; - utf16.push_back(v); - data += 2; - } - std::string result; - utf8::utf16to8(utf16.begin(), utf16.end(), back_inserter(result)); - return result; -} - -struct FIStringValueImpl: public FIStringValue { - inline FIStringValueImpl(std::string &&value_) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { return value; } -}; - -std::shared_ptr<FIStringValue> FIStringValue::create(std::string &&value) { - return std::make_shared<FIStringValueImpl>(std::move(value)); -} - -struct FIHexValueImpl: public FIHexValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIHexValueImpl(std::vector<uint8_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - os << std::hex << std::uppercase << std::setfill('0'); - std::for_each(value.begin(), value.end(), [&](uint8_t c) { os << std::setw(2) << static_cast<int>(c); }); - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FIHexValue> FIHexValue::create(std::vector<uint8_t> &&value) { - return std::make_shared<FIHexValueImpl>(std::move(value)); -} - -struct FIBase64ValueImpl: public FIBase64Value { - mutable std::string strValue; - mutable bool strValueValid; - inline FIBase64ValueImpl(std::vector<uint8_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - uint8_t c1 = 0, c2; - int imod3 = 0; - std::vector<uint8_t>::size_type valueSize = value.size(); - for (std::vector<uint8_t>::size_type i = 0; i < valueSize; ++i) { - c2 = value[i]; - switch (imod3) { - case 0: - os << basis_64[c2 >> 2]; - imod3 = 1; - break; - case 1: - os << basis_64[((c1 & 0x03) << 4) | ((c2 & 0xf0) >> 4)]; - imod3 = 2; - break; - case 2: - os << basis_64[((c1 & 0x0f) << 2) | ((c2 & 0xc0) >> 6)] << basis_64[c2 & 0x3f]; - imod3 = 0; - break; - } - c1 = c2; - } - switch (imod3) { - case 1: - os << basis_64[(c1 & 0x03) << 4] << "=="; - break; - case 2: - os << basis_64[(c1 & 0x0f) << 2] << '='; - break; - } - strValue = os.str(); - } - return strValue; - }; - static const char basis_64[]; -}; - -const char FIBase64ValueImpl::basis_64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -std::shared_ptr<FIBase64Value> FIBase64Value::create(std::vector<uint8_t> &&value) { - return std::make_shared<FIBase64ValueImpl>(std::move(value)); -} - -struct FIShortValueImpl: public FIShortValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIShortValueImpl(std::vector<int16_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](int16_t s) { if (++n > 1) os << ' '; os << s; }); - strValue = os.str(); - } - return strValue; - } -}; - -std::shared_ptr<FIShortValue> FIShortValue::create(std::vector<int16_t> &&value) { - return std::make_shared<FIShortValueImpl>(std::move(value)); -} - -struct FIIntValueImpl: public FIIntValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIIntValueImpl(std::vector<int32_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](int32_t i) { if (++n > 1) os << ' '; os << i; }); - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FIIntValue> FIIntValue::create(std::vector<int32_t> &&value) { - return std::make_shared<FIIntValueImpl>(std::move(value)); -} - -struct FILongValueImpl: public FILongValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FILongValueImpl(std::vector<int64_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](int64_t l) { if (++n > 1) os << ' '; os << l; }); - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FILongValue> FILongValue::create(std::vector<int64_t> &&value) { - return std::make_shared<FILongValueImpl>(std::move(value)); -} - -struct FIBoolValueImpl: public FIBoolValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIBoolValueImpl(std::vector<bool> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - os << std::boolalpha; - int n = 0; - std::for_each(value.begin(), value.end(), [&](bool b) { if (++n > 1) os << ' '; os << b; }); - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FIBoolValue> FIBoolValue::create(std::vector<bool> &&value) { - return std::make_shared<FIBoolValueImpl>(std::move(value)); -} - -struct FIFloatValueImpl: public FIFloatValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIFloatValueImpl(std::vector<float> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](float f) { if (++n > 1) os << ' '; os << f; }); - strValue = os.str(); - } - return strValue; - } -}; - -std::shared_ptr<FIFloatValue> FIFloatValue::create(std::vector<float> &&value) { - return std::make_shared<FIFloatValueImpl>(std::move(value)); -} - -struct FIDoubleValueImpl: public FIDoubleValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIDoubleValueImpl(std::vector<double> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - int n = 0; - std::for_each(value.begin(), value.end(), [&](double d) { if (++n > 1) os << ' '; os << d; }); - strValue = os.str(); - } - return strValue; - } -}; - -std::shared_ptr<FIDoubleValue> FIDoubleValue::create(std::vector<double> &&value) { - return std::make_shared<FIDoubleValueImpl>(std::move(value)); -} - -struct FIUUIDValueImpl: public FIUUIDValue { - mutable std::string strValue; - mutable bool strValueValid; - inline FIUUIDValueImpl(std::vector<uint8_t> &&value_): strValueValid(false) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { - if (!strValueValid) { - strValueValid = true; - std::ostringstream os; - os << std::hex << std::uppercase << std::setfill('0'); - std::vector<uint8_t>::size_type valueSize = value.size(); - for (std::vector<uint8_t>::size_type i = 0; i < valueSize; ++i) { - switch (i & 15) { - case 0: - if (i > 0) { - os << ' '; - } - os << std::setw(2) << static_cast<int>(value[i]); - break; - case 4: - case 6: - case 8: - case 10: - os << '-'; - // intentionally fall through! - case 1: - case 2: - case 3: - case 5: - case 7: - case 9: - case 11: - case 12: - case 13: - case 14: - case 15: - os << std::setw(2) << static_cast<int>(value[i]); - break; - } - } - strValue = os.str(); - } - return strValue; - }; -}; - -std::shared_ptr<FIUUIDValue> FIUUIDValue::create(std::vector<uint8_t> &&value) { - return std::make_shared<FIUUIDValueImpl>(std::move(value)); -} - -struct FICDATAValueImpl: public FICDATAValue { - inline FICDATAValueImpl(std::string &&value_) { value = std::move(value_); } - virtual const std::string &toString() const /*override*/ { return value; } -}; - -std::shared_ptr<FICDATAValue> FICDATAValue::create(std::string &&value) { - return std::make_shared<FICDATAValueImpl>(std::move(value)); -} - -struct FIHexDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - return FIHexValue::create(std::vector<uint8_t>(data, data + len)); - } -}; - -struct FIBase64Decoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - return FIBase64Value::create(std::vector<uint8_t>(data, data + len)); - } -}; - -struct FIShortDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 1) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<int16_t> value; - size_t numShorts = len / 2; - value.reserve(numShorts); - for (size_t i = 0; i < numShorts; ++i) { - int16_t v = (data[0] << 8) | data[1]; - value.push_back(v); - data += 2; - } - return FIShortValue::create(std::move(value)); - } -}; - -struct FIIntDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 3) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<int32_t> value; - size_t numInts = len / 4; - value.reserve(numInts); - for (size_t i = 0; i < numInts; ++i) { - int32_t v = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; - value.push_back(v); - data += 4; - } - return FIIntValue::create(std::move(value)); - } -}; - -struct FILongDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 7) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<int64_t> value; - size_t numLongs = len / 8; - value.reserve(numLongs); - for (size_t i = 0; i < numLongs; ++i) { - int64_t b0 = data[0], b1 = data[1], b2 = data[2], b3 = data[3], b4 = data[4], b5 = data[5], b6 = data[6], b7 = data[7]; - int64_t v = (b0 << 56) | (b1 << 48) | (b2 << 40) | (b3 << 32) | (b4 << 24) | (b5 << 16) | (b6 << 8) | b7; - value.push_back(v); - data += 8; - } - return FILongValue::create(std::move(value)); - } -}; - -struct FIBoolDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len < 1) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<bool> value; - uint8_t b = *data++; - size_t unusedBits = b >> 4; - size_t numBools = (len * 8) - 4 - unusedBits; - value.reserve(numBools); - uint8_t mask = 1 << 3; - for (size_t i = 0; i < numBools; ++i) { - if (!mask) { - mask = 1 << 7; - b = *data++; - } - value.push_back((b & mask) != 0); - } - return FIBoolValue::create(std::move(value)); - } -}; - -struct FIFloatDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 3) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<float> value; - size_t numFloats = len / 4; - value.reserve(numFloats); - for (size_t i = 0; i < numFloats; ++i) { - int v = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; - float f; - memcpy(&f, &v, 4); - value.push_back(f); - data += 4; - } - return FIFloatValue::create(std::move(value)); - } -}; - -struct FIDoubleDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 7) { - throw DeadlyImportError(parseErrorMessage); - } - std::vector<double> value; - size_t numDoubles = len / 8; - value.reserve(numDoubles); - for (size_t i = 0; i < numDoubles; ++i) { - long long b0 = data[0], b1 = data[1], b2 = data[2], b3 = data[3], b4 = data[4], b5 = data[5], b6 = data[6], b7 = data[7]; - long long v = (b0 << 56) | (b1 << 48) | (b2 << 40) | (b3 << 32) | (b4 << 24) | (b5 << 16) | (b6 << 8) | b7; - double f; - memcpy(&f, &v, 8); - value.push_back(f); - data += 8; - } - return FIDoubleValue::create(std::move(value)); - } -}; - -struct FIUUIDDecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - if (len & 15) { - throw DeadlyImportError(parseErrorMessage); - } - return FIUUIDValue::create(std::vector<uint8_t>(data, data + len)); - } -}; - -struct FICDATADecoder: public FIDecoder { - virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) /*override*/ { - return FICDATAValue::create(parseUTF8String(data, len)); - } -}; - -class CFIReaderImpl: public FIReader { -public: - - CFIReaderImpl(std::unique_ptr<uint8_t[]> data_, size_t size): - data(std::move(data_)), dataP(data.get()), dataEnd(data.get() + size), currentNodeType(irr::io::EXN_NONE), - emptyElement(false), headerPending(true), terminatorPending(false) - {} - - virtual ~CFIReaderImpl() {} - - virtual bool read() /*override*/ { - if (headerPending) { - headerPending = false; - parseHeader(); - } - if (terminatorPending) { - terminatorPending = false; - if (elementStack.empty()) { - return false; - } - else { - nodeName = elementStack.top(); - elementStack.pop(); - currentNodeType = nodeName.empty() ? irr::io::EXN_UNKNOWN : irr::io::EXN_ELEMENT_END; - return true; - } - } - if (dataP >= dataEnd) { - return false; - } - uint8_t b = *dataP; - if (b < 0x80) { // Element (C.2.11.2, C.3.7.2) - // C.3 - parseElement(); - return true; - } - else if (b < 0xc0) { // Characters (C.3.7.5) - // C.7 - auto chars = parseNonIdentifyingStringOrIndex3(vocabulary.charactersTable); - nodeName = chars->toString(); - currentNodeType = irr::io::EXN_TEXT; - return true; - } - else if (b < 0xe0) { - if ((b & 0xfc) == 0xc4) { // DTD (C.2.11.5) - // C.9 - ++dataP; - if (b & 0x02) { - /*const std::string &systemID =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - if (b & 0x01) { - /*const std::string &publicID =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - elementStack.push(EmptyString); - currentNodeType = irr::io::EXN_UNKNOWN; - return true; - } - else if ((b & 0xfc) == 0xc8) { // Unexpanded entity reference (C.3.7.4) - // C.6 - ++dataP; - /*const std::string &name =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - if (b & 0x02) { - /*const std::string &systemID =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - if (b & 0x01) { - /*const std::string &publicID =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - currentNodeType = irr::io::EXN_UNKNOWN; - return true; - } - } - else if (b < 0xf0) { - if (b == 0xe1) { // Processing instruction (C.2.11.3, C.3.7.3) - // C.5 - ++dataP; - /*const std::string &target =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::shared_ptr<const FIValue> data =*/ parseNonIdentifyingStringOrIndex1(vocabulary.otherStringTable); - currentNodeType = irr::io::EXN_UNKNOWN; - return true; - } - else if (b == 0xe2) { // Comment (C.2.11.4, C.3.7.6) - // C.8 - ++dataP; - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - std::shared_ptr<const FIValue> comment = parseNonIdentifyingStringOrIndex1(vocabulary.otherStringTable); - nodeName = comment->toString(); - currentNodeType = irr::io::EXN_COMMENT; - return true; - } - } - else { // Terminator (C.2.12, C.3.8) - ++dataP; - if (b == 0xff) { - terminatorPending = true; - } - if (elementStack.empty()) { - return false; - } - else { - nodeName = elementStack.top(); - elementStack.pop(); - currentNodeType = nodeName.empty() ? irr::io::EXN_UNKNOWN : irr::io::EXN_ELEMENT_END; - return true; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - virtual irr::io::EXML_NODE getNodeType() const /*override*/ { - return currentNodeType; - } - - virtual int getAttributeCount() const /*override*/ { - return static_cast<int>(attributes.size()); - } - - virtual const char* getAttributeName(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return nullptr; - } - return attributes[idx].name.c_str(); - } - - virtual const char* getAttributeValue(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return nullptr; - } - return attributes[idx].value->toString().c_str(); - } - - virtual const char* getAttributeValue(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return nullptr; - } - return attr->value->toString().c_str(); - } - - virtual const char* getAttributeValueSafe(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return EmptyString.c_str(); - } - return attr->value->toString().c_str(); - } - - virtual int getAttributeValueAsInt(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return 0; - } - std::shared_ptr<const FIIntValue> intValue = std::dynamic_pointer_cast<const FIIntValue>(attr->value); - if (intValue) { - return intValue->value.size() == 1 ? intValue->value.front() : 0; - } - return atoi(attr->value->toString().c_str()); - } - - virtual int getAttributeValueAsInt(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return 0; - } - std::shared_ptr<const FIIntValue> intValue = std::dynamic_pointer_cast<const FIIntValue>(attributes[idx].value); - if (intValue) { - return intValue->value.size() == 1 ? intValue->value.front() : 0; - } - return atoi(attributes[idx].value->toString().c_str()); - } - - virtual float getAttributeValueAsFloat(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return 0; - } - std::shared_ptr<const FIFloatValue> floatValue = std::dynamic_pointer_cast<const FIFloatValue>(attr->value); - if (floatValue) { - return floatValue->value.size() == 1 ? floatValue->value.front() : 0; - } - - return fast_atof(attr->value->toString().c_str()); - } - - virtual float getAttributeValueAsFloat(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return 0; - } - std::shared_ptr<const FIFloatValue> floatValue = std::dynamic_pointer_cast<const FIFloatValue>(attributes[idx].value); - if (floatValue) { - return floatValue->value.size() == 1 ? floatValue->value.front() : 0; - } - return fast_atof(attributes[idx].value->toString().c_str()); - } - - virtual const char* getNodeName() const /*override*/ { - return nodeName.c_str(); - } - - virtual const char* getNodeData() const /*override*/ { - return nodeName.c_str(); - } - - virtual bool isEmptyElement() const /*override*/ { - return emptyElement; - } - - virtual irr::io::ETEXT_FORMAT getSourceFormat() const /*override*/ { - return irr::io::ETF_UTF8; - } - - virtual irr::io::ETEXT_FORMAT getParserFormat() const /*override*/ { - return irr::io::ETF_UTF8; - } - - virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(int idx) const /*override*/ { - if (idx < 0 || idx >= (int)attributes.size()) { - return nullptr; - } - return attributes[idx].value; - } - - virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(const char* name) const /*override*/ { - const Attribute* attr = getAttributeByName(name); - if (!attr) { - return nullptr; - } - return attr->value; - } - - virtual void registerDecoder(const std::string &algorithmUri, std::unique_ptr<FIDecoder> decoder) /*override*/ { - decoderMap[algorithmUri] = std::move(decoder); - } - - virtual void registerVocabulary(const std::string &vocabularyUri, const FIVocabulary *vocabulary) /*override*/ { - vocabularyMap[vocabularyUri] = vocabulary; - } - -private: - - struct QName { - std::string prefix; - std::string uri; - std::string name; - inline QName() {} - inline QName(const FIQName &qname): prefix(qname.prefix ? qname.prefix : ""), uri(qname.uri ? qname.uri : ""), name(qname.name) {} - }; - - struct Attribute { - QName qname; - std::string name; - std::shared_ptr<const FIValue> value; - }; - - struct Vocabulary { - std::vector<std::string> restrictedAlphabetTable; - std::vector<std::string> encodingAlgorithmTable; - std::vector<std::string> prefixTable; - std::vector<std::string> namespaceNameTable; - std::vector<std::string> localNameTable; - std::vector<std::string> otherNCNameTable; - std::vector<std::string> otherURITable; - std::vector<std::shared_ptr<const FIValue>> attributeValueTable; - std::vector<std::shared_ptr<const FIValue>> charactersTable; - std::vector<std::shared_ptr<const FIValue>> otherStringTable; - std::vector<QName> elementNameTable; - std::vector<QName> attributeNameTable; - Vocabulary() { - prefixTable.push_back("xml"); - namespaceNameTable.push_back("http://www.w3.org/XML/1998/namespace"); - } - }; - - const Attribute* getAttributeByName(const char* name) const { - if (!name) { - return 0; - } - std::string n = name; - for (int i=0; i<(int)attributes.size(); ++i) { - if (attributes[i].name == n) { - return &attributes[i]; - } - } - return 0; - } - - size_t parseInt2() { // C.25 - uint8_t b = *dataP++; - if (!(b & 0x40)) { // x0...... (C.25.2) - return b & 0x3f; - } - else if ((b & 0x60) == 0x40) { // x10..... ........ (C.25.3) - if (dataEnd - dataP > 0) { - return (((b & 0x1f) << 8) | *dataP++) + 0x40; - } - } - else if ((b & 0x70) == 0x60) { // x110.... ........ ........ (C.25.4) - if (dataEnd - dataP > 1) { - size_t result = (((b & 0x0f) << 16) | (dataP[0] << 8) | dataP[1]) + 0x2040; - dataP += 2; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - size_t parseInt3() { // C.27 - uint8_t b = *dataP++; - if (!(b & 0x20)) { // xx0..... (C.27.2) - return b & 0x1f; - } - else if ((b & 0x38) == 0x20) { // xx100... ........ (C.27.3) - if (dataEnd - dataP > 0) { - return (((b & 0x07) << 8) | *dataP++) + 0x20; - } - } - else if ((b & 0x38) == 0x28) { // xx101... ........ ........ (C.27.4) - if (dataEnd - dataP > 1) { - size_t result = (((b & 0x07) << 16) | (dataP[0] << 8) | dataP[1]) + 0x820; - dataP += 2; - return result; - } - } - else if ((b & 0x3f) == 0x30) { // xx110000 0000.... ........ ........ (C.27.5) - if ((dataEnd - dataP > 2) && !(dataP[0] & 0xf0)) { - size_t result = (((dataP[0] & 0x0f) << 16) | (dataP[1] << 8) | dataP[2]) + 0x80820; - dataP += 3; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - size_t parseInt4() { // C.28 - uint8_t b = *dataP++; - if (!(b & 0x10)) { // xxx0.... (C.28.2) - return b & 0x0f; - } - else if ((b & 0x1c) == 0x10) { // xxx100.. ........ (C.28.3) - if (dataEnd - dataP > 0) { - return (((b & 0x03) << 8) | *dataP++) + 0x10; - } - } - else if ((b & 0x1c) == 0x14) { // xxx101.. ........ ........ (C.28.4) - if (dataEnd - dataP > 1) { - size_t result = (((b & 0x03) << 16) | (dataP[0] << 8) | dataP[1]) + 0x410; - dataP += 2; - return result; - } - } - else if ((b & 0x1f) == 0x18) { // xxx11000 0000.... ........ ........ (C.28.5) - if ((dataEnd - dataP > 2) && !(dataP[0] & 0xf0)) { - size_t result = (((dataP[0] & 0x0f) << 16) | (dataP[1] << 8) | dataP[2]) + 0x40410; - dataP += 3; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - size_t parseSequenceLen() { // C.21 - if (dataEnd - dataP > 0) { - uint8_t b = *dataP++; - if (b < 0x80) { // 0....... (C.21.2) - return b; - } - else if ((b & 0xf0) == 0x80) { // 1000.... ........ ........ (C.21.3) - if (dataEnd - dataP > 1) { - size_t result = (((b & 0x0f) << 16) | (dataP[0] << 8) | dataP[1]) + 0x80; - dataP += 2; - return result; - } - } - } - throw DeadlyImportError(parseErrorMessage); - } - - std::string parseNonEmptyOctetString2() { // C.22 - // Parse the length of the string - uint8_t b = *dataP++ & 0x7f; - size_t len; - if (!(b & 0x40)) { // x0...... (C.22.3.1) - len = b + 1; - } - else if (b == 0x40) { // x1000000 ........ (C.22.3.2) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - len = *dataP++ + 0x41; - } - else if (b == 0x60) { // x1100000 ........ ........ ........ ........ (C.22.3.3) - if (dataEnd - dataP < 4) { - throw DeadlyImportError(parseErrorMessage); - } - len = ((dataP[0] << 24) | (dataP[1] << 16) | (dataP[2] << 8) | dataP[3]) + 0x141; - dataP += 4; - } - else { - throw DeadlyImportError(parseErrorMessage); - } - - // Parse the string (C.22.4) - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - std::string s = parseUTF8String(dataP, len); - dataP += len; - - return s; - } - - size_t parseNonEmptyOctetString5Length() { // C.23 - // Parse the length of the string - size_t b = *dataP++ & 0x0f; - if (!(b & 0x08)) { // xxxx0... (C.23.3.1) - return b + 1; - } - else if (b == 0x08) { // xxxx1000 ........ (C.23.3.2) - if (dataEnd - dataP > 0) { - return *dataP++ + 0x09; - } - } - else if (b == 0x0c) { // xxxx1100 ........ ........ ........ ........ (C.23.3.3) - if (dataEnd - dataP > 3) { - size_t result = ((dataP[0] << 24) | (dataP[1] << 16) | (dataP[2] << 8) | dataP[3]) + 0x109; - dataP += 4; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - size_t parseNonEmptyOctetString7Length() { // C.24 - // Parse the length of the string - size_t b = *dataP++ & 0x03; - if (!(b & 0x02)) { // xxxxxx0. (C.24.3.1) - return b + 1; - } - else if (b == 0x02) { // xxxxxx10 ........ (C.24.3.2) - if (dataEnd - dataP > 0) { - return *dataP++ + 0x3; - } - } - else if (b == 0x03) { // xxxxxx11 ........ ........ ........ ........ (C.24.3.3) - if (dataEnd - dataP > 3) { - size_t result = ((dataP[0] << 24) | (dataP[1] << 16) | (dataP[2] << 8) | dataP[3]) + 0x103; - dataP += 4; - return result; - } - } - throw DeadlyImportError(parseErrorMessage); - } - - std::shared_ptr<const FIValue> parseEncodedData(size_t index, size_t len) { - if (index < 32) { - FIDecoder *decoder = defaultDecoder[index]; - if (!decoder) { - throw DeadlyImportError("Invalid encoding algorithm index " + to_string(index)); - } - return decoder->decode(dataP, len); - } - else { - if (index - 32 >= vocabulary.encodingAlgorithmTable.size()) { - throw DeadlyImportError("Invalid encoding algorithm index " + to_string(index)); - } - std::string uri = vocabulary.encodingAlgorithmTable[index - 32]; - auto it = decoderMap.find(uri); - if (it == decoderMap.end()) { - throw DeadlyImportError("Unsupported encoding algorithm " + uri); - } - else { - return it->second->decode(dataP, len); - } - } - } - - std::shared_ptr<const FIValue> parseRestrictedAlphabet(size_t index, size_t len) { - std::string alphabet; - if (index < 16) { - switch (index) { - case 0: // numeric - alphabet = "0123456789-+.e "; - break; - case 1: // date and time - alphabet = "0123456789-:TZ "; - break; - default: - throw DeadlyImportError("Invalid restricted alphabet index " + to_string(index)); - } - } - else { - if (index - 16 >= vocabulary.restrictedAlphabetTable.size()) { - throw DeadlyImportError("Invalid restricted alphabet index " + to_string(index)); - } - alphabet = vocabulary.restrictedAlphabetTable[index - 16]; - } - std::vector<uint32_t> alphabetUTF32; - utf8::utf8to32(alphabet.begin(), alphabet.end(), back_inserter(alphabetUTF32)); - std::string::size_type alphabetLength = alphabetUTF32.size(); - if (alphabetLength < 2) { - throw DeadlyImportError("Invalid restricted alphabet length " + to_string(alphabetLength)); - } - std::string::size_type bitsPerCharacter = 1; - while ((1ull << bitsPerCharacter) <= alphabetLength) { - ++bitsPerCharacter; - } - size_t bitsAvail = 0; - uint8_t mask = (1 << bitsPerCharacter) - 1; - uint32_t bits = 0; - std::string s; - for (size_t i = 0; i < len; ++i) { - bits = (bits << 8) | dataP[i]; - bitsAvail += 8; - while (bitsAvail >= bitsPerCharacter) { - bitsAvail -= bitsPerCharacter; - size_t charIndex = (bits >> bitsAvail) & mask; - if (charIndex < alphabetLength) { - s.push_back(alphabetUTF32[charIndex]); - } - else if (charIndex != mask) { - throw DeadlyImportError(parseErrorMessage); - } - } - } - return FIStringValue::create(std::move(s)); - } - - std::shared_ptr<const FIValue> parseEncodedCharacterString3() { // C.19 - std::shared_ptr<const FIValue> result; - size_t len; - uint8_t b = *dataP; - if (b & 0x20) { - ++dataP; - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - size_t index = ((b & 0x0f) << 4) | ((*dataP & 0xf0) >> 4); // C.29 - len = parseNonEmptyOctetString5Length(); - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - if (b & 0x10) { - // encoding algorithm (C.19.3.4) - result = parseEncodedData(index, len); - } - else { - // Restricted alphabet (C.19.3.3) - result = parseRestrictedAlphabet(index, len); - } - } - else { - len = parseNonEmptyOctetString5Length(); - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - if (b & 0x10) { - // UTF-16 (C.19.3.2) - if (len & 1) { - throw DeadlyImportError(parseErrorMessage); - } - result = FIStringValue::create(parseUTF16String(dataP, len)); - } - else { - // UTF-8 (C.19.3.1) - result = FIStringValue::create(parseUTF8String(dataP, len)); - } - } - dataP += len; - return result; - } - - std::shared_ptr<const FIValue> parseEncodedCharacterString5() { // C.20 - std::shared_ptr<const FIValue> result; - size_t len; - uint8_t b = *dataP; - if (b & 0x08) { - ++dataP; - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - size_t index = ((b & 0x03) << 6) | ((*dataP & 0xfc) >> 2); /* C.29 */ - len = parseNonEmptyOctetString7Length(); - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - if (b & 0x04) { - // encoding algorithm (C.20.3.4) - result = parseEncodedData(index, len); - } - else { - // Restricted alphabet (C.20.3.3) - result = parseRestrictedAlphabet(index, len); - } - } - else { - len = parseNonEmptyOctetString7Length(); - if (dataEnd - dataP < static_cast<ptrdiff_t>(len)) { - throw DeadlyImportError(parseErrorMessage); - } - if (b & 0x04) { - // UTF-16 (C.20.3.2) - if (len & 1) { - throw DeadlyImportError(parseErrorMessage); - } - result = FIStringValue::create(parseUTF16String(dataP, len)); - } - else { - // UTF-8 (C.20.3.1) - result = FIStringValue::create(parseUTF8String(dataP, len)); - } - } - dataP += len; - return result; - } - - const std::string &parseIdentifyingStringOrIndex(std::vector<std::string> &stringTable) { // C.13 - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b = *dataP; - if (b & 0x80) { - // We have an index (C.13.4) - size_t index = parseInt2(); - if (index >= stringTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return stringTable[index]; - } - else { - // We have a string (C.13.3) - stringTable.push_back(parseNonEmptyOctetString2()); - return stringTable.back(); - } - } - - QName parseNameSurrogate() { // C.16 - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b = *dataP++; - if (b & 0xfc) { // Padding '000000' C.2.5.5 - throw DeadlyImportError(parseErrorMessage); - } - QName result; - size_t index; - if (b & 0x02) { // prefix (C.16.3) - if ((dataEnd - dataP < 1) || (*dataP & 0x80)) { - throw DeadlyImportError(parseErrorMessage); - } - index = parseInt2(); - if (index >= vocabulary.prefixTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - result.prefix = vocabulary.prefixTable[index]; - } - if (b & 0x01) { // namespace-name (C.16.4) - if ((dataEnd - dataP < 1) || (*dataP & 0x80)) { - throw DeadlyImportError(parseErrorMessage); - } - index = parseInt2(); - if (index >= vocabulary.namespaceNameTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - result.uri = vocabulary.namespaceNameTable[index]; - } - // local-name - if ((dataEnd - dataP < 1) || (*dataP & 0x80)) { - throw DeadlyImportError(parseErrorMessage); - } - index = parseInt2(); - if (index >= vocabulary.localNameTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - result.name = vocabulary.localNameTable[index]; - return result; - } - - const QName &parseQualifiedNameOrIndex2(std::vector<QName> &qNameTable) { // C.17 - uint8_t b = *dataP; - if ((b & 0x7c) == 0x78) { // x11110.. - // We have a literal (C.17.3) - ++dataP; - QName result; - // prefix (C.17.3.1) - result.prefix = b & 0x02 ? parseIdentifyingStringOrIndex(vocabulary.prefixTable) : std::string(); - // namespace-name (C.17.3.1) - result.uri = b & 0x01 ? parseIdentifyingStringOrIndex(vocabulary.namespaceNameTable) : std::string(); - // local-name - result.name = parseIdentifyingStringOrIndex(vocabulary.localNameTable); - qNameTable.push_back(result); - return qNameTable.back(); - } - else { - // We have an index (C.17.4) - size_t index = parseInt2(); - if (index >= qNameTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return qNameTable[index]; - } - } - - const QName &parseQualifiedNameOrIndex3(std::vector<QName> &qNameTable) { // C.18 - uint8_t b = *dataP; - if ((b & 0x3c) == 0x3c) { // xx1111.. - // We have a literal (C.18.3) - ++dataP; - QName result; - // prefix (C.18.3.1) - result.prefix = b & 0x02 ? parseIdentifyingStringOrIndex(vocabulary.prefixTable) : std::string(); - // namespace-name (C.18.3.1) - result.uri = b & 0x01 ? parseIdentifyingStringOrIndex(vocabulary.namespaceNameTable) : std::string(); - // local-name - result.name = parseIdentifyingStringOrIndex(vocabulary.localNameTable); - qNameTable.push_back(result); - return qNameTable.back(); - } - else { - // We have an index (C.18.4) - size_t index = parseInt3(); - if (index >= qNameTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return qNameTable[index]; - } - } - - std::shared_ptr<const FIValue> parseNonIdentifyingStringOrIndex1(std::vector<std::shared_ptr<const FIValue>> &valueTable) { // C.14 - uint8_t b = *dataP; - if (b == 0xff) { // C.26.2 - // empty string - ++dataP; - return EmptyFIString; - } - else if (b & 0x80) { // C.14.4 - // We have an index - size_t index = parseInt2(); - if (index >= valueTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return valueTable[index]; - } - else { // C.14.3 - // We have a literal - std::shared_ptr<const FIValue> result = parseEncodedCharacterString3(); - if (b & 0x40) { // C.14.3.1 - valueTable.push_back(result); - } - return result; - } - } - - std::shared_ptr<const FIValue> parseNonIdentifyingStringOrIndex3(std::vector<std::shared_ptr<const FIValue>> &valueTable) { // C.15 - uint8_t b = *dataP; - if (b & 0x20) { // C.15.4 - // We have an index - size_t index = parseInt4(); - if (index >= valueTable.size()) { - throw DeadlyImportError(parseErrorMessage); - } - return valueTable[index]; - } - else { // C.15.3 - // We have a literal - std::shared_ptr<const FIValue> result = parseEncodedCharacterString5(); - if (b & 0x10) { // C.15.3.1 - valueTable.push_back(result); - } - return result; - } - } - - void parseElement() { - // C.3 - - attributes.clear(); - - uint8_t b = *dataP; - bool hasAttributes = (b & 0x40) != 0; // C.3.3 - if ((b & 0x3f) == 0x38) { // C.3.4.1 - // Parse namespaces - ++dataP; - for (;;) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - b = *dataP++; - if (b == 0xf0) { // C.3.4.3 - break; - } - if ((b & 0xfc) != 0xcc) { // C.3.4.2 - throw DeadlyImportError(parseErrorMessage); - } - // C.12 - Attribute attr; - attr.qname.prefix = "xmlns"; - attr.qname.name = b & 0x02 ? parseIdentifyingStringOrIndex(vocabulary.prefixTable) : std::string(); - attr.qname.uri = b & 0x01 ? parseIdentifyingStringOrIndex(vocabulary.namespaceNameTable) : std::string(); - attr.name = attr.qname.name.empty() ? "xmlns" : "xmlns:" + attr.qname.name; - attr.value = FIStringValue::create(std::string(attr.qname.uri)); - attributes.push_back(attr); - } - if ((dataEnd - dataP < 1) || (*dataP & 0xc0)) { - throw DeadlyImportError(parseErrorMessage); - } - } - - // Parse Element name (C.3.5) - const QName &elemName = parseQualifiedNameOrIndex3(vocabulary.elementNameTable); - nodeName = elemName.prefix.empty() ? elemName.name : elemName.prefix + ':' + elemName.name; - - if (hasAttributes) { - for (;;) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - b = *dataP; - if (b < 0x80) { // C.3.6.1 - // C.4 - Attribute attr; - attr.qname = parseQualifiedNameOrIndex2(vocabulary.attributeNameTable); - attr.name = attr.qname.prefix.empty() ? attr.qname.name : attr.qname.prefix + ':' + attr.qname.name; - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - attr.value = parseNonIdentifyingStringOrIndex1(vocabulary.attributeValueTable); - attributes.push_back(attr); - } - else { - if ((b & 0xf0) != 0xf0) { // C.3.6.2 - throw DeadlyImportError(parseErrorMessage); - } - emptyElement = b == 0xff; // C.3.6.2, C.3.8 - ++dataP; - break; - } - } - } - else { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - b = *dataP; - switch (b) { - case 0xff: - terminatorPending = true; - // Intentionally fall through - case 0xf0: - emptyElement = true; - ++dataP; - break; - default: - emptyElement = false; - } - } - if (!emptyElement) { - elementStack.push(nodeName); - } - - currentNodeType = irr::io::EXN_ELEMENT; - } - - void parseHeader() { - // Parse header (C.1.3) - size_t magicSize = parseMagic(dataP, dataEnd); - if (!magicSize) { - throw DeadlyImportError(parseErrorMessage); - } - dataP += magicSize; - // C.2.3 - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b = *dataP++; - if (b & 0x40) { - // Parse additional data (C.2.4) - size_t len = parseSequenceLen(); - for (size_t i = 0; i < len; ++i) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::string id =*/ parseNonEmptyOctetString2(); - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::string data =*/ parseNonEmptyOctetString2(); - } - } - if (b & 0x20) { - // Parse initial vocabulary (C.2.5) - if (dataEnd - dataP < 2) { - throw DeadlyImportError(parseErrorMessage); - } - uint16_t b1 = (dataP[0] << 8) | dataP[1]; - dataP += 2; - if (b1 & 0x1000) { - // External vocabulary (C.2.5.2) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - std::string uri = parseNonEmptyOctetString2(); - auto it = vocabularyMap.find(uri); - if (it == vocabularyMap.end()) { - throw DeadlyImportError("Unknown vocabulary " + uri); - } - const FIVocabulary *externalVocabulary = it->second; - if (externalVocabulary->restrictedAlphabetTable) { - std::copy(externalVocabulary->restrictedAlphabetTable, externalVocabulary->restrictedAlphabetTable + externalVocabulary->restrictedAlphabetTableSize, std::back_inserter(vocabulary.restrictedAlphabetTable)); - } - if (externalVocabulary->encodingAlgorithmTable) { - std::copy(externalVocabulary->encodingAlgorithmTable, externalVocabulary->encodingAlgorithmTable + externalVocabulary->encodingAlgorithmTableSize, std::back_inserter(vocabulary.encodingAlgorithmTable)); - } - if (externalVocabulary->prefixTable) { - std::copy(externalVocabulary->prefixTable, externalVocabulary->prefixTable + externalVocabulary->prefixTableSize, std::back_inserter(vocabulary.prefixTable)); - } - if (externalVocabulary->namespaceNameTable) { - std::copy(externalVocabulary->namespaceNameTable, externalVocabulary->namespaceNameTable + externalVocabulary->namespaceNameTableSize, std::back_inserter(vocabulary.namespaceNameTable)); - } - if (externalVocabulary->localNameTable) { - std::copy(externalVocabulary->localNameTable, externalVocabulary->localNameTable + externalVocabulary->localNameTableSize, std::back_inserter(vocabulary.localNameTable)); - } - if (externalVocabulary->otherNCNameTable) { - std::copy(externalVocabulary->otherNCNameTable, externalVocabulary->otherNCNameTable + externalVocabulary->otherNCNameTableSize, std::back_inserter(vocabulary.otherNCNameTable)); - } - if (externalVocabulary->otherURITable) { - std::copy(externalVocabulary->otherURITable, externalVocabulary->otherURITable + externalVocabulary->otherURITableSize, std::back_inserter(vocabulary.otherURITable)); - } - if (externalVocabulary->attributeValueTable) { - std::copy(externalVocabulary->attributeValueTable, externalVocabulary->attributeValueTable + externalVocabulary->attributeValueTableSize, std::back_inserter(vocabulary.attributeValueTable)); - } - if (externalVocabulary->charactersTable) { - std::copy(externalVocabulary->charactersTable, externalVocabulary->charactersTable + externalVocabulary->charactersTableSize, std::back_inserter(vocabulary.charactersTable)); - } - if (externalVocabulary->otherStringTable) { - std::copy(externalVocabulary->otherStringTable, externalVocabulary->otherStringTable + externalVocabulary->otherStringTableSize, std::back_inserter(vocabulary.otherStringTable)); - } - if (externalVocabulary->elementNameTable) { - std::copy(externalVocabulary->elementNameTable, externalVocabulary->elementNameTable + externalVocabulary->elementNameTableSize, std::back_inserter(vocabulary.elementNameTable)); - } - if (externalVocabulary->attributeNameTable) { - std::copy(externalVocabulary->attributeNameTable, externalVocabulary->attributeNameTable + externalVocabulary->attributeNameTableSize, std::back_inserter(vocabulary.attributeNameTable)); - } - } - if (b1 & 0x0800) { - // Parse restricted alphabets (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.restrictedAlphabetTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0400) { - // Parse encoding algorithms (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.encodingAlgorithmTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0200) { - // Parse prefixes (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.prefixTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0100) { - // Parse namespace names (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.namespaceNameTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0080) { - // Parse local names (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.localNameTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0040) { - // Parse other ncnames (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.otherNCNameTable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0020) { - // Parse other uris (C.2.5.3) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.otherURITable.push_back(parseNonEmptyOctetString2()); - } - } - if (b1 & 0x0010) { - // Parse attribute values (C.2.5.4) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.attributeValueTable.push_back(parseEncodedCharacterString3()); - } - } - if (b1 & 0x0008) { - // Parse content character chunks (C.2.5.4) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.charactersTable.push_back(parseEncodedCharacterString3()); - } - } - if (b1 & 0x0004) { - // Parse other strings (C.2.5.4) - for (size_t len = parseSequenceLen(); len > 0; --len) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - vocabulary.otherStringTable.push_back(parseEncodedCharacterString3()); - } - } - if (b1 & 0x0002) { - // Parse element name surrogates (C.2.5.5) - for (size_t len = parseSequenceLen(); len > 0; --len) { - vocabulary.elementNameTable.push_back(parseNameSurrogate()); - } - } - if (b1 & 0x0001) { - // Parse attribute name surrogates (C.2.5.5) - for (size_t len = parseSequenceLen(); len > 0; --len) { - vocabulary.attributeNameTable.push_back(parseNameSurrogate()); - } - } - } - if (b & 0x10) { - // Parse notations (C.2.6) - for (;;) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b1 = *dataP++; - if (b1 == 0xf0) { - break; - } - if ((b1 & 0xfc) != 0xc0) { - throw DeadlyImportError(parseErrorMessage); - } - /* C.11 */ - /*const std::string &name =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - if (b1 & 0x02) { - /*const std::string &systemId =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - if (b1 & 0x01) { - /*const std::string &publicId =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - } - } - if (b & 0x08) { - // Parse unparsed entities (C.2.7) - for (;;) { - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b1 = *dataP++; - if (b1 == 0xf0) { - break; - } - if ((b1 & 0xfe) != 0xd0) { - throw DeadlyImportError(parseErrorMessage); - } - /* C.10 */ - /*const std::string &name =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - /*const std::string &systemId =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - if (b1 & 0x01) { - /*const std::string &publicId =*/ parseIdentifyingStringOrIndex(vocabulary.otherURITable); - } - /*const std::string ¬ationName =*/ parseIdentifyingStringOrIndex(vocabulary.otherNCNameTable); - } - } - if (b & 0x04) { - // Parse character encoding scheme (C.2.8) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::string characterEncodingScheme =*/ parseNonEmptyOctetString2(); - } - if (b & 0x02) { - // Parse standalone flag (C.2.9) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - uint8_t b1 = *dataP++; - if (b1 & 0xfe) { - throw DeadlyImportError(parseErrorMessage); - } - //bool standalone = b1 & 0x01; - } - if (b & 0x01) { - // Parse version (C.2.10) - if (dataEnd - dataP < 1) { - throw DeadlyImportError(parseErrorMessage); - } - /*std::shared_ptr<const FIValue> version =*/ parseNonIdentifyingStringOrIndex1(vocabulary.otherStringTable); - } - } - - std::unique_ptr<uint8_t[]> data; - uint8_t *dataP, *dataEnd; - irr::io::EXML_NODE currentNodeType; - bool emptyElement; - bool headerPending; - bool terminatorPending; - Vocabulary vocabulary; - std::vector<Attribute> attributes; - std::stack<std::string> elementStack; - std::string nodeName; - std::map<std::string, std::unique_ptr<FIDecoder>> decoderMap; - std::map<std::string, const FIVocabulary*> vocabularyMap; - - static const std::string EmptyString; - static std::shared_ptr<const FIValue> EmptyFIString; - - static FIHexDecoder hexDecoder; - static FIBase64Decoder base64Decoder; - static FIShortDecoder shortDecoder; - static FIIntDecoder intDecoder; - static FILongDecoder longDecoder; - static FIBoolDecoder boolDecoder; - static FIFloatDecoder floatDecoder; - static FIDoubleDecoder doubleDecoder; - static FIUUIDDecoder uuidDecoder; - static FICDATADecoder cdataDecoder; - static FIDecoder *defaultDecoder[32]; -}; - -const std::string CFIReaderImpl::EmptyString; -std::shared_ptr<const FIValue> CFIReaderImpl::EmptyFIString = FIStringValue::create(std::string()); - -FIHexDecoder CFIReaderImpl::hexDecoder; -FIBase64Decoder CFIReaderImpl::base64Decoder; -FIShortDecoder CFIReaderImpl::shortDecoder; -FIIntDecoder CFIReaderImpl::intDecoder; -FILongDecoder CFIReaderImpl::longDecoder; -FIBoolDecoder CFIReaderImpl::boolDecoder; -FIFloatDecoder CFIReaderImpl::floatDecoder; -FIDoubleDecoder CFIReaderImpl::doubleDecoder; -FIUUIDDecoder CFIReaderImpl::uuidDecoder; -FICDATADecoder CFIReaderImpl::cdataDecoder; - -FIDecoder *CFIReaderImpl::defaultDecoder[32] = { - &hexDecoder, - &base64Decoder, - &shortDecoder, - &intDecoder, - &longDecoder, - &boolDecoder, - &floatDecoder, - &doubleDecoder, - &uuidDecoder, - &cdataDecoder -}; - -class CXMLReaderImpl : public FIReader -{ -public: - - //! Constructor - CXMLReaderImpl(std::unique_ptr<irr::io::IIrrXMLReader<char, irr::io::IXMLBase>> reader_) - : reader(std::move(reader_)) - {} - - virtual ~CXMLReaderImpl() {} - - virtual bool read() /*override*/ { - return reader->read(); - } - - virtual irr::io::EXML_NODE getNodeType() const /*override*/ { - return reader->getNodeType(); - } - - virtual int getAttributeCount() const /*override*/ { - return reader->getAttributeCount(); - } - - virtual const char* getAttributeName(int idx) const /*override*/ { - return reader->getAttributeName(idx); - } - - virtual const char* getAttributeValue(int idx) const /*override*/ { - return reader->getAttributeValue(idx); - } - - virtual const char* getAttributeValue(const char* name) const /*override*/ { - return reader->getAttributeValue(name); - } - - virtual const char* getAttributeValueSafe(const char* name) const /*override*/ { - return reader->getAttributeValueSafe(name); - } - - virtual int getAttributeValueAsInt(const char* name) const /*override*/ { - return reader->getAttributeValueAsInt(name); - } - - virtual int getAttributeValueAsInt(int idx) const /*override*/ { - return reader->getAttributeValueAsInt(idx); - } - - virtual float getAttributeValueAsFloat(const char* name) const /*override*/ { - return reader->getAttributeValueAsFloat(name); - } - - virtual float getAttributeValueAsFloat(int idx) const /*override*/ { - return reader->getAttributeValueAsFloat(idx); - } - - virtual const char* getNodeName() const /*override*/ { - return reader->getNodeName(); - } - - virtual const char* getNodeData() const /*override*/ { - return reader->getNodeData(); - } - - virtual bool isEmptyElement() const /*override*/ { - return reader->isEmptyElement(); - } - - virtual irr::io::ETEXT_FORMAT getSourceFormat() const /*override*/ { - return reader->getSourceFormat(); - } - - virtual irr::io::ETEXT_FORMAT getParserFormat() const /*override*/ { - return reader->getParserFormat(); - } - - virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(int /*idx*/) const /*override*/ { - return nullptr; - } - - virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(const char* /*name*/) const /*override*/ { - return nullptr; - } - - virtual void registerDecoder(const std::string & /*algorithmUri*/, std::unique_ptr<FIDecoder> /*decoder*/) /*override*/ {} - - - virtual void registerVocabulary(const std::string &/*vocabularyUri*/, const FIVocabulary * /*vocabulary*/) /*override*/ {} - -private: - - std::unique_ptr<irr::io::IIrrXMLReader<char, irr::io::IXMLBase>> reader; -}; - -static std::unique_ptr<uint8_t[]> readFile(IOStream *stream, size_t &size, bool &isFI) { - size = stream->FileSize(); - std::unique_ptr<uint8_t[]> data = std::unique_ptr<uint8_t[]>(new uint8_t[size]); - if (stream->Read(data.get(), size, 1) != 1) { - size = 0; - data.reset(); - } - isFI = parseMagic(data.get(), data.get() + size) > 0; - return data; -} - -std::unique_ptr<FIReader> FIReader::create(IOStream *stream) -{ - size_t size; - bool isFI; - auto data = readFile(stream, size, isFI); - if (isFI) { - return std::unique_ptr<FIReader>(new CFIReaderImpl(std::move(data), size)); - } - else { - auto memios = std::unique_ptr<MemoryIOStream>(new MemoryIOStream(data.release(), size, true)); - auto callback = std::unique_ptr<CIrrXML_IOStreamReader>(new CIrrXML_IOStreamReader(memios.get())); - return std::unique_ptr<FIReader>(new CXMLReaderImpl(std::unique_ptr<irr::io::IIrrXMLReader<char, irr::io::IXMLBase>>(createIrrXMLReader(callback.get())))); - } -} - -}// namespace Assimp - -#endif // !ASSIMP_BUILD_NO_X3D_IMPORTER diff --git a/thirdparty/assimp/code/MMDCpp14.h b/thirdparty/assimp/code/MMD/MMDCpp14.h index 638b0bfd2f..638b0bfd2f 100644 --- a/thirdparty/assimp/code/MMDCpp14.h +++ b/thirdparty/assimp/code/MMD/MMDCpp14.h diff --git a/thirdparty/assimp/code/MMDImporter.cpp b/thirdparty/assimp/code/MMD/MMDImporter.cpp index 84b9e35a6b..e7744e4cd0 100644 --- a/thirdparty/assimp/code/MMDImporter.cpp +++ b/thirdparty/assimp/code/MMD/MMDImporter.cpp @@ -41,15 +41,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_MMD_IMPORTER -#include "MMDImporter.h" -#include "MMDPmdParser.h" -#include "MMDPmxParser.h" -#include "MMDVmdParser.h" -#include "ConvertToLHProcess.h" +#include "MMD/MMDImporter.h" +#include "MMD/MMDPmdParser.h" +#include "MMD/MMDPmxParser.h" +#include "MMD/MMDVmdParser.h" +#include "PostProcessing/ConvertToLHProcess.h" + #include <assimp/DefaultIOSystem.h> #include <assimp/Importer.hpp> #include <assimp/ai_assert.h> #include <assimp/scene.h> + #include <fstream> #include <iomanip> #include <memory> diff --git a/thirdparty/assimp/code/MMDImporter.h b/thirdparty/assimp/code/MMD/MMDImporter.h index 4ee94eeb00..4ee94eeb00 100644 --- a/thirdparty/assimp/code/MMDImporter.h +++ b/thirdparty/assimp/code/MMD/MMDImporter.h diff --git a/thirdparty/assimp/code/MMDPmdParser.h b/thirdparty/assimp/code/MMD/MMDPmdParser.h index d2f2224aa1..d2f2224aa1 100644 --- a/thirdparty/assimp/code/MMDPmdParser.h +++ b/thirdparty/assimp/code/MMD/MMDPmdParser.h diff --git a/thirdparty/assimp/code/MMDPmxParser.cpp b/thirdparty/assimp/code/MMD/MMDPmxParser.cpp index 7425ceac22..80f0986dd7 100644 --- a/thirdparty/assimp/code/MMDPmxParser.cpp +++ b/thirdparty/assimp/code/MMD/MMDPmxParser.cpp @@ -42,7 +42,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <utility> #include "MMDPmxParser.h" #include <assimp/StringUtils.h> -#include "../contrib/utf8cpp/source/utf8.h" +#ifdef ASSIMP_USE_HUNTER +# include <utf8/utf8.h> +#else +# include "../contrib/utf8cpp/source/utf8.h" +#endif #include <assimp/Exceptional.h> namespace pmx diff --git a/thirdparty/assimp/code/MMDPmxParser.h b/thirdparty/assimp/code/MMD/MMDPmxParser.h index cf523a1298..cf523a1298 100644 --- a/thirdparty/assimp/code/MMDPmxParser.h +++ b/thirdparty/assimp/code/MMD/MMDPmxParser.h diff --git a/thirdparty/assimp/code/MMDVmdParser.h b/thirdparty/assimp/code/MMD/MMDVmdParser.h index 947c3a2422..947c3a2422 100644 --- a/thirdparty/assimp/code/MMDVmdParser.h +++ b/thirdparty/assimp/code/MMD/MMDVmdParser.h diff --git a/thirdparty/assimp/code/MaterialSystem.cpp b/thirdparty/assimp/code/Material/MaterialSystem.cpp index 03d5a18a34..d0b39093b6 100644 --- a/thirdparty/assimp/code/MaterialSystem.cpp +++ b/thirdparty/assimp/code/Material/MaterialSystem.cpp @@ -96,12 +96,12 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, ai_real* pOut, unsigned int* pMax) { - ai_assert( pOut != NULL ); - ai_assert( pMat != NULL ); + ai_assert( pOut != nullptr ); + ai_assert( pMat != nullptr ); const aiMaterialProperty* prop; aiGetMaterialProperty(pMat,pKey,type,index, (const aiMaterialProperty**) &prop); - if (!prop) { + if ( nullptr == prop) { return AI_FAILURE; } @@ -112,9 +112,11 @@ aiReturn aiGetMaterialFloatArray(const aiMaterial* pMat, if (pMax) { iWrite = std::min(*pMax,iWrite); ; } - for (unsigned int a = 0; a < iWrite;++a) { - pOut[a] = static_cast<ai_real> ( reinterpret_cast<float*>(prop->mData)[a] ); + + for (unsigned int a = 0; a < iWrite; ++a) { + pOut[ a ] = static_cast<ai_real> ( reinterpret_cast<float*>(prop->mData)[a] ); } + if (pMax) { *pMax = iWrite; } diff --git a/thirdparty/assimp/code/MaterialSystem.h b/thirdparty/assimp/code/Material/MaterialSystem.h index 67d53578cb..67d53578cb 100644 --- a/thirdparty/assimp/code/MaterialSystem.h +++ b/thirdparty/assimp/code/Material/MaterialSystem.h diff --git a/thirdparty/assimp/code/CalcTangentsProcess.cpp b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp index b30f39c274..b30f39c274 100644 --- a/thirdparty/assimp/code/CalcTangentsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.cpp diff --git a/thirdparty/assimp/code/CalcTangentsProcess.h b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.h index 18775abcc7..3568a624f8 100644 --- a/thirdparty/assimp/code/CalcTangentsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/CalcTangentsProcess.h @@ -42,11 +42,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Defines a post processing step to calculate tangents and - bitangents on all imported meshes.*/ + bi-tangents on all imported meshes.*/ #ifndef AI_CALCTANGENTSPROCESS_H_INC #define AI_CALCTANGENTSPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" struct aiMesh; diff --git a/thirdparty/assimp/code/ComputeUVMappingProcess.cpp b/thirdparty/assimp/code/PostProcessing/ComputeUVMappingProcess.cpp index bb571a551b..bb571a551b 100644 --- a/thirdparty/assimp/code/ComputeUVMappingProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/ComputeUVMappingProcess.cpp diff --git a/thirdparty/assimp/code/ComputeUVMappingProcess.h b/thirdparty/assimp/code/PostProcessing/ComputeUVMappingProcess.h index 24f6bb7218..a6d36e06ea 100644 --- a/thirdparty/assimp/code/ComputeUVMappingProcess.h +++ b/thirdparty/assimp/code/PostProcessing/ComputeUVMappingProcess.h @@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_COMPUTEUVMAPPING_H_INC #define AI_COMPUTEUVMAPPING_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> #include <assimp/material.h> #include <assimp/types.h> diff --git a/thirdparty/assimp/code/ConvertToLHProcess.cpp b/thirdparty/assimp/code/PostProcessing/ConvertToLHProcess.cpp index b7cd4f0bc6..b7cd4f0bc6 100644 --- a/thirdparty/assimp/code/ConvertToLHProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/ConvertToLHProcess.cpp diff --git a/thirdparty/assimp/code/ConvertToLHProcess.h b/thirdparty/assimp/code/PostProcessing/ConvertToLHProcess.h index 63351568d0..f32b91fc39 100644 --- a/thirdparty/assimp/code/ConvertToLHProcess.h +++ b/thirdparty/assimp/code/PostProcessing/ConvertToLHProcess.h @@ -52,7 +52,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_CONVERTTOLHPROCESS_H_INC #include <assimp/types.h> -#include "BaseProcess.h" + +#include "Common/BaseProcess.h" struct aiMesh; struct aiNodeAnim; diff --git a/thirdparty/assimp/code/DeboneProcess.cpp b/thirdparty/assimp/code/PostProcessing/DeboneProcess.cpp index 83b8336bc9..83b8336bc9 100644 --- a/thirdparty/assimp/code/DeboneProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/DeboneProcess.cpp diff --git a/thirdparty/assimp/code/DeboneProcess.h b/thirdparty/assimp/code/PostProcessing/DeboneProcess.h index ba77aba70e..8b64c2acc6 100644 --- a/thirdparty/assimp/code/DeboneProcess.h +++ b/thirdparty/assimp/code/PostProcessing/DeboneProcess.h @@ -44,17 +44,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_DEBONEPROCESS_H_INC #define AI_DEBONEPROCESS_H_INC -#include <vector> -#include <utility> -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> #include <assimp/scene.h> +#include <vector> +#include <utility> + +#// Forward declarations class DeboneTest; -namespace Assimp -{ +namespace Assimp { #if (!defined AI_DEBONE_THRESHOLD) # define AI_DEBONE_THRESHOLD 1.0f @@ -66,14 +67,11 @@ namespace Assimp * the bone are split from the mesh. The split off (new) mesh is boneless. At any * point in time, bones without affect upon a given mesh are to be removed. */ -class DeboneProcess : public BaseProcess -{ +class DeboneProcess : public BaseProcess { public: - DeboneProcess(); ~DeboneProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. * @param pFlags The processing flags the importer was called with. @@ -91,7 +89,6 @@ public: void SetupProperties(const Importer* pImp); protected: - // ------------------------------------------------------------------- /** Executes the post processing step on the given imported data. * At the moment a process is not supposed to fail. diff --git a/thirdparty/assimp/code/DropFaceNormalsProcess.cpp b/thirdparty/assimp/code/PostProcessing/DropFaceNormalsProcess.cpp index b11615bb82..b11615bb82 100644 --- a/thirdparty/assimp/code/DropFaceNormalsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/DropFaceNormalsProcess.cpp diff --git a/thirdparty/assimp/code/DropFaceNormalsProcess.h b/thirdparty/assimp/code/PostProcessing/DropFaceNormalsProcess.h index 0d116663b7..c710c5a5ee 100644 --- a/thirdparty/assimp/code/DropFaceNormalsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/DropFaceNormalsProcess.h @@ -44,23 +44,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_DROPFACENORMALPROCESS_H_INC #define AI_DROPFACENORMALPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> -namespace Assimp -{ +namespace Assimp { // --------------------------------------------------------------------------- /** The DropFaceNormalsProcess computes face normals for all faces of all meshes */ -class ASSIMP_API_WINONLY DropFaceNormalsProcess : public BaseProcess -{ +class ASSIMP_API_WINONLY DropFaceNormalsProcess : public BaseProcess { public: - DropFaceNormalsProcess(); ~DropFaceNormalsProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. * @param pFlags The processing flags the importer was called with. A bitwise diff --git a/thirdparty/assimp/code/EmbedTexturesProcess.cpp b/thirdparty/assimp/code/PostProcessing/EmbedTexturesProcess.cpp index 739382a057..739382a057 100644 --- a/thirdparty/assimp/code/EmbedTexturesProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/EmbedTexturesProcess.cpp diff --git a/thirdparty/assimp/code/EmbedTexturesProcess.h b/thirdparty/assimp/code/PostProcessing/EmbedTexturesProcess.h index cdf40bef74..3c4b2eab4e 100644 --- a/thirdparty/assimp/code/EmbedTexturesProcess.h +++ b/thirdparty/assimp/code/PostProcessing/EmbedTexturesProcess.h @@ -42,7 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #pragma once -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <string> diff --git a/thirdparty/assimp/code/FindDegenerates.cpp b/thirdparty/assimp/code/PostProcessing/FindDegenerates.cpp index 365f5d7447..50fac46dba 100644 --- a/thirdparty/assimp/code/FindDegenerates.cpp +++ b/thirdparty/assimp/code/PostProcessing/FindDegenerates.cpp @@ -228,6 +228,7 @@ bool FindDegeneratesProcess::ExecuteOnMesh( aiMesh* mesh) { if ( area < 1e-6 ) { if ( mConfigRemoveDegenerates ) { remove_me[ a ] = true; + ++deg; goto evil_jump_outside; } diff --git a/thirdparty/assimp/code/FindDegenerates.h b/thirdparty/assimp/code/PostProcessing/FindDegenerates.h index 880f5f16a2..7a15e77cf1 100644 --- a/thirdparty/assimp/code/FindDegenerates.h +++ b/thirdparty/assimp/code/PostProcessing/FindDegenerates.h @@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_FINDDEGENERATESPROCESS_H_INC #define AI_FINDDEGENERATESPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> class FindDegeneratesProcessTest; diff --git a/thirdparty/assimp/code/FindInstancesProcess.cpp b/thirdparty/assimp/code/PostProcessing/FindInstancesProcess.cpp index be1138116e..64907458a1 100644 --- a/thirdparty/assimp/code/FindInstancesProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/FindInstancesProcess.cpp @@ -137,6 +137,11 @@ void FindInstancesProcess::Execute( aiScene* pScene) aiMesh* inst = pScene->mMeshes[i]; hashes[i] = GetMeshHash(inst); + // Find an appropriate epsilon + // to compare position differences against + float epsilon = ComputePositionEpsilon(inst); + epsilon *= epsilon; + for (int a = i-1; a >= 0; --a) { if (hashes[i] == hashes[a]) { @@ -154,12 +159,7 @@ void FindInstancesProcess::Execute( aiScene* pScene) orig->mPrimitiveTypes != inst->mPrimitiveTypes) continue; - // up to now the meshes are equal. find an appropriate - // epsilon to compare position differences against - float epsilon = ComputePositionEpsilon(inst); - epsilon *= epsilon; - - // now compare vertex positions, normals, + // up to now the meshes are equal. Now compare vertex positions, normals, // tangents and bitangents using this epsilon. if (orig->HasPositions()) { if(!CompareArrays(orig->mVertices,inst->mVertices,orig->mNumVertices,epsilon)) diff --git a/thirdparty/assimp/code/FindInstancesProcess.h b/thirdparty/assimp/code/PostProcessing/FindInstancesProcess.h index ab4a371c71..64b838d7cc 100644 --- a/thirdparty/assimp/code/FindInstancesProcess.h +++ b/thirdparty/assimp/code/PostProcessing/FindInstancesProcess.h @@ -46,8 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_FINDINSTANCES_H_INC #define AI_FINDINSTANCES_H_INC -#include "BaseProcess.h" -#include "ProcessHelper.h" +#include "Common/BaseProcess.h" +#include "PostProcessing/ProcessHelper.h" class FindInstancesProcessTest; namespace Assimp { diff --git a/thirdparty/assimp/code/FindInvalidDataProcess.cpp b/thirdparty/assimp/code/PostProcessing/FindInvalidDataProcess.cpp index 433f042448..433f042448 100644 --- a/thirdparty/assimp/code/FindInvalidDataProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/FindInvalidDataProcess.cpp diff --git a/thirdparty/assimp/code/FindInvalidDataProcess.h b/thirdparty/assimp/code/PostProcessing/FindInvalidDataProcess.h index 8504fb7b1f..ce7375f34f 100644 --- a/thirdparty/assimp/code/FindInvalidDataProcess.h +++ b/thirdparty/assimp/code/PostProcessing/FindInvalidDataProcess.h @@ -46,7 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_FINDINVALIDDATA_H_INC #define AI_FINDINVALIDDATA_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/types.h> #include <assimp/anim.h> diff --git a/thirdparty/assimp/code/FixNormalsStep.cpp b/thirdparty/assimp/code/PostProcessing/FixNormalsStep.cpp index bbbe6899b4..bbbe6899b4 100644 --- a/thirdparty/assimp/code/FixNormalsStep.cpp +++ b/thirdparty/assimp/code/PostProcessing/FixNormalsStep.cpp diff --git a/thirdparty/assimp/code/FixNormalsStep.h b/thirdparty/assimp/code/PostProcessing/FixNormalsStep.h index 6be27faef6..f60ce596a4 100644 --- a/thirdparty/assimp/code/FixNormalsStep.h +++ b/thirdparty/assimp/code/PostProcessing/FixNormalsStep.h @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_FIXNORMALSPROCESS_H_INC #define AI_FIXNORMALSPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" struct aiMesh; diff --git a/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.cpp b/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.cpp new file mode 100644 index 0000000000..c013454fc3 --- /dev/null +++ b/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.cpp @@ -0,0 +1,115 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#ifndef ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS + +#include "PostProcessing/GenBoundingBoxesProcess.h" + +#include <assimp/postprocess.h> +#include <assimp/scene.h> + +namespace Assimp { + +GenBoundingBoxesProcess::GenBoundingBoxesProcess() +: BaseProcess() { + +} + +GenBoundingBoxesProcess::~GenBoundingBoxesProcess() { + // empty +} + +bool GenBoundingBoxesProcess::IsActive(unsigned int pFlags) const { + return 0 != ( pFlags & aiProcess_GenBoundingBoxes ); +} + +void checkMesh(aiMesh* mesh, aiVector3D& min, aiVector3D& max) { + ai_assert(nullptr != mesh); + + if (0 == mesh->mNumVertices) { + return; + } + + for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { + const aiVector3D &pos = mesh->mVertices[i]; + if (pos.x < min.x) { + min.x = pos.x; + } + if (pos.y < min.y) { + min.y = pos.y; + } + if (pos.z < min.z) { + min.z = pos.z; + } + + if (pos.x > max.x) { + max.x = pos.x; + } + if (pos.y > max.y) { + max.y = pos.y; + } + if (pos.z > max.z) { + max.z = pos.z; + } + } +} + +void GenBoundingBoxesProcess::Execute(aiScene* pScene) { + if (nullptr == pScene) { + return; + } + + for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) { + aiMesh* mesh = pScene->mMeshes[i]; + if (nullptr == mesh) { + continue; + } + + aiVector3D min(999999, 999999, 999999), max(-999999, -999999, -999999); + checkMesh(mesh, min, max); + mesh->mAABB.mMin = min; + mesh->mAABB.mMax = max; + } +} + +} // Namespace Assimp + +#endif // ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS diff --git a/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.h b/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.h new file mode 100644 index 0000000000..4b43c82a42 --- /dev/null +++ b/thirdparty/assimp/code/PostProcessing/GenBoundingBoxesProcess.h @@ -0,0 +1,76 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +/** @file Defines a post-processing step to generate Axis-aligned bounding + * volumes for all meshes. + */ + +#pragma once + +#ifndef AI_GENBOUNDINGBOXESPROCESS_H_INC +#define AI_GENBOUNDINGBOXESPROCESS_H_INC + +#ifndef ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS + +#include "Common/BaseProcess.h" + +namespace Assimp { + +/** Post-processing process to find axis-aligned bounding volumes for amm meshes + * used in a scene + */ +class ASSIMP_API GenBoundingBoxesProcess : public BaseProcess { +public: + /// The class constructor. + GenBoundingBoxesProcess(); + /// The class destructor. + ~GenBoundingBoxesProcess(); + /// Will return true, if aiProcess_GenBoundingBoxes is defined. + bool IsActive(unsigned int pFlags) const override; + /// The execution callback. + void Execute(aiScene* pScene) override; +}; + +} // Namespace Assimp + +#endif // #ifndef ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS + +#endif // AI_GENBOUNDINGBOXESPROCESS_H_INC diff --git a/thirdparty/assimp/code/GenFaceNormalsProcess.cpp b/thirdparty/assimp/code/PostProcessing/GenFaceNormalsProcess.cpp index 028334dec7..028334dec7 100644 --- a/thirdparty/assimp/code/GenFaceNormalsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/GenFaceNormalsProcess.cpp diff --git a/thirdparty/assimp/code/GenFaceNormalsProcess.h b/thirdparty/assimp/code/PostProcessing/GenFaceNormalsProcess.h index c80ec9fddc..c641fd6353 100644 --- a/thirdparty/assimp/code/GenFaceNormalsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/GenFaceNormalsProcess.h @@ -44,7 +44,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_GENFACENORMALPROCESS_H_INC #define AI_GENFACENORMALPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> namespace Assimp diff --git a/thirdparty/assimp/code/GenVertexNormalsProcess.cpp b/thirdparty/assimp/code/PostProcessing/GenVertexNormalsProcess.cpp index 3f6c2f86bd..3f6c2f86bd 100644 --- a/thirdparty/assimp/code/GenVertexNormalsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/GenVertexNormalsProcess.cpp diff --git a/thirdparty/assimp/code/GenVertexNormalsProcess.h b/thirdparty/assimp/code/PostProcessing/GenVertexNormalsProcess.h index 9142ad26f5..2ceee17e85 100644 --- a/thirdparty/assimp/code/GenVertexNormalsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/GenVertexNormalsProcess.h @@ -45,24 +45,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_GENVERTEXNORMALPROCESS_H_INC #define AI_GENVERTEXNORMALPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/assbin_chunks.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> +// Forward declarations class GenNormalsTest; namespace Assimp { // --------------------------------------------------------------------------- -/** The GenFaceNormalsProcess computes vertex normals for all vertizes +/** The GenFaceNormalsProcess computes vertex normals for all vertices */ -class ASSIMP_API GenVertexNormalsProcess : public BaseProcess -{ +class ASSIMP_API GenVertexNormalsProcess : public BaseProcess { public: - GenVertexNormalsProcess(); ~GenVertexNormalsProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. * @param pFlags The processing flags the importer was called with. @@ -88,13 +88,10 @@ public: // setter for configMaxAngle - inline void SetMaxSmoothAngle(ai_real f) - { + inline void SetMaxSmoothAngle(ai_real f) { configMaxAngle =f; } -public: - // ------------------------------------------------------------------- /** Computes normals for a specific mesh * @param pcMesh Mesh @@ -104,7 +101,6 @@ public: bool GenMeshVertexNormals (aiMesh* pcMesh, unsigned int meshIndex); private: - /** Configuration option: maximum smoothing angle, in radians*/ ai_real configMaxAngle; mutable bool force_ = false; diff --git a/thirdparty/assimp/code/ImproveCacheLocality.cpp b/thirdparty/assimp/code/PostProcessing/ImproveCacheLocality.cpp index ace9d95ff8..d0a016fa42 100644 --- a/thirdparty/assimp/code/ImproveCacheLocality.cpp +++ b/thirdparty/assimp/code/PostProcessing/ImproveCacheLocality.cpp @@ -45,14 +45,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * <br> * The algorithm is roughly basing on this paper: * http://www.cs.princeton.edu/gfx/pubs/Sander_2007_%3ETR/tipsy.pdf - * .. although overdraw rduction isn't implemented yet ... + * .. although overdraw reduction isn't implemented yet ... */ - - // internal headers -#include "ImproveCacheLocality.h" -#include "VertexTriangleAdjacency.h" +#include "PostProcessing/ImproveCacheLocality.h" +#include "Common/VertexTriangleAdjacency.h" + #include <assimp/StringUtils.h> #include <assimp/postprocess.h> #include <assimp/scene.h> @@ -64,36 +63,33 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -ImproveCacheLocalityProcess::ImproveCacheLocalityProcess() { - configCacheDepth = PP_ICL_PTCACHE_SIZE; +ImproveCacheLocalityProcess::ImproveCacheLocalityProcess() +: mConfigCacheDepth(PP_ICL_PTCACHE_SIZE) { + // empty } // ------------------------------------------------------------------------------------------------ // Destructor, private as well -ImproveCacheLocalityProcess::~ImproveCacheLocalityProcess() -{ +ImproveCacheLocalityProcess::~ImproveCacheLocalityProcess() { // nothing to do here } // ------------------------------------------------------------------------------------------------ // Returns whether the processing step is present in the given flag field. -bool ImproveCacheLocalityProcess::IsActive( unsigned int pFlags) const -{ +bool ImproveCacheLocalityProcess::IsActive( unsigned int pFlags) const { return (pFlags & aiProcess_ImproveCacheLocality) != 0; } // ------------------------------------------------------------------------------------------------ // Setup configuration -void ImproveCacheLocalityProcess::SetupProperties(const Importer* pImp) -{ +void ImproveCacheLocalityProcess::SetupProperties(const Importer* pImp) { // AI_CONFIG_PP_ICL_PTCACHE_SIZE controls the target cache size for the optimizer - configCacheDepth = pImp->GetPropertyInteger(AI_CONFIG_PP_ICL_PTCACHE_SIZE,PP_ICL_PTCACHE_SIZE); + mConfigCacheDepth = pImp->GetPropertyInteger(AI_CONFIG_PP_ICL_PTCACHE_SIZE,PP_ICL_PTCACHE_SIZE); } // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void ImproveCacheLocalityProcess::Execute( aiScene* pScene) -{ +void ImproveCacheLocalityProcess::Execute( aiScene* pScene) { if (!pScene->mNumMeshes) { ASSIMP_LOG_DEBUG("ImproveCacheLocalityProcess skipped; there are no meshes"); return; @@ -103,7 +99,7 @@ void ImproveCacheLocalityProcess::Execute( aiScene* pScene) float out = 0.f; unsigned int numf = 0, numm = 0; - for( unsigned int a = 0; a < pScene->mNumMeshes; a++){ + for( unsigned int a = 0; a < pScene->mNumMeshes; ++a ){ const float res = ProcessMesh( pScene->mMeshes[a],a); if (res) { numf += pScene->mMeshes[a]->mNumFaces; @@ -121,44 +117,41 @@ void ImproveCacheLocalityProcess::Execute( aiScene* pScene) // ------------------------------------------------------------------------------------------------ // Improves the cache coherency of a specific mesh -float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshNum) -{ +ai_real ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshNum) { // TODO: rewrite this to use std::vector or boost::shared_array - ai_assert(NULL != pMesh); + ai_assert(nullptr != pMesh); // Check whether the input data is valid // - there must be vertices and faces // - all faces must be triangulated or we can't operate on them if (!pMesh->HasFaces() || !pMesh->HasPositions()) - return 0.f; + return static_cast<ai_real>(0.f); if (pMesh->mPrimitiveTypes != aiPrimitiveType_TRIANGLE) { ASSIMP_LOG_ERROR("This algorithm works on triangle meshes only"); - return 0.f; + return static_cast<ai_real>(0.f); } - if(pMesh->mNumVertices <= configCacheDepth) { - return 0.f; + if(pMesh->mNumVertices <= mConfigCacheDepth) { + return static_cast<ai_real>(0.f); } - float fACMR = 3.f; + ai_real fACMR = 3.f; const aiFace* const pcEnd = pMesh->mFaces+pMesh->mNumFaces; // Input ACMR is for logging purposes only if (!DefaultLogger::isNullLogger()) { - unsigned int* piFIFOStack = new unsigned int[configCacheDepth]; - memset(piFIFOStack,0xff,configCacheDepth*sizeof(unsigned int)); + unsigned int* piFIFOStack = new unsigned int[mConfigCacheDepth]; + memset(piFIFOStack,0xff,mConfigCacheDepth*sizeof(unsigned int)); unsigned int* piCur = piFIFOStack; - const unsigned int* const piCurEnd = piFIFOStack + configCacheDepth; + const unsigned int* const piCurEnd = piFIFOStack + mConfigCacheDepth; // count the number of cache misses unsigned int iCacheMisses = 0; for (const aiFace* pcFace = pMesh->mFaces;pcFace != pcEnd;++pcFace) { - for (unsigned int qq = 0; qq < 3;++qq) { bool bInCache = false; - for (unsigned int* pp = piFIFOStack;pp < piCurEnd;++pp) { if (*pp == pcFace->mIndices[qq]) { // the vertex is in cache @@ -176,7 +169,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh } } delete[] piFIFOStack; - fACMR = (float)iCacheMisses / pMesh->mNumFaces; + fACMR = (ai_real) iCacheMisses / pMesh->mNumFaces; if (3.0 == fACMR) { char szBuff[128]; // should be sufficiently large in every case @@ -185,7 +178,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh // smaller than 3.0 ... ai_snprintf(szBuff,128,"Mesh %u: Not suitable for vcache optimization",meshNum); ASSIMP_LOG_WARN(szBuff); - return 0.f; + return static_cast<ai_real>(0.f); } } @@ -258,7 +251,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh int ivdx = 0; int ics = 1; - int iStampCnt = configCacheDepth+1; + int iStampCnt = mConfigCacheDepth+1; while (ivdx >= 0) { unsigned int icnt = piNumTriPtrNoModify[ivdx]; @@ -294,7 +287,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh *piCSIter++ = dp; // if the vertex is not yet in cache, set its cache count - if (iStampCnt-piCachingStamps[dp] > configCacheDepth) { + if (iStampCnt-piCachingStamps[dp] > mConfigCacheDepth) { piCachingStamps[dp] = iStampCnt++; ++iCacheMisses; } @@ -319,7 +312,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh // will the vertex be in cache, even after fanning occurs? unsigned int tmp; - if ((tmp = iStampCnt-piCachingStamps[dp]) + 2*piNumTriPtr[dp] <= configCacheDepth) { + if ((tmp = iStampCnt-piCachingStamps[dp]) + 2*piNumTriPtr[dp] <= mConfigCacheDepth) { priority = tmp; } @@ -356,7 +349,7 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh } } } - float fACMR2 = 0.0f; + ai_real fACMR2 = 0.0f; if (!DefaultLogger::isNullLogger()) { fACMR2 = (float)iCacheMisses / pMesh->mNumFaces; diff --git a/thirdparty/assimp/code/ImproveCacheLocality.h b/thirdparty/assimp/code/PostProcessing/ImproveCacheLocality.h index 1b29ee0d6e..de25ecd9fb 100644 --- a/thirdparty/assimp/code/ImproveCacheLocality.h +++ b/thirdparty/assimp/code/PostProcessing/ImproveCacheLocality.h @@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_IMPROVECACHELOCALITY_H_INC #define AI_IMPROVECACHELOCALITY_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/types.h> struct aiMesh; @@ -87,12 +88,12 @@ protected: * @param pMesh The mesh to process. * @param meshNum Index of the mesh to process */ - float ProcessMesh( aiMesh* pMesh, unsigned int meshNum); + ai_real ProcessMesh( aiMesh* pMesh, unsigned int meshNum); private: //! Configuration parameter: specifies the size of the cache to //! optimize the vertex data for. - unsigned int configCacheDepth; + unsigned int mConfigCacheDepth; }; } // end of namespace Assimp diff --git a/thirdparty/assimp/code/JoinVerticesProcess.cpp b/thirdparty/assimp/code/PostProcessing/JoinVerticesProcess.cpp index 914ec05b46..914ec05b46 100644 --- a/thirdparty/assimp/code/JoinVerticesProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/JoinVerticesProcess.cpp diff --git a/thirdparty/assimp/code/JoinVerticesProcess.h b/thirdparty/assimp/code/PostProcessing/JoinVerticesProcess.h index 66fa362de2..e017ae62db 100644 --- a/thirdparty/assimp/code/JoinVerticesProcess.h +++ b/thirdparty/assimp/code/PostProcessing/JoinVerticesProcess.h @@ -45,7 +45,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_JOINVERTICESPROCESS_H_INC #define AI_JOINVERTICESPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/types.h> struct aiMesh; @@ -61,13 +62,11 @@ namespace Assimp * erases all but one of the copies. This usually reduces the number of vertices * in a mesh by a serious amount and is the standard form to render a mesh. */ -class ASSIMP_API JoinVerticesProcess : public BaseProcess -{ +class ASSIMP_API JoinVerticesProcess : public BaseProcess { public: JoinVerticesProcess(); ~JoinVerticesProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. * @param pFlags The processing flags the importer was called with. A bitwise @@ -83,15 +82,12 @@ public: */ void Execute( aiScene* pScene); -public: // ------------------------------------------------------------------- /** Unites identical vertices in the given mesh. * @param pMesh The mesh to process. * @param meshIndex Index of the mesh to process */ int ProcessMesh( aiMesh* pMesh, unsigned int meshIndex); - -private: }; } // end of namespace Assimp diff --git a/thirdparty/assimp/code/LimitBoneWeightsProcess.cpp b/thirdparty/assimp/code/PostProcessing/LimitBoneWeightsProcess.cpp index d560f19287..d560f19287 100644 --- a/thirdparty/assimp/code/LimitBoneWeightsProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/LimitBoneWeightsProcess.cpp diff --git a/thirdparty/assimp/code/LimitBoneWeightsProcess.h b/thirdparty/assimp/code/PostProcessing/LimitBoneWeightsProcess.h index 3602fd8edf..73c2a68d53 100644 --- a/thirdparty/assimp/code/LimitBoneWeightsProcess.h +++ b/thirdparty/assimp/code/PostProcessing/LimitBoneWeightsProcess.h @@ -44,14 +44,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_LIMITBONEWEIGHTSPROCESS_H_INC #define AI_LIMITBONEWEIGHTSPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" +// Forward declarations struct aiMesh; class LimitBoneWeightsTest; -namespace Assimp -{ +namespace Assimp { // NOTE: If you change these limits, don't forget to change the // corresponding values in all Assimp ports @@ -72,14 +72,11 @@ namespace Assimp * The other weights on this bone are then renormalized to assure the sum weight * to be 1. */ -class ASSIMP_API LimitBoneWeightsProcess : public BaseProcess -{ +class ASSIMP_API LimitBoneWeightsProcess : public BaseProcess { public: - LimitBoneWeightsProcess(); ~LimitBoneWeightsProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag. * @param pFlags The processing flags the importer was called with. @@ -96,8 +93,6 @@ public: */ void SetupProperties(const Importer* pImp); -public: - // ------------------------------------------------------------------- /** Limits the bone weight count for all vertices in the given mesh. * @param pMesh The mesh to process. @@ -111,34 +106,29 @@ public: */ void Execute( aiScene* pScene); - -public: - // ------------------------------------------------------------------- /** Describes a bone weight on a vertex */ - struct Weight - { + struct Weight { unsigned int mBone; ///< Index of the bone float mWeight; ///< Weight of that bone on this vertex Weight() AI_NO_EXCEPT : mBone(0) - , mWeight(0.0f) - { } + , mWeight(0.0f) { + // empty + } Weight( unsigned int pBone, float pWeight) - { - mBone = pBone; - mWeight = pWeight; + : mBone(pBone) + , mWeight(pWeight) { + // empty } /** Comparison operator to sort bone weights by descending weight */ - bool operator < (const Weight& pWeight) const - { + bool operator < (const Weight& pWeight) const { return mWeight > pWeight.mWeight; } }; -public: /** Maximum number of bones influencing any single vertex. */ unsigned int mMaxWeights; }; diff --git a/thirdparty/assimp/code/MakeVerboseFormat.cpp b/thirdparty/assimp/code/PostProcessing/MakeVerboseFormat.cpp index 50ff5ed93d..50ff5ed93d 100644 --- a/thirdparty/assimp/code/MakeVerboseFormat.cpp +++ b/thirdparty/assimp/code/PostProcessing/MakeVerboseFormat.cpp diff --git a/thirdparty/assimp/code/MakeVerboseFormat.h b/thirdparty/assimp/code/PostProcessing/MakeVerboseFormat.h index d12db63ae1..1adf8e2f69 100644 --- a/thirdparty/assimp/code/MakeVerboseFormat.h +++ b/thirdparty/assimp/code/PostProcessing/MakeVerboseFormat.h @@ -46,7 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_MAKEVERBOSEFORMAT_H_INC #define AI_MAKEVERBOSEFORMAT_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + struct aiMesh; namespace Assimp { diff --git a/thirdparty/assimp/code/OptimizeGraph.cpp b/thirdparty/assimp/code/PostProcessing/OptimizeGraph.cpp index add9ab79e1..5db51f58b6 100644 --- a/thirdparty/assimp/code/OptimizeGraph.cpp +++ b/thirdparty/assimp/code/PostProcessing/OptimizeGraph.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, diff --git a/thirdparty/assimp/code/OptimizeGraph.h b/thirdparty/assimp/code/PostProcessing/OptimizeGraph.h index e5bbed7679..82cc5db3fe 100644 --- a/thirdparty/assimp/code/OptimizeGraph.h +++ b/thirdparty/assimp/code/PostProcessing/OptimizeGraph.h @@ -46,13 +46,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_OPTIMIZEGRAPHPROCESS_H_INC #define AI_OPTIMIZEGRAPHPROCESS_H_INC -#include "BaseProcess.h" -#include "ProcessHelper.h" +#include "Common/BaseProcess.h" +#include "PostProcessing/ProcessHelper.h" + #include <assimp/types.h> + #include <set> +// Forward declarations struct aiMesh; + class OptimizeGraphProcessTest; + namespace Assimp { // ----------------------------------------------------------------------------- @@ -64,14 +69,11 @@ namespace Assimp { * @see aiProcess_OptimizeGraph for a detailed description of the * algorithm being applied. */ -class OptimizeGraphProcess : public BaseProcess -{ +class OptimizeGraphProcess : public BaseProcess { public: - OptimizeGraphProcess(); ~OptimizeGraphProcess(); -public: // ------------------------------------------------------------------- bool IsActive( unsigned int pFlags) const; @@ -81,14 +83,12 @@ public: // ------------------------------------------------------------------- void SetupProperties(const Importer* pImp); - // ------------------------------------------------------------------- /** @brief Add a list of node names to be locked and not modified. * @param in List of nodes. See #AI_CONFIG_PP_OG_EXCLUDE_LIST for * format explanations. */ - inline void AddLockedNodeList(std::string& in) - { + inline void AddLockedNodeList(std::string& in) { ConvertListToStrings (in,locked_nodes); } @@ -96,8 +96,7 @@ public: /** @brief Add another node to be locked and not modified. * @param name Name to be locked */ - inline void AddLockedNode(std::string& name) - { + inline void AddLockedNode(std::string& name) { locked_nodes.push_back(name); } @@ -105,25 +104,21 @@ public: /** @brief Remove a node from the list of locked nodes. * @param name Name to be unlocked */ - inline void RemoveLockedNode(std::string& name) - { + inline void RemoveLockedNode(std::string& name) { locked_nodes.remove(name); } protected: - void CollectNewChildren(aiNode* nd, std::list<aiNode*>& nodes); void FindInstancedMeshes (aiNode* pNode); private: - #ifdef AI_OG_USE_HASHING typedef std::set<unsigned int> LockedSetType; #else typedef std::set<std::string> LockedSetType; #endif - //! Scene we're working with aiScene* mScene; diff --git a/thirdparty/assimp/code/OptimizeMeshes.cpp b/thirdparty/assimp/code/PostProcessing/OptimizeMeshes.cpp index 3f6765f6ca..3f6765f6ca 100644 --- a/thirdparty/assimp/code/OptimizeMeshes.cpp +++ b/thirdparty/assimp/code/PostProcessing/OptimizeMeshes.cpp diff --git a/thirdparty/assimp/code/OptimizeMeshes.h b/thirdparty/assimp/code/PostProcessing/OptimizeMeshes.h index 9f46f349b4..dec4ab52de 100644 --- a/thirdparty/assimp/code/OptimizeMeshes.h +++ b/thirdparty/assimp/code/PostProcessing/OptimizeMeshes.h @@ -46,8 +46,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_OPTIMIZEMESHESPROCESS_H_INC #define AI_OPTIMIZEMESHESPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/types.h> + #include <vector> struct aiMesh; @@ -64,16 +66,14 @@ namespace Assimp { * * @note Instanced meshes are currently not processed. */ -class OptimizeMeshesProcess : public BaseProcess -{ +class OptimizeMeshesProcess : public BaseProcess { public: /// @brief The class constructor. OptimizeMeshesProcess(); - /// @brief The class destcructor, + /// @brief The class destructor. ~OptimizeMeshesProcess(); - /** @brief Internal utility to store additional mesh info */ struct MeshInfo { diff --git a/thirdparty/assimp/code/PretransformVertices.cpp b/thirdparty/assimp/code/PostProcessing/PretransformVertices.cpp index 52001a0578..52001a0578 100644 --- a/thirdparty/assimp/code/PretransformVertices.cpp +++ b/thirdparty/assimp/code/PostProcessing/PretransformVertices.cpp diff --git a/thirdparty/assimp/code/PretransformVertices.h b/thirdparty/assimp/code/PostProcessing/PretransformVertices.h index b7329af130..b2982951e0 100644 --- a/thirdparty/assimp/code/PretransformVertices.h +++ b/thirdparty/assimp/code/PostProcessing/PretransformVertices.h @@ -47,13 +47,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_PRETRANSFORMVERTICES_H_INC #define AI_PRETRANSFORMVERTICES_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> + #include <list> #include <vector> +// Forward declarations struct aiNode; + class PretransformVerticesTest; + namespace Assimp { // --------------------------------------------------------------------------- @@ -80,10 +85,10 @@ public: // ------------------------------------------------------------------- /** @brief Toggle the 'keep hierarchy' option - * @param d hm ... difficult to guess what this means, hu!? + * @param keep true for keep configuration. */ - void KeepHierarchy(bool d) { - configKeepHierarchy = d; + void KeepHierarchy(bool keep) { + configKeepHierarchy = keep; } // ------------------------------------------------------------------- @@ -148,8 +153,6 @@ private: // Build reference counters for all meshes void BuildMeshRefCountArray(aiNode* nd, unsigned int * refs); - - //! Configuration option: keep scene hierarchy as long as possible bool configKeepHierarchy; bool configNormalize; diff --git a/thirdparty/assimp/code/ProcessHelper.cpp b/thirdparty/assimp/code/PostProcessing/ProcessHelper.cpp index 59869fdff7..59869fdff7 100644 --- a/thirdparty/assimp/code/ProcessHelper.cpp +++ b/thirdparty/assimp/code/PostProcessing/ProcessHelper.cpp diff --git a/thirdparty/assimp/code/ProcessHelper.h b/thirdparty/assimp/code/PostProcessing/ProcessHelper.h index c59f3217bf..0afcc41420 100644 --- a/thirdparty/assimp/code/ProcessHelper.h +++ b/thirdparty/assimp/code/PostProcessing/ProcessHelper.h @@ -51,7 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/scene.h> #include <assimp/SpatialSort.h> -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/ParsingUtils.h> #include <list> diff --git a/thirdparty/assimp/code/RemoveRedundantMaterials.cpp b/thirdparty/assimp/code/PostProcessing/RemoveRedundantMaterials.cpp index 632bdca3fe..49ec8f5c47 100644 --- a/thirdparty/assimp/code/RemoveRedundantMaterials.cpp +++ b/thirdparty/assimp/code/PostProcessing/RemoveRedundantMaterials.cpp @@ -49,7 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "RemoveRedundantMaterials.h" #include <assimp/ParsingUtils.h> #include "ProcessHelper.h" -#include "MaterialSystem.h" +#include "Material/MaterialSystem.h" #include <stdio.h> using namespace Assimp; @@ -57,7 +57,7 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer RemoveRedundantMatsProcess::RemoveRedundantMatsProcess() -: configFixedMaterials() { +: mConfigFixedMaterials() { // nothing to do here } @@ -80,7 +80,7 @@ bool RemoveRedundantMatsProcess::IsActive( unsigned int pFlags) const void RemoveRedundantMatsProcess::SetupProperties(const Importer* pImp) { // Get value of AI_CONFIG_PP_RRM_EXCLUDE_LIST - configFixedMaterials = pImp->GetPropertyString(AI_CONFIG_PP_RRM_EXCLUDE_LIST,""); + mConfigFixedMaterials = pImp->GetPropertyString(AI_CONFIG_PP_RRM_EXCLUDE_LIST,""); } // ------------------------------------------------------------------------------------------------ @@ -100,10 +100,10 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) // If a list of materials to be excluded was given, match the list with // our imported materials and 'salt' all positive matches to ensure that // we get unique hashes later. - if (configFixedMaterials.length()) { + if (mConfigFixedMaterials.length()) { std::list<std::string> strings; - ConvertListToStrings(configFixedMaterials,strings); + ConvertListToStrings(mConfigFixedMaterials,strings); for (unsigned int i = 0; i < pScene->mNumMaterials;++i) { aiMaterial* mat = pScene->mMaterials[i]; diff --git a/thirdparty/assimp/code/RemoveRedundantMaterials.h b/thirdparty/assimp/code/PostProcessing/RemoveRedundantMaterials.h index dbd4d44cc0..1f32a0abfb 100644 --- a/thirdparty/assimp/code/RemoveRedundantMaterials.h +++ b/thirdparty/assimp/code/PostProcessing/RemoveRedundantMaterials.h @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_REMOVEREDUNDANTMATERIALS_H_INC #define AI_REMOVEREDUNDANTMATERIALS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> class RemoveRedundantMatsTest; @@ -57,8 +57,7 @@ namespace Assimp { /** RemoveRedundantMatsProcess: Post-processing step to remove redundant * materials from the imported scene. */ -class ASSIMP_API RemoveRedundantMatsProcess : public BaseProcess -{ +class ASSIMP_API RemoveRedundantMatsProcess : public BaseProcess { public: /// The default class constructor. RemoveRedundantMatsProcess(); @@ -66,7 +65,6 @@ public: /// The class destructor. ~RemoveRedundantMatsProcess(); -public: // ------------------------------------------------------------------- // Check whether step is active bool IsActive( unsigned int pFlags) const; @@ -79,27 +77,25 @@ public: // Setup import settings void SetupProperties(const Importer* pImp); - // ------------------------------------------------------------------- - /** @brief Set list of fixed (unmutable) materials + /** @brief Set list of fixed (inmutable) materials * @param fixed See #AI_CONFIG_PP_RRM_EXCLUDE_LIST */ void SetFixedMaterialsString(const std::string& fixed = "") { - configFixedMaterials = fixed; + mConfigFixedMaterials = fixed; } // ------------------------------------------------------------------- - /** @brief Get list of fixed (unmutable) materials + /** @brief Get list of fixed (inmutable) materials * @return See #AI_CONFIG_PP_RRM_EXCLUDE_LIST */ const std::string& GetFixedMaterialsString() const { - return configFixedMaterials; + return mConfigFixedMaterials; } private: - //! Configuration option: list of all fixed materials - std::string configFixedMaterials; + std::string mConfigFixedMaterials; }; } // end of namespace Assimp diff --git a/thirdparty/assimp/code/RemoveVCProcess.cpp b/thirdparty/assimp/code/PostProcessing/RemoveVCProcess.cpp index 99fd47a3aa..99fd47a3aa 100644 --- a/thirdparty/assimp/code/RemoveVCProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/RemoveVCProcess.cpp diff --git a/thirdparty/assimp/code/RemoveVCProcess.h b/thirdparty/assimp/code/PostProcessing/RemoveVCProcess.h index 617d7b9b20..7bb21a8330 100644 --- a/thirdparty/assimp/code/RemoveVCProcess.h +++ b/thirdparty/assimp/code/PostProcessing/RemoveVCProcess.h @@ -44,7 +44,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_REMOVEVCPROCESS_H_INCLUDED #define AI_REMOVEVCPROCESS_H_INCLUDED -#include "BaseProcess.h" +#include "Common/BaseProcess.h" + #include <assimp/mesh.h> class RemoveVCProcessTest; diff --git a/thirdparty/assimp/code/ScaleProcess.cpp b/thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp index 6d458c4b11..6d458c4b11 100644 --- a/thirdparty/assimp/code/ScaleProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/ScaleProcess.cpp diff --git a/thirdparty/assimp/code/ScaleProcess.h b/thirdparty/assimp/code/PostProcessing/ScaleProcess.h index 55146ae064..2567378759 100644 --- a/thirdparty/assimp/code/ScaleProcess.h +++ b/thirdparty/assimp/code/PostProcessing/ScaleProcess.h @@ -41,7 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once -#include "BaseProcess.h" +#include "Common/BaseProcess.h" struct aiNode; diff --git a/thirdparty/assimp/code/SortByPTypeProcess.cpp b/thirdparty/assimp/code/PostProcessing/SortByPTypeProcess.cpp index 2e0cc54004..be8405a17b 100644 --- a/thirdparty/assimp/code/SortByPTypeProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/SortByPTypeProcess.cpp @@ -57,8 +57,8 @@ using namespace Assimp; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer SortByPTypeProcess::SortByPTypeProcess() -{ - configRemoveMeshes = 0; +: mConfigRemoveMeshes( 0 ) { + // empty } // ------------------------------------------------------------------------------------------------ @@ -78,7 +78,7 @@ bool SortByPTypeProcess::IsActive( unsigned int pFlags) const // ------------------------------------------------------------------------------------------------ void SortByPTypeProcess::SetupProperties(const Importer* pImp) { - configRemoveMeshes = pImp->GetPropertyInteger(AI_CONFIG_PP_SBP_REMOVE,0); + mConfigRemoveMeshes = pImp->GetPropertyInteger(AI_CONFIG_PP_SBP_REMOVE,0); } // ------------------------------------------------------------------------------------------------ @@ -172,7 +172,7 @@ void SortByPTypeProcess::Execute( aiScene* pScene) { } if (1 == num) { - if (!(configRemoveMeshes & mesh->mPrimitiveTypes)) { + if (!(mConfigRemoveMeshes & mesh->mPrimitiveTypes)) { *meshIdx = static_cast<unsigned int>( outMeshes.size() ); outMeshes.push_back(mesh); } else { @@ -206,7 +206,7 @@ void SortByPTypeProcess::Execute( aiScene* pScene) { VertexWeightTable* avw = ComputeVertexBoneWeightTable(mesh); for (unsigned int real = 0; real < 4; ++real,++meshIdx) { - if ( !aiNumPerPType[real] || configRemoveMeshes & (1u << real)) + if ( !aiNumPerPType[real] || mConfigRemoveMeshes & (1u << real)) { continue; } @@ -392,10 +392,10 @@ void SortByPTypeProcess::Execute( aiScene* pScene) { { char buffer[1024]; ::ai_snprintf(buffer,1024,"Points: %u%s, Lines: %u%s, Triangles: %u%s, Polygons: %u%s (Meshes, X = removed)", - aiNumMeshesPerPType[0], ((configRemoveMeshes & aiPrimitiveType_POINT) ? "X" : ""), - aiNumMeshesPerPType[1], ((configRemoveMeshes & aiPrimitiveType_LINE) ? "X" : ""), - aiNumMeshesPerPType[2], ((configRemoveMeshes & aiPrimitiveType_TRIANGLE) ? "X" : ""), - aiNumMeshesPerPType[3], ((configRemoveMeshes & aiPrimitiveType_POLYGON) ? "X" : "")); + aiNumMeshesPerPType[0], ((mConfigRemoveMeshes & aiPrimitiveType_POINT) ? "X" : ""), + aiNumMeshesPerPType[1], ((mConfigRemoveMeshes & aiPrimitiveType_LINE) ? "X" : ""), + aiNumMeshesPerPType[2], ((mConfigRemoveMeshes & aiPrimitiveType_TRIANGLE) ? "X" : ""), + aiNumMeshesPerPType[3], ((mConfigRemoveMeshes & aiPrimitiveType_POLYGON) ? "X" : "")); ASSIMP_LOG_INFO(buffer); ASSIMP_LOG_DEBUG("SortByPTypeProcess finished"); } diff --git a/thirdparty/assimp/code/SortByPTypeProcess.h b/thirdparty/assimp/code/PostProcessing/SortByPTypeProcess.h index c9d9924d8f..1d7ccfc152 100644 --- a/thirdparty/assimp/code/SortByPTypeProcess.h +++ b/thirdparty/assimp/code/PostProcessing/SortByPTypeProcess.h @@ -45,10 +45,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_SORTBYPTYPEPROCESS_H_INC #define AI_SORTBYPTYPEPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> class SortByPTypeProcessTest; + namespace Assimp { @@ -57,14 +58,11 @@ namespace Assimp { * A mesh with 5 lines, 3 points and 145 triangles would be split in 3 * submeshes. */ -class ASSIMP_API SortByPTypeProcess : public BaseProcess -{ +class ASSIMP_API SortByPTypeProcess : public BaseProcess { public: - SortByPTypeProcess(); ~SortByPTypeProcess(); -public: // ------------------------------------------------------------------- bool IsActive( unsigned int pFlags) const; @@ -75,8 +73,7 @@ public: void SetupProperties(const Importer* pImp); private: - - int configRemoveMeshes; + int mConfigRemoveMeshes; }; diff --git a/thirdparty/assimp/code/SplitLargeMeshes.cpp b/thirdparty/assimp/code/PostProcessing/SplitLargeMeshes.cpp index 1797b28d5a..1797b28d5a 100644 --- a/thirdparty/assimp/code/SplitLargeMeshes.cpp +++ b/thirdparty/assimp/code/PostProcessing/SplitLargeMeshes.cpp diff --git a/thirdparty/assimp/code/SplitLargeMeshes.h b/thirdparty/assimp/code/PostProcessing/SplitLargeMeshes.h index 77f089ce7e..3f90576ea9 100644 --- a/thirdparty/assimp/code/SplitLargeMeshes.h +++ b/thirdparty/assimp/code/PostProcessing/SplitLargeMeshes.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -40,21 +39,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file Defines a post processing step to split large meshes into submeshes +/** @file Defines a post processing step to split large meshes into sub-meshes */ #ifndef AI_SPLITLARGEMESHES_H_INC #define AI_SPLITLARGEMESHES_H_INC #include <vector> -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/mesh.h> #include <assimp/scene.h> +// Forward declarations class SplitLargeMeshesTest; -namespace Assimp -{ +namespace Assimp { class SplitLargeMeshesProcess_Triangle; class SplitLargeMeshesProcess_Vertex; diff --git a/thirdparty/assimp/code/TextureTransform.cpp b/thirdparty/assimp/code/PostProcessing/TextureTransform.cpp index 8ae2ba7218..8ae2ba7218 100644 --- a/thirdparty/assimp/code/TextureTransform.cpp +++ b/thirdparty/assimp/code/PostProcessing/TextureTransform.cpp diff --git a/thirdparty/assimp/code/TextureTransform.h b/thirdparty/assimp/code/PostProcessing/TextureTransform.h index c556ff5d8c..2a5d623d7f 100644 --- a/thirdparty/assimp/code/TextureTransform.h +++ b/thirdparty/assimp/code/PostProcessing/TextureTransform.h @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_TEXTURE_TRANSFORM_H_INCLUDED #include <assimp/BaseImporter.h> -#include "BaseProcess.h" +#include "Common/BaseProcess.h" #include <assimp/material.h> #include <list> diff --git a/thirdparty/assimp/code/TriangulateProcess.cpp b/thirdparty/assimp/code/PostProcessing/TriangulateProcess.cpp index 0f68f47ddb..1040836bbe 100644 --- a/thirdparty/assimp/code/TriangulateProcess.cpp +++ b/thirdparty/assimp/code/PostProcessing/TriangulateProcess.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -60,9 +58,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * a file */ #ifndef ASSIMP_BUILD_NO_TRIANGULATE_PROCESS -#include "TriangulateProcess.h" -#include "ProcessHelper.h" -#include "PolyTools.h" + +#include "PostProcessing/TriangulateProcess.h" +#include "PostProcessing/ProcessHelper.h" +#include "Common/PolyTools.h" + #include <memory> //#define AI_BUILD_TRIANGULATE_COLOR_FACE_WINDING diff --git a/thirdparty/assimp/code/TriangulateProcess.h b/thirdparty/assimp/code/PostProcessing/TriangulateProcess.h index 47bd2115ad..916b5103dd 100644 --- a/thirdparty/assimp/code/TriangulateProcess.h +++ b/thirdparty/assimp/code/PostProcessing/TriangulateProcess.h @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_TRIANGULATEPROCESS_H_INC #define AI_TRIANGULATEPROCESS_H_INC -#include "BaseProcess.h" +#include "Common/BaseProcess.h" struct aiMesh; @@ -59,14 +59,11 @@ namespace Assimp { * into triangles. You usually want this to happen because the graphics cards * need their data as triangles. */ -class ASSIMP_API TriangulateProcess : public BaseProcess -{ +class ASSIMP_API TriangulateProcess : public BaseProcess { public: - TriangulateProcess(); ~TriangulateProcess(); -public: // ------------------------------------------------------------------- /** Returns whether the processing step is present in the given flag field. * @param pFlags The processing flags the importer was called with. A bitwise @@ -82,7 +79,6 @@ public: */ void Execute( aiScene* pScene); -public: // ------------------------------------------------------------------- /** Triangulates the given mesh. * @param pMesh The mesh to triangulate. diff --git a/thirdparty/assimp/code/ValidateDataStructure.cpp b/thirdparty/assimp/code/PostProcessing/ValidateDataStructure.cpp index 657b0361b7..712fd6943d 100644 --- a/thirdparty/assimp/code/ValidateDataStructure.cpp +++ b/thirdparty/assimp/code/PostProcessing/ValidateDataStructure.cpp @@ -46,8 +46,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * the data structure returned by Assimp. */ - - // internal headers #include "ValidateDataStructure.h" #include <assimp/BaseImporter.h> @@ -110,8 +108,8 @@ void ValidateDSProcess::ReportWarning(const char* msg,...) } // ------------------------------------------------------------------------------------------------ -inline int HasNameMatch(const aiString& in, aiNode* node) -{ +inline +int HasNameMatch(const aiString& in, aiNode* node) { int result = (node->mName == in ? 1 : 0 ); for (unsigned int i = 0; i < node->mNumChildren;++i) { result += HasNameMatch(in,node->mChildren[i]); @@ -121,9 +119,8 @@ inline int HasNameMatch(const aiString& in, aiNode* node) // ------------------------------------------------------------------------------------------------ template <typename T> -inline void ValidateDSProcess::DoValidation(T** parray, unsigned int size, - const char* firstName, const char* secondName) -{ +inline +void ValidateDSProcess::DoValidation(T** parray, unsigned int size, const char* firstName, const char* secondName) { // validate all entries if (size) { @@ -181,7 +178,8 @@ inline void ValidateDSProcess::DoValidationEx(T** parray, unsigned int size, // ------------------------------------------------------------------------------------------------ template <typename T> inline -void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, const char* firstName, const char* secondName) { +void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, const char* firstName, + const char* secondName) { // validate all entries DoValidationEx(array,size,firstName,secondName); @@ -201,9 +199,8 @@ void ValidateDSProcess::DoValidationWithNameCheck(T** array, unsigned int size, // ------------------------------------------------------------------------------------------------ // Executes the post processing step on the given imported data. -void ValidateDSProcess::Execute( aiScene* pScene) -{ - this->mScene = pScene; +void ValidateDSProcess::Execute( aiScene* pScene) { + mScene = pScene; ASSIMP_LOG_DEBUG("ValidateDataStructureProcess begin"); // validate the node graph of the scene @@ -516,13 +513,11 @@ void ValidateDSProcess::Validate( const aiMesh* pMesh) } // ------------------------------------------------------------------------------------------------ -void ValidateDSProcess::Validate( const aiMesh* pMesh, - const aiBone* pBone,float* afSum) -{ +void ValidateDSProcess::Validate( const aiMesh* pMesh, const aiBone* pBone,float* afSum) { this->Validate(&pBone->mName); if (!pBone->mNumWeights) { - ReportError("aiBone::mNumWeights is zero"); + //ReportError("aiBone::mNumWeights is zero"); } // check whether all vertices affected by this bone are valid @@ -563,9 +558,6 @@ void ValidateDSProcess::Validate( const aiAnimation* pAnimation) else { ReportError("aiAnimation::mNumChannels is 0. At least one node animation channel must be there."); } - - // Animation duration is allowed to be zero in cases where the anim contains only a single key frame. - // if (!pAnimation->mDuration)this->ReportError("aiAnimation::mDuration is zero"); } // ------------------------------------------------------------------------------------------------ @@ -746,8 +738,9 @@ void ValidateDSProcess::Validate( const aiMaterial* pMaterial) "AI_MATKEY_SHININESS_STRENGTH key is 0.0"); } break; - default: ; - }; + default: + break; + } } if (AI_SUCCESS == aiGetMaterialFloat( pMaterial,AI_MATKEY_OPACITY,&fTemp) && (!fTemp || fTemp > 1.01)) { diff --git a/thirdparty/assimp/code/ValidateDataStructure.h b/thirdparty/assimp/code/PostProcessing/ValidateDataStructure.h index bd21e88545..0b891ef414 100644 --- a/thirdparty/assimp/code/ValidateDataStructure.h +++ b/thirdparty/assimp/code/PostProcessing/ValidateDataStructure.h @@ -48,7 +48,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <assimp/types.h> #include <assimp/material.h> -#include "BaseProcess.h" + +#include "Common/BaseProcess.h" struct aiBone; struct aiMesh; diff --git a/thirdparty/assimp/code/RawLoader.cpp b/thirdparty/assimp/code/RawLoader.cpp deleted file mode 100644 index d0da247e47..0000000000 --- a/thirdparty/assimp/code/RawLoader.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/* ---------------------------------------------------------------------------- -Open Asset Import Library (assimp) ---------------------------------------------------------------------------- - -Copyright (c) 2006-2019, assimp team - - - -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of the assimp team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the assimp team. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -*/ - -/** @file RawLoader.cpp - * @brief Implementation of the RAW importer class - */ - - -#ifndef ASSIMP_BUILD_NO_RAW_IMPORTER - -// internal headers -#include "RawLoader.h" -#include <assimp/ParsingUtils.h> -#include <assimp/fast_atof.h> -#include <memory> -#include <assimp/IOSystem.hpp> -#include <assimp/DefaultLogger.hpp> -#include <assimp/scene.h> -#include <assimp/importerdesc.h> - -using namespace Assimp; - -static const aiImporterDesc desc = { - "Raw Importer", - "", - "", - "", - aiImporterFlags_SupportTextFlavour, - 0, - 0, - 0, - 0, - "raw" -}; - -// ------------------------------------------------------------------------------------------------ -// Constructor to be privately used by Importer -RAWImporter::RAWImporter() -{} - -// ------------------------------------------------------------------------------------------------ -// Destructor, private as well -RAWImporter::~RAWImporter() -{} - -// ------------------------------------------------------------------------------------------------ -// Returns whether the class can handle the format of the given file. -bool RAWImporter::CanRead( const std::string& pFile, IOSystem* /*pIOHandler*/, bool /*checkSig*/) const -{ - return SimpleExtensionCheck(pFile,"raw"); -} - -// ------------------------------------------------------------------------------------------------ -const aiImporterDesc* RAWImporter::GetInfo () const -{ - return &desc; -} - -// ------------------------------------------------------------------------------------------------ -// Imports the given file into the given scene structure. -void RAWImporter::InternReadFile( const std::string& pFile, - aiScene* pScene, IOSystem* pIOHandler) -{ - std::unique_ptr<IOStream> file( pIOHandler->Open( pFile, "rb")); - - // Check whether we can read from the file - if( file.get() == NULL) { - throw DeadlyImportError( "Failed to open RAW file " + pFile + "."); - } - - // allocate storage and copy the contents of the file to a memory buffer - // (terminate it with zero) - std::vector<char> mBuffer2; - TextFileToBuffer(file.get(),mBuffer2); - const char* buffer = &mBuffer2[0]; - - // list of groups loaded from the file - std::vector< GroupInformation > outGroups(1,GroupInformation("<default>")); - std::vector< GroupInformation >::iterator curGroup = outGroups.begin(); - - // now read all lines - char line[4096]; - while (GetNextLine(buffer,line)) - { - // if the line starts with a non-numeric identifier, it marks - // the beginning of a new group - const char* sz = line;SkipSpaces(&sz); - if (IsLineEnd(*sz))continue; - if (!IsNumeric(*sz)) - { - const char* sz2 = sz; - while (!IsSpaceOrNewLine(*sz2))++sz2; - const unsigned int length = (unsigned int)(sz2-sz); - - // find an existing group with this name - for (std::vector< GroupInformation >::iterator it = outGroups.begin(), end = outGroups.end(); - it != end;++it) - { - if (length == (*it).name.length() && !::strcmp(sz,(*it).name.c_str())) - { - curGroup = it;sz2 = NULL; - break; - } - } - if (sz2) - { - outGroups.push_back(GroupInformation(std::string(sz,length))); - curGroup = outGroups.end()-1; - } - } - else - { - // there can be maximally 12 floats plus an extra texture file name - float data[12]; - unsigned int num; - for (num = 0; num < 12;++num) - { - if(!SkipSpaces(&sz) || !IsNumeric(*sz))break; - sz = fast_atoreal_move<float>(sz,data[num]); - } - if (num != 12 && num != 9) - { - ASSIMP_LOG_ERROR("A line may have either 9 or 12 floats and an optional texture"); - continue; - } - - MeshInformation* output = NULL; - - const char* sz2 = sz; - unsigned int length; - if (!IsLineEnd(*sz)) - { - while (!IsSpaceOrNewLine(*sz2))++sz2; - length = (unsigned int)(sz2-sz); - } - else if (9 == num) - { - sz = "%default%"; - length = 9; - } - else - { - sz = ""; - length = 0; - } - - // search in the list of meshes whether we have one with this texture - for (auto &mesh : (*curGroup).meshes) - { - if (length == mesh.name.length() && (length ? !::strcmp(sz, mesh.name.c_str()) : true)) - { - output = &mesh; - break; - } - } - // if we don't have the mesh, create it - if (!output) - { - (*curGroup).meshes.push_back(MeshInformation(std::string(sz,length))); - output = &((*curGroup).meshes.back()); - } - if (12 == num) - { - aiColor4D v(data[0],data[1],data[2],1.0f); - output->colors.push_back(v); - output->colors.push_back(v); - output->colors.push_back(v); - - output->vertices.push_back(aiVector3D(data[3],data[4],data[5])); - output->vertices.push_back(aiVector3D(data[6],data[7],data[8])); - output->vertices.push_back(aiVector3D(data[9],data[10],data[11])); - } - else - { - output->vertices.push_back(aiVector3D(data[0],data[1],data[2])); - output->vertices.push_back(aiVector3D(data[3],data[4],data[5])); - output->vertices.push_back(aiVector3D(data[6],data[7],data[8])); - } - } - } - - pScene->mRootNode = new aiNode(); - pScene->mRootNode->mName.Set("<RawRoot>"); - - // count the number of valid groups - // (meshes can't be empty) - for (auto & outGroup : outGroups) - { - if (!outGroup.meshes.empty()) - { - ++pScene->mRootNode->mNumChildren; - pScene->mNumMeshes += (unsigned int) outGroup.meshes.size(); - } - } - - if (!pScene->mNumMeshes) - { - throw DeadlyImportError("RAW: No meshes loaded. The file seems to be corrupt or empty."); - } - - pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; - aiNode** cc; - if (1 == pScene->mRootNode->mNumChildren) - { - cc = &pScene->mRootNode; - pScene->mRootNode->mNumChildren = 0; - } else { - cc = new aiNode*[pScene->mRootNode->mNumChildren]; - memset(cc, 0, sizeof(aiNode*) * pScene->mRootNode->mNumChildren); - pScene->mRootNode->mChildren = cc; - } - - pScene->mNumMaterials = pScene->mNumMeshes; - aiMaterial** mats = pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials]; - - unsigned int meshIdx = 0; - for (auto & outGroup : outGroups) - { - if (outGroup.meshes.empty())continue; - - aiNode* node; - if (pScene->mRootNode->mNumChildren) - { - node = *cc = new aiNode(); - node->mParent = pScene->mRootNode; - } - else node = *cc; - node->mName.Set(outGroup.name); - - // add all meshes - node->mNumMeshes = (unsigned int) outGroup.meshes.size(); - unsigned int* pi = node->mMeshes = new unsigned int[ node->mNumMeshes ]; - for (std::vector< MeshInformation >::iterator it2 = outGroup.meshes.begin(), - end2 = outGroup.meshes.end(); it2 != end2; ++it2) - { - ai_assert(!(*it2).vertices.empty()); - - // allocate the mesh - *pi++ = meshIdx; - aiMesh* mesh = pScene->mMeshes[meshIdx] = new aiMesh(); - mesh->mMaterialIndex = meshIdx++; - - mesh->mPrimitiveTypes = aiPrimitiveType_TRIANGLE; - - // allocate storage for the vertex components and copy them - mesh->mNumVertices = (unsigned int)(*it2).vertices.size(); - mesh->mVertices = new aiVector3D[ mesh->mNumVertices ]; - ::memcpy(mesh->mVertices,&(*it2).vertices[0],sizeof(aiVector3D)*mesh->mNumVertices); - - if ((*it2).colors.size()) - { - ai_assert((*it2).colors.size() == mesh->mNumVertices); - - mesh->mColors[0] = new aiColor4D[ mesh->mNumVertices ]; - ::memcpy(mesh->mColors[0],&(*it2).colors[0],sizeof(aiColor4D)*mesh->mNumVertices); - } - - // generate triangles - ai_assert(0 == mesh->mNumVertices % 3); - aiFace* fc = mesh->mFaces = new aiFace[ mesh->mNumFaces = mesh->mNumVertices/3 ]; - aiFace* const fcEnd = fc + mesh->mNumFaces; - unsigned int n = 0; - while (fc != fcEnd) - { - aiFace& f = *fc++; - f.mIndices = new unsigned int[f.mNumIndices = 3]; - for (unsigned int m = 0; m < 3;++m) - f.mIndices[m] = n++; - } - - // generate a material for the mesh - aiMaterial* mat = new aiMaterial(); - - aiColor4D clr(1.0f,1.0f,1.0f,1.0f); - if ("%default%" == (*it2).name) // a gray default material - { - clr.r = clr.g = clr.b = 0.6f; - } - else if ((*it2).name.length() > 0) // a texture - { - aiString s; - s.Set((*it2).name); - mat->AddProperty(&s,AI_MATKEY_TEXTURE_DIFFUSE(0)); - } - mat->AddProperty<aiColor4D>(&clr,1,AI_MATKEY_COLOR_DIFFUSE); - *mats++ = mat; - } - } -} - -#endif // !! ASSIMP_BUILD_NO_RAW_IMPORTER diff --git a/thirdparty/assimp/include/assimp/Exporter.hpp b/thirdparty/assimp/include/assimp/Exporter.hpp index bf0096e7e9..ea0303e804 100644 --- a/thirdparty/assimp/include/assimp/Exporter.hpp +++ b/thirdparty/assimp/include/assimp/Exporter.hpp @@ -190,7 +190,7 @@ public: * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene. */ const aiExportDataBlob* ExportToBlob(const aiScene* pScene, const char* pFormatId, - unsigned int pPreprocessing = 0u, const ExportProperties* = nullptr); + unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const std::string& pFormatId, unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); diff --git a/thirdparty/assimp/include/assimp/ParsingUtils.h b/thirdparty/assimp/include/assimp/ParsingUtils.h index ca30ce13b0..6b9574fc67 100644 --- a/thirdparty/assimp/include/assimp/ParsingUtils.h +++ b/thirdparty/assimp/include/assimp/ParsingUtils.h @@ -196,8 +196,7 @@ bool GetNextLine( const char_t*& buffer, char_t out[ BufferSize ] ) { // --------------------------------------------------------------------------------- template <class char_t> -AI_FORCE_INLINE bool IsNumeric( char_t in) -{ +AI_FORCE_INLINE bool IsNumeric( char_t in) { return ( in >= '0' && in <= '9' ) || '-' == in || '+' == in; } diff --git a/thirdparty/assimp/include/assimp/aabb.h b/thirdparty/assimp/include/assimp/aabb.h new file mode 100644 index 0000000000..a20f317424 --- /dev/null +++ b/thirdparty/assimp/include/assimp/aabb.h @@ -0,0 +1,76 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +#pragma once +#ifndef AI_AABB_H_INC +#define AI_AABB_H_INC + +#include <assimp/vector3.h> + +struct aiAABB { + C_STRUCT aiVector3D mMin; + C_STRUCT aiVector3D mMax; + +#ifdef __cplusplus + + aiAABB() + : mMin() + , mMax() { + // empty + } + + aiAABB(const aiVector3D &min, const aiVector3D &max ) + : mMin(min) + , mMax(max) { + // empty + } + + ~aiAABB() { + // empty + } + +#endif +}; + + +#endif diff --git a/thirdparty/assimp/include/assimp/camera.h b/thirdparty/assimp/include/assimp/camera.h index 99daf69934..e573eea5d1 100644 --- a/thirdparty/assimp/include/assimp/camera.h +++ b/thirdparty/assimp/include/assimp/camera.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -60,7 +58,7 @@ extern "C" { * * Cameras have a representation in the node graph and can be animated. * An important aspect is that the camera itself is also part of the - * scenegraph. This means, any values such as the look-at vector are not + * scene-graph. This means, any values such as the look-at vector are not * *absolute*, they're <b>relative</b> to the coordinate system defined * by the node which corresponds to the camera. This allows for camera * animations. For static cameras parameters like the 'look-at' or 'up' vectors @@ -162,7 +160,6 @@ struct aiCamera */ float mClipPlaneFar; - /** Screen aspect ratio. * * This is the ration between the width and the height of the diff --git a/thirdparty/assimp/include/assimp/color4.inl b/thirdparty/assimp/include/assimp/color4.inl index 3192d55f39..afa53dcb5b 100644 --- a/thirdparty/assimp/include/assimp/color4.inl +++ b/thirdparty/assimp/include/assimp/color4.inl @@ -85,6 +85,8 @@ AI_FORCE_INLINE TReal aiColor4t<TReal>::operator[](unsigned int i) const { return g; case 2: return b; + case 3: + return a; default: break; } @@ -100,6 +102,8 @@ AI_FORCE_INLINE TReal& aiColor4t<TReal>::operator[](unsigned int i) { return g; case 2: return b; + case 3: + return a; default: break; } diff --git a/thirdparty/assimp/include/assimp/config.h.in b/thirdparty/assimp/include/assimp/config.h.in index a37ff0b8c8..d08b929a10 100644 --- a/thirdparty/assimp/include/assimp/config.h.in +++ b/thirdparty/assimp/include/assimp/config.h.in @@ -142,7 +142,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @brief Specifies the maximum angle that may be between two vertex tangents * that their tangents and bi-tangents are smoothed. * - * This applies to the CalcTangentSpace-Step. The angle is specified + * This applies to the CalcTangentSpace-Step. TFvhe angle is specified * in degrees. The maximum value is 175. * Property type: float. Default value: 45 degrees */ @@ -651,13 +651,28 @@ enum aiComponent // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will use the legacy embedded texture naming. -* -* The default value is false (0) -* Property type: bool -*/ + * + * The default value is false (0) + * Property type: bool + */ #define AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING \ "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" - + +// --------------------------------------------------------------------------- +/** @brief Set wether the importer shall not remove empty bones. + * + * Empty bone are often used to define connections for other models. + */ +#define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ + "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" + + +// --------------------------------------------------------------------------- +/** @brief Set wether the FBX importer shall convert the unit from cm to m. + */ +#define AI_CONFIG_FBX_CONVERT_TO_M \ + "AI_CONFIG_FBX_CONVERT_TO_M" + // --------------------------------------------------------------------------- /** @brief Set the vertex animation keyframe to be imported * @@ -966,8 +981,12 @@ enum aiComponent #define AI_CONFIG_EXPORT_XFILE_64BIT "EXPORT_XFILE_64BIT" -/** - * +/** @brief Specifies whether the assimp export shall be able to export point clouds + * + * When this flag is not defined the render data has to contain valid faces. + * Point clouds are only a collection of vertices which have nor spatial organization + * by a face and the validation process will remove them. Enabling this feature will + * switch off the flag and enable the functionality to export pure point clouds. */ #define AI_CONFIG_EXPORT_POINT_CLOUDS "EXPORT_POINT_CLOUDS" diff --git a/thirdparty/assimp/include/assimp/defs.h b/thirdparty/assimp/include/assimp/defs.h index 4a177e3c3e..05a5e3fd4b 100644 --- a/thirdparty/assimp/include/assimp/defs.h +++ b/thirdparty/assimp/include/assimp/defs.h @@ -122,7 +122,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * OPTIMIZEANIMS * OPTIMIZEGRAPH * GENENTITYMESHES - * FIXTEXTUREPATHS */ + * FIXTEXTUREPATHS + * GENBOUNDINGBOXES */ ////////////////////////////////////////////////////////////////////////// #ifdef _MSC_VER @@ -214,10 +215,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif #if (defined(__BORLANDC__) || defined (__BCPLUSPLUS__)) -#error Currently, Borland is unsupported. Feel free to port Assimp. - -// "W8059 Packgröße der Struktur geändert" - +# error Currently, Borland is unsupported. Feel free to port Assimp. #endif @@ -243,10 +241,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. typedef double ai_real; typedef signed long long int ai_int; typedef unsigned long long int ai_uint; +#ifndef ASSIMP_AI_REAL_TEXT_PRECISION +#define ASSIMP_AI_REAL_TEXT_PRECISION 16 +#endif // ASSIMP_AI_REAL_TEXT_PRECISION #else // ASSIMP_DOUBLE_PRECISION typedef float ai_real; typedef signed int ai_int; typedef unsigned int ai_uint; +#ifndef ASSIMP_AI_REAL_TEXT_PRECISION +#define ASSIMP_AI_REAL_TEXT_PRECISION 8 +#endif // ASSIMP_AI_REAL_TEXT_PRECISION #endif // ASSIMP_DOUBLE_PRECISION ////////////////////////////////////////////////////////////////////////// @@ -267,6 +271,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_DEG_TO_RAD(x) ((x)*(ai_real)0.0174532925) #define AI_RAD_TO_DEG(x) ((x)*(ai_real)57.2957795) +/* Numerical limits */ +static const ai_real ai_epsilon = (ai_real) 0.00001; + /* Support for big-endian builds */ #if defined(__BYTE_ORDER__) # if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) @@ -293,11 +300,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef _MSC_VER # define AI_NO_EXCEPT noexcept #else -# if (_MSC_VER == 1915 ) +# if (_MSC_VER >= 1915 ) # define AI_NO_EXCEPT noexcept # else # define AI_NO_EXCEPT # endif -#endif +#endif // _MSC_VER #endif // !! AI_DEFINES_H_INC diff --git a/thirdparty/assimp/include/assimp/mesh.h b/thirdparty/assimp/include/assimp/mesh.h index 36f3ed2afd..f1628f1f54 100644 --- a/thirdparty/assimp/include/assimp/mesh.h +++ b/thirdparty/assimp/include/assimp/mesh.h @@ -48,7 +48,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_MESH_H_INC #define AI_MESH_H_INC -#include "types.h" +#include <assimp/types.h> +#include <assimp/aabb.h> #ifdef __cplusplus extern "C" { @@ -714,6 +715,11 @@ struct aiMesh * Method of morphing when animeshes are specified. */ unsigned int mMethod; + + /** + * + */ + C_STRUCT aiAABB mAABB; #ifdef __cplusplus @@ -735,7 +741,8 @@ struct aiMesh , mMaterialIndex( 0 ) , mNumAnimMeshes( 0 ) , mAnimMeshes(nullptr) - , mMethod( 0 ) { + , mMethod( 0 ) + , mAABB() { for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a ) { mNumUVComponents[a] = 0; mTextureCoords[a] = nullptr; diff --git a/thirdparty/assimp/include/assimp/postprocess.h b/thirdparty/assimp/include/assimp/postprocess.h index c23a5490a5..2a74414216 100644 --- a/thirdparty/assimp/include/assimp/postprocess.h +++ b/thirdparty/assimp/include/assimp/postprocess.h @@ -438,7 +438,7 @@ enum aiPostProcessSteps aiProcess_FindInstances = 0x100000, // ------------------------------------------------------------------------- - /** <hr>A postprocessing step to reduce the number of meshes. + /** <hr>A post-processing step to reduce the number of meshes. * * This will, in fact, reduce the number of draw calls. * @@ -450,7 +450,7 @@ enum aiPostProcessSteps // ------------------------------------------------------------------------- - /** <hr>A postprocessing step to optimize the scene hierarchy. + /** <hr>A post-processing step to optimize the scene hierarchy. * * Nodes without animations, bones, lights or cameras assigned are * collapsed and joined. @@ -514,7 +514,7 @@ enum aiPostProcessSteps // ------------------------------------------------------------------------- /** <hr>This step splits meshes with many bones into sub-meshes so that each - * su-bmesh has fewer or as many bones as a given limit. + * sub-mesh has fewer or as many bones as a given limit. */ aiProcess_SplitByBoneCount = 0x2000000, @@ -541,7 +541,7 @@ enum aiPostProcessSteps * global scaling from your importer settings like in FBX. Use the flag * AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY from the global property table to configure this. * - * Use <tt>#AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY</tt> to setup the global scaing factor. + * Use <tt>#AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY</tt> to setup the global scaling factor. */ aiProcess_GlobalScale = 0x8000000, @@ -574,6 +574,11 @@ enum aiPostProcessSteps * This process gives sense back to aiProcess_JoinIdenticalVertices */ aiProcess_DropNormals = 0x40000000, + + // ------------------------------------------------------------------------- + /** + */ + aiProcess_GenBoundingBoxes = 0x80000000 }; diff --git a/thirdparty/assimp/include/assimp/scene.h b/thirdparty/assimp/include/assimp/scene.h index de0239702d..df5d6f3b5e 100644 --- a/thirdparty/assimp/include/assimp/scene.h +++ b/thirdparty/assimp/include/assimp/scene.h @@ -56,6 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "material.h" #include "anim.h" #include "metadata.h" +#include <cstdlib> #ifdef __cplusplus extern "C" { @@ -389,6 +390,14 @@ struct aiScene //! Returns an embedded texture const aiTexture* GetEmbeddedTexture(const char* filename) const { + // lookup using texture ID (if referenced like: "*1", "*2", etc.) + if ('*' == *filename) { + int index = std::atoi(filename + 1); + if (0 > index || mNumTextures <= static_cast<unsigned>(index)) + return nullptr; + return mTextures[index]; + } + // lookup using filename const char* shortFilename = GetShortFilename(filename); for (unsigned int i = 0; i < mNumTextures; i++) { const char* shortTextureFilename = GetShortFilename(mTextures[i]->mFilename.C_Str()); diff --git a/thirdparty/freetype/include/freetype/freetype.h b/thirdparty/freetype/include/freetype/freetype.h index 4f2eaca691..a6bb667e3a 100644 --- a/thirdparty/freetype/include/freetype/freetype.h +++ b/thirdparty/freetype/include/freetype/freetype.h @@ -645,7 +645,7 @@ FT_BEGIN_HEADER * FT_ENCODING_MS_SYMBOL :: * Microsoft Symbol encoding, used to encode mathematical symbols and * wingdings. For more information, see - * 'https://www.microsoft.com/typography/otspec/recom.htm', + * 'https://www.microsoft.com/typography/otspec/recom.htm#non-standard-symbol-fonts', * 'http://www.kostis.net/charsets/symbol.htm', and * 'http://www.kostis.net/charsets/wingding.htm'. * @@ -1766,6 +1766,13 @@ FT_BEGIN_HEADER * transformed, distorted, emboldened, etc. However, it must not be * freed. * + * [Since 2.10.1] If @FT_LOAD_NO_SCALE is set, outline coordinates of + * OpenType variation fonts for a selected instance are internally + * handled as 26.6 fractional font units but returned as (rounded) + * integers, as expected. To get unrounded font units, don't use + * @FT_LOAD_NO_SCALE but load the glyph with @FT_LOAD_NO_HINTING and + * scale it, using the font's `units_per_EM` value as the ppem. + * * num_subglyphs :: * The number of subglyphs in a composite glyph. This field is only * valid for the composite glyph format that should normally only be @@ -3932,8 +3939,8 @@ FT_BEGIN_HEADER * The glyph index. 0~means 'undefined character code'. */ FT_EXPORT( FT_UInt ) - FT_Get_Name_Index( FT_Face face, - FT_String* glyph_name ); + FT_Get_Name_Index( FT_Face face, + const FT_String* glyph_name ); /************************************************************************** @@ -4774,7 +4781,7 @@ FT_BEGIN_HEADER */ #define FREETYPE_MAJOR 2 #define FREETYPE_MINOR 10 -#define FREETYPE_PATCH 0 +#define FREETYPE_PATCH 1 /************************************************************************** diff --git a/thirdparty/freetype/include/freetype/fterrors.h b/thirdparty/freetype/include/freetype/fterrors.h index 58f5a3ead1..2b47eb2096 100644 --- a/thirdparty/freetype/include/freetype/fterrors.h +++ b/thirdparty/freetype/include/freetype/fterrors.h @@ -244,6 +244,8 @@ #define FT_ERR_PROTOS_DEFINED +FT_BEGIN_HEADER + /************************************************************************** * * @function: @@ -274,6 +276,8 @@ FT_EXPORT( const char* ) FT_Error_String( FT_Error error_code ); +FT_END_HEADER + #endif /* FT_ERR_PROTOS_DEFINED */ diff --git a/thirdparty/freetype/include/freetype/ftglyph.h b/thirdparty/freetype/include/freetype/ftglyph.h index 4067c2e62f..fedab8491e 100644 --- a/thirdparty/freetype/include/freetype/ftglyph.h +++ b/thirdparty/freetype/include/freetype/ftglyph.h @@ -210,7 +210,7 @@ FT_BEGIN_HEADER * * As the outline is extracted from a glyph slot, its coordinates are * expressed normally in 26.6 pixels, unless the flag @FT_LOAD_NO_SCALE - * was used in @FT_Load_Glyph() or @FT_Load_Char(). + * was used in @FT_Load_Glyph or @FT_Load_Char. * * The outline's tables are always owned by the object and are destroyed * with it. diff --git a/thirdparty/freetype/include/freetype/ftimage.h b/thirdparty/freetype/include/freetype/ftimage.h index d640b0b0aa..face34fe49 100644 --- a/thirdparty/freetype/include/freetype/ftimage.h +++ b/thirdparty/freetype/include/freetype/ftimage.h @@ -869,7 +869,7 @@ FT_BEGIN_HEADER * * @input: * y :: - * The scanline's y~coordinate. + * The scanline's upward y~coordinate. * * count :: * The number of spans to draw on this scanline. @@ -945,19 +945,16 @@ FT_BEGIN_HEADER * This flag is set to indicate direct rendering. In this mode, client * applications must provide their own span callback. This lets them * directly draw or compose over an existing bitmap. If this bit is - * not set, the target pixmap's buffer _must_ be zeroed before - * rendering. + * _not_ set, the target pixmap's buffer _must_ be zeroed before + * rendering and the output will be clipped to its size. * * Direct rendering is only possible with anti-aliased glyphs. * * FT_RASTER_FLAG_CLIP :: * This flag is only used in direct rendering mode. If set, the output * will be clipped to a box specified in the `clip_box` field of the - * @FT_Raster_Params structure. - * - * Note that by default, the glyph bitmap is clipped to the target - * pixmap, except in direct rendering mode where all spans are - * generated if no clipping box is set. + * @FT_Raster_Params structure. Otherwise, the `clip_box` is + * effectively set to the bounding box and all spans are generated. */ #define FT_RASTER_FLAG_DEFAULT 0x0 #define FT_RASTER_FLAG_AA 0x1 @@ -978,7 +975,8 @@ FT_BEGIN_HEADER * FT_Raster_Params * * @description: - * A structure to hold the arguments used by a raster's render function. + * A structure to hold the parameters used by a raster's render function, + * passed as an argument to @FT_Outline_Render. * * @fields: * target :: diff --git a/thirdparty/freetype/include/freetype/ftmodapi.h b/thirdparty/freetype/include/freetype/ftmodapi.h index 88488bfe89..8d039c4f3a 100644 --- a/thirdparty/freetype/include/freetype/ftmodapi.h +++ b/thirdparty/freetype/include/freetype/ftmodapi.h @@ -623,7 +623,7 @@ FT_BEGIN_HEADER * it is bytecode interpreter's execution context, `TT_ExecContext`, * which is declared in FreeType's internal header file `tttypes.h`. */ - typedef void + typedef FT_Error (*FT_DebugHook_Func)( void* arg ); diff --git a/thirdparty/freetype/include/freetype/ftoutln.h b/thirdparty/freetype/include/freetype/ftoutln.h index 75c3d01596..b72327b703 100644 --- a/thirdparty/freetype/include/freetype/ftoutln.h +++ b/thirdparty/freetype/include/freetype/ftoutln.h @@ -466,8 +466,6 @@ FT_BEGIN_HEADER * * @description: * Render an outline within a bitmap using the current scan-convert. - * This function uses an @FT_Raster_Params structure as an argument, - * allowing advanced features like direct composition, translucency, etc. * * @input: * library :: @@ -485,8 +483,10 @@ FT_BEGIN_HEADER * FreeType error code. 0~means success. * * @note: - * You should know what you are doing and how @FT_Raster_Params works to - * use this function. + * This advanced function uses @FT_Raster_Params as an argument, + * allowing FreeType rasterizer to be used for direct composition, + * translucency, etc. You should know how to set up @FT_Raster_Params + * for this function to work. * * The field `params.source` will be set to `outline` before the scan * converter is called, which means that the value you give to it is diff --git a/thirdparty/freetype/include/freetype/ftwinfnt.h b/thirdparty/freetype/include/freetype/ftwinfnt.h index 3437913d53..a2fba903d2 100644 --- a/thirdparty/freetype/include/freetype/ftwinfnt.h +++ b/thirdparty/freetype/include/freetype/ftwinfnt.h @@ -58,7 +58,7 @@ FT_BEGIN_HEADER * @description: * A list of valid values for the `charset` byte in @FT_WinFNT_HeaderRec. * Exact mapping tables for the various 'cpXXXX' encodings (except for - * 'cp1361') can be found at 'ftp://ftp.unicode.org/Public' in the + * 'cp1361') can be found at 'ftp://ftp.unicode.org/Public/' in the * `MAPPINGS/VENDORS/MICSFT/WINDOWS` subdirectory. 'cp1361' is roughly a * superset of `MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT`. * diff --git a/thirdparty/freetype/include/freetype/internal/ftcalc.h b/thirdparty/freetype/include/freetype/internal/ftcalc.h index 2986ec359b..1811fcd1ea 100644 --- a/thirdparty/freetype/include/freetype/internal/ftcalc.h +++ b/thirdparty/freetype/include/freetype/internal/ftcalc.h @@ -378,6 +378,7 @@ FT_BEGIN_HEADER #if FT_SIZEOF_INT == 4 #include <intrin.h> +#pragma intrinsic( _BitScanReverse ) static __inline FT_Int32 FT_MSB_i386( FT_UInt32 x ) @@ -385,7 +386,6 @@ FT_BEGIN_HEADER unsigned long where; - /* not available in older VC versions */ _BitScanReverse( &where, x ); return (FT_Int32)where; diff --git a/thirdparty/freetype/include/freetype/internal/ftobjs.h b/thirdparty/freetype/include/freetype/internal/ftobjs.h index f3a41b35ab..0c1d3e5bf2 100644 --- a/thirdparty/freetype/include/freetype/internal/ftobjs.h +++ b/thirdparty/freetype/include/freetype/internal/ftobjs.h @@ -278,14 +278,12 @@ FT_BEGIN_HEADER #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, - FT_Render_Mode render_mode, FT_Byte* weights ); /* This is the default LCD filter, an in-place, 5-tap FIR filter. */ FT_BASE( void ) ft_lcd_filter_fir( FT_Bitmap* bitmap, - FT_Render_Mode mode, FT_LcdFiveTapFilter weights ); #endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ @@ -941,8 +939,8 @@ FT_BEGIN_HEADER FT_UInt buffer_max ); typedef FT_UInt - (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, - FT_String* glyph_name ); + (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, + const FT_String* glyph_name ); #ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM diff --git a/thirdparty/freetype/include/freetype/internal/ftstream.h b/thirdparty/freetype/include/freetype/internal/ftstream.h index e4dca0b0a5..a579a039b9 100644 --- a/thirdparty/freetype/include/freetype/internal/ftstream.h +++ b/thirdparty/freetype/include/freetype/internal/ftstream.h @@ -166,6 +166,17 @@ FT_BEGIN_HEADER /* + * function acts on increases does range for emits + * pointer checking frames error + * ------------------------------------------------------------------- + * FT_PEEK_XXX buffer pointer no no no no + * FT_NEXT_XXX buffer pointer yes no no no + * FT_GET_XXX stream->cursor yes yes yes no + * FT_READ_XXX stream->pos yes yes no yes + */ + + + /* * `FT_PEEK_XXX' are generic macros to get data from a buffer position. No * safety checks are performed. */ diff --git a/thirdparty/freetype/include/freetype/internal/fttrace.h b/thirdparty/freetype/include/freetype/internal/fttrace.h index 8089babfb6..f5f9598046 100644 --- a/thirdparty/freetype/include/freetype/internal/fttrace.h +++ b/thirdparty/freetype/include/freetype/internal/fttrace.h @@ -48,6 +48,7 @@ FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ /* SFNT driver components */ FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( sfwoff ) /* WOFF format handler (sfwoff.c) */ FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */ FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ FT_TRACE_DEF( ttcolr ) /* glyph layer table (ttcolr.c) */ diff --git a/thirdparty/freetype/include/freetype/internal/internal.h b/thirdparty/freetype/include/freetype/internal/internal.h index 173d8ad906..3c8830f7e4 100644 --- a/thirdparty/freetype/include/freetype/internal/internal.h +++ b/thirdparty/freetype/include/freetype/internal/internal.h @@ -40,6 +40,7 @@ #define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> #define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> +#define FT_INTERNAL_WOFF_TYPES_H <freetype/internal/wofftypes.h> #define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> #define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> diff --git a/thirdparty/freetype/include/freetype/internal/psaux.h b/thirdparty/freetype/include/freetype/internal/psaux.h index 3ab01c3e68..f962a973de 100644 --- a/thirdparty/freetype/include/freetype/internal/psaux.h +++ b/thirdparty/freetype/include/freetype/internal/psaux.h @@ -96,10 +96,10 @@ FT_BEGIN_HEADER (*done)( PS_Table table ); FT_Error - (*add)( PS_Table table, - FT_Int idx, - void* object, - FT_UInt length ); + (*add)( PS_Table table, + FT_Int idx, + const void* object, + FT_UInt length ); void (*release)( PS_Table table ); diff --git a/thirdparty/freetype/include/freetype/internal/services/svgldict.h b/thirdparty/freetype/include/freetype/internal/services/svgldict.h index ca8edf0eb5..0949621835 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svgldict.h +++ b/thirdparty/freetype/include/freetype/internal/services/svgldict.h @@ -41,8 +41,8 @@ FT_BEGIN_HEADER FT_UInt buffer_max ); typedef FT_UInt - (*FT_GlyphDict_NameIndexFunc)( FT_Face face, - FT_String* glyph_name ); + (*FT_GlyphDict_NameIndexFunc)( FT_Face face, + const FT_String* glyph_name ); FT_DEFINE_SERVICE( GlyphDict ) diff --git a/thirdparty/freetype/include/freetype/internal/sfnt.h b/thirdparty/freetype/include/freetype/internal/sfnt.h index 225f40df6e..b19241c306 100644 --- a/thirdparty/freetype/include/freetype/internal/sfnt.h +++ b/thirdparty/freetype/include/freetype/internal/sfnt.h @@ -23,6 +23,7 @@ #include <ft2build.h> #include FT_INTERNAL_DRIVER_H #include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_WOFF_TYPES_H FT_BEGIN_HEADER diff --git a/thirdparty/freetype/include/freetype/internal/t1types.h b/thirdparty/freetype/include/freetype/internal/t1types.h index e197a1afca..d94c8c1284 100644 --- a/thirdparty/freetype/include/freetype/internal/t1types.h +++ b/thirdparty/freetype/include/freetype/internal/t1types.h @@ -76,8 +76,8 @@ FT_BEGIN_HEADER FT_Int code_first; FT_Int code_last; - FT_UShort* char_index; - FT_String** char_name; + FT_UShort* char_index; + const FT_String** char_name; } T1_EncodingRec, *T1_Encoding; diff --git a/thirdparty/freetype/include/freetype/internal/tttypes.h b/thirdparty/freetype/include/freetype/internal/tttypes.h index 5e9f40ec3f..23db240e7c 100644 --- a/thirdparty/freetype/include/freetype/internal/tttypes.h +++ b/thirdparty/freetype/include/freetype/internal/tttypes.h @@ -153,81 +153,6 @@ FT_BEGIN_HEADER /************************************************************************** * * @struct: - * WOFF_HeaderRec - * - * @description: - * WOFF file format header. - * - * @fields: - * See - * - * https://www.w3.org/TR/WOFF/#WOFFHeader - */ - typedef struct WOFF_HeaderRec_ - { - FT_ULong signature; - FT_ULong flavor; - FT_ULong length; - FT_UShort num_tables; - FT_UShort reserved; - FT_ULong totalSfntSize; - FT_UShort majorVersion; - FT_UShort minorVersion; - FT_ULong metaOffset; - FT_ULong metaLength; - FT_ULong metaOrigLength; - FT_ULong privOffset; - FT_ULong privLength; - - } WOFF_HeaderRec, *WOFF_Header; - - - /************************************************************************** - * - * @struct: - * WOFF_TableRec - * - * @description: - * This structure describes a given table of a WOFF font. - * - * @fields: - * Tag :: - * A four-bytes tag describing the table. - * - * Offset :: - * The offset of the table from the start of the WOFF font in its - * resource. - * - * CompLength :: - * Compressed table length (in bytes). - * - * OrigLength :: - * Uncompressed table length (in bytes). - * - * CheckSum :: - * The table checksum. This value can be ignored. - * - * OrigOffset :: - * The uncompressed table file offset. This value gets computed while - * constructing the (uncompressed) SFNT header. It is not contained in - * the WOFF file. - */ - typedef struct WOFF_TableRec_ - { - FT_ULong Tag; /* table ID */ - FT_ULong Offset; /* table file offset */ - FT_ULong CompLength; /* compressed table length */ - FT_ULong OrigLength; /* uncompressed table length */ - FT_ULong CheckSum; /* uncompressed checksum */ - - FT_ULong OrigOffset; /* uncompressed table file offset */ - /* (not in the WOFF file) */ - } WOFF_TableRec, *WOFF_Table; - - - /************************************************************************** - * - * @struct: * TT_LongMetricsRec * * @description: @@ -1395,8 +1320,10 @@ FT_BEGIN_HEADER * * cvt :: * The face's original control value table. Coordinates are expressed - * in unscaled font units. Comes from the 'cvt~' table. Ignored for - * Type 2 fonts. + * in unscaled font units (in 26.6 format). Comes from the 'cvt~' + * table. Ignored for Type 2 fonts. + * + * If varied by the `CVAR' table, non-integer values are possible. * * interpreter :: * A pointer to the TrueType bytecode interpreters field is also used @@ -1633,7 +1560,7 @@ FT_BEGIN_HEADER /* the original, unscaled, control value table */ FT_ULong cvt_size; - FT_Short* cvt; + FT_Int32* cvt; /* A pointer to the bytecode interpreter to use. This is also */ /* used to hook the debugger for the `ttdebug' utility. */ diff --git a/thirdparty/freetype/include/freetype/internal/wofftypes.h b/thirdparty/freetype/include/freetype/internal/wofftypes.h new file mode 100644 index 0000000000..ba55bf883e --- /dev/null +++ b/thirdparty/freetype/include/freetype/internal/wofftypes.h @@ -0,0 +1,112 @@ +/**************************************************************************** + * + * wofftypes.h + * + * Basic WOFF/WOFF2 type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef WOFFTYPES_H_ +#define WOFFTYPES_H_ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @struct: + * WOFF_HeaderRec + * + * @description: + * WOFF file format header. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF/#WOFFHeader + */ + typedef struct WOFF_HeaderRec_ + { + FT_ULong signature; + FT_ULong flavor; + FT_ULong length; + FT_UShort num_tables; + FT_UShort reserved; + FT_ULong totalSfntSize; + FT_UShort majorVersion; + FT_UShort minorVersion; + FT_ULong metaOffset; + FT_ULong metaLength; + FT_ULong metaOrigLength; + FT_ULong privOffset; + FT_ULong privLength; + + } WOFF_HeaderRec, *WOFF_Header; + + + /************************************************************************** + * + * @struct: + * WOFF_TableRec + * + * @description: + * This structure describes a given table of a WOFF font. + * + * @fields: + * Tag :: + * A four-bytes tag describing the table. + * + * Offset :: + * The offset of the table from the start of the WOFF font in its + * resource. + * + * CompLength :: + * Compressed table length (in bytes). + * + * OrigLength :: + * Uncompressed table length (in bytes). + * + * CheckSum :: + * The table checksum. This value can be ignored. + * + * OrigOffset :: + * The uncompressed table file offset. This value gets computed while + * constructing the (uncompressed) SFNT header. It is not contained in + * the WOFF file. + */ + typedef struct WOFF_TableRec_ + { + FT_ULong Tag; /* table ID */ + FT_ULong Offset; /* table file offset */ + FT_ULong CompLength; /* compressed table length */ + FT_ULong OrigLength; /* uncompressed table length */ + FT_ULong CheckSum; /* uncompressed checksum */ + + FT_ULong OrigOffset; /* uncompressed table file offset */ + /* (not in the WOFF file) */ + } WOFF_TableRec, *WOFF_Table; + + +FT_END_HEADER + +#endif /* WOFFTYPES_H_ */ + + +/* END */ diff --git a/thirdparty/freetype/src/autofit/afblue.c b/thirdparty/freetype/src/autofit/afblue.c index 28da159008..b99dbeb19c 100644 --- a/thirdparty/freetype/src/autofit/afblue.c +++ b/thirdparty/freetype/src/autofit/afblue.c @@ -296,6 +296,10 @@ '\0', '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xA7', ' ', '\xE0', '\xB4', '\xB6', ' ', '\xE0', '\xB4', '\x98', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xA5', ' ', '\xE0', '\xB4', '\xB2', /* à´Ÿ à´ à´§ à´¶ à´˜ à´š à´¥ à´² */ '\0', + '\xE1', '\xA0', '\xB3', ' ', '\xE1', '\xA0', '\xB4', ' ', '\xE1', '\xA0', '\xB6', ' ', '\xE1', '\xA0', '\xBD', ' ', '\xE1', '\xA1', '\x82', ' ', '\xE1', '\xA1', '\x8A', ' ', '\xE2', '\x80', '\x8D', '\xE1', '\xA1', '\xA1', '\xE2', '\x80', '\x8D', ' ', '\xE2', '\x80', '\x8D', '\xE1', '\xA1', '\xB3', '\xE2', '\x80', '\x8D', /* á ³ á ´ á ¶ á ½ á¡‚ ᡊ â€á¡¡â€ â€á¡³â€ */ + '\0', + '\xE1', '\xA1', '\x83', /* ᡃ */ + '\0', '\xE1', '\x80', '\x81', ' ', '\xE1', '\x80', '\x82', ' ', '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\xA5', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B', /* ဠဂ င ဒ ဠᥠአዠ*/ '\0', '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x8E', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x95', ' ', '\xE1', '\x80', '\x97', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B', /* င ဎ ဒ ပ ဗ ဠአዠ*/ @@ -649,6 +653,9 @@ { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MONGOLIAN_TOP_BASE, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, { AF_BLUE_STRING_MYANMAR_BOTTOM, 0 }, diff --git a/thirdparty/freetype/src/autofit/afblue.dat b/thirdparty/freetype/src/autofit/afblue.dat index 14a0993b61..46db43fe22 100644 --- a/thirdparty/freetype/src/autofit/afblue.dat +++ b/thirdparty/freetype/src/autofit/afblue.dat @@ -392,6 +392,11 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_MALAYALAM_BOTTOM "à´Ÿ à´ à´§ à´¶ à´˜ à´š à´¥ à´²" + AF_BLUE_STRING_MONGOLIAN_TOP_BASE + "á ³ á ´ á ¶ á ½ á¡‚ ᡊ â€á¡¡â€ â€á¡³â€" + AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE + "ᡃ" + AF_BLUE_STRING_MYANMAR_TOP "ဠဂ င ဒ ဠᥠአá‹" AF_BLUE_STRING_MYANMAR_BOTTOM @@ -947,6 +952,11 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_MONG + { AF_BLUE_STRING_MONGOLIAN_TOP_BASE, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_MYMR { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT } diff --git a/thirdparty/freetype/src/autofit/afblue.h b/thirdparty/freetype/src/autofit/afblue.h index a2ff597b8e..b69b1df521 100644 --- a/thirdparty/freetype/src/autofit/afblue.h +++ b/thirdparty/freetype/src/autofit/afblue.h @@ -212,56 +212,58 @@ FT_BEGIN_HEADER AF_BLUE_STRING_LISU_BOTTOM = 3506, AF_BLUE_STRING_MALAYALAM_TOP = 3538, AF_BLUE_STRING_MALAYALAM_BOTTOM = 3582, - AF_BLUE_STRING_MYANMAR_TOP = 3614, - AF_BLUE_STRING_MYANMAR_BOTTOM = 3646, - AF_BLUE_STRING_MYANMAR_ASCENDER = 3678, - AF_BLUE_STRING_MYANMAR_DESCENDER = 3706, - AF_BLUE_STRING_NKO_TOP = 3738, - AF_BLUE_STRING_NKO_BOTTOM = 3762, - AF_BLUE_STRING_NKO_SMALL_TOP = 3777, - AF_BLUE_STRING_NKO_SMALL_BOTTOM = 3786, - AF_BLUE_STRING_OL_CHIKI = 3798, - AF_BLUE_STRING_OLD_TURKIC_TOP = 3822, - AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 3837, - AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 3857, - AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 3897, - AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 3927, - AF_BLUE_STRING_OSAGE_SMALL_TOP = 3942, - AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 3982, - AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 4022, - AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 4047, - AF_BLUE_STRING_OSMANYA_TOP = 4062, - AF_BLUE_STRING_OSMANYA_BOTTOM = 4102, - AF_BLUE_STRING_SAURASHTRA_TOP = 4142, - AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4174, - AF_BLUE_STRING_SHAVIAN_TOP = 4194, - AF_BLUE_STRING_SHAVIAN_BOTTOM = 4204, - AF_BLUE_STRING_SHAVIAN_DESCENDER = 4229, - AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4239, - AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4274, - AF_BLUE_STRING_SINHALA_TOP = 4289, - AF_BLUE_STRING_SINHALA_BOTTOM = 4321, - AF_BLUE_STRING_SINHALA_DESCENDER = 4353, - AF_BLUE_STRING_SUNDANESE_TOP = 4397, - AF_BLUE_STRING_SUNDANESE_BOTTOM = 4421, - AF_BLUE_STRING_SUNDANESE_DESCENDER = 4453, - AF_BLUE_STRING_TAI_VIET_TOP = 4461, - AF_BLUE_STRING_TAI_VIET_BOTTOM = 4481, - AF_BLUE_STRING_TAMIL_TOP = 4493, - AF_BLUE_STRING_TAMIL_BOTTOM = 4525, - AF_BLUE_STRING_TELUGU_TOP = 4557, - AF_BLUE_STRING_TELUGU_BOTTOM = 4585, - AF_BLUE_STRING_THAI_TOP = 4613, - AF_BLUE_STRING_THAI_BOTTOM = 4637, - AF_BLUE_STRING_THAI_ASCENDER = 4665, - AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4677, - AF_BLUE_STRING_THAI_DESCENDER = 4689, - AF_BLUE_STRING_THAI_LARGE_DESCENDER = 4705, - AF_BLUE_STRING_THAI_DIGIT_TOP = 4713, - AF_BLUE_STRING_TIFINAGH = 4725, - AF_BLUE_STRING_VAI_TOP = 4757, - AF_BLUE_STRING_VAI_BOTTOM = 4789, - af_blue_1_1 = 4820, + AF_BLUE_STRING_MONGOLIAN_TOP_BASE = 3614, + AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE = 3658, + AF_BLUE_STRING_MYANMAR_TOP = 3662, + AF_BLUE_STRING_MYANMAR_BOTTOM = 3694, + AF_BLUE_STRING_MYANMAR_ASCENDER = 3726, + AF_BLUE_STRING_MYANMAR_DESCENDER = 3754, + AF_BLUE_STRING_NKO_TOP = 3786, + AF_BLUE_STRING_NKO_BOTTOM = 3810, + AF_BLUE_STRING_NKO_SMALL_TOP = 3825, + AF_BLUE_STRING_NKO_SMALL_BOTTOM = 3834, + AF_BLUE_STRING_OL_CHIKI = 3846, + AF_BLUE_STRING_OLD_TURKIC_TOP = 3870, + AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 3885, + AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 3905, + AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 3945, + AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 3975, + AF_BLUE_STRING_OSAGE_SMALL_TOP = 3990, + AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 4030, + AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 4070, + AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 4095, + AF_BLUE_STRING_OSMANYA_TOP = 4110, + AF_BLUE_STRING_OSMANYA_BOTTOM = 4150, + AF_BLUE_STRING_SAURASHTRA_TOP = 4190, + AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4222, + AF_BLUE_STRING_SHAVIAN_TOP = 4242, + AF_BLUE_STRING_SHAVIAN_BOTTOM = 4252, + AF_BLUE_STRING_SHAVIAN_DESCENDER = 4277, + AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4287, + AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4322, + AF_BLUE_STRING_SINHALA_TOP = 4337, + AF_BLUE_STRING_SINHALA_BOTTOM = 4369, + AF_BLUE_STRING_SINHALA_DESCENDER = 4401, + AF_BLUE_STRING_SUNDANESE_TOP = 4445, + AF_BLUE_STRING_SUNDANESE_BOTTOM = 4469, + AF_BLUE_STRING_SUNDANESE_DESCENDER = 4501, + AF_BLUE_STRING_TAI_VIET_TOP = 4509, + AF_BLUE_STRING_TAI_VIET_BOTTOM = 4529, + AF_BLUE_STRING_TAMIL_TOP = 4541, + AF_BLUE_STRING_TAMIL_BOTTOM = 4573, + AF_BLUE_STRING_TELUGU_TOP = 4605, + AF_BLUE_STRING_TELUGU_BOTTOM = 4633, + AF_BLUE_STRING_THAI_TOP = 4661, + AF_BLUE_STRING_THAI_BOTTOM = 4685, + AF_BLUE_STRING_THAI_ASCENDER = 4713, + AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4725, + AF_BLUE_STRING_THAI_DESCENDER = 4737, + AF_BLUE_STRING_THAI_LARGE_DESCENDER = 4753, + AF_BLUE_STRING_THAI_DIGIT_TOP = 4761, + AF_BLUE_STRING_TIFINAGH = 4773, + AF_BLUE_STRING_VAI_TOP = 4805, + AF_BLUE_STRING_VAI_BOTTOM = 4837, + af_blue_1_1 = 4868, #ifdef AF_CONFIG_OPTION_CJK AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1, AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 203, @@ -355,24 +357,25 @@ FT_BEGIN_HEADER AF_BLUE_STRINGSET_LATP = 166, AF_BLUE_STRINGSET_LISU = 173, AF_BLUE_STRINGSET_MLYM = 176, - AF_BLUE_STRINGSET_MYMR = 179, - AF_BLUE_STRINGSET_NKOO = 184, - AF_BLUE_STRINGSET_NONE = 189, - AF_BLUE_STRINGSET_OLCK = 190, - AF_BLUE_STRINGSET_ORKH = 193, - AF_BLUE_STRINGSET_OSGE = 196, - AF_BLUE_STRINGSET_OSMA = 204, - AF_BLUE_STRINGSET_SAUR = 207, - AF_BLUE_STRINGSET_SHAW = 210, - AF_BLUE_STRINGSET_SINH = 216, - AF_BLUE_STRINGSET_SUND = 220, - AF_BLUE_STRINGSET_TAML = 224, - AF_BLUE_STRINGSET_TAVT = 227, - AF_BLUE_STRINGSET_TELU = 230, - AF_BLUE_STRINGSET_TFNG = 233, - AF_BLUE_STRINGSET_THAI = 236, - AF_BLUE_STRINGSET_VAII = 244, - af_blue_2_1 = 247, + AF_BLUE_STRINGSET_MONG = 179, + AF_BLUE_STRINGSET_MYMR = 182, + AF_BLUE_STRINGSET_NKOO = 187, + AF_BLUE_STRINGSET_NONE = 192, + AF_BLUE_STRINGSET_OLCK = 193, + AF_BLUE_STRINGSET_ORKH = 196, + AF_BLUE_STRINGSET_OSGE = 199, + AF_BLUE_STRINGSET_OSMA = 207, + AF_BLUE_STRINGSET_SAUR = 210, + AF_BLUE_STRINGSET_SHAW = 213, + AF_BLUE_STRINGSET_SINH = 219, + AF_BLUE_STRINGSET_SUND = 223, + AF_BLUE_STRINGSET_TAML = 227, + AF_BLUE_STRINGSET_TAVT = 230, + AF_BLUE_STRINGSET_TELU = 233, + AF_BLUE_STRINGSET_TFNG = 236, + AF_BLUE_STRINGSET_THAI = 239, + AF_BLUE_STRINGSET_VAII = 247, + af_blue_2_1 = 250, #ifdef AF_CONFIG_OPTION_CJK AF_BLUE_STRINGSET_HANI = af_blue_2_1 + 0, af_blue_2_1_1 = af_blue_2_1 + 2, diff --git a/thirdparty/freetype/src/autofit/afcjk.c b/thirdparty/freetype/src/autofit/afcjk.c index 3b2b1cf24c..a61689bee3 100644 --- a/thirdparty/freetype/src/autofit/afcjk.c +++ b/thirdparty/freetype/src/autofit/afcjk.c @@ -1184,6 +1184,8 @@ seg = edge->first; + if ( !seg ) + goto Skip_Loop; do { @@ -1239,13 +1241,14 @@ edge2->flags |= AF_EDGE_SERIF; } else - edge->link = edge2; + edge->link = edge2; } seg = seg->edge_next; } while ( seg != edge->first ); + Skip_Loop: /* set the round/straight flags */ edge->flags = AF_EDGE_NORMAL; diff --git a/thirdparty/freetype/src/autofit/afglobal.c b/thirdparty/freetype/src/autofit/afglobal.c index 7183ce4a78..6a9a1e5aaa 100644 --- a/thirdparty/freetype/src/autofit/afglobal.c +++ b/thirdparty/freetype/src/autofit/afglobal.c @@ -443,6 +443,7 @@ style = (AF_Style)( globals->glyph_styles[gindex] & AF_STYLE_UNASSIGNED ); + Again: style_class = af_style_classes[style]; writing_system_class = af_writing_system_classes [style_class->writing_system]; @@ -470,6 +471,16 @@ writing_system_class->style_metrics_done( metrics ); FT_FREE( metrics ); + + /* internal error code -1 indicates */ + /* that no blue zones have been found */ + if ( error == -1 ) + { + style = (AF_Style)( globals->glyph_styles[gindex] & + AF_STYLE_UNASSIGNED ); + goto Again; + } + goto Exit; } } diff --git a/thirdparty/freetype/src/autofit/aflatin.c b/thirdparty/freetype/src/autofit/aflatin.c index dccdcaf345..27d4024882 100644 --- a/thirdparty/freetype/src/autofit/aflatin.c +++ b/thirdparty/freetype/src/autofit/aflatin.c @@ -149,7 +149,11 @@ af_shaper_buf_destroy( face, shaper_buf ); if ( !glyph_index ) + { + FT_TRACE5(( "standard character missing;" + " using fallback stem widths\n" )); goto Exit; + } FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", ch, glyph_index )); @@ -312,7 +316,7 @@ /* Find all blue zones. Flat segments give the reference points, */ /* round segments the overshoot positions. */ - static void + static int af_latin_metrics_init_blues( AF_LatinMetrics metrics, FT_Face face ) { @@ -981,10 +985,11 @@ af_shaper_buf_destroy( face, shaper_buf ); - /* we finally check whether blue zones are ordered; */ - /* `ref' and `shoot' values of two blue zones must not overlap */ if ( axis->blue_count ) { + /* we finally check whether blue zones are ordered; */ + /* `ref' and `shoot' values of two blue zones must not overlap */ + FT_UInt i; AF_LatinBlue blue_sorted[AF_BLUE_STRINGSET_MAX_LEN + 2]; @@ -1033,11 +1038,34 @@ *a )); } } + + FT_TRACE5(( "\n" )); + + return 0; } + else + { + /* disable hinting for the current style if there are no blue zones */ - FT_TRACE5(( "\n" )); + AF_FaceGlobals globals = metrics->root.globals; + FT_UShort* gstyles = globals->glyph_styles; + + FT_Long i; + + + FT_TRACE5(( "no blue zones found:" + " hinting disabled for this style\n" )); - return; + for ( i = 0; i < globals->glyph_count; i++ ) + { + if ( ( gstyles[i] & AF_STYLE_MASK ) == sc->style ) + gstyles[i] = AF_STYLE_NONE_DFLT; + } + + FT_TRACE5(( "\n" )); + + return 1; + } } @@ -1116,6 +1144,8 @@ af_latin_metrics_init( AF_LatinMetrics metrics, FT_Face face ) { + FT_Error error = FT_Err_Ok; + FT_CharMap oldmap = face->charmap; @@ -1124,12 +1154,18 @@ if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) { af_latin_metrics_init_widths( metrics, face ); - af_latin_metrics_init_blues( metrics, face ); + if ( af_latin_metrics_init_blues( metrics, face ) ) + { + /* use internal error code to indicate missing blue zones */ + error = -1; + goto Exit; + } af_latin_metrics_check_digits( metrics, face ); } + Exit: FT_Set_Charmap( face, oldmap ); - return FT_Err_Ok; + return error; } @@ -1443,13 +1479,13 @@ nn, blue->ref.org, blue->ref.fit / 64.0, - blue->flags & AF_LATIN_BLUE_ACTIVE ? "" - : " (inactive)", + ( blue->flags & AF_LATIN_BLUE_ACTIVE ) ? "" + : " (inactive)", nn, blue->shoot.org, blue->shoot.fit / 64.0, - blue->flags & AF_LATIN_BLUE_ACTIVE ? "" - : " (inactive)" )); + ( blue->flags & AF_LATIN_BLUE_ACTIVE ) ? "" + : " (inactive)" )); } #endif } diff --git a/thirdparty/freetype/src/autofit/afranges.c b/thirdparty/freetype/src/autofit/afranges.c index c0dba818a1..45c8bbfc95 100644 --- a/thirdparty/freetype/src/autofit/afranges.c +++ b/thirdparty/freetype/src/autofit/afranges.c @@ -664,6 +664,21 @@ }; + const AF_Script_UniRangeRec af_mong_uniranges[] = + { + AF_UNIRANGE_REC( 0x1800, 0x18AF ), /* Mongolian */ + AF_UNIRANGE_REC( 0x11660, 0x1167F ), /* Mongolian Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mong_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1885, 0x1886 ), + AF_UNIRANGE_REC( 0x18A9, 0x18A9 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mymr_uniranges[] = { AF_UNIRANGE_REC( 0x1000, 0x109F ), /* Myanmar */ diff --git a/thirdparty/freetype/src/autofit/afscript.h b/thirdparty/freetype/src/autofit/afscript.h index c2f0c7ac60..2da8c70183 100644 --- a/thirdparty/freetype/src/autofit/afscript.h +++ b/thirdparty/freetype/src/autofit/afscript.h @@ -243,6 +243,12 @@ HINTING_BOTTOM_TO_TOP, "\xE0\xB4\xA0 \xE0\xB4\xB1" ) /* à´ à´± */ + SCRIPT( mong, MONG, + "Mongolian", + HB_SCRIPT_MONGOLIAN, + HINTING_TOP_TO_BOTTOM, + "\xE1\xA1\x82 \xE1\xA0\xAA" ) /* á¡‚ á ª */ + SCRIPT( mymr, MYMR, "Myanmar", HB_SCRIPT_MYANMAR, diff --git a/thirdparty/freetype/src/autofit/afstyles.h b/thirdparty/freetype/src/autofit/afstyles.h index edf4f54edd..8d1d70812f 100644 --- a/thirdparty/freetype/src/autofit/afstyles.h +++ b/thirdparty/freetype/src/autofit/afstyles.h @@ -322,6 +322,13 @@ AF_BLUE_STRINGSET_MLYM, AF_COVERAGE_DEFAULT ) + STYLE( mong_dflt, MONG_DFLT, + "Mongolian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_MONG, + AF_BLUE_STRINGSET_MONG, + AF_COVERAGE_DEFAULT ) + STYLE( mymr_dflt, MYMR_DFLT, "Myanmar default style", AF_WRITING_SYSTEM_LATIN, diff --git a/thirdparty/freetype/src/base/ftbbox.c b/thirdparty/freetype/src/base/ftbbox.c index 0b04fde635..a0b2c46f7b 100644 --- a/thirdparty/freetype/src/base/ftbbox.c +++ b/thirdparty/freetype/src/base/ftbbox.c @@ -319,9 +319,9 @@ q2 = q2 + q1; q4 = q4 + q3; q3 = q3 + q2; - q4 = ( q4 + q3 ) / 8; - q3 = q3 / 4; - q2 = q2 / 2; + q4 = ( q4 + q3 ) >> 3; + q3 = q3 >> 2; + q2 = q2 >> 1; } else /* second half */ { @@ -330,9 +330,9 @@ q3 = q3 + q4; q1 = q1 + q2; q2 = q2 + q3; - q1 = ( q1 + q2 ) / 8; - q2 = q2 / 4; - q3 = q3 / 2; + q1 = ( q1 + q2 ) >> 3; + q2 = q2 >> 2; + q3 = q3 >> 1; } /* check whether either end reached the maximum */ diff --git a/thirdparty/freetype/src/base/ftbitmap.c b/thirdparty/freetype/src/base/ftbitmap.c index 1bdcd9eff3..0e0a76fe40 100644 --- a/thirdparty/freetype/src/base/ftbitmap.c +++ b/thirdparty/freetype/src/base/ftbitmap.c @@ -922,12 +922,18 @@ else FT_TRACE5(( " target bitmap: empty\n" )); - FT_TRACE5(( " final bitmap: (%d, %d) -- (%d, %d); %d x %d\n", - final_llx / 64, final_lly / 64, - final_urx / 64, final_ury / 64, - final_width, final_rows )); + if ( final_width && final_rows ) + FT_TRACE5(( " final bitmap: (%d, %d) -- (%d, %d); %d x %d\n", + final_llx / 64, final_lly / 64, + final_urx / 64, final_ury / 64, + final_width, final_rows )); + else + FT_TRACE5(( " final bitmap: empty\n" )); #endif /* FT_DEBUG_LEVEL_TRACE */ + if ( !( final_width && final_rows ) ) + return FT_Err_Ok; /* nothing to do */ + /* for blending, set offset vector of final bitmap */ /* temporarily to (0,0) */ source_llx -= final_llx; @@ -971,6 +977,7 @@ pitch = target->pitch; + if ( pitch < 0 ) pitch = -pitch; diff --git a/thirdparty/freetype/src/base/fterrors.c b/thirdparty/freetype/src/base/fterrors.c index 4ef326d8e2..84fe590289 100644 --- a/thirdparty/freetype/src/base/fterrors.c +++ b/thirdparty/freetype/src/base/fterrors.c @@ -17,6 +17,7 @@ #include <ft2build.h> +#include FT_INTERNAL_DEBUG_H #include FT_ERRORS_H diff --git a/thirdparty/freetype/src/base/ftinit.c b/thirdparty/freetype/src/base/ftinit.c index 9d524effa9..c73cd78b83 100644 --- a/thirdparty/freetype/src/base/ftinit.c +++ b/thirdparty/freetype/src/base/ftinit.c @@ -176,6 +176,9 @@ module_name, property_name, property_value ); + + if ( !*p ) + break; } } diff --git a/thirdparty/freetype/src/base/ftlcdfil.c b/thirdparty/freetype/src/base/ftlcdfil.c index 9fb49ba116..d9f4af4293 100644 --- a/thirdparty/freetype/src/base/ftlcdfil.c +++ b/thirdparty/freetype/src/base/ftlcdfil.c @@ -77,13 +77,13 @@ /* FIR filter used by the default and light filters */ FT_BASE_DEF( void ) ft_lcd_filter_fir( FT_Bitmap* bitmap, - FT_Render_Mode mode, FT_LcdFiveTapFilter weights ) { FT_UInt width = (FT_UInt)bitmap->width; FT_UInt height = (FT_UInt)bitmap->rows; FT_Int pitch = bitmap->pitch; FT_Byte* origin = bitmap->buffer; + FT_Byte mode = bitmap->pixel_mode; /* take care of bitmap flow */ @@ -91,7 +91,7 @@ origin += pitch * (FT_Int)( height - 1 ); /* horizontal in-place FIR filter */ - if ( mode == FT_RENDER_MODE_LCD && width >= 2 ) + if ( mode == FT_PIXEL_MODE_LCD && width >= 2 ) { FT_Byte* line = origin; @@ -134,7 +134,7 @@ } /* vertical in-place FIR filter */ - else if ( mode == FT_RENDER_MODE_LCD_V && height >= 2 ) + else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 2 ) { FT_Byte* column = origin; @@ -183,13 +183,13 @@ /* intra-pixel filter used by the legacy filter */ static void _ft_lcd_filter_legacy( FT_Bitmap* bitmap, - FT_Render_Mode mode, FT_Byte* weights ) { FT_UInt width = (FT_UInt)bitmap->width; FT_UInt height = (FT_UInt)bitmap->rows; FT_Int pitch = bitmap->pitch; FT_Byte* origin = bitmap->buffer; + FT_Byte mode = bitmap->pixel_mode; static const unsigned int filters[3][3] = { @@ -206,7 +206,7 @@ origin += pitch * (FT_Int)( height - 1 ); /* horizontal in-place intra-pixel filter */ - if ( mode == FT_RENDER_MODE_LCD && width >= 3 ) + if ( mode == FT_PIXEL_MODE_LCD && width >= 3 ) { FT_Byte* line = origin; @@ -243,7 +243,7 @@ } } } - else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 ) + else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 3 ) { FT_Byte* column = origin; diff --git a/thirdparty/freetype/src/base/ftobjs.c b/thirdparty/freetype/src/base/ftobjs.c index 3f8619d3b3..e301f8f11a 100644 --- a/thirdparty/freetype/src/base/ftobjs.c +++ b/thirdparty/freetype/src/base/ftobjs.c @@ -4059,8 +4059,8 @@ /* documentation is in freetype.h */ FT_EXPORT_DEF( FT_UInt ) - FT_Get_Name_Index( FT_Face face, - FT_String* glyph_name ) + FT_Get_Name_Index( FT_Face face, + const FT_String* glyph_name ) { FT_UInt result = 0; diff --git a/thirdparty/freetype/src/base/ftoutln.c b/thirdparty/freetype/src/base/ftoutln.c index 00329b46c6..0e2ba3475d 100644 --- a/thirdparty/freetype/src/base/ftoutln.c +++ b/thirdparty/freetype/src/base/ftoutln.c @@ -46,8 +46,7 @@ void* user ) { #undef SCALED -#define SCALED( x ) ( ( (x) < 0 ? -( -(x) << shift ) \ - : ( (x) << shift ) ) - delta ) +#define SCALED( x ) ( (x) * ( 1L << shift ) - delta ) FT_Vector v_last; FT_Vector v_control; @@ -621,6 +620,16 @@ params->source = (void*)outline; + /* preset clip_box for direct mode */ + if ( params->flags & FT_RASTER_FLAG_DIRECT && + !( params->flags & FT_RASTER_FLAG_CLIP ) ) + { + params->clip_box.xMin = cbox.xMin >> 6; + params->clip_box.yMin = cbox.yMin >> 6; + params->clip_box.xMax = ( cbox.xMax + 63 ) >> 6; + params->clip_box.yMax = ( cbox.yMax + 63 ) >> 6; + } + error = FT_ERR( Cannot_Render_Glyph ); while ( renderer ) { diff --git a/thirdparty/freetype/src/base/ftstroke.c b/thirdparty/freetype/src/base/ftstroke.c index 826062c94e..1b2c0f657c 100644 --- a/thirdparty/freetype/src/base/ftstroke.c +++ b/thirdparty/freetype/src/base/ftstroke.c @@ -86,16 +86,18 @@ base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + base[3].x = b >> 1; + base[2].x = ( a + b ) >> 2; + base[1].x = a >> 1; base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + base[3].y = b >> 1; + base[2].y = ( a + b ) >> 2; + base[1].y = a >> 1; } @@ -153,28 +155,32 @@ static void ft_cubic_split( FT_Vector* base ) { - FT_Pos a, b, c, d; + FT_Pos a, b, c; base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c ) / 2; - base[5].x = b = ( base[3].x + d ) / 2; - c = ( c + d ) / 2; - base[2].x = a = ( a + c ) / 2; - base[4].x = b = ( b + c ) / 2; - base[3].x = ( a + b ) / 2; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + c = base[2].x + base[3].x; + base[5].x = c >> 1; + c += b; + base[4].x = c >> 2; + base[1].x = a >> 1; + a += b; + base[2].x = a >> 2; + base[3].x = ( a + c ) >> 3; base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c ) / 2; - base[5].y = b = ( base[3].y + d ) / 2; - c = ( c + d ) / 2; - base[2].y = a = ( a + c ) / 2; - base[4].y = b = ( b + c ) / 2; - base[3].y = ( a + b ) / 2; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + c = base[2].y + base[3].y; + base[5].y = c >> 1; + c += b; + base[4].y = c >> 2; + base[1].y = a >> 1; + a += b; + base[2].y = a >> 2; + base[3].y = ( a + c ) >> 3; } diff --git a/thirdparty/freetype/src/base/ftver.rc b/thirdparty/freetype/src/base/ftver.rc index e02a88652c..1354497423 100644 --- a/thirdparty/freetype/src/base/ftver.rc +++ b/thirdparty/freetype/src/base/ftver.rc @@ -18,8 +18,8 @@ #include<windows.h> -#define FT_VERSION 2,10,0,0 -#define FT_VERSION_STR "2.10.0" +#define FT_VERSION 2,10,1,0 +#define FT_VERSION_STR "2.10.1" VS_VERSION_INFO VERSIONINFO FILEVERSION FT_VERSION diff --git a/thirdparty/freetype/src/bdf/bdf.h b/thirdparty/freetype/src/bdf/bdf.h index 4018756f72..d9abd2378f 100644 --- a/thirdparty/freetype/src/bdf/bdf.h +++ b/thirdparty/freetype/src/bdf/bdf.h @@ -109,9 +109,9 @@ FT_BEGIN_HEADER /* There are a set of defaults and each font has their own. */ typedef struct bdf_property_t_ { - char* name; /* Name of the property. */ - int format; /* Format of the property. */ - int builtin; /* A builtin property. */ + const char* name; /* Name of the property. */ + int format; /* Format of the property. */ + int builtin; /* A builtin property. */ union { char* atom; diff --git a/thirdparty/freetype/src/bdf/bdfdrivr.c b/thirdparty/freetype/src/bdf/bdfdrivr.c index 4a11843a1c..60eb93305e 100644 --- a/thirdparty/freetype/src/bdf/bdfdrivr.c +++ b/thirdparty/freetype/src/bdf/bdfdrivr.c @@ -106,7 +106,7 @@ THE SOFTWARE. FT_ULong code; - if ( mid > max || mid < min ) + if ( mid >= max || mid < min ) mid = ( min + max ) >> 1; code = encodings[mid].enc; @@ -152,7 +152,7 @@ THE SOFTWARE. FT_ULong code; /* same as BDF_encoding_el.enc */ - if ( mid > max || mid < min ) + if ( mid >= max || mid < min ) mid = ( min + max ) >> 1; code = encodings[mid].enc; @@ -216,13 +216,13 @@ THE SOFTWARE. bdf_font_t* font = bdf->bdffont; bdf_property_t* prop; - char* strings[4] = { NULL, NULL, NULL, NULL }; - size_t nn, len, lengths[4]; + const char* strings[4] = { NULL, NULL, NULL, NULL }; + size_t lengths[4], nn, len; face->style_flags = 0; - prop = bdf_get_font_property( font, (char *)"SLANT" ); + prop = bdf_get_font_property( font, "SLANT" ); if ( prop && prop->format == BDF_ATOM && prop->value.atom && ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || @@ -230,30 +230,30 @@ THE SOFTWARE. { face->style_flags |= FT_STYLE_FLAG_ITALIC; strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) - ? (char *)"Oblique" - : (char *)"Italic"; + ? "Oblique" + : "Italic"; } - prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" ); + prop = bdf_get_font_property( font, "WEIGHT_NAME" ); if ( prop && prop->format == BDF_ATOM && prop->value.atom && ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) { face->style_flags |= FT_STYLE_FLAG_BOLD; - strings[1] = (char *)"Bold"; + strings[1] = "Bold"; } - prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" ); + prop = bdf_get_font_property( font, "SETWIDTH_NAME" ); if ( prop && prop->format == BDF_ATOM && prop->value.atom && *(prop->value.atom) && !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - strings[3] = (char *)(prop->value.atom); + strings[3] = (const char *)(prop->value.atom); - prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" ); + prop = bdf_get_font_property( font, "ADD_STYLE_NAME" ); if ( prop && prop->format == BDF_ATOM && prop->value.atom && *(prop->value.atom) && !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - strings[0] = (char *)(prop->value.atom); + strings[0] = (const char *)(prop->value.atom); for ( len = 0, nn = 0; nn < 4; nn++ ) { @@ -267,7 +267,7 @@ THE SOFTWARE. if ( len == 0 ) { - strings[0] = (char *)"Regular"; + strings[0] = "Regular"; lengths[0] = ft_strlen( strings[0] ); len = lengths[0] + 1; } @@ -283,7 +283,7 @@ THE SOFTWARE. for ( nn = 0; nn < 4; nn++ ) { - char* src = strings[nn]; + const char* src = strings[nn]; len = lengths[nn]; diff --git a/thirdparty/freetype/src/bdf/bdflib.c b/thirdparty/freetype/src/bdf/bdflib.c index 0898b0d470..63813f7edc 100644 --- a/thirdparty/freetype/src/bdf/bdflib.c +++ b/thirdparty/freetype/src/bdf/bdflib.c @@ -79,89 +79,89 @@ static const bdf_property_t _bdf_properties[] = { - { (char *)"ADD_STYLE_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, - { (char *)"CHARSET_COLLECTIONS", BDF_ATOM, 1, { 0 } }, - { (char *)"CHARSET_ENCODING", BDF_ATOM, 1, { 0 } }, - { (char *)"CHARSET_REGISTRY", BDF_ATOM, 1, { 0 } }, - { (char *)"COMMENT", BDF_ATOM, 1, { 0 } }, - { (char *)"COPYRIGHT", BDF_ATOM, 1, { 0 } }, - { (char *)"DEFAULT_CHAR", BDF_CARDINAL, 1, { 0 } }, - { (char *)"DESTINATION", BDF_CARDINAL, 1, { 0 } }, - { (char *)"DEVICE_FONT_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"END_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"FACE_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"FAMILY_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"FONT", BDF_ATOM, 1, { 0 } }, - { (char *)"FONTNAME_REGISTRY", BDF_ATOM, 1, { 0 } }, - { (char *)"FONT_ASCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"FONT_DESCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"FOUNDRY", BDF_ATOM, 1, { 0 } }, - { (char *)"FULL_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"ITALIC_ANGLE", BDF_INTEGER, 1, { 0 } }, - { (char *)"MAX_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"MIN_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"NORM_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"NOTICE", BDF_ATOM, 1, { 0 } }, - { (char *)"PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"POINT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_ASCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_DESCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_END_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_MAX_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_MIN_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_NORM_SPACE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_POINT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_PIXELSIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_POINTSIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, - { (char *)"RAW_X_HEIGHT", BDF_INTEGER, 1, { 0 } }, - { (char *)"RELATIVE_SETWIDTH", BDF_CARDINAL, 1, { 0 } }, - { (char *)"RELATIVE_WEIGHT", BDF_CARDINAL, 1, { 0 } }, - { (char *)"RESOLUTION", BDF_INTEGER, 1, { 0 } }, - { (char *)"RESOLUTION_X", BDF_CARDINAL, 1, { 0 } }, - { (char *)"RESOLUTION_Y", BDF_CARDINAL, 1, { 0 } }, - { (char *)"SETWIDTH_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"SLANT", BDF_ATOM, 1, { 0 } }, - { (char *)"SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"SPACING", BDF_ATOM, 1, { 0 } }, - { (char *)"STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, - { (char *)"SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, - { (char *)"UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, - { (char *)"UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, - { (char *)"WEIGHT", BDF_CARDINAL, 1, { 0 } }, - { (char *)"WEIGHT_NAME", BDF_ATOM, 1, { 0 } }, - { (char *)"X_HEIGHT", BDF_INTEGER, 1, { 0 } }, - { (char *)"_MULE_BASELINE_OFFSET", BDF_INTEGER, 1, { 0 } }, - { (char *)"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } }, + { "ADD_STYLE_NAME", BDF_ATOM, 1, { 0 } }, + { "AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { "CHARSET_COLLECTIONS", BDF_ATOM, 1, { 0 } }, + { "CHARSET_ENCODING", BDF_ATOM, 1, { 0 } }, + { "CHARSET_REGISTRY", BDF_ATOM, 1, { 0 } }, + { "COMMENT", BDF_ATOM, 1, { 0 } }, + { "COPYRIGHT", BDF_ATOM, 1, { 0 } }, + { "DEFAULT_CHAR", BDF_CARDINAL, 1, { 0 } }, + { "DESTINATION", BDF_CARDINAL, 1, { 0 } }, + { "DEVICE_FONT_NAME", BDF_ATOM, 1, { 0 } }, + { "END_SPACE", BDF_INTEGER, 1, { 0 } }, + { "FACE_NAME", BDF_ATOM, 1, { 0 } }, + { "FAMILY_NAME", BDF_ATOM, 1, { 0 } }, + { "FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "FONT", BDF_ATOM, 1, { 0 } }, + { "FONTNAME_REGISTRY", BDF_ATOM, 1, { 0 } }, + { "FONT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { "FONT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { "FOUNDRY", BDF_ATOM, 1, { 0 } }, + { "FULL_NAME", BDF_ATOM, 1, { 0 } }, + { "ITALIC_ANGLE", BDF_INTEGER, 1, { 0 } }, + { "MAX_SPACE", BDF_INTEGER, 1, { 0 } }, + { "MIN_SPACE", BDF_INTEGER, 1, { 0 } }, + { "NORM_SPACE", BDF_INTEGER, 1, { 0 } }, + { "NOTICE", BDF_ATOM, 1, { 0 } }, + { "PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, + { "POINT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_ASCENT", BDF_INTEGER, 1, { 0 } }, + { "RAW_AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { "RAW_DESCENT", BDF_INTEGER, 1, { 0 } }, + { "RAW_END_SPACE", BDF_INTEGER, 1, { 0 } }, + { "RAW_FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_MAX_SPACE", BDF_INTEGER, 1, { 0 } }, + { "RAW_MIN_SPACE", BDF_INTEGER, 1, { 0 } }, + { "RAW_NORM_SPACE", BDF_INTEGER, 1, { 0 } }, + { "RAW_PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_POINT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_PIXELSIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_POINTSIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { "RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { "RAW_UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, + { "RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, + { "RAW_X_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { "RELATIVE_SETWIDTH", BDF_CARDINAL, 1, { 0 } }, + { "RELATIVE_WEIGHT", BDF_CARDINAL, 1, { 0 } }, + { "RESOLUTION", BDF_INTEGER, 1, { 0 } }, + { "RESOLUTION_X", BDF_CARDINAL, 1, { 0 } }, + { "RESOLUTION_Y", BDF_CARDINAL, 1, { 0 } }, + { "SETWIDTH_NAME", BDF_ATOM, 1, { 0 } }, + { "SLANT", BDF_ATOM, 1, { 0 } }, + { "SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, + { "SPACING", BDF_ATOM, 1, { 0 } }, + { "STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { "STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { "SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { "SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { "SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { "SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { "UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, + { "UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, + { "WEIGHT", BDF_CARDINAL, 1, { 0 } }, + { "WEIGHT_NAME", BDF_ATOM, 1, { 0 } }, + { "X_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { "_MULE_BASELINE_OFFSET", BDF_INTEGER, 1, { 0 } }, + { "_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } }, }; static const unsigned long @@ -364,7 +364,7 @@ /* An empty string for empty fields. */ - static const char empty[1] = { 0 }; /* XXX eliminate this */ + static const char empty[] = ""; /* XXX eliminate this */ static char * @@ -407,13 +407,14 @@ static FT_Error _bdf_list_split( _bdf_list_t* list, - char* separators, + const char* separators, char* line, unsigned long linelen ) { unsigned long final_empty; int mult; - char *sp, *ep, *end; + const char *sp, *end; + char *ep; char seps[32]; FT_Error error = FT_Err_Ok; @@ -473,7 +474,7 @@ } /* Assign the field appropriately. */ - list->field[list->used++] = ( ep > sp ) ? sp : (char*)empty; + list->field[list->used++] = ( ep > sp ) ? (char*)sp : (char*)empty; sp = ep; @@ -692,7 +693,7 @@ /* Routine to convert a decimal ASCII string to an unsigned long integer. */ static unsigned long - _bdf_atoul( char* s ) + _bdf_atoul( const char* s ) { unsigned long v; @@ -717,7 +718,7 @@ /* Routine to convert a decimal ASCII string to a signed long integer. */ static long - _bdf_atol( char* s ) + _bdf_atol( const char* s ) { long v, neg; @@ -750,7 +751,7 @@ /* Routine to convert a decimal ASCII string to an unsigned short integer. */ static unsigned short - _bdf_atous( char* s ) + _bdf_atous( const char* s ) { unsigned short v; @@ -775,7 +776,7 @@ /* Routine to convert a decimal ASCII string to a signed short integer. */ static short - _bdf_atos( char* s ) + _bdf_atos( const char* s ) { short v, neg; @@ -828,7 +829,7 @@ static FT_Error - bdf_create_property( char* name, + bdf_create_property( const char* name, int format, bdf_font_t* font ) { @@ -998,7 +999,7 @@ FT_MEM_COPY( name, font->name, len ); - error = _bdf_list_split( &list, (char *)"-", name, (unsigned long)len ); + error = _bdf_list_split( &list, "-", name, (unsigned long)len ); if ( error ) goto Fail; @@ -1097,7 +1098,7 @@ static FT_Error _bdf_add_property( bdf_font_t* font, - char* name, + const char* name, char* value, unsigned long lineno ) { @@ -1336,7 +1337,7 @@ goto Exit; } - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1] ); @@ -1423,7 +1424,7 @@ /* encoding can be checked for an unencoded character. */ FT_FREE( p->glyph_name ); - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; @@ -1461,7 +1462,7 @@ goto Exit; } - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; @@ -1615,7 +1616,7 @@ /* Expect the SWIDTH (scalable width) field next. */ if ( _bdf_strncmp( line, "SWIDTH", 6 ) == 0 ) { - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; @@ -1628,7 +1629,7 @@ /* Expect the DWIDTH (scalable width) field next. */ if ( _bdf_strncmp( line, "DWIDTH", 6 ) == 0 ) { - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; @@ -1653,7 +1654,7 @@ /* Expect the BBX field next. */ if ( _bdf_strncmp( line, "BBX", 3 ) == 0 ) { - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; @@ -1796,7 +1797,7 @@ { p->font->font_ascent = p->font->bbx.ascent; ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); - error = _bdf_add_property( p->font, (char *)"FONT_ASCENT", + error = _bdf_add_property( p->font, "FONT_ASCENT", nbuf, lineno ); if ( error ) goto Exit; @@ -1808,7 +1809,7 @@ { p->font->font_descent = p->font->bbx.descent; ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); - error = _bdf_add_property( p->font, (char *)"FONT_DESCENT", + error = _bdf_add_property( p->font, "FONT_DESCENT", nbuf, lineno ); if ( error ) goto Exit; @@ -1846,7 +1847,7 @@ } else { - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; name = p->list.field[0]; @@ -1976,7 +1977,7 @@ goto Exit; } - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; @@ -2015,7 +2016,7 @@ goto Exit; } - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; @@ -2038,7 +2039,7 @@ /* The next thing to check for is the FONT field. */ if ( _bdf_strncmp( line, "FONT", 4 ) == 0 ) { - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; _bdf_list_shift( &p->list, 1 ); @@ -2081,7 +2082,7 @@ goto Exit; } - error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + error = _bdf_list_split( &p->list, " +", line, linelen ); if ( error ) goto Exit; @@ -2136,7 +2137,7 @@ /* for compiling fonts. */ p->font->font_ascent = p->font->bbx.ascent; ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); - error = _bdf_add_property( p->font, (char *)"FONT_ASCENT", + error = _bdf_add_property( p->font, "FONT_ASCENT", nbuf, lineno ); if ( error ) goto Exit; @@ -2144,7 +2145,7 @@ p->font->font_descent = p->font->bbx.descent; ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); - error = _bdf_add_property( p->font, (char *)"FONT_DESCENT", + error = _bdf_add_property( p->font, "FONT_DESCENT", nbuf, lineno ); if ( error ) goto Exit; diff --git a/thirdparty/freetype/src/cache/rules.mk b/thirdparty/freetype/src/cache/rules.mk index abcb242239..1618d98303 100644 --- a/thirdparty/freetype/src/cache/rules.mk +++ b/thirdparty/freetype/src/cache/rules.mk @@ -15,7 +15,7 @@ # Cache driver directory # -CACHE_DIR := $(SRC_DIR)/cache +CACHE_DIR := $(SRC_DIR)/cache # compilation flags for the driver diff --git a/thirdparty/freetype/src/cff/cffdrivr.c b/thirdparty/freetype/src/cff/cffdrivr.c index bbd5c40329..2324989811 100644 --- a/thirdparty/freetype/src/cff/cffdrivr.c +++ b/thirdparty/freetype/src/cff/cffdrivr.c @@ -381,8 +381,8 @@ static FT_UInt - cff_get_name_index( CFF_Face face, - FT_String* glyph_name ) + cff_get_name_index( CFF_Face face, + const FT_String* glyph_name ) { CFF_Font cff; CFF_Charset charset; diff --git a/thirdparty/freetype/src/cff/cffobjs.c b/thirdparty/freetype/src/cff/cffobjs.c index 1a1030c065..f76245f30b 100644 --- a/thirdparty/freetype/src/cff/cffobjs.c +++ b/thirdparty/freetype/src/cff/cffobjs.c @@ -962,7 +962,7 @@ cffface->style_name = style_name; else /* assume "Regular" style if we don't know better */ - cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); + cffface->style_name = cff_strcpy( memory, "Regular" ); /******************************************************************** * diff --git a/thirdparty/freetype/src/cff/cffparse.c b/thirdparty/freetype/src/cff/cffparse.c index fa806f1a90..008752c3ae 100644 --- a/thirdparty/freetype/src/cff/cffparse.c +++ b/thirdparty/freetype/src/cff/cffparse.c @@ -77,6 +77,23 @@ } +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + static void + finalize_t2_strings( FT_Memory memory, + void* data, + void* user ) + { + CFF_T2_String t2 = (CFF_T2_String)data; + + + FT_UNUSED( user ); + + memory->free( memory, t2->start ); + memory->free( memory, data ); + } +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + + FT_LOCAL_DEF( void ) cff_parser_done( CFF_Parser parser ) { @@ -84,13 +101,65 @@ FT_FREE( parser->stack ); + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + FT_List_Finalize( &parser->t2_strings, + finalize_t2_strings, + memory, + NULL ); +#endif + } + + + /* Assuming `first >= last'. */ + + static FT_Error + cff_parser_within_limits( CFF_Parser parser, + FT_Byte* first, + FT_Byte* last ) + { +#ifndef CFF_CONFIG_OPTION_OLD_ENGINE + + /* Fast path for regular FreeType builds with the "new" engine; */ + /* `first >= parser->start' can be assumed. */ + + FT_UNUSED( first ); + + return last < parser->limit ? FT_Err_Ok : FT_THROW( Invalid_Argument ); + +#else /* CFF_CONFIG_OPTION_OLD_ENGINE */ + + FT_ListNode node; + + + if ( first >= parser->start && + last < parser->limit ) + return FT_Err_Ok; + + node = parser->t2_strings.head; + + while ( node ) + { + CFF_T2_String t2 = (CFF_T2_String)node->data; + + + if ( first >= t2->start && + last < t2->limit ) + return FT_Err_Ok; + + node = node->next; + } + + return FT_THROW( Invalid_Argument ); + +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ } /* read an integer */ static FT_Long - cff_parse_integer( FT_Byte* start, - FT_Byte* limit ) + cff_parse_integer( CFF_Parser parser, + FT_Byte* start ) { FT_Byte* p = start; FT_Int v = *p++; @@ -99,14 +168,14 @@ if ( v == 28 ) { - if ( p + 2 > limit ) + if ( cff_parser_within_limits( parser, p, p + 1 ) ) goto Bad; val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] ); } else if ( v == 29 ) { - if ( p + 4 > limit ) + if ( cff_parser_within_limits( parser, p, p + 3 ) ) goto Bad; val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) | @@ -120,14 +189,14 @@ } else if ( v < 251 ) { - if ( p + 1 > limit ) + if ( cff_parser_within_limits( parser, p, p ) ) goto Bad; val = ( v - 247 ) * 256 + p[0] + 108; } else { - if ( p + 1 > limit ) + if ( cff_parser_within_limits( parser, p, p ) ) goto Bad; val = -( v - 251 ) * 256 - p[0] - 108; @@ -176,10 +245,10 @@ /* read a real */ static FT_Fixed - cff_parse_real( FT_Byte* start, - FT_Byte* limit, - FT_Long power_ten, - FT_Long* scaling ) + cff_parse_real( CFF_Parser parser, + FT_Byte* start, + FT_Long power_ten, + FT_Long* scaling ) { FT_Byte* p = start; FT_Int nib; @@ -214,7 +283,7 @@ p++; /* Make sure we don't read past the end. */ - if ( p >= limit ) + if ( cff_parser_within_limits( parser, p, p ) ) goto Bad; } @@ -251,7 +320,7 @@ p++; /* Make sure we don't read past the end. */ - if ( p >= limit ) + if ( cff_parser_within_limits( parser, p, p ) ) goto Bad; } @@ -290,7 +359,7 @@ p++; /* Make sure we don't read past the end. */ - if ( p >= limit ) + if ( cff_parser_within_limits( parser, p, p ) ) goto Bad; } @@ -457,7 +526,7 @@ if ( **d == 30 ) { /* binary-coded decimal is truncated to integer */ - return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16; + return cff_parse_real( parser, *d, 0, NULL ) >> 16; } else if ( **d == 255 ) @@ -483,7 +552,7 @@ } else - return cff_parse_integer( *d, parser->limit ); + return cff_parse_integer( parser, *d ); } @@ -494,10 +563,10 @@ FT_Long scaling ) { if ( **d == 30 ) - return cff_parse_real( *d, parser->limit, scaling, NULL ); + return cff_parse_real( parser, *d, scaling, NULL ); else { - FT_Long val = cff_parse_integer( *d, parser->limit ); + FT_Long val = cff_parse_integer( parser, *d ); if ( scaling ) @@ -562,14 +631,14 @@ FT_ASSERT( scaling ); if ( **d == 30 ) - return cff_parse_real( *d, parser->limit, 0, scaling ); + return cff_parse_real( parser, *d, 0, scaling ); else { FT_Long number; FT_Int integer_length; - number = cff_parse_integer( d[0], d[1] ); + number = cff_parse_integer( parser, d[0] ); if ( number > 0x7FFFL ) { @@ -1122,18 +1191,6 @@ #endif /* FT_DEBUG_LEVEL_TRACE */ -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - static void - destruct_t2s_item( FT_Memory memory, - void* data, - void* user ) - { - FT_UNUSED( user ); - memory->free( memory, data ); - } -#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ - - FT_LOCAL_DEF( FT_Error ) cff_parser_run( CFF_Parser parser, FT_Byte* start, @@ -1147,11 +1204,6 @@ FT_Library library = parser->library; FT_Memory memory = library->memory; - - FT_ListRec t2s; - - - FT_ZERO( &t2s ); #endif parser->top = parser->stack; @@ -1212,9 +1264,11 @@ FT_Byte* charstring_base; FT_ULong charstring_len; - FT_Fixed* stack; - FT_ListNode node; - FT_Byte* q; + FT_Fixed* stack; + FT_ListNode node; + CFF_T2_String t2; + size_t t2_size; + FT_Byte* q; charstring_base = ++p; @@ -1261,16 +1315,26 @@ if ( !node ) goto Out_Of_Memory_Error; + FT_List_Add( &parser->t2_strings, node ); + + t2 = (CFF_T2_String)memory->alloc( memory, + sizeof ( CFF_T2_StringRec ) ); + if ( !t2 ) + goto Out_Of_Memory_Error; + + node->data = t2; + /* `5' is the conservative upper bound of required bytes per stack */ /* element. */ - q = (FT_Byte*)memory->alloc( memory, - 5 * ( decoder.top - decoder.stack ) ); + + t2_size = 5 * ( decoder.top - decoder.stack ); + + q = (FT_Byte*)memory->alloc( memory, t2_size ); if ( !q ) goto Out_Of_Memory_Error; - node->data = q; - - FT_List_Add( &t2s, node ); + t2->start = q; + t2->limit = q + t2_size; stack = decoder.stack; @@ -1531,9 +1595,6 @@ } /* while ( p < limit ) */ Exit: -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - FT_List_Finalize( &t2s, destruct_t2s_item, memory, NULL ); -#endif return error; #ifdef CFF_CONFIG_OPTION_OLD_ENGINE diff --git a/thirdparty/freetype/src/cff/cffparse.h b/thirdparty/freetype/src/cff/cffparse.h index bac32f9449..4e74709a2d 100644 --- a/thirdparty/freetype/src/cff/cffparse.h +++ b/thirdparty/freetype/src/cff/cffparse.h @@ -60,6 +60,10 @@ FT_BEGIN_HEADER FT_Byte** top; FT_UInt stackSize; /* allocated size */ +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + FT_ListRec t2_strings; +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + FT_UInt object_code; void* object; @@ -130,6 +134,15 @@ FT_BEGIN_HEADER FT_END_HEADER +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + typedef struct CFF_T2_String_ + { + FT_Byte* start; + FT_Byte* limit; + + } CFF_T2_StringRec, *CFF_T2_String; +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + #endif /* CFFPARSE_H_ */ diff --git a/thirdparty/freetype/src/gzip/ftgzip.c b/thirdparty/freetype/src/gzip/ftgzip.c index a5206307f4..5e78bc6f8d 100644 --- a/thirdparty/freetype/src/gzip/ftgzip.c +++ b/thirdparty/freetype/src/gzip/ftgzip.c @@ -746,7 +746,7 @@ stream.zfree = (free_func) ft_gzip_free; stream.opaque = memory; - err = inflateInit2( &stream, MAX_WBITS ); + err = inflateInit2( &stream, MAX_WBITS|32 ); if ( err != Z_OK ) return FT_THROW( Invalid_Argument ); diff --git a/thirdparty/freetype/src/gzip/infblock.c b/thirdparty/freetype/src/gzip/infblock.c index d6e2dc297d..2b4f0c2b53 100644 --- a/thirdparty/freetype/src/gzip/infblock.c +++ b/thirdparty/freetype/src/gzip/infblock.c @@ -235,6 +235,7 @@ int r ) s->sub.trees.index = 0; Tracev((stderr, "inflate: table sizes ok\n")); s->mode = BTREE; + /* fall through */ case BTREE: while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) { @@ -260,6 +261,7 @@ int r ) s->sub.trees.index = 0; Tracev((stderr, "inflate: bits tree ok\n")); s->mode = DTREE; + /* fall through */ case DTREE: while (t = s->sub.trees.table, s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) @@ -335,6 +337,7 @@ int r ) } ZFREE(z, s->sub.trees.blens); s->mode = CODES; + /* fall through */ case CODES: UPDATE if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) @@ -351,11 +354,13 @@ int r ) break; } s->mode = DRY; + /* fall through */ case DRY: FLUSH if (s->read != s->write) LEAVE s->mode = DONE; + /* fall through */ case DONE: r = Z_STREAM_END; LEAVE diff --git a/thirdparty/freetype/src/gzip/infcodes.c b/thirdparty/freetype/src/gzip/infcodes.c index f7bfd58c4f..ba30654990 100644 --- a/thirdparty/freetype/src/gzip/infcodes.c +++ b/thirdparty/freetype/src/gzip/infcodes.c @@ -117,6 +117,7 @@ int r ) c->sub.code.need = c->lbits; c->sub.code.tree = c->ltree; c->mode = LEN; + /* fall through */ case LEN: /* i: get length/literal/eob next */ j = c->sub.code.need; NEEDBITS(j) @@ -164,6 +165,7 @@ int r ) c->sub.code.tree = c->dtree; Tracevv((stderr, "inflate: length %u\n", c->len)); c->mode = DIST; + /* fall through */ case DIST: /* i: get distance next */ j = c->sub.code.need; NEEDBITS(j) @@ -194,6 +196,7 @@ int r ) DUMPBITS(j) Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); c->mode = COPY; + /* fall through */ case COPY: /* o: copying bytes in window, waiting for space */ f = q - c->sub.copy.dist; while (f < s->window) /* modulo window size-"while" instead */ @@ -225,6 +228,7 @@ int r ) if (s->read != s->write) LEAVE c->mode = END; + /* fall through */ case END: r = Z_STREAM_END; LEAVE diff --git a/thirdparty/freetype/src/gzip/inflate.c b/thirdparty/freetype/src/gzip/inflate.c index 8877fa3eb2..95e2653662 100644 --- a/thirdparty/freetype/src/gzip/inflate.c +++ b/thirdparty/freetype/src/gzip/inflate.c @@ -174,6 +174,7 @@ int f ) break; } z->state->mode = FLAG; + /* fall through */ case FLAG: NEEDBYTE b = NEXTBYTE; @@ -191,18 +192,22 @@ int f ) break; } z->state->mode = DICT4; + /* fall through */ case DICT4: NEEDBYTE z->state->sub.check.need = (uLong)NEXTBYTE << 24; z->state->mode = DICT3; + /* fall through */ case DICT3: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE << 16; z->state->mode = DICT2; + /* fall through */ case DICT2: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE << 8; z->state->mode = DICT1; + /* fall through */ case DICT1: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE; @@ -234,18 +239,22 @@ int f ) break; } z->state->mode = CHECK4; + /* fall through */ case CHECK4: NEEDBYTE z->state->sub.check.need = (uLong)NEXTBYTE << 24; z->state->mode = CHECK3; + /* fall through */ case CHECK3: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE << 16; z->state->mode = CHECK2; + /* fall through */ case CHECK2: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE << 8; z->state->mode = CHECK1; + /* fall through */ case CHECK1: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE; @@ -259,6 +268,7 @@ int f ) } Tracev((stderr, "inflate: zlib check ok\n")); z->state->mode = DONE; + /* fall through */ case DONE: return Z_STREAM_END; case BAD: diff --git a/thirdparty/freetype/src/pcf/pcf.h b/thirdparty/freetype/src/pcf/pcf.h index 529dd3adf8..33be4bcd85 100644 --- a/thirdparty/freetype/src/pcf/pcf.h +++ b/thirdparty/freetype/src/pcf/pcf.h @@ -99,7 +99,8 @@ FT_BEGIN_HEADER FT_Short ascent; FT_Short descent; FT_Short attributes; - FT_ULong bits; + + FT_ULong bits; /* offset into the PCF_BITMAPS table */ } PCF_MetricRec, *PCF_Metric; diff --git a/thirdparty/freetype/src/pcf/pcfdrivr.c b/thirdparty/freetype/src/pcf/pcfdrivr.c index 54bbb9d119..b39592c794 100644 --- a/thirdparty/freetype/src/pcf/pcfdrivr.c +++ b/thirdparty/freetype/src/pcf/pcfdrivr.c @@ -122,9 +122,9 @@ THE SOFTWARE. charcodeCol > enc->lastCol ) return 0; - return (FT_UInt)enc->offset[ ( charcodeRow - enc->firstRow ) * - ( enc->lastCol - enc->firstCol + 1 ) + - charcodeCol - enc->firstCol ]; + return (FT_UInt)enc->offset[( charcodeRow - enc->firstRow ) * + ( enc->lastCol - enc->firstCol + 1 ) + + charcodeCol - enc->firstCol]; } @@ -160,9 +160,9 @@ THE SOFTWARE. charcode = (FT_UInt32)( charcodeRow * 256 + charcodeCol ); - result = (FT_UInt)enc->offset[ ( charcodeRow - enc->firstRow ) * - ( enc->lastCol - enc->firstCol + 1 ) + - charcodeCol - enc->firstCol ]; + result = (FT_UInt)enc->offset[( charcodeRow - enc->firstRow ) * + ( enc->lastCol - enc->firstCol + 1 ) + + charcodeCol - enc->firstCol]; if ( result != 0xFFFFU ) break; } diff --git a/thirdparty/freetype/src/pcf/pcfread.c b/thirdparty/freetype/src/pcf/pcfread.c index 71143ecfb5..2ffe22d71c 100644 --- a/thirdparty/freetype/src/pcf/pcfread.c +++ b/thirdparty/freetype/src/pcf/pcfread.c @@ -743,33 +743,39 @@ THE SOFTWARE. if ( !orig_nmetrics ) return FT_THROW( Invalid_Table ); - /* PCF is a format from ancient times; Unicode was in its */ - /* infancy, and widely used two-byte character sets for CJK */ - /* scripts (Big 5, GB 2312, JIS X 0208, etc.) did have at most */ - /* 15000 characters. Even the more exotic CNS 11643 and CCCII */ - /* standards, which were essentially three-byte character sets, */ - /* provided less then 65536 assigned characters. */ - /* */ - /* While technically possible to have a larger number of glyphs */ - /* in PCF files, we thus limit the number to 65536. */ - if ( orig_nmetrics > 65536 ) + /* + * PCF is a format from ancient times; Unicode was in its infancy, and + * widely used two-byte character sets for CJK scripts (Big 5, GB 2312, + * JIS X 0208, etc.) did have at most 15000 characters. Even the more + * exotic CNS 11643 and CCCII standards, which were essentially + * three-byte character sets, provided less then 65536 assigned + * characters. + * + * While technically possible to have a larger number of glyphs in PCF + * files, we thus limit the number to 65535, taking into account that we + * synthesize the metrics of glyph 0 to be a copy of the `default + * character', and that 0xFFFF in the encodings array indicates a + * missing glyph. + */ + if ( orig_nmetrics > 65534 ) { FT_TRACE0(( "pcf_get_metrics:" - " only loading first 65536 metrics\n" )); - nmetrics = 65536; + " only loading first 65534 metrics\n" )); + nmetrics = 65534; } else nmetrics = orig_nmetrics; - face->nmetrics = nmetrics; + face->nmetrics = nmetrics + 1; - if ( FT_NEW_ARRAY( face->metrics, nmetrics ) ) + if ( FT_NEW_ARRAY( face->metrics, face->nmetrics ) ) return error; - metrics = face->metrics; + /* we handle glyph index 0 later on */ + metrics = face->metrics + 1; FT_TRACE4(( "\n" )); - for ( i = 0; i < nmetrics; i++, metrics++ ) + for ( i = 1; i < face->nmetrics; i++, metrics++ ) { FT_TRACE5(( " idx %ld:", i )); error = pcf_get_metric( stream, format, metrics ); @@ -808,12 +814,10 @@ THE SOFTWARE. pcf_get_bitmaps( FT_Stream stream, PCF_Face face ) { - FT_Error error; - FT_Memory memory = FT_FACE( face )->memory; - FT_ULong* offsets = NULL; - FT_ULong bitmapSizes[GLYPHPADOPTIONS]; - FT_ULong format, size; - FT_ULong nbitmaps, orig_nbitmaps, i, sizebitmaps = 0; + FT_Error error; + FT_ULong bitmapSizes[GLYPHPADOPTIONS]; + FT_ULong format, size, pos; + FT_ULong nbitmaps, orig_nbitmaps, i, sizebitmaps = 0; error = pcf_seek_to_table_type( stream, @@ -859,31 +863,46 @@ THE SOFTWARE. FT_TRACE4(( " number of bitmaps: %ld\n", orig_nbitmaps )); /* see comment in `pcf_get_metrics' */ - if ( orig_nbitmaps > 65536 ) + if ( orig_nbitmaps > 65534 ) { FT_TRACE0(( "pcf_get_bitmaps:" - " only loading first 65536 bitmaps\n" )); - nbitmaps = 65536; + " only loading first 65534 bitmaps\n" )); + nbitmaps = 65534; } else nbitmaps = orig_nbitmaps; - if ( nbitmaps != face->nmetrics ) + /* no extra bitmap for glyph 0 */ + if ( nbitmaps != face->nmetrics - 1 ) return FT_THROW( Invalid_File_Format ); - if ( FT_NEW_ARRAY( offsets, nbitmaps ) ) - return error; + /* start position of bitmap data */ + pos = stream->pos + nbitmaps * 4 + 4 * 4; FT_TRACE5(( "\n" )); - for ( i = 0; i < nbitmaps; i++ ) + for ( i = 1; i <= nbitmaps; i++ ) { + FT_ULong offset; + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_ULONG( offsets[i] ); + (void)FT_READ_ULONG( offset ); else - (void)FT_READ_ULONG_LE( offsets[i] ); + (void)FT_READ_ULONG_LE( offset ); FT_TRACE5(( " bitmap %lu: offset %lu (0x%lX)\n", - i, offsets[i], offsets[i] )); + i, offset, offset )); + + /* right now, we only check the offset with a rough estimate; */ + /* actual bitmaps are only loaded on demand */ + if ( offset > size ) + { + FT_TRACE0(( "pcf_get_bitmaps:" + " invalid offset to bitmap data of glyph %lu\n", i )); + face->metrics[i].bits = pos; + } + else + face->metrics[i].bits = pos + offset; } if ( error ) goto Bail; @@ -910,24 +929,9 @@ THE SOFTWARE. FT_UNUSED( sizebitmaps ); /* only used for debugging */ - /* right now, we only check the bitmap offsets; */ - /* actual bitmaps are only loaded on demand */ - for ( i = 0; i < nbitmaps; i++ ) - { - /* rough estimate */ - if ( offsets[i] > size ) - { - FT_TRACE0(( "pcf_get_bitmaps:" - " invalid offset to bitmap data of glyph %lu\n", i )); - } - else - face->metrics[i].bits = stream->pos + offsets[i]; - } - face->bitmapsFormat = format; Bail: - FT_FREE( offsets ); return error; } @@ -1062,41 +1066,52 @@ THE SOFTWARE. defaultCharCol = enc->firstCol; } - /* FreeType mandates that glyph index 0 is the `undefined glyph', */ - /* which PCF calls the `default character'. For this reason, we */ - /* swap the positions of glyph index 0 and the index corresponding */ - /* to `defaultChar' in case they are different. */ - - /* `stream->cursor' still points at the beginning of the frame; */ - /* we can thus easily get the offset to the default character */ + /* + * FreeType mandates that glyph index 0 is the `undefined glyph', which + * PCF calls the `default character'. However, FreeType needs glyph + * index 0 to be used for the undefined glyph only, which is is not the + * case for PCF. For this reason, we add one slot for glyph index 0 and + * simply copy the default character to it. + * + * `stream->cursor' still points to the beginning of the frame; we can + * thus easily get the offset to the default character. + */ pos = stream->cursor + 2 * ( ( defaultCharRow - enc->firstRow ) * - ( enc->lastCol - enc->firstCol + 1 ) + - defaultCharCol - enc->firstCol ); + ( enc->lastCol - enc->firstCol + 1 ) + + defaultCharCol - enc->firstCol ); if ( PCF_BYTE_ORDER( format ) == MSBFirst ) defaultCharEncodingOffset = FT_PEEK_USHORT( pos ); else defaultCharEncodingOffset = FT_PEEK_USHORT_LE( pos ); - if ( defaultCharEncodingOffset >= face->nmetrics ) + if ( defaultCharEncodingOffset == 0xFFFF ) { FT_TRACE0(( "pcf_get_encodings:" - " Invalid glyph index for default character," - " setting to zero\n" )); - defaultCharEncodingOffset = 0; + " No glyph for default character,\n" + " " + " setting it to the first glyph of the font\n" )); + defaultCharEncodingOffset = 1; } - - if ( defaultCharEncodingOffset ) + else { - /* do the swapping */ - PCF_MetricRec tmp = face->metrics[defaultCharEncodingOffset]; - + defaultCharEncodingOffset++; - face->metrics[defaultCharEncodingOffset] = face->metrics[0]; - face->metrics[0] = tmp; + if ( defaultCharEncodingOffset >= face->nmetrics ) + { + FT_TRACE0(( "pcf_get_encodings:" + " Invalid glyph index for default character,\n" + " " + " setting it to the first glyph of the font\n" )); + defaultCharEncodingOffset = 1; + } } + /* copy metrics of default character to index 0 */ + face->metrics[0] = face->metrics[defaultCharEncodingOffset]; + + /* now loop over all values */ offset = enc->offset; for ( i = enc->firstRow; i <= enc->lastRow; i++ ) { @@ -1111,15 +1126,9 @@ THE SOFTWARE. else encodingOffset = FT_GET_USHORT_LE(); - if ( encodingOffset != 0xFFFFU ) - { - if ( encodingOffset == defaultCharEncodingOffset ) - encodingOffset = 0; - else if ( encodingOffset == 0 ) - encodingOffset = defaultCharEncodingOffset; - } - - *offset++ = encodingOffset; + /* everything is off by 1 due to the artificial glyph 0 */ + *offset++ = encodingOffset == 0xFFFF ? 0xFFFF + : encodingOffset + 1; } } FT_Stream_ExitFrame( stream ); @@ -1303,9 +1312,8 @@ THE SOFTWARE. PCF_Property prop; - size_t nn, len; - char* strings[4] = { NULL, NULL, NULL, NULL }; - size_t lengths[4]; + const char* strings[4] = { NULL, NULL, NULL, NULL }; + size_t lengths[4], nn, len; face->style_flags = 0; @@ -1317,8 +1325,8 @@ THE SOFTWARE. { face->style_flags |= FT_STYLE_FLAG_ITALIC; strings[2] = ( *(prop->value.atom) == 'O' || - *(prop->value.atom) == 'o' ) ? (char *)"Oblique" - : (char *)"Italic"; + *(prop->value.atom) == 'o' ) ? "Oblique" + : "Italic"; } prop = pcf_find_property( pcf, "WEIGHT_NAME" ); @@ -1326,20 +1334,20 @@ THE SOFTWARE. ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) { face->style_flags |= FT_STYLE_FLAG_BOLD; - strings[1] = (char*)"Bold"; + strings[1] = "Bold"; } prop = pcf_find_property( pcf, "SETWIDTH_NAME" ); if ( prop && prop->isString && *(prop->value.atom) && !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - strings[3] = (char*)( prop->value.atom ); + strings[3] = (const char*)( prop->value.atom ); prop = pcf_find_property( pcf, "ADD_STYLE_NAME" ); if ( prop && prop->isString && *(prop->value.atom) && !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) - strings[0] = (char*)( prop->value.atom ); + strings[0] = (const char*)( prop->value.atom ); for ( len = 0, nn = 0; nn < 4; nn++ ) { @@ -1353,7 +1361,7 @@ THE SOFTWARE. if ( len == 0 ) { - strings[0] = (char*)"Regular"; + strings[0] = "Regular"; lengths[0] = ft_strlen( strings[0] ); len = lengths[0] + 1; } @@ -1369,7 +1377,7 @@ THE SOFTWARE. for ( nn = 0; nn < 4; nn++ ) { - char* src = strings[nn]; + const char* src = strings[nn]; len = lengths[nn]; diff --git a/thirdparty/freetype/src/pfr/pfrobjs.c b/thirdparty/freetype/src/pfr/pfrobjs.c index e103a3f6f2..9765f95c2f 100644 --- a/thirdparty/freetype/src/pfr/pfrobjs.c +++ b/thirdparty/freetype/src/pfr/pfrobjs.c @@ -378,7 +378,7 @@ outline->flags &= ~FT_OUTLINE_OWNER; outline->flags |= FT_OUTLINE_REVERSE_FILL; - if ( size && pfrsize->metrics.y_ppem < 24 ) + if ( pfrsize->metrics.y_ppem < 24 ) outline->flags |= FT_OUTLINE_HIGH_PRECISION; /* compute the advance vector */ diff --git a/thirdparty/freetype/src/psaux/afmparse.c b/thirdparty/freetype/src/psaux/afmparse.c index 49225a9f78..f78adbba3d 100644 --- a/thirdparty/freetype/src/psaux/afmparse.c +++ b/thirdparty/freetype/src/psaux/afmparse.c @@ -953,7 +953,8 @@ error = afm_parse_kern_data( parser ); if ( error ) goto Fail; - /* fall through since we only support kern data */ + /* we only support kern data, so ... */ + /* fall through */ case AFM_TOKEN_ENDFONTMETRICS: return FT_Err_Ok; diff --git a/thirdparty/freetype/src/psaux/psfixed.h b/thirdparty/freetype/src/psaux/psfixed.h index fd3460f34a..7dff9ef1bd 100644 --- a/thirdparty/freetype/src/psaux/psfixed.h +++ b/thirdparty/freetype/src/psaux/psfixed.h @@ -72,8 +72,7 @@ FT_BEGIN_HEADER #define cf2_fixedFraction( x ) \ ( (x) - cf2_fixedFloor( x ) ) #define cf2_fracToFixed( x ) \ - ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 ) \ - : ( ( (x) + 0x2000 ) >> 14 ) ) + ( ( (x) + 0x2000 - ( (x) < 0 ) ) >> 14 ) /* signed numeric types */ diff --git a/thirdparty/freetype/src/psaux/psfont.c b/thirdparty/freetype/src/psaux/psfont.c index bb5faa38f5..00e4210819 100644 --- a/thirdparty/freetype/src/psaux/psfont.c +++ b/thirdparty/freetype/src/psaux/psfont.c @@ -274,9 +274,6 @@ if ( !font->isT1 ) { - FT_Service_CFFLoad cffload = (FT_Service_CFFLoad)font->cffload; - - /* check for variation vectors */ vstore = cf2_getVStore( decoder ); hasVariations = ( vstore->dataCount != 0 ); @@ -284,6 +281,9 @@ if ( hasVariations ) { #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Service_CFFLoad cffload = (FT_Service_CFFLoad)font->cffload; + + /* check whether Private DICT in this subfont needs to be reparsed */ font->error = cf2_getNormalizedVector( decoder, &lenNormalizedV, diff --git a/thirdparty/freetype/src/psaux/psobjs.c b/thirdparty/freetype/src/psaux/psobjs.c index e2168a3324..8bfdb92332 100644 --- a/thirdparty/freetype/src/psaux/psobjs.c +++ b/thirdparty/freetype/src/psaux/psobjs.c @@ -174,10 +174,10 @@ * reallocation fails. */ FT_LOCAL_DEF( FT_Error ) - ps_table_add( PS_Table table, - FT_Int idx, - void* object, - FT_UInt length ) + ps_table_add( PS_Table table, + FT_Int idx, + const void* object, + FT_UInt length ) { if ( idx < 0 || idx >= table->max_elems ) { diff --git a/thirdparty/freetype/src/psaux/psobjs.h b/thirdparty/freetype/src/psaux/psobjs.h index 9466a1d075..c44dc450ec 100644 --- a/thirdparty/freetype/src/psaux/psobjs.h +++ b/thirdparty/freetype/src/psaux/psobjs.h @@ -53,10 +53,10 @@ FT_BEGIN_HEADER FT_Memory memory ); FT_LOCAL( FT_Error ) - ps_table_add( PS_Table table, - FT_Int idx, - void* object, - FT_UInt length ); + ps_table_add( PS_Table table, + FT_Int idx, + const void* object, + FT_UInt length ); FT_LOCAL( void ) ps_table_done( PS_Table table ); diff --git a/thirdparty/freetype/src/raster/ftraster.c b/thirdparty/freetype/src/raster/ftraster.c index 798a72d02a..023b6c1eff 100644 --- a/thirdparty/freetype/src/raster/ftraster.c +++ b/thirdparty/freetype/src/raster/ftraster.c @@ -399,7 +399,7 @@ #define RAS_ARGS /* void */ -#define RAS_ARG /* void */ +#define RAS_ARG void #define RAS_VARS /* void */ #define RAS_VAR /* void */ @@ -546,8 +546,7 @@ #ifdef FT_STATIC_RASTER - static black_TWorker cur_ras; -#define ras cur_ras + static black_TWorker ras; #else /* !FT_STATIC_RASTER */ @@ -661,7 +660,6 @@ return FAILURE; } - ras.cProfile->flags = 0; ras.cProfile->start = 0; ras.cProfile->height = 0; ras.cProfile->offset = ras.top; @@ -914,16 +912,18 @@ base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + base[3].x = b >> 1; + base[2].x = ( a + b ) >> 2; + base[1].x = a >> 1; base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + base[3].y = b >> 1; + base[2].y = ( a + b ) >> 2; + base[1].y = a >> 1; /* hand optimized. gcc doesn't seem to be too good at common */ /* expression substitution and instruction scheduling ;-) */ @@ -947,28 +947,32 @@ static void Split_Cubic( TPoint* base ) { - Long a, b, c, d; + Long a, b, c; base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c + 1 ) >> 1; - base[5].x = b = ( base[3].x + d + 1 ) >> 1; - c = ( c + d + 1 ) >> 1; - base[2].x = a = ( a + c + 1 ) >> 1; - base[4].x = b = ( b + c + 1 ) >> 1; - base[3].x = ( a + b + 1 ) >> 1; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + c = base[2].x + base[3].x; + base[5].x = c >> 1; + c += b; + base[4].x = c >> 2; + base[1].x = a >> 1; + a += b; + base[2].x = a >> 2; + base[3].x = ( a + c ) >> 3; base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c + 1 ) >> 1; - base[5].y = b = ( base[3].y + d + 1 ) >> 1; - c = ( c + d + 1 ) >> 1; - base[2].y = a = ( a + c + 1 ) >> 1; - base[4].y = b = ( b + c + 1 ) >> 1; - base[3].y = ( a + b + 1 ) >> 1; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + c = base[2].y + base[3].y; + base[5].y = c >> 1; + c += b; + base[4].y = c >> 2; + base[1].y = a >> 1; + a += b; + base[2].y = a >> 2; + base[3].y = ( a + c ) >> 3; } @@ -2784,7 +2788,7 @@ P_Left = draw_left; P_Right = draw_right; - while ( P_Left ) + while ( P_Left && P_Right ) { x1 = P_Left ->X; x2 = P_Right->X; @@ -2885,7 +2889,7 @@ P_Left = draw_left; P_Right = draw_right; - while ( P_Left ) + while ( P_Left && P_Right ) { if ( P_Left->countL ) { @@ -3257,7 +3261,9 @@ const FT_Outline* outline = (const FT_Outline*)params->source; const FT_Bitmap* target_map = params->target; +#ifndef FT_STATIC_RASTER black_TWorker worker[1]; +#endif Long buffer[FT_MAX_BLACK_POOL]; @@ -3299,8 +3305,8 @@ ras.outline = *outline; ras.target = *target_map; - worker->buff = buffer; - worker->sizeBuff = (&buffer)[1]; /* Points to right after buffer. */ + ras.buff = buffer; + ras.sizeBuff = (&buffer)[1]; /* Points to right after buffer. */ return Render_Glyph( RAS_VAR ); } diff --git a/thirdparty/freetype/src/sfnt/rules.mk b/thirdparty/freetype/src/sfnt/rules.mk index ff9e7c6117..ee3314eac3 100644 --- a/thirdparty/freetype/src/sfnt/rules.mk +++ b/thirdparty/freetype/src/sfnt/rules.mk @@ -31,6 +31,7 @@ SFNT_COMPILE := $(CC) $(ANSIFLAGS) \ SFNT_DRV_SRC := $(SFNT_DIR)/pngshim.c \ $(SFNT_DIR)/sfdriver.c \ $(SFNT_DIR)/sfobjs.c \ + $(SFNT_DIR)/sfwoff.c \ $(SFNT_DIR)/ttbdf.c \ $(SFNT_DIR)/ttcmap.c \ $(SFNT_DIR)/ttcolr.c \ diff --git a/thirdparty/freetype/src/sfnt/sfdriver.c b/thirdparty/freetype/src/sfnt/sfdriver.c index c467ff4d37..2611685284 100644 --- a/thirdparty/freetype/src/sfnt/sfdriver.c +++ b/thirdparty/freetype/src/sfnt/sfdriver.c @@ -182,8 +182,8 @@ static FT_UInt - sfnt_get_name_index( FT_Face face, - FT_String* glyph_name ) + sfnt_get_name_index( FT_Face face, + const FT_String* glyph_name ) { TT_Face ttface = (TT_Face)face; @@ -375,47 +375,61 @@ { case 15: k4 ^= (FT_UInt32)tail[14] << 16; + /* fall through */ case 14: k4 ^= (FT_UInt32)tail[13] << 8; + /* fall through */ case 13: k4 ^= (FT_UInt32)tail[12]; k4 *= c4; k4 = ROTL32( k4, 18 ); k4 *= c1; h4 ^= k4; + /* fall through */ case 12: k3 ^= (FT_UInt32)tail[11] << 24; + /* fall through */ case 11: k3 ^= (FT_UInt32)tail[10] << 16; + /* fall through */ case 10: k3 ^= (FT_UInt32)tail[9] << 8; + /* fall through */ case 9: k3 ^= (FT_UInt32)tail[8]; k3 *= c3; k3 = ROTL32( k3, 17 ); k3 *= c4; h3 ^= k3; + /* fall through */ case 8: k2 ^= (FT_UInt32)tail[7] << 24; + /* fall through */ case 7: k2 ^= (FT_UInt32)tail[6] << 16; + /* fall through */ case 6: k2 ^= (FT_UInt32)tail[5] << 8; + /* fall through */ case 5: k2 ^= (FT_UInt32)tail[4]; k2 *= c2; k2 = ROTL32( k2, 16 ); k2 *= c3; h2 ^= k2; + /* fall through */ case 4: k1 ^= (FT_UInt32)tail[3] << 24; + /* fall through */ case 3: k1 ^= (FT_UInt32)tail[2] << 16; + /* fall through */ case 2: k1 ^= (FT_UInt32)tail[1] << 8; + /* fall through */ case 1: k1 ^= (FT_UInt32)tail[0]; k1 *= c1; diff --git a/thirdparty/freetype/src/sfnt/sfnt.c b/thirdparty/freetype/src/sfnt/sfnt.c index 5a503f30c5..b4faf34a3a 100644 --- a/thirdparty/freetype/src/sfnt/sfnt.c +++ b/thirdparty/freetype/src/sfnt/sfnt.c @@ -22,6 +22,7 @@ #include "pngshim.c" #include "sfdriver.c" #include "sfobjs.c" +#include "sfwoff.c" #include "ttbdf.c" #include "ttcmap.c" #include "ttcolr.c" diff --git a/thirdparty/freetype/src/sfnt/sfobjs.c b/thirdparty/freetype/src/sfnt/sfobjs.c index 0b43d251b8..6edf3ae1de 100644 --- a/thirdparty/freetype/src/sfnt/sfobjs.c +++ b/thirdparty/freetype/src/sfnt/sfobjs.c @@ -21,13 +21,13 @@ #include "ttload.h" #include "ttcmap.h" #include "ttkern.h" +#include "sfwoff.h" #include FT_INTERNAL_SFNT_H #include FT_INTERNAL_DEBUG_H #include FT_TRUETYPE_IDS_H #include FT_TRUETYPE_TAGS_H #include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_SFNT_NAMES_H -#include FT_GZIP_H #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #include FT_SERVICE_MULTIPLE_MASTERS_H @@ -337,403 +337,6 @@ } -#define WRITE_USHORT( p, v ) \ - do \ - { \ - *(p)++ = (FT_Byte)( (v) >> 8 ); \ - *(p)++ = (FT_Byte)( (v) >> 0 ); \ - \ - } while ( 0 ) - -#define WRITE_ULONG( p, v ) \ - do \ - { \ - *(p)++ = (FT_Byte)( (v) >> 24 ); \ - *(p)++ = (FT_Byte)( (v) >> 16 ); \ - *(p)++ = (FT_Byte)( (v) >> 8 ); \ - *(p)++ = (FT_Byte)( (v) >> 0 ); \ - \ - } while ( 0 ) - - - static void - sfnt_stream_close( FT_Stream stream ) - { - FT_Memory memory = stream->memory; - - - FT_FREE( stream->base ); - - stream->size = 0; - stream->base = NULL; - stream->close = NULL; - } - - - FT_CALLBACK_DEF( int ) - compare_offsets( const void* a, - const void* b ) - { - WOFF_Table table1 = *(WOFF_Table*)a; - WOFF_Table table2 = *(WOFF_Table*)b; - - FT_ULong offset1 = table1->Offset; - FT_ULong offset2 = table2->Offset; - - - if ( offset1 > offset2 ) - return 1; - else if ( offset1 < offset2 ) - return -1; - else - return 0; - } - - - /* Replace `face->root.stream' with a stream containing the extracted */ - /* SFNT of a WOFF font. */ - - static FT_Error - woff_open_font( FT_Stream stream, - TT_Face face ) - { - FT_Memory memory = stream->memory; - FT_Error error = FT_Err_Ok; - - WOFF_HeaderRec woff; - WOFF_Table tables = NULL; - WOFF_Table* indices = NULL; - - FT_ULong woff_offset; - - FT_Byte* sfnt = NULL; - FT_Stream sfnt_stream = NULL; - - FT_Byte* sfnt_header; - FT_ULong sfnt_offset; - - FT_Int nn; - FT_ULong old_tag = 0; - - static const FT_Frame_Field woff_header_fields[] = - { -#undef FT_STRUCTURE -#define FT_STRUCTURE WOFF_HeaderRec - - FT_FRAME_START( 44 ), - FT_FRAME_ULONG ( signature ), - FT_FRAME_ULONG ( flavor ), - FT_FRAME_ULONG ( length ), - FT_FRAME_USHORT( num_tables ), - FT_FRAME_USHORT( reserved ), - FT_FRAME_ULONG ( totalSfntSize ), - FT_FRAME_USHORT( majorVersion ), - FT_FRAME_USHORT( minorVersion ), - FT_FRAME_ULONG ( metaOffset ), - FT_FRAME_ULONG ( metaLength ), - FT_FRAME_ULONG ( metaOrigLength ), - FT_FRAME_ULONG ( privOffset ), - FT_FRAME_ULONG ( privLength ), - FT_FRAME_END - }; - - - FT_ASSERT( stream == face->root.stream ); - FT_ASSERT( FT_STREAM_POS() == 0 ); - - if ( FT_STREAM_READ_FIELDS( woff_header_fields, &woff ) ) - return error; - - /* Make sure we don't recurse back here or hit TTC code. */ - if ( woff.flavor == TTAG_wOFF || woff.flavor == TTAG_ttcf ) - return FT_THROW( Invalid_Table ); - - /* Miscellaneous checks. */ - if ( woff.length != stream->size || - woff.num_tables == 0 || - 44 + woff.num_tables * 20UL >= woff.length || - 12 + woff.num_tables * 16UL >= woff.totalSfntSize || - ( woff.totalSfntSize & 3 ) != 0 || - ( woff.metaOffset == 0 && ( woff.metaLength != 0 || - woff.metaOrigLength != 0 ) ) || - ( woff.metaLength != 0 && woff.metaOrigLength == 0 ) || - ( woff.privOffset == 0 && woff.privLength != 0 ) ) - { - FT_ERROR(( "woff_font_open: invalid WOFF header\n" )); - return FT_THROW( Invalid_Table ); - } - - /* Don't trust `totalSfntSize' before thorough checks. */ - if ( FT_ALLOC( sfnt, 12 + woff.num_tables * 16UL ) || - FT_NEW( sfnt_stream ) ) - goto Exit; - - sfnt_header = sfnt; - - /* Write sfnt header. */ - { - FT_UInt searchRange, entrySelector, rangeShift, x; - - - x = woff.num_tables; - entrySelector = 0; - while ( x ) - { - x >>= 1; - entrySelector += 1; - } - entrySelector--; - - searchRange = ( 1 << entrySelector ) * 16; - rangeShift = woff.num_tables * 16 - searchRange; - - WRITE_ULONG ( sfnt_header, woff.flavor ); - WRITE_USHORT( sfnt_header, woff.num_tables ); - WRITE_USHORT( sfnt_header, searchRange ); - WRITE_USHORT( sfnt_header, entrySelector ); - WRITE_USHORT( sfnt_header, rangeShift ); - } - - /* While the entries in the sfnt header must be sorted by the */ - /* tag value, the tables themselves are not. We thus have to */ - /* sort them by offset and check that they don't overlap. */ - - if ( FT_NEW_ARRAY( tables, woff.num_tables ) || - FT_NEW_ARRAY( indices, woff.num_tables ) ) - goto Exit; - - FT_TRACE2(( "\n" - " tag offset compLen origLen checksum\n" - " -------------------------------------------\n" )); - - if ( FT_FRAME_ENTER( 20L * woff.num_tables ) ) - goto Exit; - - for ( nn = 0; nn < woff.num_tables; nn++ ) - { - WOFF_Table table = tables + nn; - - table->Tag = FT_GET_TAG4(); - table->Offset = FT_GET_ULONG(); - table->CompLength = FT_GET_ULONG(); - table->OrigLength = FT_GET_ULONG(); - table->CheckSum = FT_GET_ULONG(); - - FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx %08lx\n", - (FT_Char)( table->Tag >> 24 ), - (FT_Char)( table->Tag >> 16 ), - (FT_Char)( table->Tag >> 8 ), - (FT_Char)( table->Tag ), - table->Offset, - table->CompLength, - table->OrigLength, - table->CheckSum )); - - if ( table->Tag <= old_tag ) - { - FT_FRAME_EXIT(); - - FT_ERROR(( "woff_font_open: table tags are not sorted\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - old_tag = table->Tag; - indices[nn] = table; - } - - FT_FRAME_EXIT(); - - /* Sort by offset. */ - - ft_qsort( indices, - woff.num_tables, - sizeof ( WOFF_Table ), - compare_offsets ); - - /* Check offsets and lengths. */ - - woff_offset = 44 + woff.num_tables * 20L; - sfnt_offset = 12 + woff.num_tables * 16L; - - for ( nn = 0; nn < woff.num_tables; nn++ ) - { - WOFF_Table table = indices[nn]; - - - if ( table->Offset != woff_offset || - table->CompLength > woff.length || - table->Offset > woff.length - table->CompLength || - table->OrigLength > woff.totalSfntSize || - sfnt_offset > woff.totalSfntSize - table->OrigLength || - table->CompLength > table->OrigLength ) - { - FT_ERROR(( "woff_font_open: invalid table offsets\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - table->OrigOffset = sfnt_offset; - - /* The offsets must be multiples of 4. */ - woff_offset += ( table->CompLength + 3 ) & ~3U; - sfnt_offset += ( table->OrigLength + 3 ) & ~3U; - } - - /* - * Final checks! - * - * We don't decode and check the metadata block. - * We don't check table checksums either. - * But other than those, I think we implement all - * `MUST' checks from the spec. - */ - - if ( woff.metaOffset ) - { - if ( woff.metaOffset != woff_offset || - woff.metaOffset + woff.metaLength > woff.length ) - { - FT_ERROR(( "woff_font_open:" - " invalid `metadata' offset or length\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - /* We have padding only ... */ - woff_offset += woff.metaLength; - } - - if ( woff.privOffset ) - { - /* ... if it isn't the last block. */ - woff_offset = ( woff_offset + 3 ) & ~3U; - - if ( woff.privOffset != woff_offset || - woff.privOffset + woff.privLength > woff.length ) - { - FT_ERROR(( "woff_font_open: invalid `private' offset or length\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - /* No padding for the last block. */ - woff_offset += woff.privLength; - } - - if ( sfnt_offset != woff.totalSfntSize || - woff_offset != woff.length ) - { - FT_ERROR(( "woff_font_open: invalid `sfnt' table structure\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - - /* Now use `totalSfntSize'. */ - if ( FT_REALLOC( sfnt, - 12 + woff.num_tables * 16UL, - woff.totalSfntSize ) ) - goto Exit; - - sfnt_header = sfnt + 12; - - /* Write the tables. */ - - for ( nn = 0; nn < woff.num_tables; nn++ ) - { - WOFF_Table table = tables + nn; - - - /* Write SFNT table entry. */ - WRITE_ULONG( sfnt_header, table->Tag ); - WRITE_ULONG( sfnt_header, table->CheckSum ); - WRITE_ULONG( sfnt_header, table->OrigOffset ); - WRITE_ULONG( sfnt_header, table->OrigLength ); - - /* Write table data. */ - if ( FT_STREAM_SEEK( table->Offset ) || - FT_FRAME_ENTER( table->CompLength ) ) - goto Exit; - - if ( table->CompLength == table->OrigLength ) - { - /* Uncompressed data; just copy. */ - ft_memcpy( sfnt + table->OrigOffset, - stream->cursor, - table->OrigLength ); - } - else - { -#ifdef FT_CONFIG_OPTION_USE_ZLIB - - /* Uncompress with zlib. */ - FT_ULong output_len = table->OrigLength; - - - error = FT_Gzip_Uncompress( memory, - sfnt + table->OrigOffset, &output_len, - stream->cursor, table->CompLength ); - if ( error ) - goto Exit; - if ( output_len != table->OrigLength ) - { - FT_ERROR(( "woff_font_open: compressed table length mismatch\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } - -#else /* !FT_CONFIG_OPTION_USE_ZLIB */ - - error = FT_THROW( Unimplemented_Feature ); - goto Exit; - -#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ - } - - FT_FRAME_EXIT(); - - /* We don't check whether the padding bytes in the WOFF file are */ - /* actually '\0'. For the output, however, we do set them properly. */ - sfnt_offset = table->OrigOffset + table->OrigLength; - while ( sfnt_offset & 3 ) - { - sfnt[sfnt_offset] = '\0'; - sfnt_offset++; - } - } - - /* Ok! Finally ready. Swap out stream and return. */ - FT_Stream_OpenMemory( sfnt_stream, sfnt, woff.totalSfntSize ); - sfnt_stream->memory = stream->memory; - sfnt_stream->close = sfnt_stream_close; - - FT_Stream_Free( - face->root.stream, - ( face->root.face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); - - face->root.stream = sfnt_stream; - - face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; - - Exit: - FT_FREE( tables ); - FT_FREE( indices ); - - if ( error ) - { - FT_FREE( sfnt ); - FT_Stream_Close( sfnt_stream ); - FT_FREE( sfnt_stream ); - } - - return error; - } - - -#undef WRITE_USHORT -#undef WRITE_ULONG - - /* Fill in face->ttc_header. If the font is not a TTC, it is */ /* synthesized into a TTC with one offset table. */ static FT_Error diff --git a/thirdparty/freetype/src/sfnt/sfobjs.h b/thirdparty/freetype/src/sfnt/sfobjs.h index 17b0d50105..3fbf2dd6bd 100644 --- a/thirdparty/freetype/src/sfnt/sfobjs.h +++ b/thirdparty/freetype/src/sfnt/sfobjs.h @@ -53,7 +53,7 @@ FT_BEGIN_HEADER FT_END_HEADER -#endif /* SFDRIVER_H_ */ +#endif /* SFOBJS_H_ */ /* END */ diff --git a/thirdparty/freetype/src/sfnt/sfwoff.c b/thirdparty/freetype/src/sfnt/sfwoff.c new file mode 100644 index 0000000000..ca4821a20a --- /dev/null +++ b/thirdparty/freetype/src/sfnt/sfwoff.c @@ -0,0 +1,434 @@ +/**************************************************************************** + * + * sfwoff.c + * + * WOFF format management (base). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <ft2build.h> +#include "sfwoff.h" +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_GZIP_H + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT sfwoff + + +#define WRITE_USHORT( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_ULONG( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 24 ); \ + *(p)++ = (FT_Byte)( (v) >> 16 ); \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + + + static void + sfnt_stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->base = NULL; + stream->close = NULL; + } + + + FT_CALLBACK_DEF( int ) + compare_offsets( const void* a, + const void* b ) + { + WOFF_Table table1 = *(WOFF_Table*)a; + WOFF_Table table2 = *(WOFF_Table*)b; + + FT_ULong offset1 = table1->Offset; + FT_ULong offset2 = table2->Offset; + + + if ( offset1 > offset2 ) + return 1; + else if ( offset1 < offset2 ) + return -1; + else + return 0; + } + + + /* Replace `face->root.stream' with a stream containing the extracted */ + /* SFNT of a WOFF font. */ + + FT_LOCAL_DEF( FT_Error ) + woff_open_font( FT_Stream stream, + TT_Face face ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + + WOFF_HeaderRec woff; + WOFF_Table tables = NULL; + WOFF_Table* indices = NULL; + + FT_ULong woff_offset; + + FT_Byte* sfnt = NULL; + FT_Stream sfnt_stream = NULL; + + FT_Byte* sfnt_header; + FT_ULong sfnt_offset; + + FT_Int nn; + FT_ULong old_tag = 0; + + static const FT_Frame_Field woff_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WOFF_HeaderRec + + FT_FRAME_START( 44 ), + FT_FRAME_ULONG ( signature ), + FT_FRAME_ULONG ( flavor ), + FT_FRAME_ULONG ( length ), + FT_FRAME_USHORT( num_tables ), + FT_FRAME_USHORT( reserved ), + FT_FRAME_ULONG ( totalSfntSize ), + FT_FRAME_USHORT( majorVersion ), + FT_FRAME_USHORT( minorVersion ), + FT_FRAME_ULONG ( metaOffset ), + FT_FRAME_ULONG ( metaLength ), + FT_FRAME_ULONG ( metaOrigLength ), + FT_FRAME_ULONG ( privOffset ), + FT_FRAME_ULONG ( privLength ), + FT_FRAME_END + }; + + + FT_ASSERT( stream == face->root.stream ); + FT_ASSERT( FT_STREAM_POS() == 0 ); + + if ( FT_STREAM_READ_FIELDS( woff_header_fields, &woff ) ) + return error; + + /* Make sure we don't recurse back here or hit TTC code. */ + if ( woff.flavor == TTAG_wOFF || woff.flavor == TTAG_ttcf ) + return FT_THROW( Invalid_Table ); + + /* Miscellaneous checks. */ + if ( woff.length != stream->size || + woff.num_tables == 0 || + 44 + woff.num_tables * 20UL >= woff.length || + 12 + woff.num_tables * 16UL >= woff.totalSfntSize || + ( woff.totalSfntSize & 3 ) != 0 || + ( woff.metaOffset == 0 && ( woff.metaLength != 0 || + woff.metaOrigLength != 0 ) ) || + ( woff.metaLength != 0 && woff.metaOrigLength == 0 ) || + ( woff.privOffset == 0 && woff.privLength != 0 ) ) + { + FT_ERROR(( "woff_font_open: invalid WOFF header\n" )); + return FT_THROW( Invalid_Table ); + } + + /* Don't trust `totalSfntSize' before thorough checks. */ + if ( FT_ALLOC( sfnt, 12 + woff.num_tables * 16UL ) || + FT_NEW( sfnt_stream ) ) + goto Exit; + + sfnt_header = sfnt; + + /* Write sfnt header. */ + { + FT_UInt searchRange, entrySelector, rangeShift, x; + + + x = woff.num_tables; + entrySelector = 0; + while ( x ) + { + x >>= 1; + entrySelector += 1; + } + entrySelector--; + + searchRange = ( 1 << entrySelector ) * 16; + rangeShift = woff.num_tables * 16 - searchRange; + + WRITE_ULONG ( sfnt_header, woff.flavor ); + WRITE_USHORT( sfnt_header, woff.num_tables ); + WRITE_USHORT( sfnt_header, searchRange ); + WRITE_USHORT( sfnt_header, entrySelector ); + WRITE_USHORT( sfnt_header, rangeShift ); + } + + /* While the entries in the sfnt header must be sorted by the */ + /* tag value, the tables themselves are not. We thus have to */ + /* sort them by offset and check that they don't overlap. */ + + if ( FT_NEW_ARRAY( tables, woff.num_tables ) || + FT_NEW_ARRAY( indices, woff.num_tables ) ) + goto Exit; + + FT_TRACE2(( "\n" + " tag offset compLen origLen checksum\n" + " -------------------------------------------\n" )); + + if ( FT_FRAME_ENTER( 20L * woff.num_tables ) ) + goto Exit; + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = tables + nn; + + table->Tag = FT_GET_TAG4(); + table->Offset = FT_GET_ULONG(); + table->CompLength = FT_GET_ULONG(); + table->OrigLength = FT_GET_ULONG(); + table->CheckSum = FT_GET_ULONG(); + + FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx %08lx\n", + (FT_Char)( table->Tag >> 24 ), + (FT_Char)( table->Tag >> 16 ), + (FT_Char)( table->Tag >> 8 ), + (FT_Char)( table->Tag ), + table->Offset, + table->CompLength, + table->OrigLength, + table->CheckSum )); + + if ( table->Tag <= old_tag ) + { + FT_FRAME_EXIT(); + + FT_ERROR(( "woff_font_open: table tags are not sorted\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + old_tag = table->Tag; + indices[nn] = table; + } + + FT_FRAME_EXIT(); + + /* Sort by offset. */ + + ft_qsort( indices, + woff.num_tables, + sizeof ( WOFF_Table ), + compare_offsets ); + + /* Check offsets and lengths. */ + + woff_offset = 44 + woff.num_tables * 20L; + sfnt_offset = 12 + woff.num_tables * 16L; + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = indices[nn]; + + + if ( table->Offset != woff_offset || + table->CompLength > woff.length || + table->Offset > woff.length - table->CompLength || + table->OrigLength > woff.totalSfntSize || + sfnt_offset > woff.totalSfntSize - table->OrigLength || + table->CompLength > table->OrigLength ) + { + FT_ERROR(( "woff_font_open: invalid table offsets\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + table->OrigOffset = sfnt_offset; + + /* The offsets must be multiples of 4. */ + woff_offset += ( table->CompLength + 3 ) & ~3U; + sfnt_offset += ( table->OrigLength + 3 ) & ~3U; + } + + /* + * Final checks! + * + * We don't decode and check the metadata block. + * We don't check table checksums either. + * But other than those, I think we implement all + * `MUST' checks from the spec. + */ + + if ( woff.metaOffset ) + { + if ( woff.metaOffset != woff_offset || + woff.metaOffset + woff.metaLength > woff.length ) + { + FT_ERROR(( "woff_font_open:" + " invalid `metadata' offset or length\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* We have padding only ... */ + woff_offset += woff.metaLength; + } + + if ( woff.privOffset ) + { + /* ... if it isn't the last block. */ + woff_offset = ( woff_offset + 3 ) & ~3U; + + if ( woff.privOffset != woff_offset || + woff.privOffset + woff.privLength > woff.length ) + { + FT_ERROR(( "woff_font_open: invalid `private' offset or length\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* No padding for the last block. */ + woff_offset += woff.privLength; + } + + if ( sfnt_offset != woff.totalSfntSize || + woff_offset != woff.length ) + { + FT_ERROR(( "woff_font_open: invalid `sfnt' table structure\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* Now use `totalSfntSize'. */ + if ( FT_REALLOC( sfnt, + 12 + woff.num_tables * 16UL, + woff.totalSfntSize ) ) + goto Exit; + + sfnt_header = sfnt + 12; + + /* Write the tables. */ + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = tables + nn; + + + /* Write SFNT table entry. */ + WRITE_ULONG( sfnt_header, table->Tag ); + WRITE_ULONG( sfnt_header, table->CheckSum ); + WRITE_ULONG( sfnt_header, table->OrigOffset ); + WRITE_ULONG( sfnt_header, table->OrigLength ); + + /* Write table data. */ + if ( FT_STREAM_SEEK( table->Offset ) || + FT_FRAME_ENTER( table->CompLength ) ) + goto Exit; + + if ( table->CompLength == table->OrigLength ) + { + /* Uncompressed data; just copy. */ + ft_memcpy( sfnt + table->OrigOffset, + stream->cursor, + table->OrigLength ); + } + else + { +#ifdef FT_CONFIG_OPTION_USE_ZLIB + + /* Uncompress with zlib. */ + FT_ULong output_len = table->OrigLength; + + + error = FT_Gzip_Uncompress( memory, + sfnt + table->OrigOffset, &output_len, + stream->cursor, table->CompLength ); + if ( error ) + goto Exit; + if ( output_len != table->OrigLength ) + { + FT_ERROR(( "woff_font_open: compressed table length mismatch\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + +#else /* !FT_CONFIG_OPTION_USE_ZLIB */ + + error = FT_THROW( Unimplemented_Feature ); + goto Exit; + +#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ + } + + FT_FRAME_EXIT(); + + /* We don't check whether the padding bytes in the WOFF file are */ + /* actually '\0'. For the output, however, we do set them properly. */ + sfnt_offset = table->OrigOffset + table->OrigLength; + while ( sfnt_offset & 3 ) + { + sfnt[sfnt_offset] = '\0'; + sfnt_offset++; + } + } + + /* Ok! Finally ready. Swap out stream and return. */ + FT_Stream_OpenMemory( sfnt_stream, sfnt, woff.totalSfntSize ); + sfnt_stream->memory = stream->memory; + sfnt_stream->close = sfnt_stream_close; + + FT_Stream_Free( + face->root.stream, + ( face->root.face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->root.stream = sfnt_stream; + + face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + + Exit: + FT_FREE( tables ); + FT_FREE( indices ); + + if ( error ) + { + FT_FREE( sfnt ); + FT_Stream_Close( sfnt_stream ); + FT_FREE( sfnt_stream ); + } + + return error; + } + + +#undef WRITE_USHORT +#undef WRITE_ULONG + + +/* END */ diff --git a/thirdparty/freetype/src/sfnt/sfwoff.h b/thirdparty/freetype/src/sfnt/sfwoff.h new file mode 100644 index 0000000000..15495c32a2 --- /dev/null +++ b/thirdparty/freetype/src/sfnt/sfwoff.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * sfwoff.h + * + * WOFFF format management (specification). + * + * Copyright (C) 1996-2019 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SFWOFF_H_ +#define SFWOFF_H_ + + +#include <ft2build.h> +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + woff_open_font( FT_Stream stream, + TT_Face face ); + + +FT_END_HEADER + +#endif /* SFWOFF_H_ */ + + +/* END */ diff --git a/thirdparty/freetype/src/sfnt/ttcmap.c b/thirdparty/freetype/src/sfnt/ttcmap.c index 8d9737310c..683f3b1818 100644 --- a/thirdparty/freetype/src/sfnt/ttcmap.c +++ b/thirdparty/freetype/src/sfnt/ttcmap.c @@ -2368,10 +2368,7 @@ /* if `gindex' is invalid, the remaining values */ /* in this group are invalid, too */ if ( gindex >= (FT_UInt)face->num_glyphs ) - { - gindex = 0; continue; - } cmap->cur_charcode = char_code; cmap->cur_gindex = gindex; @@ -3661,7 +3658,7 @@ tt_get_glyph_name( TT_Face face, FT_UInt idx ) { - FT_String* PSname; + FT_String* PSname = NULL; tt_face_get_ps_name( face, idx, &PSname ); diff --git a/thirdparty/freetype/src/sfnt/ttmtx.c b/thirdparty/freetype/src/sfnt/ttmtx.c index 7a4d2be2cb..b6725c962f 100644 --- a/thirdparty/freetype/src/sfnt/ttmtx.c +++ b/thirdparty/freetype/src/sfnt/ttmtx.c @@ -280,7 +280,7 @@ else { table_pos += 4 * ( k - 1 ); - if ( table_pos + 4 > table_end ) + if ( table_pos + 2 > table_end ) goto NoData; if ( FT_STREAM_SEEK( table_pos ) || @@ -292,7 +292,9 @@ *abearing = 0; else { - if ( !FT_STREAM_SEEK( table_pos ) ) + if ( FT_STREAM_SEEK( table_pos ) ) + *abearing = 0; + else (void)FT_READ_SHORT( *abearing ); } } diff --git a/thirdparty/freetype/src/smooth/ftgrays.c b/thirdparty/freetype/src/smooth/ftgrays.c index 91293ac946..fd357a50fc 100644 --- a/thirdparty/freetype/src/smooth/ftgrays.c +++ b/thirdparty/freetype/src/smooth/ftgrays.c @@ -45,7 +45,7 @@ * This is a new anti-aliasing scan-converter for FreeType 2. The * algorithm used here is _very_ different from the one in the standard * `ftraster' module. Actually, `ftgrays' computes the _exact_ - * coverage of the outline on each pixel cell. + * coverage of the outline on each pixel cell by straight segments. * * It is based on ideas that I initially found in Raph Levien's * excellent LibArt graphics library (see https://www.levien.com/libart @@ -58,6 +58,14 @@ * different way, and I don't use sorted vector paths. Also, it doesn't * use floating point values. * + * Bézier segments are flattened by splitting them until their deviation + * from straight line becomes much smaller than a pixel. Therefore, the + * pixel coverage by a Bézier curve is calculated approximately. To + * estimate the deviation, we use the distance from the control point + * to the conic chord centre or the cubic chord trisection. These + * distances vanish fast after each split. In the conic case, they vanish + * predictably and the number of necessary splits can be calculated. + * * This renderer has the following advantages: * * - It doesn't need an intermediate bitmap. Instead, one can supply a @@ -67,7 +75,7 @@ * callback. * * - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on - * each pixel cell. + * each pixel cell by straight segments. * * - It performs a single pass on the outline (the `standard' FT2 * renderer makes two passes). @@ -75,7 +83,7 @@ * - It can easily be modified to render to _any_ number of gray levels * cheaply. * - * - For small (< 20) pixel sizes, it is faster than the standard + * - For small (< 80) pixel sizes, it is faster than the standard * renderer. * */ @@ -327,17 +335,9 @@ typedef ptrdiff_t FT_PtrDist; /* must be at least 6 bits! */ #define PIXEL_BITS 8 -#undef FLOOR -#undef CEILING -#undef TRUNC -#undef SCALED - #define ONE_PIXEL ( 1 << PIXEL_BITS ) -#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) -#define SUBPIXELS( x ) ( (TPos)(x) * ONE_PIXEL ) -#define FLOOR( x ) ( (x) & -ONE_PIXEL ) -#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) -#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) +#define TRUNC( x ) (TCoord)( (x) >> PIXEL_BITS ) +#define FRACT( x ) (TCoord)( (x) & ( ONE_PIXEL - 1 ) ) #if PIXEL_BITS >= 6 #define UPSCALE( x ) ( (x) * ( ONE_PIXEL >> 6 ) ) @@ -388,9 +388,9 @@ typedef ptrdiff_t FT_PtrDist; #define FT_UDIVPREP( c, b ) \ long b ## _r = c ? (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) \ : 0 -#define FT_UDIV( a, b ) \ - ( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >> \ - ( sizeof( long ) * FT_CHAR_BIT - PIXEL_BITS ) ) +#define FT_UDIV( a, b ) \ + (TCoord)( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >> \ + ( sizeof( long ) * FT_CHAR_BIT - PIXEL_BITS ) ) /************************************************************************** @@ -432,6 +432,9 @@ typedef ptrdiff_t FT_PtrDist; #define FT_MAX_GRAY_POOL ( 2048 / sizeof ( TCell ) ) #endif + /* FT_Span buffer size for direct rendering only */ +#define FT_MAX_GRAY_SPANS 10 + #if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ /* We disable the warning `structure was padded due to */ @@ -465,6 +468,8 @@ typedef ptrdiff_t FT_PtrDist; FT_Raster_Span_Func render_span; void* render_span_data; + FT_Span spans[FT_MAX_GRAY_SPANS]; + int num_spans; } gray_TWorker, *gray_PWorker; @@ -516,7 +521,7 @@ typedef ptrdiff_t FT_PtrDist; /************************************************************************** * - * Record the current cell in the table. + * Record the current cell in the linked list. */ static void gray_record_cell( RAS_ARG ) @@ -526,10 +531,9 @@ typedef ptrdiff_t FT_PtrDist; pcell = &ras.ycells[ras.ey - ras.min_ey]; - for (;;) + while ( ( cell = *pcell ) ) { - cell = *pcell; - if ( !cell || cell->x > x ) + if ( cell->x > x ) break; if ( cell->x == x ) @@ -577,16 +581,13 @@ typedef ptrdiff_t FT_PtrDist; /* Note that if a cell is to the left of the clipping region, it is */ /* actually set to the (min_ex-1) horizontal position. */ - if ( ex < ras.min_ex ) - ex = ras.min_ex - 1; - /* record the current one if it is valid and substantial */ if ( !ras.invalid && ( ras.area || ras.cover ) ) gray_record_cell( RAS_VAR ); ras.area = 0; ras.cover = 0; - ras.ex = ex; + ras.ex = FT_MAX( ex, ras.min_ex - 1 ); ras.ey = ey; ras.invalid = ( ey >= ras.max_ey || ey < ras.min_ey || @@ -622,8 +623,8 @@ typedef ptrdiff_t FT_PtrDist; return; } - fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); - fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); + fx1 = FRACT( x1 ); + fx2 = FRACT( x2 ); /* everything is located in a single cell. That is easy! */ /* */ @@ -650,6 +651,9 @@ typedef ptrdiff_t FT_PtrDist; dx = -dx; } + /* the fractional part of y-delta is mod/dx. It is essential to */ + /* keep track of its accumulation for accurate rendering. */ + /* XXX: y-delta and x-delta below should be related. */ FT_DIV_MOD( TCoord, p, dx, delta, mod ); ras.area += (TArea)( ( fx1 + first ) * delta ); @@ -715,8 +719,8 @@ typedef ptrdiff_t FT_PtrDist; ( ey1 < ras.min_ey && ey2 < ras.min_ey ) ) goto End; - fy1 = (TCoord)( ras.y - SUBPIXELS( ey1 ) ); - fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) ); + fy1 = FRACT( ras.y ); + fy2 = FRACT( to_y ); /* everything is on a single scanline */ if ( ey1 == ey2 ) @@ -732,7 +736,7 @@ typedef ptrdiff_t FT_PtrDist; if ( dx == 0 ) { TCoord ex = TRUNC( ras.x ); - TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 ); + TCoord two_fx = FRACT( ras.x ) << 1; TArea area; @@ -787,6 +791,8 @@ typedef ptrdiff_t FT_PtrDist; dy = -dy; } + /* the fractional part of x-delta is mod/dy. It is essential to */ + /* keep track of its accumulation for accurate rendering. */ FT_DIV_MOD( TCoord, p, dy, delta, mod ); x = ras.x + delta; @@ -843,8 +849,9 @@ typedef ptrdiff_t FT_PtrDist; gray_render_line( RAS_ARG_ TPos to_x, TPos to_y ) { - TPos dx, dy, fx1, fy1, fx2, fy2; - TCoord ex1, ex2, ey1, ey2; + TPos dx, dy; + TCoord fx1, fy1, fx2, fy2; + TCoord ex1, ey1, ex2, ey2; ey1 = TRUNC( ras.y ); @@ -858,8 +865,8 @@ typedef ptrdiff_t FT_PtrDist; ex1 = TRUNC( ras.x ); ex2 = TRUNC( to_x ); - fx1 = ras.x - SUBPIXELS( ex1 ); - fy1 = ras.y - SUBPIXELS( ey1 ); + fx1 = FRACT( ras.x ); + fy1 = FRACT( ras.y ); dx = to_x - ras.x; dy = to_y - ras.y; @@ -868,8 +875,8 @@ typedef ptrdiff_t FT_PtrDist; ; else if ( dy == 0 ) /* ex1 != ex2 */ /* any horizontal line */ { - ex1 = ex2; - gray_set_cell( RAS_VAR_ ex1, ey1 ); + gray_set_cell( RAS_VAR_ ex2, ey2 ); + goto End; } else if ( dx == 0 ) { @@ -896,7 +903,7 @@ typedef ptrdiff_t FT_PtrDist; } else /* any other line */ { - TPos prod = dx * fy1 - dy * fx1; + TPos prod = dx * (TPos)fy1 - dy * (TPos)fx1; FT_UDIVPREP( ex1 != ex2, dx ); FT_UDIVPREP( ey1 != ey2, dy ); @@ -910,7 +917,7 @@ typedef ptrdiff_t FT_PtrDist; prod - dx * ONE_PIXEL > 0 ) /* left */ { fx2 = 0; - fy2 = (TPos)FT_UDIV( -prod, -dx ); + fy2 = FT_UDIV( -prod, -dx ); prod -= dy * ONE_PIXEL; ras.cover += ( fy2 - fy1 ); ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); @@ -922,7 +929,7 @@ typedef ptrdiff_t FT_PtrDist; prod - dx * ONE_PIXEL + dy * ONE_PIXEL > 0 ) /* up */ { prod -= dx * ONE_PIXEL; - fx2 = (TPos)FT_UDIV( -prod, dy ); + fx2 = FT_UDIV( -prod, dy ); fy2 = ONE_PIXEL; ras.cover += ( fy2 - fy1 ); ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); @@ -935,7 +942,7 @@ typedef ptrdiff_t FT_PtrDist; { prod += dy * ONE_PIXEL; fx2 = ONE_PIXEL; - fy2 = (TPos)FT_UDIV( prod, dx ); + fy2 = FT_UDIV( prod, dx ); ras.cover += ( fy2 - fy1 ); ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); fx1 = 0; @@ -945,7 +952,7 @@ typedef ptrdiff_t FT_PtrDist; else /* ( prod + dy * ONE_PIXEL < 0 && prod > 0 ) down */ { - fx2 = (TPos)FT_UDIV( prod, -dy ); + fx2 = FT_UDIV( prod, -dy ); fy2 = 0; prod += dx * ONE_PIXEL; ras.cover += ( fy2 - fy1 ); @@ -959,8 +966,8 @@ typedef ptrdiff_t FT_PtrDist; } while ( ex1 != ex2 || ey1 != ey2 ); } - fx2 = to_x - SUBPIXELS( ex2 ); - fy2 = to_y - SUBPIXELS( ey2 ); + fx2 = FRACT( to_x ); + fy2 = FRACT( to_y ); ras.cover += ( fy2 - fy1 ); ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); @@ -979,16 +986,18 @@ typedef ptrdiff_t FT_PtrDist; base[4].x = base[2].x; - b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + base[3].x = b >> 1; + base[2].x = ( a + b ) >> 2; + base[1].x = a >> 1; base[4].y = base[2].y; - b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + base[3].y = b >> 1; + base[2].y = ( a + b ) >> 2; + base[1].y = a >> 1; } @@ -1042,12 +1051,11 @@ typedef ptrdiff_t FT_PtrDist; /* many times as there are trailing zeros in the counter. */ do { - split = 1; - while ( ( draw & split ) == 0 ) + split = draw & ( -draw ); /* isolate the rightmost 1-bit */ + while ( ( split >>= 1 ) ) { gray_split_conic( arc ); arc += 2; - split <<= 1; } gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); @@ -1060,28 +1068,32 @@ typedef ptrdiff_t FT_PtrDist; static void gray_split_cubic( FT_Vector* base ) { - TPos a, b, c, d; + TPos a, b, c; base[6].x = base[3].x; - c = base[1].x; - d = base[2].x; - base[1].x = a = ( base[0].x + c ) / 2; - base[5].x = b = ( base[3].x + d ) / 2; - c = ( c + d ) / 2; - base[2].x = a = ( a + c ) / 2; - base[4].x = b = ( b + c ) / 2; - base[3].x = ( a + b ) / 2; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + c = base[2].x + base[3].x; + base[5].x = c >> 1; + c += b; + base[4].x = c >> 2; + base[1].x = a >> 1; + a += b; + base[2].x = a >> 2; + base[3].x = ( a + c ) >> 3; base[6].y = base[3].y; - c = base[1].y; - d = base[2].y; - base[1].y = a = ( base[0].y + c ) / 2; - base[5].y = b = ( base[3].y + d ) / 2; - c = ( c + d ) / 2; - base[2].y = a = ( a + c ) / 2; - base[4].y = b = ( b + c ) / 2; - base[3].y = ( a + b ) / 2; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + c = base[2].y + base[3].y; + base[5].y = c >> 1; + c += b; + base[4].y = c >> 2; + base[1].y = a >> 1; + a += b; + base[2].y = a >> 2; + base[3].y = ( a + c ) >> 3; } @@ -1092,9 +1104,6 @@ typedef ptrdiff_t FT_PtrDist; { FT_Vector bez_stack[16 * 3 + 1]; /* enough to accommodate bisections */ FT_Vector* arc = bez_stack; - TPos dx, dy, dx_, dy_; - TPos dx1, dy1, dx2, dy2; - TPos L, s, s_limit; arc[0].x = UPSCALE( to->x ); @@ -1123,45 +1132,13 @@ typedef ptrdiff_t FT_PtrDist; for (;;) { - /* Decide whether to split or draw. See `Rapid Termination */ - /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ - /* F. Hain, at */ - /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */ - - /* dx and dy are x and y components of the P0-P3 chord vector. */ - dx = dx_ = arc[3].x - arc[0].x; - dy = dy_ = arc[3].y - arc[0].y; - - L = FT_HYPOT( dx_, dy_ ); - - /* Avoid possible arithmetic overflow below by splitting. */ - if ( L > 32767 ) - goto Split; - - /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */ - s_limit = L * (TPos)( ONE_PIXEL / 6 ); - - /* s is L * the perpendicular distance from P1 to the line P0-P3. */ - dx1 = arc[1].x - arc[0].x; - dy1 = arc[1].y - arc[0].y; - s = FT_ABS( SUB_LONG( MUL_LONG( dy, dx1 ), MUL_LONG( dx, dy1 ) ) ); - - if ( s > s_limit ) - goto Split; - - /* s is L * the perpendicular distance from P2 to the line P0-P3. */ - dx2 = arc[2].x - arc[0].x; - dy2 = arc[2].y - arc[0].y; - s = FT_ABS( SUB_LONG( MUL_LONG( dy, dx2 ), MUL_LONG( dx, dy2 ) ) ); - - if ( s > s_limit ) - goto Split; - - /* Split super curvy segments where the off points are so far - from the chord that the angles P0-P1-P3 or P0-P2-P3 become - acute as detected by appropriate dot products. */ - if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 || - dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 ) + /* with each split, control points quickly converge towards */ + /* chord trisection points and the vanishing distances below */ + /* indicate when the segment is flat enough to draw */ + if ( FT_ABS( 2 * arc[0].x - 3 * arc[1].x + arc[3].x ) > ONE_PIXEL / 2 || + FT_ABS( 2 * arc[0].y - 3 * arc[1].y + arc[3].y ) > ONE_PIXEL / 2 || + FT_ABS( arc[0].x - 3 * arc[2].x + 2 * arc[3].x ) > ONE_PIXEL / 2 || + FT_ABS( arc[0].y - 3 * arc[2].y + 2 * arc[3].y ) > ONE_PIXEL / 2 ) goto Split; gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); @@ -1236,8 +1213,6 @@ typedef ptrdiff_t FT_PtrDist; { /* scale the coverage from 0..(ONE_PIXEL*ONE_PIXEL*2) to 0..256 */ coverage >>= PIXEL_BITS * 2 + 1 - 8; - if ( coverage < 0 ) - coverage = -coverage - 1; /* compute the line's coverage depending on the outline fill rule */ if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) @@ -1247,23 +1222,30 @@ typedef ptrdiff_t FT_PtrDist; if ( coverage >= 256 ) coverage = 511 - coverage; } - else + else /* default non-zero winding rule */ { - /* normal non-zero winding rule */ + if ( coverage < 0 ) + coverage = ~coverage; /* the same as -coverage - 1 */ + if ( coverage >= 256 ) coverage = 255; } - if ( ras.render_span ) /* for FT_RASTER_FLAG_DIRECT only */ + if ( ras.num_spans >= 0 ) /* for FT_RASTER_FLAG_DIRECT only */ { - FT_Span span; + FT_Span* span = ras.spans + ras.num_spans++; - span.x = (short)x; - span.len = (unsigned short)acount; - span.coverage = (unsigned char)coverage; + span->x = (short)x; + span->len = (unsigned short)acount; + span->coverage = (unsigned char)coverage; - ras.render_span( y, 1, &span, ras.render_span_data ); + if ( ras.num_spans == FT_MAX_GRAY_SPANS ) + { + /* flush the span buffer and reset the count */ + ras.render_span( y, ras.num_spans, ras.spans, ras.render_span_data ); + ras.num_spans = 0; + } } else { @@ -1277,14 +1259,29 @@ typedef ptrdiff_t FT_PtrDist; */ switch ( acount ) { - case 7: *q++ = c; - case 6: *q++ = c; - case 5: *q++ = c; - case 4: *q++ = c; - case 3: *q++ = c; - case 2: *q++ = c; - case 1: *q = c; - case 0: break; + case 7: + *q++ = c; + /* fall through */ + case 6: + *q++ = c; + /* fall through */ + case 5: + *q++ = c; + /* fall through */ + case 4: + *q++ = c; + /* fall through */ + case 3: + *q++ = c; + /* fall through */ + case 2: + *q++ = c; + /* fall through */ + case 1: + *q = c; + /* fall through */ + case 0: + break; default: FT_MEM_SET( q, c, acount ); } @@ -1322,6 +1319,13 @@ typedef ptrdiff_t FT_PtrDist; if ( cover != 0 ) gray_hline( RAS_VAR_ x, y, cover, ras.max_ex - x ); + + if ( ras.num_spans > 0 ) /* for FT_RASTER_FLAG_DIRECT only */ + { + /* flush the span buffer and reset the count */ + ras.render_span( y, ras.num_spans, ras.spans, ras.render_span_data ); + ras.num_spans = 0; + } } } @@ -1371,7 +1375,7 @@ typedef ptrdiff_t FT_PtrDist; void* user ) { #undef SCALED -#define SCALED( x ) ( ( (x) << shift ) - delta ) +#define SCALED( x ) ( (x) * ( 1L << shift ) - delta ) FT_Vector v_last; FT_Vector v_control; @@ -1631,7 +1635,7 @@ typedef ptrdiff_t FT_PtrDist; gray_convert_glyph_inner( RAS_ARG, int continued ) { - volatile int error = 0; + int error; if ( ft_setjmp( ras.jump_buffer ) == 0 ) @@ -1755,7 +1759,6 @@ typedef ptrdiff_t FT_PtrDist; { const FT_Outline* outline = (const FT_Outline*)params->source; const FT_Bitmap* target_map = params->target; - FT_BBox clip; #ifndef FT_STATIC_RASTER gray_TWorker worker[1]; @@ -1792,6 +1795,12 @@ typedef ptrdiff_t FT_PtrDist; ras.render_span = (FT_Raster_Span_Func)params->gray_spans; ras.render_span_data = params->user; + ras.num_spans = 0; + + ras.min_ex = params->clip_box.xMin; + ras.min_ey = params->clip_box.yMin; + ras.max_ex = params->clip_box.xMax; + ras.max_ey = params->clip_box.yMax; } else { @@ -1816,27 +1825,15 @@ typedef ptrdiff_t FT_PtrDist; ras.render_span = (FT_Raster_Span_Func)NULL; ras.render_span_data = NULL; - } + ras.num_spans = -1; /* invalid */ - /* compute clipping box */ - if ( params->flags & FT_RASTER_FLAG_DIRECT && - params->flags & FT_RASTER_FLAG_CLIP ) - clip = params->clip_box; - else - { - /* compute clip box from target pixmap */ - clip.xMin = 0; - clip.yMin = 0; - clip.xMax = (FT_Pos)target_map->width; - clip.yMax = (FT_Pos)target_map->rows; + ras.min_ex = 0; + ras.min_ey = 0; + ras.max_ex = (FT_Pos)target_map->width; + ras.max_ey = (FT_Pos)target_map->rows; } - /* clip to target bitmap, exit if nothing to do */ - ras.min_ex = clip.xMin; - ras.min_ey = clip.yMin; - ras.max_ex = clip.xMax; - ras.max_ey = clip.yMax; - + /* exit if nothing to do */ if ( ras.max_ex <= ras.min_ex || ras.max_ey <= ras.min_ey ) return 0; diff --git a/thirdparty/freetype/src/smooth/ftsmooth.c b/thirdparty/freetype/src/smooth/ftsmooth.c index c8b6bb7518..cd034d2b40 100644 --- a/thirdparty/freetype/src/smooth/ftsmooth.c +++ b/thirdparty/freetype/src/smooth/ftsmooth.c @@ -243,7 +243,7 @@ } if ( lcd_filter_func ) - lcd_filter_func( bitmap, mode, lcd_weights ); + lcd_filter_func( bitmap, lcd_weights ); } #else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ diff --git a/thirdparty/freetype/src/truetype/ttgload.c b/thirdparty/freetype/src/truetype/ttgload.c index cbee27aa69..a04684086b 100644 --- a/thirdparty/freetype/src/truetype/ttgload.c +++ b/thirdparty/freetype/src/truetype/ttgload.c @@ -82,6 +82,15 @@ #define UNSCALED_COMPONENT_OFFSET 0x1000 +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#define IS_DEFAULT_INSTANCE( _face ) \ + ( !( FT_IS_NAMED_INSTANCE( _face ) || \ + FT_IS_VARIATION( _face ) ) ) +#else +#define IS_DEFAULT_INSTANCE( _face ) 1 +#endif + + /************************************************************************** * * Return the horizontal metrics in font units for a given glyph. @@ -927,6 +936,11 @@ FT_Outline* outline; FT_Int n_points; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Memory memory = loader->face->root.memory; + FT_Vector* unrounded = NULL; +#endif + outline = &gloader->current.outline; n_points = outline->n_points; @@ -947,26 +961,32 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( FT_IS_NAMED_INSTANCE( FT_FACE( loader->face ) ) || - FT_IS_VARIATION( FT_FACE( loader->face ) ) ) + if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) { + if ( FT_NEW_ARRAY( unrounded, n_points ) ) + goto Exit; + /* Deltas apply to the unscaled data. */ error = TT_Vary_Apply_Glyph_Deltas( loader->face, loader->glyph_index, outline, + unrounded, (FT_UInt)n_points ); /* recalculate linear horizontal and vertical advances */ /* if we don't have HVAR and VVAR, respectively */ + + /* XXX: change all FreeType modules to store `linear' and `vadvance' */ + /* in 26.6 format before the `base' module scales them to 16.16 */ if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) - loader->linear = outline->points[n_points - 3].x - - outline->points[n_points - 4].x; + loader->linear = FT_PIX_ROUND( unrounded[n_points - 3].x - + unrounded[n_points - 4].x ) / 64; if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) - loader->vadvance = outline->points[n_points - 1].x - - outline->points[n_points - 2].x; + loader->vadvance = FT_PIX_ROUND( unrounded[n_points - 1].x - + unrounded[n_points - 2].x ) / 64; if ( error ) - return error; + goto Exit; } #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ @@ -1021,10 +1041,23 @@ /* compensate for any scaling by de/emboldening; */ /* the amount was determined via experimentation */ if ( x_scale_factor != 1000 && ppem > 11 ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Vector* orig_points = outline->points; + + + if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) + outline->points = unrounded; +#endif FT_Outline_EmboldenXY( outline, FT_MulFix( 1280 * ppem, 1000 - x_scale_factor ), 0 ); +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) + outline->points = orig_points; +#endif + } do_scale = TRUE; } } @@ -1045,10 +1078,26 @@ if ( do_scale ) { - for ( ; vec < limit; vec++ ) +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); + FT_Vector* u = unrounded; + + + for ( ; vec < limit; vec++, u++ ) + { + vec->x = ( FT_MulFix( u->x, x_scale ) + 32 ) >> 6; + vec->y = ( FT_MulFix( u->y, y_scale ) + 32 ) >> 6; + } + } + else +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + { + for ( ; vec < limit; vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } } } @@ -1080,6 +1129,11 @@ error = TT_Hint_Glyph( loader, 0 ); } +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + Exit: + FT_FREE( unrounded ); +#endif + return error; } @@ -1681,6 +1735,9 @@ short contours[4] = { 0, 1, 2, 3 }; FT_Outline outline; + /* unrounded values */ + FT_Vector unrounded[4] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} }; + points[0].x = loader->pp1.x; points[0].y = loader->pp1.y; @@ -1702,6 +1759,7 @@ error = TT_Vary_Apply_Glyph_Deltas( loader->face, glyph_index, &outline, + unrounded, (FT_UInt)outline.n_points ); if ( error ) goto Exit; @@ -1719,9 +1777,11 @@ /* recalculate linear horizontal and vertical advances */ /* if we don't have HVAR and VVAR, respectively */ if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) - loader->linear = loader->pp2.x - loader->pp1.x; + loader->linear = FT_PIX_ROUND( unrounded[1].x - + unrounded[0].x ) / 64; if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) - loader->vadvance = loader->pp4.x - loader->pp3.x; + loader->vadvance = FT_PIX_ROUND( unrounded[3].x - + unrounded[2].x ) / 64; } #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ @@ -1861,9 +1921,10 @@ FT_SubGlyph subglyph; FT_Outline outline; - FT_Vector* points = NULL; - char* tags = NULL; - short* contours = NULL; + FT_Vector* points = NULL; + char* tags = NULL; + short* contours = NULL; + FT_Vector* unrounded = NULL; limit = (short)gloader->current.num_subglyphs; @@ -1877,9 +1938,10 @@ outline.tags = NULL; outline.contours = NULL; - if ( FT_NEW_ARRAY( points, outline.n_points ) || - FT_NEW_ARRAY( tags, outline.n_points ) || - FT_NEW_ARRAY( contours, outline.n_points ) ) + if ( FT_NEW_ARRAY( points, outline.n_points ) || + FT_NEW_ARRAY( tags, outline.n_points ) || + FT_NEW_ARRAY( contours, outline.n_points ) || + FT_NEW_ARRAY( unrounded, outline.n_points ) ) goto Exit1; subglyph = gloader->current.subglyphs; @@ -1928,6 +1990,7 @@ face, glyph_index, &outline, + unrounded, (FT_UInt)outline.n_points ) ) ) goto Exit1; @@ -1955,14 +2018,19 @@ /* recalculate linear horizontal and vertical advances */ /* if we don't have HVAR and VVAR, respectively */ if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) - loader->linear = loader->pp2.x - loader->pp1.x; + loader->linear = + FT_PIX_ROUND( unrounded[outline.n_points - 3].x - + unrounded[outline.n_points - 4].x ) / 64; if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) - loader->vadvance = loader->pp4.x - loader->pp3.x; + loader->vadvance = + FT_PIX_ROUND( unrounded[outline.n_points - 1].x - + unrounded[outline.n_points - 2].x ) / 64; Exit1: FT_FREE( outline.points ); FT_FREE( outline.tags ); FT_FREE( outline.contours ); + FT_FREE( unrounded ); if ( error ) goto Exit; @@ -2088,6 +2156,7 @@ loader->ins_pos = ins_pos; if ( IS_HINTED( loader->load_flags ) && #ifdef TT_USE_BYTECODE_INTERPRETER + subglyph && subglyph->flags & WE_HAVE_INSTR && #endif num_points > start_point ) @@ -2611,11 +2680,6 @@ if ( reexecute ) { - FT_UInt i; - - - for ( i = 0; i < size->cvt_size; i++ ) - size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); error = tt_size_run_prep( size, pedantic ); if ( error ) return error; @@ -2718,13 +2782,6 @@ FT_Error error; TT_LoaderRec loader; -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#define IS_DEFAULT_INSTANCE ( !( FT_IS_NAMED_INSTANCE( glyph->face ) || \ - FT_IS_VARIATION( glyph->face ) ) ) -#else -#define IS_DEFAULT_INSTANCE 1 -#endif - FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index )); @@ -2733,7 +2790,7 @@ /* try to load embedded bitmap (if any) */ if ( size->strike_index != 0xFFFFFFFFUL && ( load_flags & FT_LOAD_NO_BITMAP ) == 0 && - IS_DEFAULT_INSTANCE ) + IS_DEFAULT_INSTANCE( glyph->face ) ) { FT_Fixed x_scale = size->root.metrics.x_scale; FT_Fixed y_scale = size->root.metrics.y_scale; diff --git a/thirdparty/freetype/src/truetype/ttgxvar.c b/thirdparty/freetype/src/truetype/ttgxvar.c index 020918f533..78d87dc097 100644 --- a/thirdparty/freetype/src/truetype/ttgxvar.c +++ b/thirdparty/freetype/src/truetype/ttgxvar.c @@ -68,12 +68,16 @@ /* some macros we need */ -#define FT_fdot14ToFixed( x ) \ - ( (FT_Fixed)( (FT_ULong)(x) << 2 ) ) -#define FT_intToFixed( i ) \ - ( (FT_Fixed)( (FT_ULong)(i) << 16 ) ) -#define FT_fixedToInt( x ) \ - ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) +#define FT_fdot14ToFixed( x ) \ + ( (FT_Fixed)( (FT_ULong)(x) << 2 ) ) +#define FT_intToFixed( i ) \ + ( (FT_Fixed)( (FT_ULong)(i) << 16 ) ) +#define FT_fdot6ToFixed( i ) \ + ( (FT_Fixed)( (FT_ULong)(i) << 10 ) ) +#define FT_fixedToInt( x ) \ + ( (FT_Short)( ( (x) + 0x8000U ) >> 16 ) ) +#define FT_fixedToFdot6( x ) \ + ( (FT_Pos)( ( (x) + 0x200 ) >> 10 ) ) /************************************************************************** @@ -397,9 +401,10 @@ for ( j = 0; j < segment->pairCount; j++ ) { - /* convert to Fixed */ - segment->correspondence[j].fromCoord = FT_GET_SHORT() * 4; - segment->correspondence[j].toCoord = FT_GET_SHORT() * 4; + segment->correspondence[j].fromCoord = + FT_fdot14ToFixed( FT_GET_SHORT() ); + segment->correspondence[j].toCoord = + FT_fdot14ToFixed( FT_GET_SHORT() ); FT_TRACE5(( " mapping %.5f to %.5f\n", segment->correspondence[j].fromCoord / 65536.0, @@ -1616,7 +1621,7 @@ for ( j = 0; j < (FT_UInt)gvar_head.axisCount; j++ ) { blend->tuplecoords[i * gvar_head.axisCount + j] = - FT_GET_SHORT() * 4; /* convert to FT_Fixed */ + FT_fdot14ToFixed( FT_GET_SHORT() ); FT_TRACE5(( "%.5f ", blend->tuplecoords[i * gvar_head.axisCount + j] / 65536.0 )); } @@ -3054,7 +3059,7 @@ if ( instance_index > num_instances ) goto Exit; - if ( instance_index > 0 && mmvar->namedstyle ) + if ( instance_index > 0 ) { FT_Memory memory = face->root.memory; SFNT_Service sfnt = (SFNT_Service)face->sfnt; @@ -3080,7 +3085,12 @@ mmvar->num_axis, named_style->coords ); if ( error ) + { + /* internal error code -1 means `no change' */ + if ( error == -1 ) + error = FT_Err_Ok; goto Exit; + } } else error = TT_Set_Var_Design( face, 0, NULL ); @@ -3103,6 +3113,21 @@ /*************************************************************************/ + static FT_Error + tt_cvt_ready_iterator( FT_ListNode node, + void* user ) + { + TT_Size size = (TT_Size)node->data; + + FT_UNUSED( user ); + + + size->cvt_ready = -1; + + return FT_Err_Ok; + } + + /************************************************************************** * * @Function: @@ -3133,6 +3158,8 @@ FT_Error error; FT_Memory memory = stream->memory; + FT_Face root = &face->root; + FT_ULong table_start; FT_ULong table_len; @@ -3261,8 +3288,7 @@ if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) { for ( j = 0; j < blend->num_axis; j++ ) - tuple_coords[j] = FT_GET_SHORT() * 4; /* convert from */ - /* short frac to fixed */ + tuple_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); } else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) { @@ -3293,9 +3319,9 @@ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) { for ( j = 0; j < blend->num_axis; j++ ) - im_start_coords[j] = FT_GET_SHORT() * 4; + im_start_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); for ( j = 0; j < blend->num_axis; j++ ) - im_end_coords[j] = FT_GET_SHORT() * 4; + im_end_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); } apply = ft_var_apply_tuple( blend, @@ -3360,9 +3386,9 @@ { FT_TRACE7(( " %d: %f -> %f\n", j, - ( FT_intToFixed( face->cvt[j] ) + + ( FT_fdot6ToFixed( face->cvt[j] ) + old_cvt_delta ) / 65536.0, - ( FT_intToFixed( face->cvt[j] ) + + ( FT_fdot6ToFixed( face->cvt[j] ) + cvt_deltas[j] ) / 65536.0 )); count++; } @@ -3402,9 +3428,9 @@ { FT_TRACE7(( " %d: %f -> %f\n", pindex, - ( FT_intToFixed( face->cvt[pindex] ) + + ( FT_fdot6ToFixed( face->cvt[pindex] ) + old_cvt_delta ) / 65536.0, - ( FT_intToFixed( face->cvt[pindex] ) + + ( FT_fdot6ToFixed( face->cvt[pindex] ) + cvt_deltas[pindex] ) / 65536.0 )); count++; } @@ -3429,7 +3455,7 @@ FT_TRACE5(( "\n" )); for ( i = 0; i < face->cvt_size; i++ ) - face->cvt[i] += FT_fixedToInt( cvt_deltas[i] ); + face->cvt[i] += FT_fixedToFdot6( cvt_deltas[i] ); FExit: FT_FRAME_EXIT(); @@ -3442,6 +3468,12 @@ FT_FREE( im_end_coords ); FT_FREE( cvt_deltas ); + /* iterate over all FT_Size objects and set `cvt_ready' to -1 */ + /* to trigger rescaling of all CVT values */ + FT_List_Iterate( &root->sizes_list, + tt_cvt_ready_iterator, + NULL ); + return error; } @@ -3669,6 +3701,11 @@ * outline :: * The outline to change. * + * @Output: + * unrounded :: + * An array with `n_points' elements that is filled with unrounded + * point coordinates (in 26.6 format). + * * @Return: * FreeType error code. 0 means success. */ @@ -3676,6 +3713,7 @@ TT_Vary_Apply_Glyph_Deltas( TT_Face face, FT_UInt glyph_index, FT_Outline* outline, + FT_Vector* unrounded, FT_UInt n_points ) { FT_Error error; @@ -3717,6 +3755,12 @@ if ( !face->doblend || !blend ) return FT_THROW( Invalid_Argument ); + for ( i = 0; i < n_points; i++ ) + { + unrounded[i].x = INT_TO_F26DOT6( outline->points[i].x ); + unrounded[i].y = INT_TO_F26DOT6( outline->points[i].y ); + } + if ( glyph_index >= blend->gv_glyphcnt || blend->glyphoffsets[glyph_index] == blend->glyphoffsets[glyph_index + 1] ) @@ -3807,8 +3851,7 @@ if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) { for ( j = 0; j < blend->num_axis; j++ ) - tuple_coords[j] = FT_GET_SHORT() * 4; /* convert from */ - /* short frac to fixed */ + tuple_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); } else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) { @@ -3828,9 +3871,9 @@ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) { for ( j = 0; j < blend->num_axis; j++ ) - im_start_coords[j] = FT_GET_SHORT() * 4; + im_start_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); for ( j = 0; j < blend->num_axis; j++ ) - im_end_coords[j] = FT_GET_SHORT() * 4; + im_end_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); } apply = ft_var_apply_tuple( blend, @@ -4064,6 +4107,9 @@ for ( i = 0; i < n_points; i++ ) { + unrounded[i].x += FT_fixedToFdot6( point_deltas_x[i] ); + unrounded[i].y += FT_fixedToFdot6( point_deltas_y[i] ); + outline->points[i].x += FT_fixedToInt( point_deltas_x[i] ); outline->points[i].y += FT_fixedToInt( point_deltas_y[i] ); } diff --git a/thirdparty/freetype/src/truetype/ttgxvar.h b/thirdparty/freetype/src/truetype/ttgxvar.h index 7e8d9768a7..07c99b6403 100644 --- a/thirdparty/freetype/src/truetype/ttgxvar.h +++ b/thirdparty/freetype/src/truetype/ttgxvar.h @@ -416,6 +416,7 @@ FT_BEGIN_HEADER TT_Vary_Apply_Glyph_Deltas( TT_Face face, FT_UInt glyph_index, FT_Outline* outline, + FT_Vector* unrounded, FT_UInt n_points ); FT_LOCAL( FT_Error ) diff --git a/thirdparty/freetype/src/truetype/ttinterp.c b/thirdparty/freetype/src/truetype/ttinterp.c index 403f3753c7..70434e1729 100644 --- a/thirdparty/freetype/src/truetype/ttinterp.c +++ b/thirdparty/freetype/src/truetype/ttinterp.c @@ -654,23 +654,25 @@ /* opcodes are gathered in groups of 16 */ /* please keep the spaces as they are */ - /* SVTCA y */ PACK( 0, 0 ), - /* SVTCA x */ PACK( 0, 0 ), - /* SPvTCA y */ PACK( 0, 0 ), - /* SPvTCA x */ PACK( 0, 0 ), - /* SFvTCA y */ PACK( 0, 0 ), - /* SFvTCA x */ PACK( 0, 0 ), - /* SPvTL // */ PACK( 2, 0 ), - /* SPvTL + */ PACK( 2, 0 ), - /* SFvTL // */ PACK( 2, 0 ), - /* SFvTL + */ PACK( 2, 0 ), - /* SPvFS */ PACK( 2, 0 ), - /* SFvFS */ PACK( 2, 0 ), - /* GPv */ PACK( 0, 2 ), - /* GFv */ PACK( 0, 2 ), - /* SFvTPv */ PACK( 0, 0 ), + /* 0x00 */ + /* SVTCA[0] */ PACK( 0, 0 ), + /* SVTCA[1] */ PACK( 0, 0 ), + /* SPVTCA[0] */ PACK( 0, 0 ), + /* SPVTCA[1] */ PACK( 0, 0 ), + /* SFVTCA[0] */ PACK( 0, 0 ), + /* SFVTCA[1] */ PACK( 0, 0 ), + /* SPVTL[0] */ PACK( 2, 0 ), + /* SPVTL[1] */ PACK( 2, 0 ), + /* SFVTL[0] */ PACK( 2, 0 ), + /* SFVTL[1] */ PACK( 2, 0 ), + /* SPVFS */ PACK( 2, 0 ), + /* SFVFS */ PACK( 2, 0 ), + /* GPV */ PACK( 0, 2 ), + /* GFV */ PACK( 0, 2 ), + /* SFVTPV */ PACK( 0, 0 ), /* ISECT */ PACK( 5, 0 ), + /* 0x10 */ /* SRP0 */ PACK( 1, 0 ), /* SRP1 */ PACK( 1, 0 ), /* SRP2 */ PACK( 1, 0 ), @@ -684,10 +686,11 @@ /* SMD */ PACK( 1, 0 ), /* ELSE */ PACK( 0, 0 ), /* JMPR */ PACK( 1, 0 ), - /* SCvTCi */ PACK( 1, 0 ), - /* SSwCi */ PACK( 1, 0 ), + /* SCVTCI */ PACK( 1, 0 ), + /* SSWCI */ PACK( 1, 0 ), /* SSW */ PACK( 1, 0 ), + /* 0x20 */ /* DUP */ PACK( 1, 2 ), /* POP */ PACK( 1, 0 ), /* CLEAR */ PACK( 0, 0 ), @@ -695,7 +698,7 @@ /* DEPTH */ PACK( 0, 1 ), /* CINDEX */ PACK( 1, 1 ), /* MINDEX */ PACK( 1, 0 ), - /* AlignPTS */ PACK( 2, 0 ), + /* ALIGNPTS */ PACK( 2, 0 ), /* INS_$28 */ PACK( 0, 0 ), /* UTP */ PACK( 1, 0 ), /* LOOPCALL */ PACK( 2, 0 ), @@ -705,6 +708,7 @@ /* MDAP[0] */ PACK( 1, 0 ), /* MDAP[1] */ PACK( 1, 0 ), + /* 0x30 */ /* IUP[0] */ PACK( 0, 0 ), /* IUP[1] */ PACK( 0, 0 ), /* SHP[0] */ PACK( 0, 0 ), /* loops */ @@ -717,17 +721,18 @@ /* IP */ PACK( 0, 0 ), /* loops */ /* MSIRP[0] */ PACK( 2, 0 ), /* MSIRP[1] */ PACK( 2, 0 ), - /* AlignRP */ PACK( 0, 0 ), /* loops */ + /* ALIGNRP */ PACK( 0, 0 ), /* loops */ /* RTDG */ PACK( 0, 0 ), /* MIAP[0] */ PACK( 2, 0 ), /* MIAP[1] */ PACK( 2, 0 ), - /* NPushB */ PACK( 0, 0 ), - /* NPushW */ PACK( 0, 0 ), + /* 0x40 */ + /* NPUSHB */ PACK( 0, 0 ), + /* NPUSHW */ PACK( 0, 0 ), /* WS */ PACK( 2, 0 ), /* RS */ PACK( 1, 1 ), - /* WCvtP */ PACK( 2, 0 ), - /* RCvt */ PACK( 1, 1 ), + /* WCVTP */ PACK( 2, 0 ), + /* RCVT */ PACK( 1, 1 ), /* GC[0] */ PACK( 1, 1 ), /* GC[1] */ PACK( 1, 1 ), /* SCFS */ PACK( 2, 0 ), @@ -735,10 +740,11 @@ /* MD[1] */ PACK( 2, 1 ), /* MPPEM */ PACK( 0, 1 ), /* MPS */ PACK( 0, 1 ), - /* FlipON */ PACK( 0, 0 ), - /* FlipOFF */ PACK( 0, 0 ), + /* FLIPON */ PACK( 0, 0 ), + /* FLIPOFF */ PACK( 0, 0 ), /* DEBUG */ PACK( 1, 0 ), + /* 0x50 */ /* LT */ PACK( 2, 1 ), /* LTEQ */ PACK( 2, 1 ), /* GT */ PACK( 2, 1 ), @@ -752,10 +758,11 @@ /* AND */ PACK( 2, 1 ), /* OR */ PACK( 2, 1 ), /* NOT */ PACK( 1, 1 ), - /* DeltaP1 */ PACK( 1, 0 ), + /* DELTAP1 */ PACK( 1, 0 ), /* SDB */ PACK( 1, 0 ), /* SDS */ PACK( 1, 0 ), + /* 0x60 */ /* ADD */ PACK( 2, 1 ), /* SUB */ PACK( 2, 1 ), /* DIV */ PACK( 2, 1 ), @@ -773,14 +780,15 @@ /* NROUND[2] */ PACK( 1, 1 ), /* NROUND[3] */ PACK( 1, 1 ), - /* WCvtF */ PACK( 2, 0 ), - /* DeltaP2 */ PACK( 1, 0 ), - /* DeltaP3 */ PACK( 1, 0 ), - /* DeltaCn[0] */ PACK( 1, 0 ), - /* DeltaCn[1] */ PACK( 1, 0 ), - /* DeltaCn[2] */ PACK( 1, 0 ), + /* 0x70 */ + /* WCVTF */ PACK( 2, 0 ), + /* DELTAP2 */ PACK( 1, 0 ), + /* DELTAP3 */ PACK( 1, 0 ), + /* DELTAC1 */ PACK( 1, 0 ), + /* DELTAC2 */ PACK( 1, 0 ), + /* DELTAC3 */ PACK( 1, 0 ), /* SROUND */ PACK( 1, 0 ), - /* S45Round */ PACK( 1, 0 ), + /* S45ROUND */ PACK( 1, 0 ), /* JROT */ PACK( 2, 0 ), /* JROF */ PACK( 2, 0 ), /* ROFF */ PACK( 0, 0 ), @@ -790,23 +798,25 @@ /* SANGW */ PACK( 1, 0 ), /* AA */ PACK( 1, 0 ), - /* FlipPT */ PACK( 0, 0 ), /* loops */ - /* FlipRgON */ PACK( 2, 0 ), - /* FlipRgOFF */ PACK( 2, 0 ), + /* 0x80 */ + /* FLIPPT */ PACK( 0, 0 ), /* loops */ + /* FLIPRGON */ PACK( 2, 0 ), + /* FLIPRGOFF */ PACK( 2, 0 ), /* INS_$83 */ PACK( 0, 0 ), /* INS_$84 */ PACK( 0, 0 ), - /* ScanCTRL */ PACK( 1, 0 ), - /* SDPvTL[0] */ PACK( 2, 0 ), - /* SDPvTL[1] */ PACK( 2, 0 ), - /* GetINFO */ PACK( 1, 1 ), + /* SCANCTRL */ PACK( 1, 0 ), + /* SDPVTL[0] */ PACK( 2, 0 ), + /* SDPVTL[1] */ PACK( 2, 0 ), + /* GETINFO */ PACK( 1, 1 ), /* IDEF */ PACK( 1, 0 ), /* ROLL */ PACK( 3, 3 ), /* MAX */ PACK( 2, 1 ), /* MIN */ PACK( 2, 1 ), - /* ScanTYPE */ PACK( 1, 0 ), - /* InstCTRL */ PACK( 2, 0 ), + /* SCANTYPE */ PACK( 1, 0 ), + /* INSTCTRL */ PACK( 2, 0 ), /* INS_$8F */ PACK( 0, 0 ), + /* 0x90 */ /* INS_$90 */ PACK( 0, 0 ), /* GETVAR */ PACK( 0, 0 ), /* will be handled specially */ /* GETDATA */ PACK( 0, 1 ), @@ -824,6 +834,7 @@ /* INS_$9E */ PACK( 0, 0 ), /* INS_$9F */ PACK( 0, 0 ), + /* 0xA0 */ /* INS_$A0 */ PACK( 0, 0 ), /* INS_$A1 */ PACK( 0, 0 ), /* INS_$A2 */ PACK( 0, 0 ), @@ -841,23 +852,25 @@ /* INS_$AE */ PACK( 0, 0 ), /* INS_$AF */ PACK( 0, 0 ), - /* PushB[0] */ PACK( 0, 1 ), - /* PushB[1] */ PACK( 0, 2 ), - /* PushB[2] */ PACK( 0, 3 ), - /* PushB[3] */ PACK( 0, 4 ), - /* PushB[4] */ PACK( 0, 5 ), - /* PushB[5] */ PACK( 0, 6 ), - /* PushB[6] */ PACK( 0, 7 ), - /* PushB[7] */ PACK( 0, 8 ), - /* PushW[0] */ PACK( 0, 1 ), - /* PushW[1] */ PACK( 0, 2 ), - /* PushW[2] */ PACK( 0, 3 ), - /* PushW[3] */ PACK( 0, 4 ), - /* PushW[4] */ PACK( 0, 5 ), - /* PushW[5] */ PACK( 0, 6 ), - /* PushW[6] */ PACK( 0, 7 ), - /* PushW[7] */ PACK( 0, 8 ), - + /* 0xB0 */ + /* PUSHB[0] */ PACK( 0, 1 ), + /* PUSHB[1] */ PACK( 0, 2 ), + /* PUSHB[2] */ PACK( 0, 3 ), + /* PUSHB[3] */ PACK( 0, 4 ), + /* PUSHB[4] */ PACK( 0, 5 ), + /* PUSHB[5] */ PACK( 0, 6 ), + /* PUSHB[6] */ PACK( 0, 7 ), + /* PUSHB[7] */ PACK( 0, 8 ), + /* PUSHW[0] */ PACK( 0, 1 ), + /* PUSHW[1] */ PACK( 0, 2 ), + /* PUSHW[2] */ PACK( 0, 3 ), + /* PUSHW[3] */ PACK( 0, 4 ), + /* PUSHW[4] */ PACK( 0, 5 ), + /* PUSHW[5] */ PACK( 0, 6 ), + /* PUSHW[6] */ PACK( 0, 7 ), + /* PUSHW[7] */ PACK( 0, 8 ), + + /* 0xC0 */ /* MDRP[00] */ PACK( 1, 0 ), /* MDRP[01] */ PACK( 1, 0 ), /* MDRP[02] */ PACK( 1, 0 ), @@ -875,6 +888,7 @@ /* MDRP[14] */ PACK( 1, 0 ), /* MDRP[15] */ PACK( 1, 0 ), + /* 0xD0 */ /* MDRP[16] */ PACK( 1, 0 ), /* MDRP[17] */ PACK( 1, 0 ), /* MDRP[18] */ PACK( 1, 0 ), @@ -892,6 +906,7 @@ /* MDRP[30] */ PACK( 1, 0 ), /* MDRP[31] */ PACK( 1, 0 ), + /* 0xE0 */ /* MIRP[00] */ PACK( 2, 0 ), /* MIRP[01] */ PACK( 2, 0 ), /* MIRP[02] */ PACK( 2, 0 ), @@ -909,6 +924,7 @@ /* MIRP[14] */ PACK( 2, 0 ), /* MIRP[15] */ PACK( 2, 0 ), + /* 0xF0 */ /* MIRP[16] */ PACK( 2, 0 ), /* MIRP[17] */ PACK( 2, 0 ), /* MIRP[18] */ PACK( 2, 0 ), @@ -937,23 +953,25 @@ static const char* const opcode_name[256] = { - "7 SVTCA y", - "7 SVTCA x", - "8 SPvTCA y", - "8 SPvTCA x", - "8 SFvTCA y", - "8 SFvTCA x", - "8 SPvTL ||", - "7 SPvTL +", - "8 SFvTL ||", - "7 SFvTL +", - "5 SPvFS", - "5 SFvFS", - "3 GPv", - "3 GFv", - "6 SFvTPv", + /* 0x00 */ + "8 SVTCA[y]", + "8 SVTCA[x]", + "9 SPVTCA[y]", + "9 SPVTCA[x]", + "9 SFVTCA[y]", + "9 SFVTCA[x]", + "9 SPVTL[||]", + "8 SPVTL[+]", + "9 SFVTL[||]", + "8 SFVTL[+]", + "5 SPVFS", + "5 SFVFS", + "3 GPV", + "3 GFV", + "6 SFVTPV", "5 ISECT", + /* 0x10 */ "4 SRP0", "4 SRP1", "4 SRP2", @@ -967,10 +985,11 @@ "3 SMD", "4 ELSE", "4 JMPR", - "6 SCvTCi", - "5 SSwCi", + "6 SCVTCI", + "5 SSWCI", "3 SSW", + /* 0x20 */ "3 DUP", "3 POP", "5 CLEAR", @@ -978,50 +997,53 @@ "5 DEPTH", "6 CINDEX", "6 MINDEX", - "8 AlignPTS", + "8 ALIGNPTS", "7 INS_$28", "3 UTP", "8 LOOPCALL", "4 CALL", "4 FDEF", "4 ENDF", - "7 MDAP[0]", - "7 MDAP[1]", - - "6 IUP[0]", - "6 IUP[1]", - "6 SHP[0]", - "6 SHP[1]", - "6 SHC[0]", - "6 SHC[1]", - "6 SHZ[0]", - "6 SHZ[1]", + "6 MDAP[]", + "9 MDAP[rnd]", + + /* 0x30 */ + "6 IUP[y]", + "6 IUP[x]", + "8 SHP[rp2]", + "8 SHP[rp1]", + "8 SHC[rp2]", + "8 SHC[rp1]", + "8 SHZ[rp2]", + "8 SHZ[rp1]", "5 SHPIX", "2 IP", - "8 MSIRP[0]", - "8 MSIRP[1]", - "7 AlignRP", + "7 MSIRP[]", + "A MSIRP[rp0]", + "7 ALIGNRP", "4 RTDG", - "7 MIAP[0]", - "7 MIAP[1]", + "6 MIAP[]", + "9 MIAP[rnd]", - "6 NPushB", - "6 NPushW", + /* 0x40 */ + "6 NPUSHB", + "6 NPUSHW", "2 WS", "2 RS", - "5 WCvtP", - "4 RCvt", - "5 GC[0]", - "5 GC[1]", + "5 WCVTP", + "4 RCVT", + "8 GC[curr]", + "8 GC[orig]", "4 SCFS", - "5 MD[0]", - "5 MD[1]", + "8 MD[curr]", + "8 MD[orig]", "5 MPPEM", "3 MPS", - "6 FlipON", - "7 FlipOFF", + "6 FLIPON", + "7 FLIPOFF", "5 DEBUG", + /* 0x50 */ "2 LT", "4 LTEQ", "2 GT", @@ -1035,10 +1057,11 @@ "3 AND", "2 OR", "3 NOT", - "7 DeltaP1", + "7 DELTAP1", "3 SDB", "3 SDS", + /* 0x60 */ "3 ADD", "3 SUB", "3 DIV", @@ -1047,23 +1070,24 @@ "3 NEG", "5 FLOOR", "7 CEILING", - "8 ROUND[0]", - "8 ROUND[1]", - "8 ROUND[2]", - "8 ROUND[3]", - "9 NROUND[0]", - "9 NROUND[1]", - "9 NROUND[2]", - "9 NROUND[3]", - - "5 WCvtF", - "7 DeltaP2", - "7 DeltaP3", - "A DeltaCn[0]", - "A DeltaCn[1]", - "A DeltaCn[2]", + "8 ROUND[G]", + "8 ROUND[B]", + "8 ROUND[W]", + "7 ROUND[]", + "9 NROUND[G]", + "9 NROUND[B]", + "9 NROUND[W]", + "8 NROUND[]", + + /* 0x70 */ + "5 WCVTF", + "7 DELTAP2", + "7 DELTAP3", + "7 DELTAC1", + "7 DELTAC2", + "7 DELTAC3", "6 SROUND", - "8 S45Round", + "8 S45ROUND", "4 JROT", "4 JROF", "4 ROFF", @@ -1073,26 +1097,28 @@ "5 SANGW", "2 AA", - "6 FlipPT", - "8 FlipRgON", - "9 FlipRgOFF", + /* 0x80 */ + "6 FLIPPT", + "8 FLIPRGON", + "9 FLIPRGOFF", "7 INS_$83", "7 INS_$84", - "8 ScanCTRL", - "9 SDPvTL[0]", - "9 SDPvTL[1]", - "7 GetINFO", + "8 SCANCTRL", + "A SDPVTL[||]", + "9 SDPVTL[+]", + "7 GETINFO", "4 IDEF", "4 ROLL", "3 MAX", "3 MIN", - "8 ScanTYPE", - "8 InstCTRL", + "8 SCANTYPE", + "8 INSTCTRL", "7 INS_$8F", + /* 0x90 */ "7 INS_$90", #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - "6 GETVAR", + "C GETVARIATION", "7 GETDATA", #else "7 INS_$91", @@ -1112,6 +1138,7 @@ "7 INS_$9E", "7 INS_$9F", + /* 0xA0 */ "7 INS_$A0", "7 INS_$A1", "7 INS_$A2", @@ -1129,90 +1156,95 @@ "7 INS_$AE", "7 INS_$AF", - "8 PushB[0]", - "8 PushB[1]", - "8 PushB[2]", - "8 PushB[3]", - "8 PushB[4]", - "8 PushB[5]", - "8 PushB[6]", - "8 PushB[7]", - "8 PushW[0]", - "8 PushW[1]", - "8 PushW[2]", - "8 PushW[3]", - "8 PushW[4]", - "8 PushW[5]", - "8 PushW[6]", - "8 PushW[7]", - + /* 0xB0 */ + "8 PUSHB[0]", + "8 PUSHB[1]", + "8 PUSHB[2]", + "8 PUSHB[3]", + "8 PUSHB[4]", + "8 PUSHB[5]", + "8 PUSHB[6]", + "8 PUSHB[7]", + "8 PUSHW[0]", + "8 PUSHW[1]", + "8 PUSHW[2]", + "8 PUSHW[3]", + "8 PUSHW[4]", + "8 PUSHW[5]", + "8 PUSHW[6]", + "8 PUSHW[7]", + + /* 0xC0 */ "7 MDRP[G]", "7 MDRP[B]", "7 MDRP[W]", - "7 MDRP[?]", + "6 MDRP[]", "8 MDRP[rG]", "8 MDRP[rB]", "8 MDRP[rW]", - "8 MDRP[r?]", + "7 MDRP[r]", "8 MDRP[mG]", "8 MDRP[mB]", "8 MDRP[mW]", - "8 MDRP[m?]", + "7 MDRP[m]", "9 MDRP[mrG]", "9 MDRP[mrB]", "9 MDRP[mrW]", - "9 MDRP[mr?]", + "8 MDRP[mr]", + /* 0xD0 */ "8 MDRP[pG]", "8 MDRP[pB]", "8 MDRP[pW]", - "8 MDRP[p?]", + "7 MDRP[p]", "9 MDRP[prG]", "9 MDRP[prB]", "9 MDRP[prW]", - "9 MDRP[pr?]", + "8 MDRP[pr]", "9 MDRP[pmG]", "9 MDRP[pmB]", "9 MDRP[pmW]", - "9 MDRP[pm?]", + "8 MDRP[pm]", "A MDRP[pmrG]", "A MDRP[pmrB]", "A MDRP[pmrW]", - "A MDRP[pmr?]", + "9 MDRP[pmr]", + /* 0xE0 */ "7 MIRP[G]", "7 MIRP[B]", "7 MIRP[W]", - "7 MIRP[?]", + "6 MIRP[]", "8 MIRP[rG]", "8 MIRP[rB]", "8 MIRP[rW]", - "8 MIRP[r?]", + "7 MIRP[r]", "8 MIRP[mG]", "8 MIRP[mB]", "8 MIRP[mW]", - "8 MIRP[m?]", + "7 MIRP[m]", "9 MIRP[mrG]", "9 MIRP[mrB]", "9 MIRP[mrW]", - "9 MIRP[mr?]", + "8 MIRP[mr]", + /* 0xF0 */ "8 MIRP[pG]", "8 MIRP[pB]", "8 MIRP[pW]", - "8 MIRP[p?]", + "7 MIRP[p]", "9 MIRP[prG]", "9 MIRP[prB]", "9 MIRP[prW]", - "9 MIRP[pr?]", + "8 MIRP[pr]", "9 MIRP[pmG]", "9 MIRP[pmB]", "9 MIRP[pmW]", - "9 MIRP[pm?]", + "8 MIRP[pm]", "A MIRP[pmrG]", "A MIRP[pmrB]", "A MIRP[pmrW]", - "A MIRP[pmr?]" + "9 MIRP[pmr]" }; #endif /* FT_DEBUG_LEVEL_TRACE */ @@ -1662,6 +1694,32 @@ } + /* + * + * Apple's TrueType specification at + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM02/Chap2.html#order + * + * gives the following order of operations in instructions that move + * points. + * + * - check single width cut-in (MIRP, MDRP) + * + * - check control value cut-in (MIRP, MIAP) + * + * - apply engine compensation (MIRP, MDRP) + * + * - round distance (MIRP, MDRP) or value (MIAP, MDAP) + * + * - check minimum distance (MIRP,MDRP) + * + * - move point (MIRP, MDRP, MIAP, MSIRP, MDAP) + * + * For rounding instructions, engine compensation happens before rounding. + * + */ + + /************************************************************************** * * @Function: @@ -1886,7 +1944,6 @@ zone->org[point].y = ADD_LONG( zone->org[point].y, distance ); } - /************************************************************************** * * @Function: @@ -1904,12 +1961,6 @@ * * @Return: * The compensated distance. - * - * @Note: - * The TrueType specification says very few about the relationship - * between rounding and engine compensation. However, it seems from - * the description of super round that we should add the compensation - * before rounding. */ static FT_F26Dot6 Round_None( TT_ExecContext exc, diff --git a/thirdparty/freetype/src/truetype/ttobjs.c b/thirdparty/freetype/src/truetype/ttobjs.c index f3a432cedd..e4775a51ed 100644 --- a/thirdparty/freetype/src/truetype/ttobjs.c +++ b/thirdparty/freetype/src/truetype/ttobjs.c @@ -148,7 +148,7 @@ /* This list shall be expanded as we find more of them. */ static FT_Bool - tt_check_trickyness_family( FT_String* name ) + tt_check_trickyness_family( const FT_String* name ) { #define TRICK_NAMES_MAX_CHARACTERS 19 @@ -937,7 +937,22 @@ TT_Face face = (TT_Face)size->root.face; TT_ExecContext exec; FT_Error error; + FT_UInt i; + /* unscaled CVT values are already stored in 26.6 format */ + FT_Fixed scale = size->ttmetrics.scale >> 6; + + + /* Scale the cvt values to the new ppem. */ + /* By default, we use the y ppem value for scaling. */ + FT_TRACE6(( "CVT values:\n" )); + for ( i = 0; i < size->cvt_size; i++ ) + { + size->cvt[i] = FT_MulFix( face->cvt[i], scale ); + FT_TRACE6(( " %3d: %f (%f)\n", + i, face->cvt[i] / 64.0, size->cvt[i] / 64.0 )); + } + FT_TRACE6(( "\n" )); exec = size->context; @@ -1094,11 +1109,17 @@ tt_metrics->rotated = FALSE; tt_metrics->stretched = FALSE; - /* set default engine compensation */ - tt_metrics->compensations[0] = 0; /* gray */ - tt_metrics->compensations[1] = 0; /* black */ - tt_metrics->compensations[2] = 0; /* white */ - tt_metrics->compensations[3] = 0; /* reserved */ + /* Set default engine compensation. Value 3 is not described */ + /* in the OpenType specification (as of Mai 2019), but Greg */ + /* says that MS handles it the same as `gray'. */ + /* */ + /* The Apple specification says that the compensation for */ + /* `gray' is always zero. FreeType doesn't do any */ + /* compensation at all. */ + tt_metrics->compensations[0] = 0; /* gray */ + tt_metrics->compensations[1] = 0; /* black */ + tt_metrics->compensations[2] = 0; /* white */ + tt_metrics->compensations[3] = 0; /* the same as gray */ } /* allocate function defs, instruction defs, cvt, and storage area */ @@ -1171,20 +1192,8 @@ if ( size->cvt_ready < 0 ) { FT_UInt i; - TT_Face face = (TT_Face)size->root.face; - /* Scale the cvt values to the new ppem. */ - /* By default, we use the y ppem value for scaling. */ - FT_TRACE6(( "CVT values:\n" )); - for ( i = 0; i < size->cvt_size; i++ ) - { - size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); - FT_TRACE6(( " %3d: %d (%f)\n", - i, face->cvt[i], size->cvt[i] / 64.0 )); - } - FT_TRACE6(( "\n" )); - /* all twilight points are originally zero */ for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) { diff --git a/thirdparty/freetype/src/truetype/ttpload.c b/thirdparty/freetype/src/truetype/ttpload.c index e7718bf9b7..bc954c2dba 100644 --- a/thirdparty/freetype/src/truetype/ttpload.c +++ b/thirdparty/freetype/src/truetype/ttpload.c @@ -352,12 +352,12 @@ goto Exit; { - FT_Short* cur = face->cvt; - FT_Short* limit = cur + face->cvt_size; + FT_Int32* cur = face->cvt; + FT_Int32* limit = cur + face->cvt_size; for ( ; cur < limit; cur++ ) - *cur = FT_GET_SHORT(); + *cur = FT_GET_SHORT() * 64; } FT_FRAME_EXIT(); diff --git a/thirdparty/freetype/src/type1/t1driver.c b/thirdparty/freetype/src/type1/t1driver.c index 8625db5b01..557733da3b 100644 --- a/thirdparty/freetype/src/type1/t1driver.c +++ b/thirdparty/freetype/src/type1/t1driver.c @@ -70,8 +70,8 @@ static FT_UInt - t1_get_name_index( T1_Face face, - FT_String* glyph_name ) + t1_get_name_index( T1_Face face, + const FT_String* glyph_name ) { FT_Int i; diff --git a/thirdparty/freetype/src/type1/t1load.c b/thirdparty/freetype/src/type1/t1load.c index 3896af70ba..5cffdfaac4 100644 --- a/thirdparty/freetype/src/type1/t1load.c +++ b/thirdparty/freetype/src/type1/t1load.c @@ -1507,12 +1507,7 @@ /* We need to `zero' out encoding_table.elements */ for ( n = 0; n < array_size; n++ ) - { - char* notdef = (char *)".notdef"; - - - (void)T1_Add_Table( char_table, n, notdef, 8 ); - } + (void)T1_Add_Table( char_table, n, ".notdef", 8 ); /* Now we need to read records of the form */ /* */ @@ -2147,7 +2142,6 @@ /* 0 333 hsbw endchar */ FT_Byte notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E }; - char* notdef_name = (char *)".notdef"; error = T1_Add_Table( swap_table, 0, @@ -2162,7 +2156,7 @@ if ( error ) goto Fail; - error = T1_Add_Table( name_table, 0, notdef_name, 8 ); + error = T1_Add_Table( name_table, 0, ".notdef", 8 ); if ( error ) goto Fail; @@ -2633,8 +2627,7 @@ /* we must now build type1.encoding when we have a custom array */ if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) { - FT_Int charcode, idx, min_char, max_char; - FT_Byte* glyph_name; + FT_Int charcode, idx, min_char, max_char; /* OK, we do the following: for each element in the encoding */ @@ -2648,27 +2641,27 @@ charcode = 0; for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) { - FT_Byte* char_name; + const FT_String* char_name = + (const FT_String*)loader.encoding_table.elements[charcode]; type1->encoding.char_index[charcode] = 0; - type1->encoding.char_name [charcode] = (char *)".notdef"; + type1->encoding.char_name [charcode] = ".notdef"; - char_name = loader.encoding_table.elements[charcode]; if ( char_name ) for ( idx = 0; idx < type1->num_glyphs; idx++ ) { - glyph_name = (FT_Byte*)type1->glyph_names[idx]; - if ( ft_strcmp( (const char*)char_name, - (const char*)glyph_name ) == 0 ) + const FT_String* glyph_name = type1->glyph_names[idx]; + + + if ( ft_strcmp( char_name, glyph_name ) == 0 ) { type1->encoding.char_index[charcode] = (FT_UShort)idx; - type1->encoding.char_name [charcode] = (char*)glyph_name; + type1->encoding.char_name [charcode] = glyph_name; /* Change min/max encoded char only if glyph name is */ /* not /.notdef */ - if ( ft_strcmp( (const char*)".notdef", - (const char*)glyph_name ) != 0 ) + if ( ft_strcmp( ".notdef", glyph_name ) != 0 ) { if ( charcode < min_char ) min_char = charcode; diff --git a/thirdparty/freetype/src/type42/t42drivr.c b/thirdparty/freetype/src/type42/t42drivr.c index 6d4e7a0955..09ad632e97 100644 --- a/thirdparty/freetype/src/type42/t42drivr.c +++ b/thirdparty/freetype/src/type42/t42drivr.c @@ -69,8 +69,8 @@ static FT_UInt - t42_get_name_index( T42_Face face, - FT_String* glyph_name ) + t42_get_name_index( T42_Face face, + const FT_String* glyph_name ) { FT_Int i; diff --git a/thirdparty/freetype/src/type42/t42objs.c b/thirdparty/freetype/src/type42/t42objs.c index 234c0a3e97..d31bace451 100644 --- a/thirdparty/freetype/src/type42/t42objs.c +++ b/thirdparty/freetype/src/type42/t42objs.c @@ -98,8 +98,7 @@ /* we must now build type1.encoding when we have a custom array */ if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) { - FT_Int charcode, idx, min_char, max_char; - FT_Byte* glyph_name; + FT_Int charcode, idx, min_char, max_char; /* OK, we do the following: for each element in the encoding */ @@ -114,27 +113,27 @@ charcode = 0; for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) { - FT_Byte* char_name; + const FT_String* char_name = + (const FT_String*)loader.encoding_table.elements[charcode]; type1->encoding.char_index[charcode] = 0; - type1->encoding.char_name [charcode] = (char *)".notdef"; + type1->encoding.char_name [charcode] = ".notdef"; - char_name = loader.encoding_table.elements[charcode]; if ( char_name ) for ( idx = 0; idx < type1->num_glyphs; idx++ ) { - glyph_name = (FT_Byte*)type1->glyph_names[idx]; - if ( ft_strcmp( (const char*)char_name, - (const char*)glyph_name ) == 0 ) + const FT_String* glyph_name = type1->glyph_names[idx]; + + + if ( ft_strcmp( char_name, glyph_name ) == 0 ) { type1->encoding.char_index[charcode] = (FT_UShort)idx; - type1->encoding.char_name [charcode] = (char*)glyph_name; + type1->encoding.char_name [charcode] = glyph_name; /* Change min/max encoded char only if glyph name is */ /* not /.notdef */ - if ( ft_strcmp( (const char*)".notdef", - (const char*)glyph_name ) != 0 ) + if ( ft_strcmp( ".notdef", glyph_name ) != 0 ) { if ( charcode < min_char ) min_char = charcode; diff --git a/thirdparty/freetype/src/type42/t42parse.c b/thirdparty/freetype/src/type42/t42parse.c index b653a133a5..c47a77786d 100644 --- a/thirdparty/freetype/src/type42/t42parse.c +++ b/thirdparty/freetype/src/type42/t42parse.c @@ -226,7 +226,8 @@ if ( !parser->in_memory ) FT_FREE( parser->base_dict ); - parser->root.funcs.done( &parser->root ); + if ( parser->root.funcs.done ) + parser->root.funcs.done( &parser->root ); } @@ -373,12 +374,7 @@ /* We need to `zero' out encoding_table.elements */ for ( n = 0; n < count; n++ ) - { - char* notdef = (char *)".notdef"; - - - (void)T1_Add_Table( char_table, n, notdef, 8 ); - } + (void)T1_Add_Table( char_table, n, ".notdef", 8 ); /* Now we need to read records of the form */ /* */ @@ -1021,8 +1017,7 @@ } /* if /.notdef does not occupy index 0, do our magic. */ - if ( ft_strcmp( (const char*)".notdef", - (const char*)name_table->elements[0] ) ) + if ( ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) ) { /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ /* name and code entries to swap_table. Then place notdef_index */ diff --git a/thirdparty/glad/KHR/khrplatform.h b/thirdparty/glad/KHR/khrplatform.h index 975bbffed6..5b55ea2b98 100644 --- a/thirdparty/glad/KHR/khrplatform.h +++ b/thirdparty/glad/KHR/khrplatform.h @@ -90,12 +90,20 @@ * int arg2) KHRONOS_APIATTRIBUTES; */ +#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) +# define KHRONOS_STATIC 1 +#endif + /*------------------------------------------------------------------------- * Definition of KHRONOS_APICALL *------------------------------------------------------------------------- * This precedes the return type of the function in the function prototype. */ -#if defined(_WIN32) && !defined(__SCITECH_SNAP__) +#if defined(KHRONOS_STATIC) + /* If the preprocessor constant KHRONOS_STATIC is defined, make the + * header compatible with static linking. */ +# define KHRONOS_APICALL +#elif defined(_WIN32) # define KHRONOS_APICALL __declspec(dllimport) #elif defined (__SYMBIAN32__) # define KHRONOS_APICALL IMPORT_C @@ -111,7 +119,7 @@ * This follows the return type of the function and precedes the function * name in the function prototype. */ -#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(KHRONOS_STATIC) /* Win32 but not WinCE */ # define KHRONOS_APIENTRY __stdcall #else diff --git a/thirdparty/glad/glad.c b/thirdparty/glad/glad.c index 9704c1079f..08c9c7e228 100644 --- a/thirdparty/glad/glad.c +++ b/thirdparty/glad/glad.c @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.29 on Wed May 1 23:16:34 2019. + OpenGL loader generated by glad 0.1.31 on Thu Jul 11 10:09:18 2019. Language/Generator: C/C++ Specification: gl diff --git a/thirdparty/glad/glad/glad.h b/thirdparty/glad/glad/glad.h index b398faf627..acf96d8cd9 100644 --- a/thirdparty/glad/glad/glad.h +++ b/thirdparty/glad/glad/glad.h @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.29 on Wed May 1 23:16:34 2019. + OpenGL loader generated by glad 0.1.31 on Thu Jul 11 10:09:18 2019. Language/Generator: C/C++ Specification: gl @@ -33,13 +33,7 @@ #define __gl_h_ #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN 1 -#endif -#ifndef NOMINMAX -#define NOMINMAX 1 -#endif -#include <windows.h> +#define APIENTRY __stdcall #endif #ifndef APIENTRY diff --git a/thirdparty/jpeg-compressor/jpgd.cpp b/thirdparty/jpeg-compressor/jpgd.cpp index fad9a37a9a..62fbd1b72d 100644 --- a/thirdparty/jpeg-compressor/jpgd.cpp +++ b/thirdparty/jpeg-compressor/jpgd.cpp @@ -29,6 +29,10 @@ #define JPGD_MAX(a,b) (((a)>(b)) ? (a) : (b)) #define JPGD_MIN(a,b) (((a)<(b)) ? (a) : (b)) +// TODO: Move to header and use these constants when declaring the arrays. +#define JPGD_HUFF_TREE_MAX_LENGTH 512 +#define JPGD_HUFF_CODE_SIZE_MAX_LENGTH 256 + namespace jpgd { static inline void *jpgd_malloc(size_t nSize) { return malloc(nSize); } @@ -491,8 +495,9 @@ inline uint jpeg_decoder::get_bits_no_markers(int num_bits) // Decodes a Huffman encoded symbol. inline int jpeg_decoder::huff_decode(huff_tables *pH) { - int symbol; + JPGD_ASSERT(pH); + int symbol; // Check first 8-bits: do we have a complete symbol? if ((symbol = pH->look_up[m_bit_buf >> 24]) < 0) { @@ -500,14 +505,19 @@ inline int jpeg_decoder::huff_decode(huff_tables *pH) int ofs = 23; do { - symbol = pH->tree[-(int)(symbol + ((m_bit_buf >> ofs) & 1))]; + unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); + JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); + symbol = pH->tree[idx]; ofs--; } while (symbol < 0); get_bits_no_markers(8 + (23 - ofs)); } else + { + JPGD_ASSERT(symbol < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); get_bits_no_markers(pH->code_size[symbol]); + } return symbol; } @@ -517,6 +527,8 @@ inline int jpeg_decoder::huff_decode(huff_tables *pH, int& extra_bits) { int symbol; + JPGD_ASSERT(pH); + // Check first 8-bits: do we have a complete symbol? if ((symbol = pH->look_up2[m_bit_buf >> 24]) < 0) { @@ -524,7 +536,9 @@ inline int jpeg_decoder::huff_decode(huff_tables *pH, int& extra_bits) int ofs = 23; do { - symbol = pH->tree[-(int)(symbol + ((m_bit_buf >> ofs) & 1))]; + unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); + JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); + symbol = pH->tree[idx]; ofs--; } while (symbol < 0); @@ -1495,6 +1509,12 @@ void jpeg_decoder::fix_in_buffer() void jpeg_decoder::transform_mcu(int mcu_row) { jpgd_block_t* pSrc_ptr = m_pMCU_coefficients; + if (m_freq_domain_chroma_upsample) { + JPGD_ASSERT(mcu_row * m_blocks_per_mcu < m_expanded_blocks_per_row); + } + else { + JPGD_ASSERT(mcu_row * m_blocks_per_mcu < m_max_blocks_per_row); + } uint8* pDst_ptr = m_pSample_buf + mcu_row * m_blocks_per_mcu * 64; for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) @@ -1650,6 +1670,7 @@ void jpeg_decoder::load_next_row() for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) { component_id = m_mcu_org[mcu_block]; + JPGD_ASSERT(m_comp_quant[component_id] < JPGD_MAX_QUANT_TABLES); q = m_quant[m_comp_quant[component_id]]; p = m_pMCU_coefficients + 64 * mcu_block; @@ -1770,6 +1791,7 @@ void jpeg_decoder::decode_next_row() for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++, p += 64) { int component_id = m_mcu_org[mcu_block]; + JPGD_ASSERT(m_comp_quant[component_id] < JPGD_MAX_QUANT_TABLES); jpgd_quant_t* q = m_quant[m_comp_quant[component_id]]; int r, s; @@ -2229,7 +2251,10 @@ void jpeg_decoder::make_huff_table(int index, huff_tables *pH) for (l = 1; l <= 16; l++) { for (i = 1; i <= m_huff_num[index][l]; i++) + { + JPGD_ASSERT(p < 257); huffsize[p++] = static_cast<uint8>(l); + } } huffsize[p] = 0; @@ -2244,6 +2269,7 @@ void jpeg_decoder::make_huff_table(int index, huff_tables *pH) { while (huffsize[p] == si) { + JPGD_ASSERT(p < 257); huffcode[p++] = code; code++; } @@ -2275,7 +2301,8 @@ void jpeg_decoder::make_huff_table(int index, huff_tables *pH) for (l = 1 << (8 - code_size); l > 0; l--) { - JPGD_ASSERT(i < 256); + JPGD_ASSERT(i < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); + JPGD_ASSERT(code < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); pH->look_up[code] = i; @@ -2325,16 +2352,19 @@ void jpeg_decoder::make_huff_table(int index, huff_tables *pH) if ((code & 0x8000) == 0) currententry--; - if (pH->tree[-currententry - 1] == 0) + unsigned int idx = -currententry - 1; + JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); + if (pH->tree[idx] == 0) { - pH->tree[-currententry - 1] = nextfreeentry; + pH->tree[idx] = nextfreeentry; currententry = nextfreeentry; nextfreeentry -= 2; } - else - currententry = pH->tree[-currententry - 1]; + else { + currententry = pH->tree[idx]; + } code <<= 1; } @@ -2636,7 +2666,9 @@ void jpeg_decoder::decode_block_ac_first(jpeg_decoder *pD, int component_id, int for (k = pD->m_spectral_start; k <= pD->m_spectral_end; k++) { - s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]); + unsigned int idx = pD->m_comp_ac_tab[component_id]; + JPGD_ASSERT(idx < JPGD_MAX_HUFF_TABLES); + s = pD->huff_decode(pD->m_pHuff_tabs[idx]); r = s >> 4; s &= 15; @@ -2679,7 +2711,6 @@ void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, in int p1 = 1 << pD->m_successive_low; int m1 = (-1) << pD->m_successive_low; jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); - JPGD_ASSERT(pD->m_spectral_end <= 63); k = pD->m_spectral_start; @@ -2688,7 +2719,9 @@ void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, in { for ( ; k <= pD->m_spectral_end; k++) { - s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]); + unsigned int idx = pD->m_comp_ac_tab[component_id]; + JPGD_ASSERT(idx < JPGD_MAX_HUFF_TABLES); + s = pD->huff_decode(pD->m_pHuff_tabs[idx]); r = s >> 4; s &= 15; diff --git a/thirdparty/mbedtls/include/mbedtls/aes.h b/thirdparty/mbedtls/include/mbedtls/aes.h index b42e564efc..94e7282d36 100644 --- a/thirdparty/mbedtls/include/mbedtls/aes.h +++ b/thirdparty/mbedtls/include/mbedtls/aes.h @@ -655,6 +655,8 @@ MBEDTLS_DEPRECATED void mbedtls_aes_decrypt( mbedtls_aes_context *ctx, #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine. * @@ -663,6 +665,8 @@ MBEDTLS_DEPRECATED void mbedtls_aes_decrypt( mbedtls_aes_context *ctx, */ int mbedtls_aes_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/aesni.h b/thirdparty/mbedtls/include/mbedtls/aesni.h index 0196f49b87..a4ca012f8a 100644 --- a/thirdparty/mbedtls/include/mbedtls/aesni.h +++ b/thirdparty/mbedtls/include/mbedtls/aesni.h @@ -27,6 +27,12 @@ #ifndef MBEDTLS_AESNI_H #define MBEDTLS_AESNI_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "aes.h" #define MBEDTLS_AESNI_AES 0x02000000u diff --git a/thirdparty/mbedtls/include/mbedtls/arc4.h b/thirdparty/mbedtls/include/mbedtls/arc4.h index c43f4065f1..fb044d5b7f 100644 --- a/thirdparty/mbedtls/include/mbedtls/arc4.h +++ b/thirdparty/mbedtls/include/mbedtls/arc4.h @@ -123,6 +123,8 @@ void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key, int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, unsigned char *output ); +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -135,6 +137,8 @@ int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned */ int mbedtls_arc4_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/asn1write.h b/thirdparty/mbedtls/include/mbedtls/asn1write.h index 76c1780b59..a194243696 100644 --- a/thirdparty/mbedtls/include/mbedtls/asn1write.h +++ b/thirdparty/mbedtls/include/mbedtls/asn1write.h @@ -24,14 +24,21 @@ #ifndef MBEDTLS_ASN1_WRITE_H #define MBEDTLS_ASN1_WRITE_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "asn1.h" #define MBEDTLS_ASN1_CHK_ADD(g, f) \ - do { \ - if( ( ret = f ) < 0 ) \ + do \ + { \ + if( ( ret = (f) ) < 0 ) \ return( ret ); \ else \ - g += ret; \ + (g) += ret; \ } while( 0 ) #ifdef __cplusplus diff --git a/thirdparty/mbedtls/include/mbedtls/base64.h b/thirdparty/mbedtls/include/mbedtls/base64.h index 7a64f52163..0d024164c5 100644 --- a/thirdparty/mbedtls/include/mbedtls/base64.h +++ b/thirdparty/mbedtls/include/mbedtls/base64.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_BASE64_H #define MBEDTLS_BASE64_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include <stddef.h> #define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */ @@ -75,6 +81,7 @@ int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ); +#if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * @@ -82,6 +89,8 @@ int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, */ int mbedtls_base64_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/bignum.h b/thirdparty/mbedtls/include/mbedtls/bignum.h index 141a8e9adf..1c8607264f 100644 --- a/thirdparty/mbedtls/include/mbedtls/bignum.h +++ b/thirdparty/mbedtls/include/mbedtls/bignum.h @@ -46,7 +46,12 @@ #define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E /**< The input arguments are not acceptable. */ #define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010 /**< Memory allocation failed. */ -#define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 ) +#define MBEDTLS_MPI_CHK(f) \ + do \ + { \ + if( ( ret = (f) ) != 0 ) \ + goto cleanup; \ + } while( 0 ) /* * Maximum size MPIs are allowed to grow to in number of limbs. @@ -943,6 +948,8 @@ int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -950,6 +957,8 @@ int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags, */ int mbedtls_mpi_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/bn_mul.h b/thirdparty/mbedtls/include/mbedtls/bn_mul.h index 2f7b72fe4c..c33bd8d4ab 100644 --- a/thirdparty/mbedtls/include/mbedtls/bn_mul.h +++ b/thirdparty/mbedtls/include/mbedtls/bn_mul.h @@ -38,6 +38,12 @@ #ifndef MBEDTLS_BN_MUL_H #define MBEDTLS_BN_MUL_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "bignum.h" #if defined(MBEDTLS_HAVE_ASM) @@ -750,7 +756,7 @@ "sw $10, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "$9", "$10", "$11", "$12", "$13", "$14", "$15" \ + : "$9", "$10", "$11", "$12", "$13", "$14", "$15", "lo", "hi" \ ); #endif /* MIPS */ diff --git a/thirdparty/mbedtls/include/mbedtls/camellia.h b/thirdparty/mbedtls/include/mbedtls/camellia.h index 0f7c42c92d..3eeb66366d 100644 --- a/thirdparty/mbedtls/include/mbedtls/camellia.h +++ b/thirdparty/mbedtls/include/mbedtls/camellia.h @@ -308,6 +308,8 @@ int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -315,6 +317,8 @@ int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx, */ int mbedtls_camellia_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/ccm.h b/thirdparty/mbedtls/include/mbedtls/ccm.h index 3f6b8f6709..f03e3b580e 100644 --- a/thirdparty/mbedtls/include/mbedtls/ccm.h +++ b/thirdparty/mbedtls/include/mbedtls/ccm.h @@ -49,6 +49,12 @@ #ifndef MBEDTLS_CCM_H #define MBEDTLS_CCM_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "cipher.h" #define MBEDTLS_ERR_CCM_BAD_INPUT -0x000D /**< Bad input parameters to the function. */ diff --git a/thirdparty/mbedtls/include/mbedtls/certs.h b/thirdparty/mbedtls/include/mbedtls/certs.h index 8dab7b5ce8..179ebbbad2 100644 --- a/thirdparty/mbedtls/include/mbedtls/certs.h +++ b/thirdparty/mbedtls/include/mbedtls/certs.h @@ -24,74 +24,226 @@ #ifndef MBEDTLS_CERTS_H #define MBEDTLS_CERTS_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include <stddef.h> #ifdef __cplusplus extern "C" { #endif +/* List of all PEM-encoded CA certificates, terminated by NULL; + * PEM encoded if MBEDTLS_PEM_PARSE_C is enabled, DER encoded + * otherwise. */ +extern const char * mbedtls_test_cas[]; +extern const size_t mbedtls_test_cas_len[]; + +/* List of all DER-encoded CA certificates, terminated by NULL */ +extern const unsigned char * mbedtls_test_cas_der[]; +extern const size_t mbedtls_test_cas_der_len[]; + #if defined(MBEDTLS_PEM_PARSE_C) /* Concatenation of all CA certificates in PEM format if available */ extern const char mbedtls_test_cas_pem[]; extern const size_t mbedtls_test_cas_pem_len; -#endif - -/* List of all CA certificates, terminated by NULL */ -extern const char * mbedtls_test_cas[]; -extern const size_t mbedtls_test_cas_len[]; +#endif /* MBEDTLS_PEM_PARSE_C */ /* - * Convenience for users who just want a certificate: - * RSA by default, or ECDSA if RSA is not available + * CA test certificates */ + +extern const char mbedtls_test_ca_crt_ec_pem[]; +extern const char mbedtls_test_ca_key_ec_pem[]; +extern const char mbedtls_test_ca_pwd_ec_pem[]; +extern const char mbedtls_test_ca_key_rsa_pem[]; +extern const char mbedtls_test_ca_pwd_rsa_pem[]; +extern const char mbedtls_test_ca_crt_rsa_sha1_pem[]; +extern const char mbedtls_test_ca_crt_rsa_sha256_pem[]; + +extern const unsigned char mbedtls_test_ca_crt_ec_der[]; +extern const unsigned char mbedtls_test_ca_key_ec_der[]; +extern const unsigned char mbedtls_test_ca_key_rsa_der[]; +extern const unsigned char mbedtls_test_ca_crt_rsa_sha1_der[]; +extern const unsigned char mbedtls_test_ca_crt_rsa_sha256_der[]; + +extern const size_t mbedtls_test_ca_crt_ec_pem_len; +extern const size_t mbedtls_test_ca_key_ec_pem_len; +extern const size_t mbedtls_test_ca_pwd_ec_pem_len; +extern const size_t mbedtls_test_ca_key_rsa_pem_len; +extern const size_t mbedtls_test_ca_pwd_rsa_pem_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha1_pem_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha256_pem_len; + +extern const size_t mbedtls_test_ca_crt_ec_der_len; +extern const size_t mbedtls_test_ca_key_ec_der_len; +extern const size_t mbedtls_test_ca_pwd_ec_der_len; +extern const size_t mbedtls_test_ca_key_rsa_der_len; +extern const size_t mbedtls_test_ca_pwd_rsa_der_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha1_der_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha256_der_len; + +/* Config-dependent dispatch between PEM and DER encoding + * (PEM if enabled, otherwise DER) */ + +extern const char mbedtls_test_ca_crt_ec[]; +extern const char mbedtls_test_ca_key_ec[]; +extern const char mbedtls_test_ca_pwd_ec[]; +extern const char mbedtls_test_ca_key_rsa[]; +extern const char mbedtls_test_ca_pwd_rsa[]; +extern const char mbedtls_test_ca_crt_rsa_sha1[]; +extern const char mbedtls_test_ca_crt_rsa_sha256[]; + +extern const size_t mbedtls_test_ca_crt_ec_len; +extern const size_t mbedtls_test_ca_key_ec_len; +extern const size_t mbedtls_test_ca_pwd_ec_len; +extern const size_t mbedtls_test_ca_key_rsa_len; +extern const size_t mbedtls_test_ca_pwd_rsa_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha1_len; +extern const size_t mbedtls_test_ca_crt_rsa_sha256_len; + +/* Config-dependent dispatch between SHA-1 and SHA-256 + * (SHA-256 if enabled, otherwise SHA-1) */ + +extern const char mbedtls_test_ca_crt_rsa[]; +extern const size_t mbedtls_test_ca_crt_rsa_len; + +/* Config-dependent dispatch between EC and RSA + * (RSA if enabled, otherwise EC) */ + extern const char * mbedtls_test_ca_crt; -extern const size_t mbedtls_test_ca_crt_len; extern const char * mbedtls_test_ca_key; -extern const size_t mbedtls_test_ca_key_len; extern const char * mbedtls_test_ca_pwd; +extern const size_t mbedtls_test_ca_crt_len; +extern const size_t mbedtls_test_ca_key_len; extern const size_t mbedtls_test_ca_pwd_len; + +/* + * Server test certificates + */ + +extern const char mbedtls_test_srv_crt_ec_pem[]; +extern const char mbedtls_test_srv_key_ec_pem[]; +extern const char mbedtls_test_srv_pwd_ec_pem[]; +extern const char mbedtls_test_srv_key_rsa_pem[]; +extern const char mbedtls_test_srv_pwd_rsa_pem[]; +extern const char mbedtls_test_srv_crt_rsa_sha1_pem[]; +extern const char mbedtls_test_srv_crt_rsa_sha256_pem[]; + +extern const unsigned char mbedtls_test_srv_crt_ec_der[]; +extern const unsigned char mbedtls_test_srv_key_ec_der[]; +extern const unsigned char mbedtls_test_srv_key_rsa_der[]; +extern const unsigned char mbedtls_test_srv_crt_rsa_sha1_der[]; +extern const unsigned char mbedtls_test_srv_crt_rsa_sha256_der[]; + +extern const size_t mbedtls_test_srv_crt_ec_pem_len; +extern const size_t mbedtls_test_srv_key_ec_pem_len; +extern const size_t mbedtls_test_srv_pwd_ec_pem_len; +extern const size_t mbedtls_test_srv_key_rsa_pem_len; +extern const size_t mbedtls_test_srv_pwd_rsa_pem_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha1_pem_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha256_pem_len; + +extern const size_t mbedtls_test_srv_crt_ec_der_len; +extern const size_t mbedtls_test_srv_key_ec_der_len; +extern const size_t mbedtls_test_srv_pwd_ec_der_len; +extern const size_t mbedtls_test_srv_key_rsa_der_len; +extern const size_t mbedtls_test_srv_pwd_rsa_der_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha1_der_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha256_der_len; + +/* Config-dependent dispatch between PEM and DER encoding + * (PEM if enabled, otherwise DER) */ + +extern const char mbedtls_test_srv_crt_ec[]; +extern const char mbedtls_test_srv_key_ec[]; +extern const char mbedtls_test_srv_pwd_ec[]; +extern const char mbedtls_test_srv_key_rsa[]; +extern const char mbedtls_test_srv_pwd_rsa[]; +extern const char mbedtls_test_srv_crt_rsa_sha1[]; +extern const char mbedtls_test_srv_crt_rsa_sha256[]; + +extern const size_t mbedtls_test_srv_crt_ec_len; +extern const size_t mbedtls_test_srv_key_ec_len; +extern const size_t mbedtls_test_srv_pwd_ec_len; +extern const size_t mbedtls_test_srv_key_rsa_len; +extern const size_t mbedtls_test_srv_pwd_rsa_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha1_len; +extern const size_t mbedtls_test_srv_crt_rsa_sha256_len; + +/* Config-dependent dispatch between SHA-1 and SHA-256 + * (SHA-256 if enabled, otherwise SHA-1) */ + +extern const char mbedtls_test_srv_crt_rsa[]; +extern const size_t mbedtls_test_srv_crt_rsa_len; + +/* Config-dependent dispatch between EC and RSA + * (RSA if enabled, otherwise EC) */ + extern const char * mbedtls_test_srv_crt; -extern const size_t mbedtls_test_srv_crt_len; extern const char * mbedtls_test_srv_key; +extern const char * mbedtls_test_srv_pwd; +extern const size_t mbedtls_test_srv_crt_len; extern const size_t mbedtls_test_srv_key_len; -extern const char * mbedtls_test_cli_crt; -extern const size_t mbedtls_test_cli_crt_len; -extern const char * mbedtls_test_cli_key; -extern const size_t mbedtls_test_cli_key_len; +extern const size_t mbedtls_test_srv_pwd_len; + +/* + * Client test certificates + */ + +extern const char mbedtls_test_cli_crt_ec_pem[]; +extern const char mbedtls_test_cli_key_ec_pem[]; +extern const char mbedtls_test_cli_pwd_ec_pem[]; +extern const char mbedtls_test_cli_key_rsa_pem[]; +extern const char mbedtls_test_cli_pwd_rsa_pem[]; +extern const char mbedtls_test_cli_crt_rsa_pem[]; + +extern const unsigned char mbedtls_test_cli_crt_ec_der[]; +extern const unsigned char mbedtls_test_cli_key_ec_der[]; +extern const unsigned char mbedtls_test_cli_key_rsa_der[]; +extern const unsigned char mbedtls_test_cli_crt_rsa_der[]; + +extern const size_t mbedtls_test_cli_crt_ec_pem_len; +extern const size_t mbedtls_test_cli_key_ec_pem_len; +extern const size_t mbedtls_test_cli_pwd_ec_pem_len; +extern const size_t mbedtls_test_cli_key_rsa_pem_len; +extern const size_t mbedtls_test_cli_pwd_rsa_pem_len; +extern const size_t mbedtls_test_cli_crt_rsa_pem_len; + +extern const size_t mbedtls_test_cli_crt_ec_der_len; +extern const size_t mbedtls_test_cli_key_ec_der_len; +extern const size_t mbedtls_test_cli_key_rsa_der_len; +extern const size_t mbedtls_test_cli_crt_rsa_der_len; + +/* Config-dependent dispatch between PEM and DER encoding + * (PEM if enabled, otherwise DER) */ + +extern const char mbedtls_test_cli_crt_ec[]; +extern const char mbedtls_test_cli_key_ec[]; +extern const char mbedtls_test_cli_pwd_ec[]; +extern const char mbedtls_test_cli_key_rsa[]; +extern const char mbedtls_test_cli_pwd_rsa[]; +extern const char mbedtls_test_cli_crt_rsa[]; -#if defined(MBEDTLS_ECDSA_C) -extern const char mbedtls_test_ca_crt_ec[]; -extern const size_t mbedtls_test_ca_crt_ec_len; -extern const char mbedtls_test_ca_key_ec[]; -extern const size_t mbedtls_test_ca_key_ec_len; -extern const char mbedtls_test_ca_pwd_ec[]; -extern const size_t mbedtls_test_ca_pwd_ec_len; -extern const char mbedtls_test_srv_crt_ec[]; -extern const size_t mbedtls_test_srv_crt_ec_len; -extern const char mbedtls_test_srv_key_ec[]; -extern const size_t mbedtls_test_srv_key_ec_len; -extern const char mbedtls_test_cli_crt_ec[]; extern const size_t mbedtls_test_cli_crt_ec_len; -extern const char mbedtls_test_cli_key_ec[]; extern const size_t mbedtls_test_cli_key_ec_len; -#endif - -#if defined(MBEDTLS_RSA_C) -extern const char mbedtls_test_ca_crt_rsa[]; -extern const size_t mbedtls_test_ca_crt_rsa_len; -extern const char mbedtls_test_ca_key_rsa[]; -extern const size_t mbedtls_test_ca_key_rsa_len; -extern const char mbedtls_test_ca_pwd_rsa[]; -extern const size_t mbedtls_test_ca_pwd_rsa_len; -extern const char mbedtls_test_srv_crt_rsa[]; -extern const size_t mbedtls_test_srv_crt_rsa_len; -extern const char mbedtls_test_srv_key_rsa[]; -extern const size_t mbedtls_test_srv_key_rsa_len; -extern const char mbedtls_test_cli_crt_rsa[]; -extern const size_t mbedtls_test_cli_crt_rsa_len; -extern const char mbedtls_test_cli_key_rsa[]; +extern const size_t mbedtls_test_cli_pwd_ec_len; extern const size_t mbedtls_test_cli_key_rsa_len; -#endif +extern const size_t mbedtls_test_cli_pwd_rsa_len; +extern const size_t mbedtls_test_cli_crt_rsa_len; + +/* Config-dependent dispatch between EC and RSA + * (RSA if enabled, otherwise EC) */ + +extern const char * mbedtls_test_cli_crt; +extern const char * mbedtls_test_cli_key; +extern const char * mbedtls_test_cli_pwd; +extern const size_t mbedtls_test_cli_crt_len; +extern const size_t mbedtls_test_cli_key_len; +extern const size_t mbedtls_test_cli_pwd_len; #ifdef __cplusplus } diff --git a/thirdparty/mbedtls/include/mbedtls/cipher.h b/thirdparty/mbedtls/include/mbedtls/cipher.h index 922b6c32c6..082a691741 100644 --- a/thirdparty/mbedtls/include/mbedtls/cipher.h +++ b/thirdparty/mbedtls/include/mbedtls/cipher.h @@ -36,7 +36,7 @@ #endif #include <stddef.h> -#include "mbedtls/platform_util.h" +#include "platform_util.h" #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) #define MBEDTLS_CIPHER_MODE_AEAD diff --git a/thirdparty/mbedtls/include/mbedtls/cmac.h b/thirdparty/mbedtls/include/mbedtls/cmac.h index c196793531..9d42b3f209 100644 --- a/thirdparty/mbedtls/include/mbedtls/cmac.h +++ b/thirdparty/mbedtls/include/mbedtls/cmac.h @@ -28,6 +28,12 @@ #ifndef MBEDTLS_CMAC_H #define MBEDTLS_CMAC_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "cipher.h" #ifdef __cplusplus diff --git a/thirdparty/mbedtls/include/mbedtls/compat-1.3.h b/thirdparty/mbedtls/include/mbedtls/compat-1.3.h index 213b691403..a58b47243d 100644 --- a/thirdparty/mbedtls/include/mbedtls/compat-1.3.h +++ b/thirdparty/mbedtls/include/mbedtls/compat-1.3.h @@ -25,6 +25,12 @@ * This file is part of mbed TLS (https://tls.mbed.org) */ +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) diff --git a/thirdparty/mbedtls/include/mbedtls/config.h b/thirdparty/mbedtls/include/mbedtls/config.h index 51d66291a5..e16e1e53d3 100644 --- a/thirdparty/mbedtls/include/mbedtls/config.h +++ b/thirdparty/mbedtls/include/mbedtls/config.h @@ -687,6 +687,26 @@ #define MBEDTLS_REMOVE_ARC4_CIPHERSUITES /** + * \def MBEDTLS_REMOVE_3DES_CIPHERSUITES + * + * Remove 3DES ciphersuites by default in SSL / TLS. + * This flag removes the ciphersuites based on 3DES from the default list as + * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible + * to enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including + * them explicitly. + * + * A man-in-the-browser attacker can recover authentication tokens sent through + * a TLS connection using a 3DES based cipher suite (see "On the Practical + * (In-)Security of 64-bit Block Ciphers" by Karthikeyan Bhargavan and Gaëtan + * Leurent, see https://sweet32.info/SWEET32_CCS16.pdf). If this attack falls + * in your threat model or you are unsure, then you should keep this option + * enabled to remove 3DES based cipher suites. + * + * Comment this macro to keep 3DES in the default ciphersuite list. + */ +#define MBEDTLS_REMOVE_3DES_CIPHERSUITES + +/** * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED * * MBEDTLS_ECP_XXXX_ENABLED: Enables specific curves within the Elliptic Curve @@ -1622,7 +1642,9 @@ * * Uncomment this to enable pthread mutexes. */ +// -- GODOT start -- //#define MBEDTLS_THREADING_PTHREAD +// -- GODOT end -- /** * \def MBEDTLS_VERSION_FEATURES @@ -2816,7 +2838,9 @@ * * Enable this layer to allow use of mutexes within mbed TLS */ +// -- GODOT start -- //#define MBEDTLS_THREADING_C +// -- GODOT end -- /** * \def MBEDTLS_TIMING_C diff --git a/thirdparty/mbedtls/include/mbedtls/ctr_drbg.h b/thirdparty/mbedtls/include/mbedtls/ctr_drbg.h index 10f9389d9f..cc3df7b113 100644 --- a/thirdparty/mbedtls/include/mbedtls/ctr_drbg.h +++ b/thirdparty/mbedtls/include/mbedtls/ctr_drbg.h @@ -36,6 +36,12 @@ #ifndef MBEDTLS_CTR_DRBG_H #define MBEDTLS_CTR_DRBG_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "aes.h" #if defined(MBEDTLS_THREADING_C) @@ -350,6 +356,8 @@ int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief The CTR_DRBG checkup routine. * @@ -358,6 +366,8 @@ int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char */ int mbedtls_ctr_drbg_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + /* Internal functions (do not call directly) */ int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *, int (*)(void *, unsigned char *, size_t), void *, diff --git a/thirdparty/mbedtls/include/mbedtls/des.h b/thirdparty/mbedtls/include/mbedtls/des.h index d62042d14e..54e6b7894b 100644 --- a/thirdparty/mbedtls/include/mbedtls/des.h +++ b/thirdparty/mbedtls/include/mbedtls/des.h @@ -338,6 +338,8 @@ int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx, void mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -345,6 +347,8 @@ void mbedtls_des_setkey( uint32_t SK[32], */ int mbedtls_des_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/dhm.h b/thirdparty/mbedtls/include/mbedtls/dhm.h index a5452c199a..2909f5fbc8 100644 --- a/thirdparty/mbedtls/include/mbedtls/dhm.h +++ b/thirdparty/mbedtls/include/mbedtls/dhm.h @@ -334,6 +334,8 @@ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ); #endif /* MBEDTLS_FS_IO */ #endif /* MBEDTLS_ASN1_PARSE_C */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief The DMH checkup routine. * @@ -342,6 +344,7 @@ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ); */ int mbedtls_dhm_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/ecdh.h b/thirdparty/mbedtls/include/mbedtls/ecdh.h index 05b2b03970..4479a1d46f 100644 --- a/thirdparty/mbedtls/include/mbedtls/ecdh.h +++ b/thirdparty/mbedtls/include/mbedtls/ecdh.h @@ -34,6 +34,12 @@ #ifndef MBEDTLS_ECDH_H #define MBEDTLS_ECDH_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "ecp.h" /* diff --git a/thirdparty/mbedtls/include/mbedtls/ecdsa.h b/thirdparty/mbedtls/include/mbedtls/ecdsa.h index 40fdab3729..f8b28507c2 100644 --- a/thirdparty/mbedtls/include/mbedtls/ecdsa.h +++ b/thirdparty/mbedtls/include/mbedtls/ecdsa.h @@ -32,6 +32,12 @@ #ifndef MBEDTLS_ECDSA_H #define MBEDTLS_ECDSA_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "ecp.h" #include "md.h" diff --git a/thirdparty/mbedtls/include/mbedtls/ecjpake.h b/thirdparty/mbedtls/include/mbedtls/ecjpake.h index b967af8385..3d8d02ae64 100644 --- a/thirdparty/mbedtls/include/mbedtls/ecjpake.h +++ b/thirdparty/mbedtls/include/mbedtls/ecjpake.h @@ -40,6 +40,11 @@ * The payloads are serialized in a way suitable for use in TLS, but could * also be use outside TLS. */ +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif #include "ecp.h" #include "md.h" diff --git a/thirdparty/mbedtls/include/mbedtls/ecp.h b/thirdparty/mbedtls/include/mbedtls/ecp.h index de3a343cb6..065a4cc0b9 100644 --- a/thirdparty/mbedtls/include/mbedtls/ecp.h +++ b/thirdparty/mbedtls/include/mbedtls/ecp.h @@ -36,6 +36,12 @@ #ifndef MBEDTLS_ECP_H #define MBEDTLS_ECP_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "bignum.h" /* @@ -189,6 +195,68 @@ typedef struct mbedtls_ecp_group } mbedtls_ecp_group; +/** + * \name SECTION: Module settings + * + * The configuration options you can set for this module are in this section. + * Either change them in config.h, or define them using the compiler command line. + * \{ + */ + +#if !defined(MBEDTLS_ECP_MAX_BITS) +/** + * The maximum size of the groups, that is, of \c N and \c P. + */ +#define MBEDTLS_ECP_MAX_BITS 521 /**< The maximum size of groups, in bits. */ +#endif + +#define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 ) +#define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 ) + +#if !defined(MBEDTLS_ECP_WINDOW_SIZE) +/* + * Maximum "window" size used for point multiplication. + * Default: 6. + * Minimum value: 2. Maximum value: 7. + * + * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) + * points used for point multiplication. This value is directly tied to EC + * peak memory usage, so decreasing it by one should roughly cut memory usage + * by two (if large curves are in use). + * + * Reduction in size may reduce speed, but larger curves are impacted first. + * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): + * w-size: 6 5 4 3 2 + * 521 145 141 135 120 97 + * 384 214 209 198 177 146 + * 256 320 320 303 262 226 + * 224 475 475 453 398 342 + * 192 640 640 633 587 476 + */ +#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< The maximum window size used. */ +#endif /* MBEDTLS_ECP_WINDOW_SIZE */ + +#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM) +/* + * Trade memory for speed on fixed-point multiplication. + * + * This speeds up repeated multiplication of the generator (that is, the + * multiplication in ECDSA signatures, and half of the multiplications in + * ECDSA verification and ECDHE) by a factor roughly 3 to 4. + * + * The cost is increasing EC peak memory usage by a factor roughly 2. + * + * Change this value to 0 to reduce peak memory usage. + */ +#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up. */ +#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */ + +/* \} name SECTION: Module settings */ + +#else /* MBEDTLS_ECP_ALT */ +#include "ecp_alt.h" +#endif /* MBEDTLS_ECP_ALT */ + #if defined(MBEDTLS_ECP_RESTARTABLE) /** @@ -254,68 +322,6 @@ typedef void mbedtls_ecp_restart_ctx; #endif /* MBEDTLS_ECP_RESTARTABLE */ /** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h, or define them using the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_ECP_MAX_BITS) -/** - * The maximum size of the groups, that is, of \c N and \c P. - */ -#define MBEDTLS_ECP_MAX_BITS 521 /**< The maximum size of groups, in bits. */ -#endif - -#define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 ) -#define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 ) - -#if !defined(MBEDTLS_ECP_WINDOW_SIZE) -/* - * Maximum "window" size used for point multiplication. - * Default: 6. - * Minimum value: 2. Maximum value: 7. - * - * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) - * points used for point multiplication. This value is directly tied to EC - * peak memory usage, so decreasing it by one should roughly cut memory usage - * by two (if large curves are in use). - * - * Reduction in size may reduce speed, but larger curves are impacted first. - * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): - * w-size: 6 5 4 3 2 - * 521 145 141 135 120 97 - * 384 214 209 198 177 146 - * 256 320 320 303 262 226 - * 224 475 475 453 398 342 - * 192 640 640 633 587 476 - */ -#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< The maximum window size used. */ -#endif /* MBEDTLS_ECP_WINDOW_SIZE */ - -#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM) -/* - * Trade memory for speed on fixed-point multiplication. - * - * This speeds up repeated multiplication of the generator (that is, the - * multiplication in ECDSA signatures, and half of the multiplications in - * ECDSA verification and ECDHE) by a factor roughly 3 to 4. - * - * The cost is increasing EC peak memory usage by a factor roughly 2. - * - * Change this value to 0 to reduce peak memory usage. - */ -#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up. */ -#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */ - -/* \} name SECTION: Module settings */ - -#else /* MBEDTLS_ECP_ALT */ -#include "ecp_alt.h" -#endif /* MBEDTLS_ECP_ALT */ - -/** * \brief The ECP key-pair structure. * * A generic key-pair that may be used for ECDSA and fixed ECDH, for example. @@ -476,7 +482,7 @@ void mbedtls_ecp_point_init( mbedtls_ecp_point *pt ); * * \note After this function is called, domain parameters * for various ECP groups can be loaded through the - * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group() + * mbedtls_ecp_group_load() or mbedtls_ecp_tls_read_group() * functions. */ void mbedtls_ecp_group_init( mbedtls_ecp_group *grp ); diff --git a/thirdparty/mbedtls/include/mbedtls/ecp_internal.h b/thirdparty/mbedtls/include/mbedtls/ecp_internal.h index 18040697ad..7625ed48e1 100644 --- a/thirdparty/mbedtls/include/mbedtls/ecp_internal.h +++ b/thirdparty/mbedtls/include/mbedtls/ecp_internal.h @@ -61,6 +61,12 @@ #ifndef MBEDTLS_ECP_INTERNAL_H #define MBEDTLS_ECP_INTERNAL_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #if defined(MBEDTLS_ECP_INTERNAL_ALT) /** diff --git a/thirdparty/mbedtls/include/mbedtls/error.h b/thirdparty/mbedtls/include/mbedtls/error.h index 647a11a566..bee0fe485a 100644 --- a/thirdparty/mbedtls/include/mbedtls/error.h +++ b/thirdparty/mbedtls/include/mbedtls/error.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_ERROR_H #define MBEDTLS_ERROR_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include <stddef.h> /** diff --git a/thirdparty/mbedtls/include/mbedtls/gcm.h b/thirdparty/mbedtls/include/mbedtls/gcm.h index fccabb0d97..fd130abd7c 100644 --- a/thirdparty/mbedtls/include/mbedtls/gcm.h +++ b/thirdparty/mbedtls/include/mbedtls/gcm.h @@ -33,6 +33,12 @@ #ifndef MBEDTLS_GCM_H #define MBEDTLS_GCM_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "cipher.h" #include <stdint.h> @@ -300,6 +306,8 @@ int mbedtls_gcm_finish( mbedtls_gcm_context *ctx, */ void mbedtls_gcm_free( mbedtls_gcm_context *ctx ); +#if defined(MBEDTLS_SELF_TEST) + /** * \brief The GCM checkup routine. * @@ -308,6 +316,8 @@ void mbedtls_gcm_free( mbedtls_gcm_context *ctx ); */ int mbedtls_gcm_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/havege.h b/thirdparty/mbedtls/include/mbedtls/havege.h index 57e8c40943..4c1c86087a 100644 --- a/thirdparty/mbedtls/include/mbedtls/havege.h +++ b/thirdparty/mbedtls/include/mbedtls/havege.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_HAVEGE_H #define MBEDTLS_HAVEGE_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include <stddef.h> #define MBEDTLS_HAVEGE_COLLECT_SIZE 1024 diff --git a/thirdparty/mbedtls/include/mbedtls/hkdf.h b/thirdparty/mbedtls/include/mbedtls/hkdf.h index e6ed7cde97..40ee64eb03 100644 --- a/thirdparty/mbedtls/include/mbedtls/hkdf.h +++ b/thirdparty/mbedtls/include/mbedtls/hkdf.h @@ -27,6 +27,12 @@ #ifndef MBEDTLS_HKDF_H #define MBEDTLS_HKDF_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "md.h" /** diff --git a/thirdparty/mbedtls/include/mbedtls/hmac_drbg.h b/thirdparty/mbedtls/include/mbedtls/hmac_drbg.h index 146367b9de..7eae32bbd6 100644 --- a/thirdparty/mbedtls/include/mbedtls/hmac_drbg.h +++ b/thirdparty/mbedtls/include/mbedtls/hmac_drbg.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_HMAC_DRBG_H #define MBEDTLS_HMAC_DRBG_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "md.h" #if defined(MBEDTLS_THREADING_C) diff --git a/thirdparty/mbedtls/include/mbedtls/md2.h b/thirdparty/mbedtls/include/mbedtls/md2.h index f9bd98f804..fe97cf08d4 100644 --- a/thirdparty/mbedtls/include/mbedtls/md2.h +++ b/thirdparty/mbedtls/include/mbedtls/md2.h @@ -283,6 +283,8 @@ MBEDTLS_DEPRECATED void mbedtls_md2( const unsigned char *input, #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -295,6 +297,8 @@ MBEDTLS_DEPRECATED void mbedtls_md2( const unsigned char *input, */ int mbedtls_md2_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/md4.h b/thirdparty/mbedtls/include/mbedtls/md4.h index dc3c048949..ce703c0ba4 100644 --- a/thirdparty/mbedtls/include/mbedtls/md4.h +++ b/thirdparty/mbedtls/include/mbedtls/md4.h @@ -288,6 +288,8 @@ MBEDTLS_DEPRECATED void mbedtls_md4( const unsigned char *input, #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -300,6 +302,8 @@ MBEDTLS_DEPRECATED void mbedtls_md4( const unsigned char *input, */ int mbedtls_md4_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/md5.h b/thirdparty/mbedtls/include/mbedtls/md5.h index 6c3354fd30..6eed6cc864 100644 --- a/thirdparty/mbedtls/include/mbedtls/md5.h +++ b/thirdparty/mbedtls/include/mbedtls/md5.h @@ -288,6 +288,8 @@ MBEDTLS_DEPRECATED void mbedtls_md5( const unsigned char *input, #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -300,6 +302,8 @@ MBEDTLS_DEPRECATED void mbedtls_md5( const unsigned char *input, */ int mbedtls_md5_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/net.h b/thirdparty/mbedtls/include/mbedtls/net.h index 6c13b53fb9..8cead58e5d 100644 --- a/thirdparty/mbedtls/include/mbedtls/net.h +++ b/thirdparty/mbedtls/include/mbedtls/net.h @@ -23,6 +23,11 @@ * * This file is part of mbed TLS (https://tls.mbed.org) */ +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif #if !defined(MBEDTLS_DEPRECATED_REMOVED) #include "net_sockets.h" diff --git a/thirdparty/mbedtls/include/mbedtls/nist_kw.h b/thirdparty/mbedtls/include/mbedtls/nist_kw.h index 5a0f656a8f..3b67b59cd2 100644 --- a/thirdparty/mbedtls/include/mbedtls/nist_kw.h +++ b/thirdparty/mbedtls/include/mbedtls/nist_kw.h @@ -37,6 +37,12 @@ #ifndef MBEDTLS_NIST_KW_H #define MBEDTLS_NIST_KW_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "cipher.h" #ifdef __cplusplus diff --git a/thirdparty/mbedtls/include/mbedtls/padlock.h b/thirdparty/mbedtls/include/mbedtls/padlock.h index 7a5d083a95..721a5d4930 100644 --- a/thirdparty/mbedtls/include/mbedtls/padlock.h +++ b/thirdparty/mbedtls/include/mbedtls/padlock.h @@ -28,6 +28,12 @@ #ifndef MBEDTLS_PADLOCK_H #define MBEDTLS_PADLOCK_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "aes.h" #define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ @@ -53,7 +59,7 @@ #define MBEDTLS_PADLOCK_PHE 0x0C00 #define MBEDTLS_PADLOCK_PMM 0x3000 -#define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) x & ~15)) +#define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) (x) & ~15)) #ifdef __cplusplus extern "C" { diff --git a/thirdparty/mbedtls/include/mbedtls/pem.h b/thirdparty/mbedtls/include/mbedtls/pem.h index fa82f7bdbd..a29e9ce300 100644 --- a/thirdparty/mbedtls/include/mbedtls/pem.h +++ b/thirdparty/mbedtls/include/mbedtls/pem.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_PEM_H #define MBEDTLS_PEM_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include <stddef.h> /** diff --git a/thirdparty/mbedtls/include/mbedtls/pkcs12.h b/thirdparty/mbedtls/include/mbedtls/pkcs12.h index 69f04177c8..d441357b7f 100644 --- a/thirdparty/mbedtls/include/mbedtls/pkcs12.h +++ b/thirdparty/mbedtls/include/mbedtls/pkcs12.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_PKCS12_H #define MBEDTLS_PKCS12_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "md.h" #include "cipher.h" #include "asn1.h" diff --git a/thirdparty/mbedtls/include/mbedtls/pkcs5.h b/thirdparty/mbedtls/include/mbedtls/pkcs5.h index d4bb36dfae..c92185f7a6 100644 --- a/thirdparty/mbedtls/include/mbedtls/pkcs5.h +++ b/thirdparty/mbedtls/include/mbedtls/pkcs5.h @@ -26,6 +26,12 @@ #ifndef MBEDTLS_PKCS5_H #define MBEDTLS_PKCS5_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "asn1.h" #include "md.h" @@ -85,6 +91,8 @@ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *p unsigned int iteration_count, uint32_t key_length, unsigned char *output ); +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -92,6 +100,8 @@ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *p */ int mbedtls_pkcs5_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/platform_util.h b/thirdparty/mbedtls/include/mbedtls/platform_util.h index b0e72ad149..dba6d45982 100644 --- a/thirdparty/mbedtls/include/mbedtls/platform_util.h +++ b/thirdparty/mbedtls/include/mbedtls/platform_util.h @@ -26,14 +26,14 @@ #define MBEDTLS_PLATFORM_UTIL_H #if !defined(MBEDTLS_CONFIG_FILE) -#include "mbedtls/config.h" +#include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include <stddef.h> #if defined(MBEDTLS_HAVE_TIME_DATE) -#include "mbedtls/platform_time.h" +#include "platform_time.h" #include <time.h> #endif /* MBEDTLS_HAVE_TIME_DATE */ diff --git a/thirdparty/mbedtls/include/mbedtls/poly1305.h b/thirdparty/mbedtls/include/mbedtls/poly1305.h index 05866a2da6..f0ec44c968 100644 --- a/thirdparty/mbedtls/include/mbedtls/poly1305.h +++ b/thirdparty/mbedtls/include/mbedtls/poly1305.h @@ -34,7 +34,7 @@ #define MBEDTLS_POLY1305_H #if !defined(MBEDTLS_CONFIG_FILE) -#include "mbedtls/config.h" +#include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif diff --git a/thirdparty/mbedtls/include/mbedtls/ripemd160.h b/thirdparty/mbedtls/include/mbedtls/ripemd160.h index c74b7d2c6c..b42f6d2a95 100644 --- a/thirdparty/mbedtls/include/mbedtls/ripemd160.h +++ b/thirdparty/mbedtls/include/mbedtls/ripemd160.h @@ -219,6 +219,8 @@ MBEDTLS_DEPRECATED void mbedtls_ripemd160( const unsigned char *input, #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -226,6 +228,8 @@ MBEDTLS_DEPRECATED void mbedtls_ripemd160( const unsigned char *input, */ int mbedtls_ripemd160_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/rsa.h b/thirdparty/mbedtls/include/mbedtls/rsa.h index ed65a34452..906c427332 100644 --- a/thirdparty/mbedtls/include/mbedtls/rsa.h +++ b/thirdparty/mbedtls/include/mbedtls/rsa.h @@ -1252,6 +1252,8 @@ int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src ) */ void mbedtls_rsa_free( mbedtls_rsa_context *ctx ); +#if defined(MBEDTLS_SELF_TEST) + /** * \brief The RSA checkup routine. * @@ -1260,6 +1262,8 @@ void mbedtls_rsa_free( mbedtls_rsa_context *ctx ); */ int mbedtls_rsa_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/sha1.h b/thirdparty/mbedtls/include/mbedtls/sha1.h index 38ea10b137..bb6ecf05a4 100644 --- a/thirdparty/mbedtls/include/mbedtls/sha1.h +++ b/thirdparty/mbedtls/include/mbedtls/sha1.h @@ -328,6 +328,8 @@ MBEDTLS_DEPRECATED void mbedtls_sha1( const unsigned char *input, #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief The SHA-1 checkup routine. * @@ -341,6 +343,8 @@ MBEDTLS_DEPRECATED void mbedtls_sha1( const unsigned char *input, */ int mbedtls_sha1_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/sha256.h b/thirdparty/mbedtls/include/mbedtls/sha256.h index 0e42f0abba..d64739820c 100644 --- a/thirdparty/mbedtls/include/mbedtls/sha256.h +++ b/thirdparty/mbedtls/include/mbedtls/sha256.h @@ -278,6 +278,8 @@ MBEDTLS_DEPRECATED void mbedtls_sha256( const unsigned char *input, #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief The SHA-224 and SHA-256 checkup routine. * @@ -286,6 +288,8 @@ MBEDTLS_DEPRECATED void mbedtls_sha256( const unsigned char *input, */ int mbedtls_sha256_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/include/mbedtls/sha512.h b/thirdparty/mbedtls/include/mbedtls/sha512.h index 7b26cf5cc3..c06ceed1d1 100644 --- a/thirdparty/mbedtls/include/mbedtls/sha512.h +++ b/thirdparty/mbedtls/include/mbedtls/sha512.h @@ -253,6 +253,7 @@ int mbedtls_sha512_ret( const unsigned char *input, #else #define MBEDTLS_DEPRECATED #endif + /** * \brief This function calculates the SHA-512 or SHA-384 * checksum of a buffer. @@ -280,6 +281,9 @@ MBEDTLS_DEPRECATED void mbedtls_sha512( const unsigned char *input, #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ + +#if defined(MBEDTLS_SELF_TEST) + /** * \brief The SHA-384 or SHA-512 checkup routine. * @@ -287,6 +291,7 @@ MBEDTLS_DEPRECATED void mbedtls_sha512( const unsigned char *input, * \return \c 1 on failure. */ int mbedtls_sha512_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } diff --git a/thirdparty/mbedtls/include/mbedtls/ssl.h b/thirdparty/mbedtls/include/mbedtls/ssl.h index 8106bb4ab0..d31f6cdd56 100644 --- a/thirdparty/mbedtls/include/mbedtls/ssl.h +++ b/thirdparty/mbedtls/include/mbedtls/ssl.h @@ -2532,22 +2532,28 @@ void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf, #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) /** - * \brief Set the maximum fragment length to emit and/or negotiate - * (Default: the smaller of MBEDTLS_SSL_IN_CONTENT_LEN and - * MBEDTLS_SSL_OUT_CONTENT_LEN, usually 2^14 bytes) + * \brief Set the maximum fragment length to emit and/or negotiate. + * (Typical: the smaller of #MBEDTLS_SSL_IN_CONTENT_LEN and + * #MBEDTLS_SSL_OUT_CONTENT_LEN, usually `2^14` bytes) * (Server: set maximum fragment length to emit, - * usually negotiated by the client during handshake + * usually negotiated by the client during handshake) * (Client: set maximum fragment length to emit *and* * negotiate with the server during handshake) + * (Default: #MBEDTLS_SSL_MAX_FRAG_LEN_NONE) * - * \note With TLS, this currently only affects ApplicationData (sent - * with \c mbedtls_ssl_read()), not handshake messages. - * With DTLS, this affects both ApplicationData and handshake. + * \note On the client side, the maximum fragment length extension + * *will not* be used, unless the maximum fragment length has + * been set via this function to a value different than + * #MBEDTLS_SSL_MAX_FRAG_LEN_NONE. * * \note This sets the maximum length for a record's payload, * excluding record overhead that will be added to it, see * \c mbedtls_ssl_get_record_expansion(). * + * \note With TLS, this currently only affects ApplicationData (sent + * with \c mbedtls_ssl_read()), not handshake messages. + * With DTLS, this affects both ApplicationData and handshake. + * * \note For DTLS, it is also possible to set a limit for the total * size of daragrams passed to the transport layer, including * record overhead, see \c mbedtls_ssl_set_mtu(). diff --git a/thirdparty/mbedtls/include/mbedtls/ssl_cache.h b/thirdparty/mbedtls/include/mbedtls/ssl_cache.h index ec081e6d24..52ba0948c5 100644 --- a/thirdparty/mbedtls/include/mbedtls/ssl_cache.h +++ b/thirdparty/mbedtls/include/mbedtls/ssl_cache.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_SSL_CACHE_H #define MBEDTLS_SSL_CACHE_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "ssl.h" #if defined(MBEDTLS_THREADING_C) diff --git a/thirdparty/mbedtls/include/mbedtls/ssl_ciphersuites.h b/thirdparty/mbedtls/include/mbedtls/ssl_ciphersuites.h index cda8b4835b..71053e5ba7 100644 --- a/thirdparty/mbedtls/include/mbedtls/ssl_ciphersuites.h +++ b/thirdparty/mbedtls/include/mbedtls/ssl_ciphersuites.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_SSL_CIPHERSUITES_H #define MBEDTLS_SSL_CIPHERSUITES_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "pk.h" #include "cipher.h" #include "md.h" diff --git a/thirdparty/mbedtls/include/mbedtls/ssl_cookie.h b/thirdparty/mbedtls/include/mbedtls/ssl_cookie.h index 6a0ad4fa96..e34760ae85 100644 --- a/thirdparty/mbedtls/include/mbedtls/ssl_cookie.h +++ b/thirdparty/mbedtls/include/mbedtls/ssl_cookie.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_SSL_COOKIE_H #define MBEDTLS_SSL_COOKIE_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "ssl.h" #if defined(MBEDTLS_THREADING_C) diff --git a/thirdparty/mbedtls/include/mbedtls/ssl_internal.h b/thirdparty/mbedtls/include/mbedtls/ssl_internal.h index 97abb9f90b..bd5ad94dbf 100644 --- a/thirdparty/mbedtls/include/mbedtls/ssl_internal.h +++ b/thirdparty/mbedtls/include/mbedtls/ssl_internal.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_SSL_INTERNAL_H #define MBEDTLS_SSL_INTERNAL_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + #include "ssl.h" #include "cipher.h" diff --git a/thirdparty/mbedtls/include/mbedtls/ssl_ticket.h b/thirdparty/mbedtls/include/mbedtls/ssl_ticket.h index b2686df09f..a84e7816e4 100644 --- a/thirdparty/mbedtls/include/mbedtls/ssl_ticket.h +++ b/thirdparty/mbedtls/include/mbedtls/ssl_ticket.h @@ -24,6 +24,12 @@ #ifndef MBEDTLS_SSL_TICKET_H #define MBEDTLS_SSL_TICKET_H +#if !defined(MBEDTLS_CONFIG_FILE) +#include "config.h" +#else +#include MBEDTLS_CONFIG_FILE +#endif + /* * This implementation of the session ticket callbacks includes key * management, rotating the keys periodically in order to preserve forward diff --git a/thirdparty/mbedtls/include/mbedtls/version.h b/thirdparty/mbedtls/include/mbedtls/version.h index 56e7398a2a..ef8e4c1f4f 100644 --- a/thirdparty/mbedtls/include/mbedtls/version.h +++ b/thirdparty/mbedtls/include/mbedtls/version.h @@ -40,16 +40,16 @@ */ #define MBEDTLS_VERSION_MAJOR 2 #define MBEDTLS_VERSION_MINOR 16 -#define MBEDTLS_VERSION_PATCH 0 +#define MBEDTLS_VERSION_PATCH 2 /** * The single version number has the following structure: * MMNNPP00 * Major version | Minor version | Patch version */ -#define MBEDTLS_VERSION_NUMBER 0x02100000 -#define MBEDTLS_VERSION_STRING "2.16.0" -#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.16.0" +#define MBEDTLS_VERSION_NUMBER 0x02100200 +#define MBEDTLS_VERSION_STRING "2.16.2" +#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.16.2" #if defined(MBEDTLS_VERSION_C) diff --git a/thirdparty/mbedtls/include/mbedtls/x509.h b/thirdparty/mbedtls/include/mbedtls/x509.h index d6db9c6e37..9ae825c183 100644 --- a/thirdparty/mbedtls/include/mbedtls/x509.h +++ b/thirdparty/mbedtls/include/mbedtls/x509.h @@ -269,6 +269,8 @@ int mbedtls_x509_time_is_past( const mbedtls_x509_time *to ); */ int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ); +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -276,6 +278,8 @@ int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ); */ int mbedtls_x509_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + /* * Internal module functions. You probably do not want to use these unless you * know you do. diff --git a/thirdparty/mbedtls/include/mbedtls/x509_crt.h b/thirdparty/mbedtls/include/mbedtls/x509_crt.h index 3dd5922486..670bd10d89 100644 --- a/thirdparty/mbedtls/include/mbedtls/x509_crt.h +++ b/thirdparty/mbedtls/include/mbedtls/x509_crt.h @@ -98,7 +98,7 @@ mbedtls_x509_crt; * Build flag from an algorithm/curve identifier (pk, md, ecp) * Since 0 is always XXX_NONE, ignore it. */ -#define MBEDTLS_X509_ID_FLAG( id ) ( 1 << ( id - 1 ) ) +#define MBEDTLS_X509_ID_FLAG( id ) ( 1 << ( (id) - 1 ) ) /** * Security profile for certificate verification. diff --git a/thirdparty/mbedtls/include/mbedtls/x509_csr.h b/thirdparty/mbedtls/include/mbedtls/x509_csr.h index 0c6ccad78d..a3c28048e0 100644 --- a/thirdparty/mbedtls/include/mbedtls/x509_csr.h +++ b/thirdparty/mbedtls/include/mbedtls/x509_csr.h @@ -205,6 +205,14 @@ void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_ty * \param key_usage key usage flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED + * + * \note The <code>decipherOnly</code> flag from the Key Usage + * extension is represented by bit 8 (i.e. + * <code>0x8000</code>), which cannot typically be represented + * in an unsigned char. Therefore, the flag + * <code>decipherOnly</code> (i.e. + * #MBEDTLS_X509_KU_DECIPHER_ONLY) cannot be set using this + * function. */ int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ); diff --git a/thirdparty/mbedtls/include/mbedtls/xtea.h b/thirdparty/mbedtls/include/mbedtls/xtea.h index 6430c1318a..b47f553508 100644 --- a/thirdparty/mbedtls/include/mbedtls/xtea.h +++ b/thirdparty/mbedtls/include/mbedtls/xtea.h @@ -121,6 +121,8 @@ int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, unsigned char *output); #endif /* MBEDTLS_CIPHER_MODE_CBC */ +#if defined(MBEDTLS_SELF_TEST) + /** * \brief Checkup routine * @@ -128,6 +130,8 @@ int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, */ int mbedtls_xtea_self_test( int verbose ); +#endif /* MBEDTLS_SELF_TEST */ + #ifdef __cplusplus } #endif diff --git a/thirdparty/mbedtls/library/aes.c b/thirdparty/mbedtls/library/aes.c index 0543cd7817..aff0a9939a 100644 --- a/thirdparty/mbedtls/library/aes.c +++ b/thirdparty/mbedtls/library/aes.c @@ -395,9 +395,9 @@ static uint32_t RCON[10]; /* * Tables generation code */ -#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 ) -#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) ) -#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 ) +#define ROTL8(x) ( ( (x) << 8 ) & 0xFFFFFFFF ) | ( (x) >> 24 ) +#define XTIME(x) ( ( (x) << 1 ) ^ ( ( (x) & 0x80 ) ? 0x1B : 0x00 ) ) +#define MUL(x,y) ( ( (x) && (y) ) ? pow[(log[(x)]+log[(y)]) % 255] : 0 ) static int aes_init_done = 0; @@ -815,51 +815,53 @@ int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx, #endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */ -#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ -{ \ - X0 = *RK++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^ \ - AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^ \ - AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^ \ - AES_FT3( ( Y3 >> 24 ) & 0xFF ); \ - \ - X1 = *RK++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^ \ - AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^ \ - AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^ \ - AES_FT3( ( Y0 >> 24 ) & 0xFF ); \ - \ - X2 = *RK++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^ \ - AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^ \ - AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^ \ - AES_FT3( ( Y1 >> 24 ) & 0xFF ); \ - \ - X3 = *RK++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^ \ - AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^ \ - AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^ \ - AES_FT3( ( Y2 >> 24 ) & 0xFF ); \ -} - -#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ -{ \ - X0 = *RK++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^ \ - AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^ \ - AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^ \ - AES_RT3( ( Y1 >> 24 ) & 0xFF ); \ - \ - X1 = *RK++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^ \ - AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^ \ - AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^ \ - AES_RT3( ( Y2 >> 24 ) & 0xFF ); \ - \ - X2 = *RK++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^ \ - AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^ \ - AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^ \ - AES_RT3( ( Y3 >> 24 ) & 0xFF ); \ - \ - X3 = *RK++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^ \ - AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^ \ - AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^ \ - AES_RT3( ( Y0 >> 24 ) & 0xFF ); \ -} +#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ + do \ + { \ + (X0) = *RK++ ^ AES_FT0( ( (Y0) ) & 0xFF ) ^ \ + AES_FT1( ( (Y1) >> 8 ) & 0xFF ) ^ \ + AES_FT2( ( (Y2) >> 16 ) & 0xFF ) ^ \ + AES_FT3( ( (Y3) >> 24 ) & 0xFF ); \ + \ + (X1) = *RK++ ^ AES_FT0( ( (Y1) ) & 0xFF ) ^ \ + AES_FT1( ( (Y2) >> 8 ) & 0xFF ) ^ \ + AES_FT2( ( (Y3) >> 16 ) & 0xFF ) ^ \ + AES_FT3( ( (Y0) >> 24 ) & 0xFF ); \ + \ + (X2) = *RK++ ^ AES_FT0( ( (Y2) ) & 0xFF ) ^ \ + AES_FT1( ( (Y3) >> 8 ) & 0xFF ) ^ \ + AES_FT2( ( (Y0) >> 16 ) & 0xFF ) ^ \ + AES_FT3( ( (Y1) >> 24 ) & 0xFF ); \ + \ + (X3) = *RK++ ^ AES_FT0( ( (Y3) ) & 0xFF ) ^ \ + AES_FT1( ( (Y0) >> 8 ) & 0xFF ) ^ \ + AES_FT2( ( (Y1) >> 16 ) & 0xFF ) ^ \ + AES_FT3( ( (Y2) >> 24 ) & 0xFF ); \ + } while( 0 ) + +#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ + do \ + { \ + (X0) = *RK++ ^ AES_RT0( ( (Y0) ) & 0xFF ) ^ \ + AES_RT1( ( (Y3) >> 8 ) & 0xFF ) ^ \ + AES_RT2( ( (Y2) >> 16 ) & 0xFF ) ^ \ + AES_RT3( ( (Y1) >> 24 ) & 0xFF ); \ + \ + (X1) = *RK++ ^ AES_RT0( ( (Y1) ) & 0xFF ) ^ \ + AES_RT1( ( (Y0) >> 8 ) & 0xFF ) ^ \ + AES_RT2( ( (Y3) >> 16 ) & 0xFF ) ^ \ + AES_RT3( ( (Y2) >> 24 ) & 0xFF ); \ + \ + (X2) = *RK++ ^ AES_RT0( ( (Y2) ) & 0xFF ) ^ \ + AES_RT1( ( (Y1) >> 8 ) & 0xFF ) ^ \ + AES_RT2( ( (Y0) >> 16 ) & 0xFF ) ^ \ + AES_RT3( ( (Y3) >> 24 ) & 0xFF ); \ + \ + (X3) = *RK++ ^ AES_RT0( ( (Y3) ) & 0xFF ) ^ \ + AES_RT1( ( (Y2) >> 8 ) & 0xFF ) ^ \ + AES_RT2( ( (Y1) >> 16 ) & 0xFF ) ^ \ + AES_RT3( ( (Y0) >> 24 ) & 0xFF ); \ + } while( 0 ) /* * AES-ECB block encryption diff --git a/thirdparty/mbedtls/library/asn1write.c b/thirdparty/mbedtls/library/asn1write.c index a4d23f6196..c0b4622d58 100644 --- a/thirdparty/mbedtls/library/asn1write.c +++ b/thirdparty/mbedtls/library/asn1write.c @@ -294,22 +294,28 @@ int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t bits ) { int ret; - size_t len = 0, size; + size_t len = 0; + size_t unused_bits, byte_len; - size = ( bits / 8 ) + ( ( bits % 8 ) ? 1 : 0 ); + byte_len = ( bits + 7 ) / 8; + unused_bits = ( byte_len * 8 ) - bits; - // Calculate byte length - // - if( *p < start || (size_t)( *p - start ) < size + 1 ) + if( *p < start || (size_t)( *p - start ) < byte_len + 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); - len = size + 1; - (*p) -= size; - memcpy( *p, buf, size ); + len = byte_len + 1; - // Write unused bits - // - *--(*p) = (unsigned char) (size * 8 - bits); + /* Write the bitstring. Ensure the unused bits are zeroed */ + if( byte_len > 0 ) + { + byte_len--; + *--( *p ) = buf[byte_len] & ~( ( 0x1 << unused_bits ) - 1 ); + ( *p ) -= byte_len; + memcpy( *p, buf, byte_len ); + } + + /* Write unused bits */ + *--( *p ) = (unsigned char)unused_bits; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) ); diff --git a/thirdparty/mbedtls/library/bignum.c b/thirdparty/mbedtls/library/bignum.c index f968a0ad7d..41946183c5 100644 --- a/thirdparty/mbedtls/library/bignum.c +++ b/thirdparty/mbedtls/library/bignum.c @@ -527,26 +527,38 @@ cleanup: } /* - * Helper to write the digits high-order first + * Helper to write the digits high-order first. */ -static int mpi_write_hlp( mbedtls_mpi *X, int radix, char **p ) +static int mpi_write_hlp( mbedtls_mpi *X, int radix, + char **p, const size_t buflen ) { int ret; mbedtls_mpi_uint r; + size_t length = 0; + char *p_end = *p + buflen; - if( radix < 2 || radix > 16 ) - return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); + do + { + if( length >= buflen ) + { + return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL ); + } - MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, radix ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X, NULL, X, radix ) ); + MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, radix ) ); + MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X, NULL, X, radix ) ); + /* + * Write the residue in the current position, as an ASCII character. + */ + if( r < 0xA ) + *(--p_end) = (char)( '0' + r ); + else + *(--p_end) = (char)( 'A' + ( r - 0xA ) ); - if( mbedtls_mpi_cmp_int( X, 0 ) != 0 ) - MBEDTLS_MPI_CHK( mpi_write_hlp( X, radix, p ) ); + length++; + } while( mbedtls_mpi_cmp_int( X, 0 ) != 0 ); - if( r < 10 ) - *(*p)++ = (char)( r + 0x30 ); - else - *(*p)++ = (char)( r + 0x37 ); + memmove( *p, p_end, length ); + *p += length; cleanup: @@ -570,15 +582,20 @@ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); - n = mbedtls_mpi_bitlen( X ); - if( radix >= 4 ) n >>= 1; - if( radix >= 16 ) n >>= 1; - /* - * Round up the buffer length to an even value to ensure that there is - * enough room for hexadecimal values that can be represented in an odd - * number of digits. - */ - n += 3 + ( ( n + 1 ) & 1 ); + n = mbedtls_mpi_bitlen( X ); /* Number of bits necessary to present `n`. */ + if( radix >= 4 ) n >>= 1; /* Number of 4-adic digits necessary to present + * `n`. If radix > 4, this might be a strict + * overapproximation of the number of + * radix-adic digits needed to present `n`. */ + if( radix >= 16 ) n >>= 1; /* Number of hexadecimal digits necessary to + * present `n`. */ + + n += 1; /* Terminating null byte */ + n += 1; /* Compensate for the divisions above, which round down `n` + * in case it's not even. */ + n += 1; /* Potential '-'-sign. */ + n += ( n & 1 ); /* Make n even to have enough space for hexadecimal writing, + * which always uses an even number of hex-digits. */ if( buflen < n ) { @@ -590,7 +607,10 @@ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, mbedtls_mpi_init( &T ); if( X->s == -1 ) + { *p++ = '-'; + buflen--; + } if( radix == 16 ) { @@ -619,7 +639,7 @@ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, if( T.s == -1 ) T.s = 1; - MBEDTLS_MPI_CHK( mpi_write_hlp( &T, radix, &p ) ); + MBEDTLS_MPI_CHK( mpi_write_hlp( &T, radix, &p, buflen ) ); } *p++ = '\0'; @@ -715,14 +735,101 @@ cleanup: } #endif /* MBEDTLS_FS_IO */ + +/* Convert a big-endian byte array aligned to the size of mbedtls_mpi_uint + * into the storage form used by mbedtls_mpi. */ + +static mbedtls_mpi_uint mpi_uint_bigendian_to_host_c( mbedtls_mpi_uint x ) +{ + uint8_t i; + mbedtls_mpi_uint tmp = 0; + /* This works regardless of the endianness. */ + for( i = 0; i < ciL; i++, x >>= 8 ) + tmp |= ( x & 0xFF ) << ( ( ciL - 1 - i ) << 3 ); + return( tmp ); +} + +static mbedtls_mpi_uint mpi_uint_bigendian_to_host( mbedtls_mpi_uint x ) +{ +#if defined(__BYTE_ORDER__) + +/* Nothing to do on bigendian systems. */ +#if ( __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ) + return( x ); +#endif /* __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ */ + +#if ( __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ ) + +/* For GCC and Clang, have builtins for byte swapping. */ +#if defined(__GNUC__) && defined(__GNUC_PREREQ) +#if __GNUC_PREREQ(4,3) +#define have_bswap +#endif +#endif + +#if defined(__clang__) && defined(__has_builtin) +#if __has_builtin(__builtin_bswap32) && \ + __has_builtin(__builtin_bswap64) +#define have_bswap +#endif +#endif + +#if defined(have_bswap) + /* The compiler is hopefully able to statically evaluate this! */ + switch( sizeof(mbedtls_mpi_uint) ) + { + case 4: + return( __builtin_bswap32(x) ); + case 8: + return( __builtin_bswap64(x) ); + } +#endif +#endif /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */ +#endif /* __BYTE_ORDER__ */ + + /* Fall back to C-based reordering if we don't know the byte order + * or we couldn't use a compiler-specific builtin. */ + return( mpi_uint_bigendian_to_host_c( x ) ); +} + +static void mpi_bigendian_to_host( mbedtls_mpi_uint * const p, size_t limbs ) +{ + mbedtls_mpi_uint *cur_limb_left; + mbedtls_mpi_uint *cur_limb_right; + if( limbs == 0 ) + return; + + /* + * Traverse limbs and + * - adapt byte-order in each limb + * - swap the limbs themselves. + * For that, simultaneously traverse the limbs from left to right + * and from right to left, as long as the left index is not bigger + * than the right index (it's not a problem if limbs is odd and the + * indices coincide in the last iteration). + */ + for( cur_limb_left = p, cur_limb_right = p + ( limbs - 1 ); + cur_limb_left <= cur_limb_right; + cur_limb_left++, cur_limb_right-- ) + { + mbedtls_mpi_uint tmp; + /* Note that if cur_limb_left == cur_limb_right, + * this code effectively swaps the bytes only once. */ + tmp = mpi_uint_bigendian_to_host( *cur_limb_left ); + *cur_limb_left = mpi_uint_bigendian_to_host( *cur_limb_right ); + *cur_limb_right = tmp; + } +} + /* * Import X from unsigned binary data, big endian */ int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen ) { int ret; - size_t i, j; - size_t const limbs = CHARS_TO_LIMBS( buflen ); + size_t const limbs = CHARS_TO_LIMBS( buflen ); + size_t const overhead = ( limbs * ciL ) - buflen; + unsigned char *Xp; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( buflen == 0 || buf != NULL ); @@ -734,11 +841,17 @@ int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t bu mbedtls_mpi_init( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, limbs ) ); } - MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); - for( i = buflen, j = 0; i > 0; i--, j++ ) - X->p[j / ciL] |= ((mbedtls_mpi_uint) buf[i - 1]) << ((j % ciL) << 3); + /* Avoid calling `memcpy` with NULL source argument, + * even if buflen is 0. */ + if( buf != NULL ) + { + Xp = (unsigned char*) X->p; + memcpy( Xp + overhead, buf, buflen ); + + mpi_bigendian_to_host( X->p, limbs ); + } cleanup: @@ -1764,8 +1877,10 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1; +#if( MBEDTLS_MPI_WINDOW_SIZE < 6 ) if( wsize > MBEDTLS_MPI_WINDOW_SIZE ) wsize = MBEDTLS_MPI_WINDOW_SIZE; +#endif j = N->n + 1; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); @@ -2008,18 +2123,28 @@ int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size, void *p_rng ) { int ret; - unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; + size_t const limbs = CHARS_TO_LIMBS( size ); + size_t const overhead = ( limbs * ciL ) - size; + unsigned char *Xp; + MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); - if( size > MBEDTLS_MPI_MAX_SIZE ) - return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); + /* Ensure that target MPI has exactly the necessary number of limbs */ + if( X->n != limbs ) + { + mbedtls_mpi_free( X ); + mbedtls_mpi_init( X ); + MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, limbs ) ); + } + MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); + + Xp = (unsigned char*) X->p; + f_rng( p_rng, Xp + overhead, size ); - MBEDTLS_MPI_CHK( f_rng( p_rng, buf, size ) ); - MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( X, buf, size ) ); + mpi_bigendian_to_host( X->p, limbs ); cleanup: - mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } diff --git a/thirdparty/mbedtls/library/ccm.c b/thirdparty/mbedtls/library/ccm.c index 01e58b0436..c6211ee773 100644 --- a/thirdparty/mbedtls/library/ccm.c +++ b/thirdparty/mbedtls/library/ccm.c @@ -134,11 +134,17 @@ void mbedtls_ccm_free( mbedtls_ccm_context *ctx ) * This avoids allocating one more 16 bytes buffer while allowing src == dst. */ #define CTR_CRYPT( dst, src, len ) \ - if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctr, 16, b, &olen ) ) != 0 ) \ - return( ret ); \ - \ - for( i = 0; i < len; i++ ) \ - dst[i] = src[i] ^ b[i]; + do \ + { \ + if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctr, \ + 16, b, &olen ) ) != 0 ) \ + { \ + return( ret ); \ + } \ + \ + for( i = 0; i < (len); i++ ) \ + (dst)[i] = (src)[i] ^ b[i]; \ + } while( 0 ) /* * Authenticated encryption or decryption diff --git a/thirdparty/mbedtls/library/certs.c b/thirdparty/mbedtls/library/certs.c index ff0f11e923..b07fd8a3a1 100644 --- a/thirdparty/mbedtls/library/certs.c +++ b/thirdparty/mbedtls/library/certs.c @@ -29,328 +29,1673 @@ #if defined(MBEDTLS_CERTS_C) -#if defined(MBEDTLS_ECDSA_C) -#define TEST_CA_CRT_EC \ -"-----BEGIN CERTIFICATE-----\r\n" \ -"MIICUjCCAdegAwIBAgIJAMFD4n5iQ8zoMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYT\r\n" \ -"Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \ -"QyBDQTAeFw0xMzA5MjQxNTQ5NDhaFw0yMzA5MjIxNTQ5NDhaMD4xCzAJBgNVBAYT\r\n" \ -"Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \ -"QyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMPaKzRBN1gvh1b+/Im6KUNLTuBu\r\n" \ -"ww5XUzM5WNRStJGVOQsj318XJGJI/BqVKc4sLYfCiFKAr9ZqqyHduNMcbli4yuiy\r\n" \ -"aY7zQa0pw7RfdadHb9UZKVVpmlM7ILRmFmAzHqOBoDCBnTAdBgNVHQ4EFgQUnW0g\r\n" \ -"JEkBPyvLeLUZvH4kydv7NnwwbgYDVR0jBGcwZYAUnW0gJEkBPyvLeLUZvH4kydv7\r\n" \ -"NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UE\r\n" \ -"AxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAwGA1UdEwQFMAMBAf8w\r\n" \ -"CgYIKoZIzj0EAwIDaQAwZgIxAMO0YnNWKJUAfXgSJtJxexn4ipg+kv4znuR50v56\r\n" \ -"t4d0PCu412mUC6Nnd7izvtE2MgIxAP1nnJQjZ8BWukszFQDG48wxCCyci9qpdSMv\r\n" \ -"uCjn8pwUOkABXK8Mss90fzCfCEOtIA==\r\n" \ -"-----END CERTIFICATE-----\r\n" -const char mbedtls_test_ca_crt_ec[] = TEST_CA_CRT_EC; -const size_t mbedtls_test_ca_crt_ec_len = sizeof( mbedtls_test_ca_crt_ec ); - -const char mbedtls_test_ca_key_ec[] = -"-----BEGIN EC PRIVATE KEY-----\r\n" -"Proc-Type: 4,ENCRYPTED\r\n" -"DEK-Info: DES-EDE3-CBC,307EAB469933D64E\r\n" -"\r\n" -"IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG\r\n" -"ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq\r\n" -"UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb\r\n" -"a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm\r\n" -"-----END EC PRIVATE KEY-----\r\n"; -const size_t mbedtls_test_ca_key_ec_len = sizeof( mbedtls_test_ca_key_ec ); - -const char mbedtls_test_ca_pwd_ec[] = "PolarSSLTest"; -const size_t mbedtls_test_ca_pwd_ec_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1; - -const char mbedtls_test_srv_crt_ec[] = -"-----BEGIN CERTIFICATE-----\r\n" -"MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" -"A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" -"MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" -"A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG\r\n" -"CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA\r\n" -"2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd\r\n" -"BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB\r\n" -"PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xh\r\n" -"clNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG\r\n" -"CCqGSM49BAMCA2gAMGUCMQCaLFzXptui5WQN8LlO3ddh1hMxx6tzgLvT03MTVK2S\r\n" -"C12r0Lz3ri/moSEpNZWqPjkCMCE2f53GXcYLqyfyJR078c/xNSUU5+Xxl7VZ414V\r\n" -"fGa5kHvHARBPc8YAIVIqDvHH1Q==\r\n" -"-----END CERTIFICATE-----\r\n"; -const size_t mbedtls_test_srv_crt_ec_len = sizeof( mbedtls_test_srv_crt_ec ); - -const char mbedtls_test_srv_key_ec[] = -"-----BEGIN EC PRIVATE KEY-----\r\n" -"MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49\r\n" -"AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/\r\n" -"6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w==\r\n" -"-----END EC PRIVATE KEY-----\r\n"; -const size_t mbedtls_test_srv_key_ec_len = sizeof( mbedtls_test_srv_key_ec ); - -const char mbedtls_test_cli_crt_ec[] = -"-----BEGIN CERTIFICATE-----\r\n" -"MIICLDCCAbKgAwIBAgIBDTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" -"A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" -"MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjBBMQswCQYDVQQGEwJOTDERMA8G\r\n" -"A1UEChMIUG9sYXJTU0wxHzAdBgNVBAMTFlBvbGFyU1NMIFRlc3QgQ2xpZW50IDIw\r\n" -"WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARX5a6xc9/TrLuTuIH/Eq7u5lOszlVT\r\n" -"9jQOzC7jYyUL35ji81xgNpbA1RgUcOV/n9VLRRjlsGzVXPiWj4dwo+THo4GdMIGa\r\n" -"MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMG4GA1Ud\r\n" -"IwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDER\r\n" -"MA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GC\r\n" -"CQDBQ+J+YkPM6DAKBggqhkjOPQQDAgNoADBlAjBKZQ17IIOimbmoD/yN7o89u3BM\r\n" -"lgOsjnhw3fIOoLIWy2WOGsk/LGF++DzvrRzuNiACMQCd8iem1XS4JK7haj8xocpU\r\n" -"LwjQje5PDGHfd3h9tP38Qknu5bJqws0md2KOKHyeV0U=\r\n" -"-----END CERTIFICATE-----\r\n"; -const size_t mbedtls_test_cli_crt_ec_len = sizeof( mbedtls_test_cli_crt_ec ); - -const char mbedtls_test_cli_key_ec[] = -"-----BEGIN EC PRIVATE KEY-----\r\n" -"MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49\r\n" -"AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW\r\n" -"wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw==\r\n" -"-----END EC PRIVATE KEY-----\r\n"; -const size_t mbedtls_test_cli_key_ec_len = sizeof( mbedtls_test_cli_key_ec ); -#endif /* MBEDTLS_ECDSA_C */ +/* + * Test CA Certificates + * + * We define test CA certificates for each choice of the following parameters: + * - PEM or DER encoding + * - SHA-1 or SHA-256 hash + * - RSA or EC key + * + * Things to add: + * - multiple EC curve types + * + */ -#if defined(MBEDTLS_RSA_C) +/* This is taken from tests/data_files/test-ca2.crt */ +/* BEGIN FILE string macro TEST_CA_CRT_EC_PEM tests/data_files/test-ca2.crt */ +#define TEST_CA_CRT_EC_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIICUjCCAdegAwIBAgIJAMFD4n5iQ8zoMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYT\r\n" \ + "Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \ + "QyBDQTAeFw0xMzA5MjQxNTQ5NDhaFw0yMzA5MjIxNTQ5NDhaMD4xCzAJBgNVBAYT\r\n" \ + "Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \ + "QyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMPaKzRBN1gvh1b+/Im6KUNLTuBu\r\n" \ + "ww5XUzM5WNRStJGVOQsj318XJGJI/BqVKc4sLYfCiFKAr9ZqqyHduNMcbli4yuiy\r\n" \ + "aY7zQa0pw7RfdadHb9UZKVVpmlM7ILRmFmAzHqOBoDCBnTAdBgNVHQ4EFgQUnW0g\r\n" \ + "JEkBPyvLeLUZvH4kydv7NnwwbgYDVR0jBGcwZYAUnW0gJEkBPyvLeLUZvH4kydv7\r\n" \ + "NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UE\r\n" \ + "AxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAwGA1UdEwQFMAMBAf8w\r\n" \ + "CgYIKoZIzj0EAwIDaQAwZgIxAMO0YnNWKJUAfXgSJtJxexn4ipg+kv4znuR50v56\r\n" \ + "t4d0PCu412mUC6Nnd7izvtE2MgIxAP1nnJQjZ8BWukszFQDG48wxCCyci9qpdSMv\r\n" \ + "uCjn8pwUOkABXK8Mss90fzCfCEOtIA==\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/test-ca2.crt.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CA_CRT_EC_DER tests/data_files/test-ca2.crt.der */ +#define TEST_CA_CRT_EC_DER { \ + 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, \ + 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, \ + 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, \ + 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, \ + 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, \ + 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, \ + 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39, \ + 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32, \ + 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, \ + 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, \ + 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, \ + 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, \ + 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, \ + 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, \ + 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, \ + 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f, \ + 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e, \ + 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95, \ + 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95, \ + 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a, \ + 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2, \ + 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47, \ + 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66, \ + 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d, \ + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20, \ + 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, \ + 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23, \ + 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01, \ + 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb, \ + 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, \ + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, \ + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, \ + 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, \ + 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, \ + 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09, \ + 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06, \ + 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, \ + 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, \ + 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56, \ + 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8, \ + 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a, \ + 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67, \ + 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67, \ + 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6, \ + 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f, \ + 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c, \ + 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/test-ca2.key.enc */ +/* BEGIN FILE string macro TEST_CA_KEY_EC_PEM tests/data_files/test-ca2.key.enc */ +#define TEST_CA_KEY_EC_PEM \ + "-----BEGIN EC PRIVATE KEY-----\r\n" \ + "Proc-Type: 4,ENCRYPTED\r\n" \ + "DEK-Info: DES-EDE3-CBC,307EAB469933D64E\r\n" \ + "\r\n" \ + "IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG\r\n" \ + "ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq\r\n" \ + "UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb\r\n" \ + "a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm\r\n" \ + "-----END EC PRIVATE KEY-----\r\n" +/* END FILE */ + +#define TEST_CA_PWD_EC_PEM "PolarSSLTest" + +/* This is generated from tests/data_files/test-ca2.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CA_KEY_EC_DER tests/data_files/test-ca2.key.der */ +#define TEST_CA_KEY_EC_DER { \ + 0x30, 0x81, 0xa4, 0x02, 0x01, 0x01, 0x04, 0x30, 0x83, 0xd9, 0x15, 0x0e, \ + 0xa0, 0x71, 0xf0, 0x57, 0x10, 0x33, 0xa3, 0x38, 0xb8, 0x86, 0xc1, 0xa6, \ + 0x11, 0x5d, 0x6d, 0xb4, 0x03, 0xe1, 0x29, 0x76, 0x45, 0xd7, 0x87, 0x6f, \ + 0x23, 0xab, 0x44, 0x20, 0xea, 0x64, 0x7b, 0x85, 0xb1, 0x76, 0xe7, 0x85, \ + 0x95, 0xaa, 0x74, 0xd6, 0xd1, 0xa4, 0x5e, 0xea, 0xa0, 0x07, 0x06, 0x05, \ + 0x2b, 0x81, 0x04, 0x00, 0x22, 0xa1, 0x64, 0x03, 0x62, 0x00, 0x04, 0xc3, \ + 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f, 0x87, 0x56, 0xfe, 0xfc, 0x89, \ + 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e, 0xc3, 0x0e, 0x57, 0x53, 0x33, \ + 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95, 0x39, 0x0b, 0x23, 0xdf, 0x5f, \ + 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95, 0x29, 0xce, 0x2c, 0x2d, 0x87, \ + 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a, 0xab, 0x21, 0xdd, 0xb8, 0xd3, \ + 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2, 0x69, 0x8e, 0xf3, 0x41, 0xad, \ + 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47, 0x6f, 0xd5, 0x19, 0x29, 0x55, \ + 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66, 0x16, 0x60, 0x33, 0x1e \ +} +/* END FILE */ + +/* This is taken from tests/data_files/test-ca-sha256.crt. */ +/* BEGIN FILE string macro TEST_CA_CRT_RSA_SHA256_PEM tests/data_files/test-ca-sha256.crt */ +#define TEST_CA_CRT_RSA_SHA256_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ + "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ + "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ + "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ + "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ + "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ + "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ + "UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/\r\n" \ + "MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBCwUA\r\n" \ + "A4IBAQB2W2dIy4q4KysbrTL4HIaOqu62RceGuQ/KhyiI6O0ndCtQ/PgCBqHHTP8u\r\n" \ + "8F1X2ivb60ynHV6baMLPI4Kf1k4MONtLSf/++1qh0Gdycd3A8IDAfy0YnC1F3OPK\r\n" \ + "vWO/cZGitKoTbEpP4y4Rng3sFCDndRCWIRIDOEEW/H3lCcfL7sOQojdLl85ajFkh\r\n" \ + "YvcDqjmnTcspUnuq9Y00C7porXJthZwz1S18qVjcFNk0zEhVMUbupSrdXVmKtOJW\r\n" \ + "MWZjgcA+OXzcnb2hSKWbhjykH/u6/PqkuHPkD723rwXbmHdxRVS9CW57kDkn5ezJ\r\n" \ + "5pE6Sam4qFsCNFJNBV9FRf3ZBMFi\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/test-ca-sha256.crt.der + * using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CA_CRT_RSA_SHA256_DER tests/data_files/test-ca-sha256.crt.der */ +#define TEST_CA_CRT_RSA_SHA256_DER { \ + 0x30, 0x82, 0x03, 0x41, 0x30, 0x82, 0x02, 0x29, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, 0x34, 0x30, 0x30, \ + 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x30, 0x5a, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, 0x54, 0x65, \ + 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, \ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, \ + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, \ + 0x01, 0x00, 0xc0, 0xdf, 0x37, 0xfc, 0x17, 0xbb, 0xe0, 0x96, 0x9d, 0x3f, \ + 0x86, 0xde, 0x96, 0x32, 0x7d, 0x44, 0xa5, 0x16, 0xa0, 0xcd, 0x21, 0xf1, \ + 0x99, 0xd4, 0xec, 0xea, 0xcb, 0x7c, 0x18, 0x58, 0x08, 0x94, 0xa5, 0xec, \ + 0x9b, 0xc5, 0x8b, 0xdf, 0x1a, 0x1e, 0x99, 0x38, 0x99, 0x87, 0x1e, 0x7b, \ + 0xc0, 0x8d, 0x39, 0xdf, 0x38, 0x5d, 0x70, 0x78, 0x07, 0xd3, 0x9e, 0xd9, \ + 0x93, 0xe8, 0xb9, 0x72, 0x51, 0xc5, 0xce, 0xa3, 0x30, 0x52, 0xa9, 0xf2, \ + 0xe7, 0x40, 0x70, 0x14, 0xcb, 0x44, 0xa2, 0x72, 0x0b, 0xc2, 0xe5, 0x40, \ + 0xf9, 0x3e, 0xe5, 0xa6, 0x0e, 0xb3, 0xf9, 0xec, 0x4a, 0x63, 0xc0, 0xb8, \ + 0x29, 0x00, 0x74, 0x9c, 0x57, 0x3b, 0xa8, 0xa5, 0x04, 0x90, 0x71, 0xf1, \ + 0xbd, 0x83, 0xd9, 0x3f, 0xd6, 0xa5, 0xe2, 0x3c, 0x2a, 0x8f, 0xef, 0x27, \ + 0x60, 0xc3, 0xc6, 0x9f, 0xcb, 0xba, 0xec, 0x60, 0x7d, 0xb7, 0xe6, 0x84, \ + 0x32, 0xbe, 0x4f, 0xfb, 0x58, 0x26, 0x22, 0x03, 0x5b, 0xd4, 0xb4, 0xd5, \ + 0xfb, 0xf5, 0xe3, 0x96, 0x2e, 0x70, 0xc0, 0xe4, 0x2e, 0xbd, 0xfc, 0x2e, \ + 0xee, 0xe2, 0x41, 0x55, 0xc0, 0x34, 0x2e, 0x7d, 0x24, 0x72, 0x69, 0xcb, \ + 0x47, 0xb1, 0x14, 0x40, 0x83, 0x7d, 0x67, 0xf4, 0x86, 0xf6, 0x31, 0xab, \ + 0xf1, 0x79, 0xa4, 0xb2, 0xb5, 0x2e, 0x12, 0xf9, 0x84, 0x17, 0xf0, 0x62, \ + 0x6f, 0x27, 0x3e, 0x13, 0x58, 0xb1, 0x54, 0x0d, 0x21, 0x9a, 0x73, 0x37, \ + 0xa1, 0x30, 0xcf, 0x6f, 0x92, 0xdc, 0xf6, 0xe9, 0xfc, 0xac, 0xdb, 0x2e, \ + 0x28, 0xd1, 0x7e, 0x02, 0x4b, 0x23, 0xa0, 0x15, 0xf2, 0x38, 0x65, 0x64, \ + 0x09, 0xea, 0x0c, 0x6e, 0x8e, 0x1b, 0x17, 0xa0, 0x71, 0xc8, 0xb3, 0x9b, \ + 0xc9, 0xab, 0xe9, 0xc3, 0xf2, 0xcf, 0x87, 0x96, 0x8f, 0x80, 0x02, 0x32, \ + 0x9e, 0x99, 0x58, 0x6f, 0xa2, 0xd5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, \ + 0x50, 0x30, 0x4e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, \ + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, \ + 0x04, 0x16, 0x04, 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, \ + 0xf6, 0xb9, 0xd5, 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, \ + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, \ + 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, 0xb9, 0xd5, \ + 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, 0x0d, 0x06, \ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, \ + 0x03, 0x82, 0x01, 0x01, 0x00, 0x76, 0x5b, 0x67, 0x48, 0xcb, 0x8a, 0xb8, \ + 0x2b, 0x2b, 0x1b, 0xad, 0x32, 0xf8, 0x1c, 0x86, 0x8e, 0xaa, 0xee, 0xb6, \ + 0x45, 0xc7, 0x86, 0xb9, 0x0f, 0xca, 0x87, 0x28, 0x88, 0xe8, 0xed, 0x27, \ + 0x74, 0x2b, 0x50, 0xfc, 0xf8, 0x02, 0x06, 0xa1, 0xc7, 0x4c, 0xff, 0x2e, \ + 0xf0, 0x5d, 0x57, 0xda, 0x2b, 0xdb, 0xeb, 0x4c, 0xa7, 0x1d, 0x5e, 0x9b, \ + 0x68, 0xc2, 0xcf, 0x23, 0x82, 0x9f, 0xd6, 0x4e, 0x0c, 0x38, 0xdb, 0x4b, \ + 0x49, 0xff, 0xfe, 0xfb, 0x5a, 0xa1, 0xd0, 0x67, 0x72, 0x71, 0xdd, 0xc0, \ + 0xf0, 0x80, 0xc0, 0x7f, 0x2d, 0x18, 0x9c, 0x2d, 0x45, 0xdc, 0xe3, 0xca, \ + 0xbd, 0x63, 0xbf, 0x71, 0x91, 0xa2, 0xb4, 0xaa, 0x13, 0x6c, 0x4a, 0x4f, \ + 0xe3, 0x2e, 0x11, 0x9e, 0x0d, 0xec, 0x14, 0x20, 0xe7, 0x75, 0x10, 0x96, \ + 0x21, 0x12, 0x03, 0x38, 0x41, 0x16, 0xfc, 0x7d, 0xe5, 0x09, 0xc7, 0xcb, \ + 0xee, 0xc3, 0x90, 0xa2, 0x37, 0x4b, 0x97, 0xce, 0x5a, 0x8c, 0x59, 0x21, \ + 0x62, 0xf7, 0x03, 0xaa, 0x39, 0xa7, 0x4d, 0xcb, 0x29, 0x52, 0x7b, 0xaa, \ + 0xf5, 0x8d, 0x34, 0x0b, 0xba, 0x68, 0xad, 0x72, 0x6d, 0x85, 0x9c, 0x33, \ + 0xd5, 0x2d, 0x7c, 0xa9, 0x58, 0xdc, 0x14, 0xd9, 0x34, 0xcc, 0x48, 0x55, \ + 0x31, 0x46, 0xee, 0xa5, 0x2a, 0xdd, 0x5d, 0x59, 0x8a, 0xb4, 0xe2, 0x56, \ + 0x31, 0x66, 0x63, 0x81, 0xc0, 0x3e, 0x39, 0x7c, 0xdc, 0x9d, 0xbd, 0xa1, \ + 0x48, 0xa5, 0x9b, 0x86, 0x3c, 0xa4, 0x1f, 0xfb, 0xba, 0xfc, 0xfa, 0xa4, \ + 0xb8, 0x73, 0xe4, 0x0f, 0xbd, 0xb7, 0xaf, 0x05, 0xdb, 0x98, 0x77, 0x71, \ + 0x45, 0x54, 0xbd, 0x09, 0x6e, 0x7b, 0x90, 0x39, 0x27, 0xe5, 0xec, 0xc9, \ + 0xe6, 0x91, 0x3a, 0x49, 0xa9, 0xb8, 0xa8, 0x5b, 0x02, 0x34, 0x52, 0x4d, \ + 0x05, 0x5f, 0x45, 0x45, 0xfd, 0xd9, 0x04, 0xc1, 0x62 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/test-ca-sha1.crt. */ +/* BEGIN FILE string macro TEST_CA_CRT_RSA_SHA1_PEM tests/data_files/test-ca-sha1.crt */ +#define TEST_CA_CRT_RSA_SHA1_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDQTCCAimgAwIBAgIBAzANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ + "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ + "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ + "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ + "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ + "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ + "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ + "UDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/\r\n" \ + "MB8GA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBBQUA\r\n" \ + "A4IBAQABE3OEPfEd/bcJW5ZdU3/VgPNS4tMzh8gnJP/V2FcvFtGylMpQq6YnEBYI\r\n" \ + "yBHAL4DRvlMY5rnXGBp3ODR8MpqHC6AquRTCLzjS57iYff//4QFQqW9n92zctspv\r\n" \ + "czkaPKgjqo1No3Uq0Xaz10rcxyTUPrf5wNVRZ2V0KvllvAAVSzbI4mpdUXztjhST\r\n" \ + "S5A2BeWQAAOr0zq1F7TSRVJpJs7jmB2ai/igkh1IAjcuwV6VwlP+sbw0gjQ0NpGM\r\n" \ + "iHpnlzRAi/tIbtOvMIGOBU2TIfax/5jq1agUx5aPmT5TWAiJPOOP6l5xXnDwxeYS\r\n" \ + "NWqiX9GyusBZjezaCaHabjDLU0qQ\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is taken from tests/data_files/test-ca-sha1.crt.der. */ +/* BEGIN FILE binary macro TEST_CA_CRT_RSA_SHA1_DER tests/data_files/test-ca-sha1.crt.der */ +#define TEST_CA_CRT_RSA_SHA1_DER { \ + 0x30, 0x82, 0x03, 0x41, 0x30, 0x82, 0x02, 0x29, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, 0x34, 0x30, 0x30, \ + 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x30, 0x5a, 0x30, 0x3b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, 0x54, 0x65, \ + 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, \ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, \ + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, \ + 0x01, 0x00, 0xc0, 0xdf, 0x37, 0xfc, 0x17, 0xbb, 0xe0, 0x96, 0x9d, 0x3f, \ + 0x86, 0xde, 0x96, 0x32, 0x7d, 0x44, 0xa5, 0x16, 0xa0, 0xcd, 0x21, 0xf1, \ + 0x99, 0xd4, 0xec, 0xea, 0xcb, 0x7c, 0x18, 0x58, 0x08, 0x94, 0xa5, 0xec, \ + 0x9b, 0xc5, 0x8b, 0xdf, 0x1a, 0x1e, 0x99, 0x38, 0x99, 0x87, 0x1e, 0x7b, \ + 0xc0, 0x8d, 0x39, 0xdf, 0x38, 0x5d, 0x70, 0x78, 0x07, 0xd3, 0x9e, 0xd9, \ + 0x93, 0xe8, 0xb9, 0x72, 0x51, 0xc5, 0xce, 0xa3, 0x30, 0x52, 0xa9, 0xf2, \ + 0xe7, 0x40, 0x70, 0x14, 0xcb, 0x44, 0xa2, 0x72, 0x0b, 0xc2, 0xe5, 0x40, \ + 0xf9, 0x3e, 0xe5, 0xa6, 0x0e, 0xb3, 0xf9, 0xec, 0x4a, 0x63, 0xc0, 0xb8, \ + 0x29, 0x00, 0x74, 0x9c, 0x57, 0x3b, 0xa8, 0xa5, 0x04, 0x90, 0x71, 0xf1, \ + 0xbd, 0x83, 0xd9, 0x3f, 0xd6, 0xa5, 0xe2, 0x3c, 0x2a, 0x8f, 0xef, 0x27, \ + 0x60, 0xc3, 0xc6, 0x9f, 0xcb, 0xba, 0xec, 0x60, 0x7d, 0xb7, 0xe6, 0x84, \ + 0x32, 0xbe, 0x4f, 0xfb, 0x58, 0x26, 0x22, 0x03, 0x5b, 0xd4, 0xb4, 0xd5, \ + 0xfb, 0xf5, 0xe3, 0x96, 0x2e, 0x70, 0xc0, 0xe4, 0x2e, 0xbd, 0xfc, 0x2e, \ + 0xee, 0xe2, 0x41, 0x55, 0xc0, 0x34, 0x2e, 0x7d, 0x24, 0x72, 0x69, 0xcb, \ + 0x47, 0xb1, 0x14, 0x40, 0x83, 0x7d, 0x67, 0xf4, 0x86, 0xf6, 0x31, 0xab, \ + 0xf1, 0x79, 0xa4, 0xb2, 0xb5, 0x2e, 0x12, 0xf9, 0x84, 0x17, 0xf0, 0x62, \ + 0x6f, 0x27, 0x3e, 0x13, 0x58, 0xb1, 0x54, 0x0d, 0x21, 0x9a, 0x73, 0x37, \ + 0xa1, 0x30, 0xcf, 0x6f, 0x92, 0xdc, 0xf6, 0xe9, 0xfc, 0xac, 0xdb, 0x2e, \ + 0x28, 0xd1, 0x7e, 0x02, 0x4b, 0x23, 0xa0, 0x15, 0xf2, 0x38, 0x65, 0x64, \ + 0x09, 0xea, 0x0c, 0x6e, 0x8e, 0x1b, 0x17, 0xa0, 0x71, 0xc8, 0xb3, 0x9b, \ + 0xc9, 0xab, 0xe9, 0xc3, 0xf2, 0xcf, 0x87, 0x96, 0x8f, 0x80, 0x02, 0x32, \ + 0x9e, 0x99, 0x58, 0x6f, 0xa2, 0xd5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, \ + 0x50, 0x30, 0x4e, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, \ + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, \ + 0x04, 0x16, 0x04, 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, \ + 0xf6, 0xb9, 0xd5, 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, \ + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, \ + 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, 0xb9, 0xd5, \ + 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, 0x0d, 0x06, \ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, \ + 0x03, 0x82, 0x01, 0x01, 0x00, 0x01, 0x13, 0x73, 0x84, 0x3d, 0xf1, 0x1d, \ + 0xfd, 0xb7, 0x09, 0x5b, 0x96, 0x5d, 0x53, 0x7f, 0xd5, 0x80, 0xf3, 0x52, \ + 0xe2, 0xd3, 0x33, 0x87, 0xc8, 0x27, 0x24, 0xff, 0xd5, 0xd8, 0x57, 0x2f, \ + 0x16, 0xd1, 0xb2, 0x94, 0xca, 0x50, 0xab, 0xa6, 0x27, 0x10, 0x16, 0x08, \ + 0xc8, 0x11, 0xc0, 0x2f, 0x80, 0xd1, 0xbe, 0x53, 0x18, 0xe6, 0xb9, 0xd7, \ + 0x18, 0x1a, 0x77, 0x38, 0x34, 0x7c, 0x32, 0x9a, 0x87, 0x0b, 0xa0, 0x2a, \ + 0xb9, 0x14, 0xc2, 0x2f, 0x38, 0xd2, 0xe7, 0xb8, 0x98, 0x7d, 0xff, 0xff, \ + 0xe1, 0x01, 0x50, 0xa9, 0x6f, 0x67, 0xf7, 0x6c, 0xdc, 0xb6, 0xca, 0x6f, \ + 0x73, 0x39, 0x1a, 0x3c, 0xa8, 0x23, 0xaa, 0x8d, 0x4d, 0xa3, 0x75, 0x2a, \ + 0xd1, 0x76, 0xb3, 0xd7, 0x4a, 0xdc, 0xc7, 0x24, 0xd4, 0x3e, 0xb7, 0xf9, \ + 0xc0, 0xd5, 0x51, 0x67, 0x65, 0x74, 0x2a, 0xf9, 0x65, 0xbc, 0x00, 0x15, \ + 0x4b, 0x36, 0xc8, 0xe2, 0x6a, 0x5d, 0x51, 0x7c, 0xed, 0x8e, 0x14, 0x93, \ + 0x4b, 0x90, 0x36, 0x05, 0xe5, 0x90, 0x00, 0x03, 0xab, 0xd3, 0x3a, 0xb5, \ + 0x17, 0xb4, 0xd2, 0x45, 0x52, 0x69, 0x26, 0xce, 0xe3, 0x98, 0x1d, 0x9a, \ + 0x8b, 0xf8, 0xa0, 0x92, 0x1d, 0x48, 0x02, 0x37, 0x2e, 0xc1, 0x5e, 0x95, \ + 0xc2, 0x53, 0xfe, 0xb1, 0xbc, 0x34, 0x82, 0x34, 0x34, 0x36, 0x91, 0x8c, \ + 0x88, 0x7a, 0x67, 0x97, 0x34, 0x40, 0x8b, 0xfb, 0x48, 0x6e, 0xd3, 0xaf, \ + 0x30, 0x81, 0x8e, 0x05, 0x4d, 0x93, 0x21, 0xf6, 0xb1, 0xff, 0x98, 0xea, \ + 0xd5, 0xa8, 0x14, 0xc7, 0x96, 0x8f, 0x99, 0x3e, 0x53, 0x58, 0x08, 0x89, \ + 0x3c, 0xe3, 0x8f, 0xea, 0x5e, 0x71, 0x5e, 0x70, 0xf0, 0xc5, 0xe6, 0x12, \ + 0x35, 0x6a, 0xa2, 0x5f, 0xd1, 0xb2, 0xba, 0xc0, 0x59, 0x8d, 0xec, 0xda, \ + 0x09, 0xa1, 0xda, 0x6e, 0x30, 0xcb, 0x53, 0x4a, 0x90 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/test-ca.key */ +/* BEGIN FILE string macro TEST_CA_KEY_RSA_PEM tests/data_files/test-ca.key */ +#define TEST_CA_KEY_RSA_PEM \ + "-----BEGIN RSA PRIVATE KEY-----\r\n" \ + "Proc-Type: 4,ENCRYPTED\r\n" \ + "DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B\r\n" \ + "\r\n" \ + "9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA\r\n" \ + "7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq\r\n" \ + "Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo\r\n" \ + "PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb\r\n" \ + "GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9\r\n" \ + "gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq\r\n" \ + "QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w\r\n" \ + "PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x\r\n" \ + "vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU\r\n" \ + "WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X\r\n" \ + "JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR\r\n" \ + "KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe\r\n" \ + "Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J\r\n" \ + "9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2\r\n" \ + "iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/\r\n" \ + "tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT\r\n" \ + "P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL\r\n" \ + "1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb\r\n" \ + "nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5\r\n" \ + "X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq\r\n" \ + "rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz\r\n" \ + "L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l\r\n" \ + "I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR\r\n" \ + "wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde\r\n" \ + "P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2\r\n" \ + "-----END RSA PRIVATE KEY-----\r\n" +/* END FILE */ + +#define TEST_CA_PWD_RSA_PEM "PolarSSLTest" + +/* This was generated from test-ca.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CA_KEY_RSA_DER tests/data_files/test-ca.key.der */ +#define TEST_CA_KEY_RSA_DER { \ + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, \ + 0xc0, 0xdf, 0x37, 0xfc, 0x17, 0xbb, 0xe0, 0x96, 0x9d, 0x3f, 0x86, 0xde, \ + 0x96, 0x32, 0x7d, 0x44, 0xa5, 0x16, 0xa0, 0xcd, 0x21, 0xf1, 0x99, 0xd4, \ + 0xec, 0xea, 0xcb, 0x7c, 0x18, 0x58, 0x08, 0x94, 0xa5, 0xec, 0x9b, 0xc5, \ + 0x8b, 0xdf, 0x1a, 0x1e, 0x99, 0x38, 0x99, 0x87, 0x1e, 0x7b, 0xc0, 0x8d, \ + 0x39, 0xdf, 0x38, 0x5d, 0x70, 0x78, 0x07, 0xd3, 0x9e, 0xd9, 0x93, 0xe8, \ + 0xb9, 0x72, 0x51, 0xc5, 0xce, 0xa3, 0x30, 0x52, 0xa9, 0xf2, 0xe7, 0x40, \ + 0x70, 0x14, 0xcb, 0x44, 0xa2, 0x72, 0x0b, 0xc2, 0xe5, 0x40, 0xf9, 0x3e, \ + 0xe5, 0xa6, 0x0e, 0xb3, 0xf9, 0xec, 0x4a, 0x63, 0xc0, 0xb8, 0x29, 0x00, \ + 0x74, 0x9c, 0x57, 0x3b, 0xa8, 0xa5, 0x04, 0x90, 0x71, 0xf1, 0xbd, 0x83, \ + 0xd9, 0x3f, 0xd6, 0xa5, 0xe2, 0x3c, 0x2a, 0x8f, 0xef, 0x27, 0x60, 0xc3, \ + 0xc6, 0x9f, 0xcb, 0xba, 0xec, 0x60, 0x7d, 0xb7, 0xe6, 0x84, 0x32, 0xbe, \ + 0x4f, 0xfb, 0x58, 0x26, 0x22, 0x03, 0x5b, 0xd4, 0xb4, 0xd5, 0xfb, 0xf5, \ + 0xe3, 0x96, 0x2e, 0x70, 0xc0, 0xe4, 0x2e, 0xbd, 0xfc, 0x2e, 0xee, 0xe2, \ + 0x41, 0x55, 0xc0, 0x34, 0x2e, 0x7d, 0x24, 0x72, 0x69, 0xcb, 0x47, 0xb1, \ + 0x14, 0x40, 0x83, 0x7d, 0x67, 0xf4, 0x86, 0xf6, 0x31, 0xab, 0xf1, 0x79, \ + 0xa4, 0xb2, 0xb5, 0x2e, 0x12, 0xf9, 0x84, 0x17, 0xf0, 0x62, 0x6f, 0x27, \ + 0x3e, 0x13, 0x58, 0xb1, 0x54, 0x0d, 0x21, 0x9a, 0x73, 0x37, 0xa1, 0x30, \ + 0xcf, 0x6f, 0x92, 0xdc, 0xf6, 0xe9, 0xfc, 0xac, 0xdb, 0x2e, 0x28, 0xd1, \ + 0x7e, 0x02, 0x4b, 0x23, 0xa0, 0x15, 0xf2, 0x38, 0x65, 0x64, 0x09, 0xea, \ + 0x0c, 0x6e, 0x8e, 0x1b, 0x17, 0xa0, 0x71, 0xc8, 0xb3, 0x9b, 0xc9, 0xab, \ + 0xe9, 0xc3, 0xf2, 0xcf, 0x87, 0x96, 0x8f, 0x80, 0x02, 0x32, 0x9e, 0x99, \ + 0x58, 0x6f, 0xa2, 0xd5, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, \ + 0x00, 0x3f, 0xf7, 0x07, 0xd3, 0x34, 0x6f, 0xdb, 0xc9, 0x37, 0xb7, 0x84, \ + 0xdc, 0x37, 0x45, 0xe1, 0x63, 0xad, 0xb8, 0xb6, 0x75, 0xb1, 0xc7, 0x35, \ + 0xb4, 0x77, 0x2a, 0x5b, 0x77, 0xf9, 0x7e, 0xe0, 0xc1, 0xa3, 0xd1, 0xb7, \ + 0xcb, 0xa9, 0x5a, 0xc1, 0x87, 0xda, 0x5a, 0xfa, 0x17, 0xe4, 0xd5, 0x38, \ + 0x03, 0xde, 0x68, 0x98, 0x81, 0xec, 0xb5, 0xf2, 0x2a, 0x8d, 0xe9, 0x2c, \ + 0xf3, 0xa6, 0xe5, 0x32, 0x17, 0x7f, 0x33, 0x81, 0xe8, 0x38, 0x72, 0xd5, \ + 0x9c, 0xfa, 0x4e, 0xfb, 0x26, 0xf5, 0x15, 0x0b, 0xaf, 0x84, 0x66, 0xab, \ + 0x02, 0xe0, 0x18, 0xd5, 0x91, 0x7c, 0xd6, 0x8f, 0xc9, 0x4b, 0x76, 0x08, \ + 0x2b, 0x1d, 0x81, 0x68, 0x30, 0xe1, 0xfa, 0x70, 0x6c, 0x13, 0x4e, 0x10, \ + 0x03, 0x35, 0x3e, 0xc5, 0xca, 0x58, 0x20, 0x8a, 0x21, 0x18, 0x38, 0xa0, \ + 0x0f, 0xed, 0xc4, 0xbb, 0x45, 0x6f, 0xf5, 0x84, 0x5b, 0xb0, 0xcf, 0x4e, \ + 0x9d, 0x58, 0x13, 0x6b, 0x35, 0x35, 0x69, 0xa1, 0xd2, 0xc4, 0xf2, 0xc1, \ + 0x48, 0x04, 0x20, 0x51, 0xb9, 0x6b, 0xa4, 0x5d, 0xa5, 0x4b, 0x84, 0x88, \ + 0x43, 0x48, 0x99, 0x2c, 0xbb, 0xa4, 0x97, 0xd6, 0xd6, 0x18, 0xf6, 0xec, \ + 0x5c, 0xd1, 0x31, 0x49, 0xc9, 0xf2, 0x8f, 0x0b, 0x4d, 0xef, 0x09, 0x02, \ + 0xfe, 0x7d, 0xfd, 0xbb, 0xaf, 0x2b, 0x83, 0x94, 0x22, 0xc4, 0xa7, 0x3e, \ + 0x66, 0xf5, 0xe0, 0x57, 0xdc, 0xf2, 0xed, 0x2c, 0x3e, 0x81, 0x74, 0x76, \ + 0x1e, 0x96, 0x6f, 0x74, 0x1e, 0x32, 0x0e, 0x14, 0x31, 0xd0, 0x74, 0xf0, \ + 0xf4, 0x07, 0xbd, 0xc3, 0xd1, 0x22, 0xc2, 0xa8, 0x95, 0x92, 0x06, 0x7f, \ + 0x43, 0x02, 0x91, 0xbc, 0xdd, 0x23, 0x01, 0x89, 0x94, 0x20, 0x44, 0x64, \ + 0xf5, 0x1d, 0x67, 0xd2, 0x8f, 0xe8, 0x69, 0xa5, 0x29, 0x25, 0xe6, 0x50, \ + 0x9c, 0xe3, 0xe9, 0xcb, 0x75, 0x02, 0x81, 0x81, 0x00, 0xe2, 0x29, 0x3e, \ + 0xaa, 0x6b, 0xd5, 0x59, 0x1e, 0x9c, 0xe6, 0x47, 0xd5, 0xb6, 0xd7, 0xe3, \ + 0xf1, 0x8e, 0x9e, 0xe9, 0x83, 0x5f, 0x10, 0x9f, 0x63, 0xec, 0x04, 0x44, \ + 0xcc, 0x3f, 0xf8, 0xd9, 0x3a, 0x17, 0xe0, 0x4f, 0xfe, 0xd8, 0x4d, 0xcd, \ + 0x46, 0x54, 0x74, 0xbf, 0x0a, 0xc4, 0x67, 0x9c, 0xa7, 0xd8, 0x89, 0x65, \ + 0x4c, 0xfd, 0x58, 0x2a, 0x47, 0x0f, 0xf4, 0x37, 0xb6, 0x55, 0xb0, 0x1d, \ + 0xed, 0xa7, 0x39, 0xfc, 0x4f, 0xa3, 0xc4, 0x75, 0x3a, 0xa3, 0x98, 0xa7, \ + 0x45, 0xf5, 0x66, 0xcb, 0x7c, 0x65, 0xfb, 0x80, 0x23, 0xe6, 0xff, 0xfd, \ + 0x99, 0x1f, 0x8e, 0x6b, 0xff, 0x5e, 0x93, 0x66, 0xdf, 0x6c, 0x6f, 0xc3, \ + 0xf6, 0x38, 0x2e, 0xff, 0x69, 0xb5, 0xac, 0xae, 0xbb, 0xc6, 0x71, 0x16, \ + 0x6b, 0xd0, 0xf8, 0x22, 0xd9, 0xf8, 0xa2, 0x72, 0x20, 0xd2, 0xe2, 0x3a, \ + 0x70, 0x4b, 0xde, 0xab, 0x2f, 0x02, 0x81, 0x81, 0x00, 0xda, 0x51, 0x9b, \ + 0xb8, 0xb2, 0x2a, 0x14, 0x75, 0x58, 0x40, 0x8d, 0x27, 0x70, 0xfa, 0x31, \ + 0x48, 0xb0, 0x20, 0x21, 0x34, 0xfa, 0x4c, 0x57, 0xa8, 0x11, 0x88, 0xf3, \ + 0xa7, 0xae, 0x21, 0xe9, 0xb6, 0x2b, 0xd1, 0xcd, 0xa7, 0xf8, 0xd8, 0x0c, \ + 0x8a, 0x76, 0x22, 0x35, 0x44, 0xce, 0x3f, 0x25, 0x29, 0x83, 0x7d, 0x79, \ + 0xa7, 0x31, 0xd6, 0xec, 0xb2, 0xbf, 0xda, 0x34, 0xb6, 0xf6, 0xb2, 0x3b, \ + 0xf3, 0x78, 0x5a, 0x04, 0x83, 0x33, 0x3e, 0xa2, 0xe2, 0x81, 0x82, 0x13, \ + 0xd4, 0x35, 0x17, 0x63, 0x9b, 0x9e, 0xc4, 0x8d, 0x91, 0x4c, 0x03, 0x77, \ + 0xc7, 0x71, 0x5b, 0xee, 0x83, 0x6d, 0xd5, 0x78, 0x88, 0xf6, 0x2c, 0x79, \ + 0xc2, 0x4a, 0xb4, 0x79, 0x90, 0x70, 0xbf, 0xdf, 0x34, 0x56, 0x96, 0x71, \ + 0xe3, 0x0e, 0x68, 0x91, 0xbc, 0xea, 0xcb, 0x33, 0xc0, 0xbe, 0x45, 0xd7, \ + 0xfc, 0x30, 0xfd, 0x01, 0x3b, 0x02, 0x81, 0x81, 0x00, 0xd2, 0x9f, 0x2a, \ + 0xb7, 0x38, 0x19, 0xc7, 0x17, 0x95, 0x73, 0x78, 0xae, 0xf5, 0xcb, 0x75, \ + 0x83, 0x7f, 0x19, 0x4b, 0xcb, 0x86, 0xfb, 0x4a, 0x15, 0x9a, 0xb6, 0x17, \ + 0x04, 0x49, 0x07, 0x8d, 0xf6, 0x66, 0x4a, 0x06, 0xf6, 0x05, 0xa7, 0xdf, \ + 0x66, 0x82, 0x3c, 0xff, 0xb6, 0x1d, 0x57, 0x89, 0x33, 0x5f, 0x9c, 0x05, \ + 0x75, 0x7f, 0xf3, 0x5d, 0xdc, 0x34, 0x65, 0x72, 0x85, 0x22, 0xa4, 0x14, \ + 0x1b, 0x41, 0xc3, 0xe4, 0xd0, 0x9e, 0x69, 0xd5, 0xeb, 0x38, 0x74, 0x70, \ + 0x43, 0xdc, 0xd9, 0x50, 0xe4, 0x97, 0x6d, 0x73, 0xd6, 0xfb, 0xc8, 0xa7, \ + 0xfa, 0xb4, 0xc2, 0xc4, 0x9d, 0x5d, 0x0c, 0xd5, 0x9f, 0x79, 0xb3, 0x54, \ + 0xc2, 0xb7, 0x6c, 0x3d, 0x7d, 0xcb, 0x2d, 0xf8, 0xc4, 0xf3, 0x78, 0x5a, \ + 0x33, 0x2a, 0xb8, 0x0c, 0x6d, 0x06, 0xfa, 0xf2, 0x62, 0xd3, 0x42, 0xd0, \ + 0xbd, 0xc8, 0x4a, 0xa5, 0x0d, 0x02, 0x81, 0x81, 0x00, 0xd4, 0xa9, 0x90, \ + 0x15, 0xde, 0xbf, 0x2c, 0xc4, 0x8d, 0x9d, 0xfb, 0xa1, 0xc2, 0xe4, 0x83, \ + 0xe3, 0x79, 0x65, 0x22, 0xd3, 0xb7, 0x49, 0x6c, 0x4d, 0x94, 0x1f, 0x22, \ + 0xb1, 0x60, 0xe7, 0x3a, 0x00, 0xb1, 0x38, 0xa2, 0xab, 0x0f, 0xb4, 0x6c, \ + 0xaa, 0xe7, 0x9e, 0x34, 0xe3, 0x7c, 0x40, 0x78, 0x53, 0xb2, 0xf9, 0x23, \ + 0xea, 0xa0, 0x9a, 0xea, 0x60, 0xc8, 0x8f, 0xa6, 0xaf, 0xdf, 0x29, 0x09, \ + 0x4b, 0x06, 0x1e, 0x31, 0xad, 0x17, 0xda, 0xd8, 0xd1, 0xe9, 0x33, 0xab, \ + 0x5b, 0x18, 0x08, 0x5b, 0x87, 0xf8, 0xa5, 0x1f, 0xfd, 0xbb, 0xdc, 0xd8, \ + 0xed, 0x97, 0x57, 0xe4, 0xc3, 0x73, 0xd6, 0xf0, 0x9e, 0x01, 0xa6, 0x9b, \ + 0x48, 0x8e, 0x7a, 0xb4, 0xbb, 0xe5, 0x88, 0x91, 0xc5, 0x2a, 0xdf, 0x4b, \ + 0xba, 0xd0, 0x8b, 0x3e, 0x03, 0x97, 0x77, 0x2f, 0x47, 0x7e, 0x51, 0x0c, \ + 0xae, 0x65, 0x8d, 0xde, 0x87, 0x02, 0x81, 0x80, 0x20, 0x24, 0x0f, 0xd2, \ + 0xaf, 0xc2, 0x28, 0x3b, 0x97, 0x20, 0xb2, 0x92, 0x49, 0xeb, 0x09, 0x68, \ + 0x40, 0xb2, 0xbe, 0xd1, 0xc3, 0x83, 0x94, 0x34, 0x38, 0xd6, 0xc9, 0xec, \ + 0x34, 0x09, 0xf9, 0x41, 0x6d, 0x5c, 0x42, 0x94, 0xf7, 0x04, 0xfc, 0x32, \ + 0x39, 0x69, 0xbc, 0x1c, 0xfb, 0x3e, 0x61, 0x98, 0xc0, 0x80, 0xd8, 0x36, \ + 0x47, 0xc3, 0x6d, 0xc2, 0x2e, 0xe7, 0x81, 0x2a, 0x17, 0x34, 0x64, 0x30, \ + 0x4e, 0x96, 0xbb, 0x26, 0x16, 0xb9, 0x41, 0x36, 0xfe, 0x8a, 0xd6, 0x53, \ + 0x7c, 0xaa, 0xec, 0x39, 0x42, 0x50, 0xef, 0xe3, 0xb3, 0x01, 0x28, 0x32, \ + 0xca, 0x6d, 0xf5, 0x9a, 0x1e, 0x9f, 0x37, 0xbe, 0xfe, 0x38, 0x20, 0x22, \ + 0x91, 0x8c, 0xcd, 0x95, 0x02, 0xf2, 0x4d, 0x6f, 0x1a, 0xb4, 0x43, 0xf0, \ + 0x19, 0xdf, 0x65, 0xc0, 0x92, 0xe7, 0x9d, 0x2f, 0x09, 0xe7, 0xec, 0x69, \ + 0xa8, 0xc2, 0x8f, 0x0d \ +} +/* END FILE */ + +/* + * Test server Certificates + * + * Test server certificates are defined for each choice + * of the following parameters: + * - PEM or DER encoding + * - SHA-1 or SHA-256 hash + * - RSA or EC key + * + * Things to add: + * - multiple EC curve types + */ + +/* This is taken from tests/data_files/server5.crt. */ +/* BEGIN FILE string macro TEST_SRV_CRT_EC_PEM tests/data_files/server5.crt */ +#define TEST_SRV_CRT_EC_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" \ + "MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG\r\n" \ + "CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA\r\n" \ + "2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd\r\n" \ + "BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB\r\n" \ + "PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xh\r\n" \ + "clNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG\r\n" \ + "CCqGSM49BAMCA2gAMGUCMQCaLFzXptui5WQN8LlO3ddh1hMxx6tzgLvT03MTVK2S\r\n" \ + "C12r0Lz3ri/moSEpNZWqPjkCMCE2f53GXcYLqyfyJR078c/xNSUU5+Xxl7VZ414V\r\n" \ + "fGa5kHvHARBPc8YAIVIqDvHH1Q==\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/server5.crt.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_SRV_CRT_EC_DER tests/data_files/server5.crt.der */ +#define TEST_SRV_CRT_EC_DER { \ + 0x30, 0x82, 0x02, 0x1f, 0x30, 0x82, 0x01, 0xa5, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x09, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, \ + 0x3d, 0x04, 0x03, 0x02, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, \ + 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, \ + 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x33, 0x30, 0x39, 0x32, 0x34, 0x31, 0x35, 0x35, 0x32, 0x30, 0x34, \ + 0x5a, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x35, \ + 0x32, 0x30, 0x34, 0x5a, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, \ + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x30, 0x59, \ + 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, \ + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, \ + 0x04, 0x37, 0xcc, 0x56, 0xd9, 0x76, 0x09, 0x1e, 0x5a, 0x72, 0x3e, 0xc7, \ + 0x59, 0x2d, 0xff, 0x20, 0x6e, 0xee, 0x7c, 0xf9, 0x06, 0x91, 0x74, 0xd0, \ + 0xad, 0x14, 0xb5, 0xf7, 0x68, 0x22, 0x59, 0x62, 0x92, 0x4e, 0xe5, 0x00, \ + 0xd8, 0x23, 0x11, 0xff, 0xea, 0x2f, 0xd2, 0x34, 0x5d, 0x5d, 0x16, 0xbd, \ + 0x8a, 0x88, 0xc2, 0x6b, 0x77, 0x0d, 0x55, 0xcd, 0x8a, 0x2a, 0x0e, 0xfa, \ + 0x01, 0xc8, 0xb4, 0xed, 0xff, 0xa3, 0x81, 0x9d, 0x30, 0x81, 0x9a, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1d, \ + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x50, 0x61, 0xa5, \ + 0x8f, 0xd4, 0x07, 0xd9, 0xd7, 0x82, 0x01, 0x0c, 0xe5, 0x65, 0x7f, 0x8c, \ + 0x63, 0x46, 0xa7, 0x13, 0xbe, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23, \ + 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01, \ + 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb, \ + 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, \ + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, \ + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, \ + 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, \ + 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, \ + 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09, \ + 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0a, 0x06, \ + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x68, 0x00, \ + 0x30, 0x65, 0x02, 0x31, 0x00, 0x9a, 0x2c, 0x5c, 0xd7, 0xa6, 0xdb, 0xa2, \ + 0xe5, 0x64, 0x0d, 0xf0, 0xb9, 0x4e, 0xdd, 0xd7, 0x61, 0xd6, 0x13, 0x31, \ + 0xc7, 0xab, 0x73, 0x80, 0xbb, 0xd3, 0xd3, 0x73, 0x13, 0x54, 0xad, 0x92, \ + 0x0b, 0x5d, 0xab, 0xd0, 0xbc, 0xf7, 0xae, 0x2f, 0xe6, 0xa1, 0x21, 0x29, \ + 0x35, 0x95, 0xaa, 0x3e, 0x39, 0x02, 0x30, 0x21, 0x36, 0x7f, 0x9d, 0xc6, \ + 0x5d, 0xc6, 0x0b, 0xab, 0x27, 0xf2, 0x25, 0x1d, 0x3b, 0xf1, 0xcf, 0xf1, \ + 0x35, 0x25, 0x14, 0xe7, 0xe5, 0xf1, 0x97, 0xb5, 0x59, 0xe3, 0x5e, 0x15, \ + 0x7c, 0x66, 0xb9, 0x90, 0x7b, 0xc7, 0x01, 0x10, 0x4f, 0x73, 0xc6, 0x00, \ + 0x21, 0x52, 0x2a, 0x0e, 0xf1, 0xc7, 0xd5 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/server5.key. */ +/* BEGIN FILE string macro TEST_SRV_KEY_EC_PEM tests/data_files/server5.key */ +#define TEST_SRV_KEY_EC_PEM \ + "-----BEGIN EC PRIVATE KEY-----\r\n" \ + "MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49\r\n" \ + "AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/\r\n" \ + "6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w==\r\n" \ + "-----END EC PRIVATE KEY-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/server5.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_SRV_KEY_EC_DER tests/data_files/server5.key.der */ +#define TEST_SRV_KEY_EC_DER { \ + 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0xf1, 0x2a, 0x13, 0x20, 0x76, \ + 0x02, 0x70, 0xa8, 0x3c, 0xbf, 0xfd, 0x53, 0xf6, 0x03, 0x1e, 0xf7, 0x6a, \ + 0x5d, 0x86, 0xc8, 0xa2, 0x04, 0xf2, 0xc3, 0x0c, 0xa9, 0xeb, 0xf5, 0x1f, \ + 0x0f, 0x0e, 0xa7, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, \ + 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0x37, 0xcc, 0x56, \ + 0xd9, 0x76, 0x09, 0x1e, 0x5a, 0x72, 0x3e, 0xc7, 0x59, 0x2d, 0xff, 0x20, \ + 0x6e, 0xee, 0x7c, 0xf9, 0x06, 0x91, 0x74, 0xd0, 0xad, 0x14, 0xb5, 0xf7, \ + 0x68, 0x22, 0x59, 0x62, 0x92, 0x4e, 0xe5, 0x00, 0xd8, 0x23, 0x11, 0xff, \ + 0xea, 0x2f, 0xd2, 0x34, 0x5d, 0x5d, 0x16, 0xbd, 0x8a, 0x88, 0xc2, 0x6b, \ + 0x77, 0x0d, 0x55, 0xcd, 0x8a, 0x2a, 0x0e, 0xfa, 0x01, 0xc8, 0xb4, 0xed, \ + 0xff \ +} +/* END FILE */ + +/* This is taken from tests/data_files/server2-sha256.crt. */ +/* BEGIN FILE string macro TEST_SRV_CRT_RSA_SHA256_PEM tests/data_files/server2-sha256.crt */ +#define TEST_SRV_CRT_RSA_SHA256_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n" \ + "AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n" \ + "owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n" \ + "NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n" \ + "tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n" \ + "hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n" \ + "HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n" \ + "VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n" \ + "FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQELBQADggEBAGGEshT5\r\n" \ + "kvnRmLVScVeUEdwIrvW7ezbGbUvJ8VxeJ79/HSjlLiGbMc4uUathwtzEdi9R/4C5\r\n" \ + "DXBNeEPTkbB+fhG1W06iHYj/Dp8+aaG7fuDxKVKHVZSqBnmQLn73ymyclZNHii5A\r\n" \ + "3nTS8WUaHAzxN/rajOtoM7aH1P9tULpHrl+7HOeLMpxUnwI12ZqZaLIzxbcdJVcr\r\n" \ + "ra2F00aXCGkYVLvyvbZIq7LC+yVysej5gCeQYD7VFOEks0jhFjrS06gP0/XnWv6v\r\n" \ + "eBoPez9d+CCjkrhseiWzXOiriIMICX48EloO/DrsMRAtvlwq7EDz4QhILz6ffndm\r\n" \ + "e4K1cVANRPN2o9Y=\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is taken from tests/data_files/server2-sha256.crt.der. */ +/* BEGIN FILE binary macro TEST_SRV_CRT_RSA_SHA256_DER tests/data_files/server2-sha256.crt.der */ +#define TEST_SRV_CRT_RSA_SHA256_DER { \ + 0x30, 0x82, 0x03, 0x37, 0x30, 0x82, 0x02, 0x1f, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, 0x34, 0x30, 0x36, \ + 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x36, 0x5a, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x30, 0x82, \ + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, \ + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, \ + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc1, 0x4d, 0xa3, 0xdd, 0xe7, \ + 0xcd, 0x1d, 0xd1, 0x04, 0xd7, 0x49, 0x72, 0xb8, 0x99, 0xac, 0x0e, 0x78, \ + 0xe4, 0x3a, 0x3c, 0x4a, 0xcf, 0x3a, 0x13, 0x16, 0xd0, 0x5a, 0xe4, 0xcd, \ + 0xa3, 0x00, 0x88, 0xa7, 0xee, 0x1e, 0x6b, 0x96, 0xa7, 0x52, 0xb4, 0x90, \ + 0xef, 0x2d, 0x72, 0x7a, 0x3e, 0x24, 0x9a, 0xfc, 0xb6, 0x34, 0xac, 0x24, \ + 0xf5, 0x77, 0xe0, 0x26, 0x64, 0x8c, 0x9c, 0xb0, 0x28, 0x7d, 0xa1, 0xda, \ + 0xea, 0x8c, 0xe6, 0xc9, 0x1c, 0x96, 0xbc, 0xfe, 0xc1, 0x04, 0x52, 0xb3, \ + 0x36, 0xd4, 0xa3, 0xfa, 0xe1, 0xb1, 0x76, 0xd8, 0x90, 0xc1, 0x61, 0xb4, \ + 0x66, 0x52, 0x36, 0xa2, 0x26, 0x53, 0xaa, 0xab, 0x74, 0x5e, 0x07, 0x7d, \ + 0x19, 0x82, 0xdb, 0x2a, 0xd8, 0x1f, 0xa0, 0xd9, 0x0d, 0x1c, 0x2d, 0x49, \ + 0x66, 0xf7, 0x5b, 0x25, 0x73, 0x46, 0xe8, 0x0b, 0x8a, 0x4f, 0x69, 0x0c, \ + 0xb5, 0x00, 0x90, 0xe1, 0xda, 0x82, 0x10, 0x66, 0x7d, 0xae, 0x54, 0x2b, \ + 0x8b, 0x65, 0x79, 0x91, 0xa1, 0xe2, 0x61, 0xc3, 0xcd, 0x40, 0x49, 0x08, \ + 0xee, 0x68, 0x0c, 0xf1, 0x8b, 0x86, 0xd2, 0x46, 0xbf, 0xd0, 0xb8, 0xaa, \ + 0x11, 0x03, 0x1e, 0x7f, 0x56, 0xa8, 0x1a, 0x1e, 0x44, 0x18, 0x0f, 0x0f, \ + 0x85, 0x8b, 0xda, 0x8b, 0x44, 0x5e, 0xe2, 0x18, 0xc6, 0x62, 0x2f, 0xc7, \ + 0x66, 0x8d, 0xfa, 0x5d, 0xd8, 0x7d, 0xf3, 0x27, 0x89, 0x29, 0x01, 0xc5, \ + 0x90, 0x0e, 0x3f, 0x27, 0xf1, 0x30, 0xc8, 0x4a, 0x0e, 0xef, 0xd6, 0xde, \ + 0xc7, 0xc7, 0x27, 0x6b, 0xc7, 0x05, 0x3d, 0x7a, 0xc4, 0x02, 0x3c, 0x9a, \ + 0x1d, 0x3e, 0x0f, 0xe8, 0x34, 0x98, 0x5b, 0xcb, 0x73, 0x4b, 0x52, 0x96, \ + 0xd8, 0x11, 0xa2, 0x2c, 0x80, 0x88, 0x69, 0x39, 0x5a, 0xd3, 0x0f, 0xb0, \ + 0xde, 0x59, 0x2f, 0x11, 0xc7, 0xf7, 0xea, 0x12, 0x01, 0x30, 0x97, 0x02, \ + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x4d, 0x30, 0x4b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, \ + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa5, 0x05, 0xe8, 0x64, 0xb8, 0xdc, \ + 0xdf, 0x60, 0x0f, 0x50, 0x12, 0x4d, 0x60, 0xa8, 0x64, 0xaf, 0x4d, 0x8b, \ + 0x43, 0x93, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, \ + 0x16, 0x80, 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, \ + 0xb9, 0xd5, 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, \ + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, \ + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x61, 0x84, 0xb2, 0x14, 0xf9, \ + 0x92, 0xf9, 0xd1, 0x98, 0xb5, 0x52, 0x71, 0x57, 0x94, 0x11, 0xdc, 0x08, \ + 0xae, 0xf5, 0xbb, 0x7b, 0x36, 0xc6, 0x6d, 0x4b, 0xc9, 0xf1, 0x5c, 0x5e, \ + 0x27, 0xbf, 0x7f, 0x1d, 0x28, 0xe5, 0x2e, 0x21, 0x9b, 0x31, 0xce, 0x2e, \ + 0x51, 0xab, 0x61, 0xc2, 0xdc, 0xc4, 0x76, 0x2f, 0x51, 0xff, 0x80, 0xb9, \ + 0x0d, 0x70, 0x4d, 0x78, 0x43, 0xd3, 0x91, 0xb0, 0x7e, 0x7e, 0x11, 0xb5, \ + 0x5b, 0x4e, 0xa2, 0x1d, 0x88, 0xff, 0x0e, 0x9f, 0x3e, 0x69, 0xa1, 0xbb, \ + 0x7e, 0xe0, 0xf1, 0x29, 0x52, 0x87, 0x55, 0x94, 0xaa, 0x06, 0x79, 0x90, \ + 0x2e, 0x7e, 0xf7, 0xca, 0x6c, 0x9c, 0x95, 0x93, 0x47, 0x8a, 0x2e, 0x40, \ + 0xde, 0x74, 0xd2, 0xf1, 0x65, 0x1a, 0x1c, 0x0c, 0xf1, 0x37, 0xfa, 0xda, \ + 0x8c, 0xeb, 0x68, 0x33, 0xb6, 0x87, 0xd4, 0xff, 0x6d, 0x50, 0xba, 0x47, \ + 0xae, 0x5f, 0xbb, 0x1c, 0xe7, 0x8b, 0x32, 0x9c, 0x54, 0x9f, 0x02, 0x35, \ + 0xd9, 0x9a, 0x99, 0x68, 0xb2, 0x33, 0xc5, 0xb7, 0x1d, 0x25, 0x57, 0x2b, \ + 0xad, 0xad, 0x85, 0xd3, 0x46, 0x97, 0x08, 0x69, 0x18, 0x54, 0xbb, 0xf2, \ + 0xbd, 0xb6, 0x48, 0xab, 0xb2, 0xc2, 0xfb, 0x25, 0x72, 0xb1, 0xe8, 0xf9, \ + 0x80, 0x27, 0x90, 0x60, 0x3e, 0xd5, 0x14, 0xe1, 0x24, 0xb3, 0x48, 0xe1, \ + 0x16, 0x3a, 0xd2, 0xd3, 0xa8, 0x0f, 0xd3, 0xf5, 0xe7, 0x5a, 0xfe, 0xaf, \ + 0x78, 0x1a, 0x0f, 0x7b, 0x3f, 0x5d, 0xf8, 0x20, 0xa3, 0x92, 0xb8, 0x6c, \ + 0x7a, 0x25, 0xb3, 0x5c, 0xe8, 0xab, 0x88, 0x83, 0x08, 0x09, 0x7e, 0x3c, \ + 0x12, 0x5a, 0x0e, 0xfc, 0x3a, 0xec, 0x31, 0x10, 0x2d, 0xbe, 0x5c, 0x2a, \ + 0xec, 0x40, 0xf3, 0xe1, 0x08, 0x48, 0x2f, 0x3e, 0x9f, 0x7e, 0x77, 0x66, \ + 0x7b, 0x82, 0xb5, 0x71, 0x50, 0x0d, 0x44, 0xf3, 0x76, 0xa3, 0xd6 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/server2.crt. */ +/* BEGIN FILE string macro TEST_SRV_CRT_RSA_SHA1_PEM tests/data_files/server2.crt */ +#define TEST_SRV_CRT_RSA_SHA1_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n" \ + "AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n" \ + "owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n" \ + "NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n" \ + "tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n" \ + "hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n" \ + "HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n" \ + "VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n" \ + "FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAAFzC0rF\r\n" \ + "y6De8WMcdgQrEw3AhBHFjzqnxZw1ene4IBSC7lTw8rBSy3jOWQdPUWn+0y/pCeeF\r\n" \ + "kti6sevFdl1hLemGtd4q+T9TKEKGg3ND4ARfB5AUZZ9uEHq8WBkiwus5clGS17Qd\r\n" \ + "dS/TOisB59tQruLx1E1bPLtBKyqk4koC5WAULJwfpswGSyWJTpYwIpxcWE3D2tBu\r\n" \ + "UB6MZfXZFzWmWEOyKbeoXjXe8GBCGgHLywvYDsGQ36HSGtEsAvR2QaTLSxWYcfk1\r\n" \ + "fbDn4jSWkb4yZy1r01UEigFQtONieGwRFaUqEcFJHJvEEGVgh9keaVlOj2vrwf5r\r\n" \ + "4mN4lW7gLdenN6g=\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is taken from tests/data_files/server2.crt.der. */ +/* BEGIN FILE binary macro TEST_SRV_CRT_RSA_SHA1_DER tests/data_files/server2.crt.der */ +#define TEST_SRV_CRT_RSA_SHA1_DER { \ + 0x30, 0x82, 0x03, 0x37, 0x30, 0x82, 0x02, 0x1f, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, 0x34, 0x30, 0x36, \ + 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x36, 0x5a, 0x30, 0x34, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x30, 0x82, \ + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, \ + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, \ + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc1, 0x4d, 0xa3, 0xdd, 0xe7, \ + 0xcd, 0x1d, 0xd1, 0x04, 0xd7, 0x49, 0x72, 0xb8, 0x99, 0xac, 0x0e, 0x78, \ + 0xe4, 0x3a, 0x3c, 0x4a, 0xcf, 0x3a, 0x13, 0x16, 0xd0, 0x5a, 0xe4, 0xcd, \ + 0xa3, 0x00, 0x88, 0xa7, 0xee, 0x1e, 0x6b, 0x96, 0xa7, 0x52, 0xb4, 0x90, \ + 0xef, 0x2d, 0x72, 0x7a, 0x3e, 0x24, 0x9a, 0xfc, 0xb6, 0x34, 0xac, 0x24, \ + 0xf5, 0x77, 0xe0, 0x26, 0x64, 0x8c, 0x9c, 0xb0, 0x28, 0x7d, 0xa1, 0xda, \ + 0xea, 0x8c, 0xe6, 0xc9, 0x1c, 0x96, 0xbc, 0xfe, 0xc1, 0x04, 0x52, 0xb3, \ + 0x36, 0xd4, 0xa3, 0xfa, 0xe1, 0xb1, 0x76, 0xd8, 0x90, 0xc1, 0x61, 0xb4, \ + 0x66, 0x52, 0x36, 0xa2, 0x26, 0x53, 0xaa, 0xab, 0x74, 0x5e, 0x07, 0x7d, \ + 0x19, 0x82, 0xdb, 0x2a, 0xd8, 0x1f, 0xa0, 0xd9, 0x0d, 0x1c, 0x2d, 0x49, \ + 0x66, 0xf7, 0x5b, 0x25, 0x73, 0x46, 0xe8, 0x0b, 0x8a, 0x4f, 0x69, 0x0c, \ + 0xb5, 0x00, 0x90, 0xe1, 0xda, 0x82, 0x10, 0x66, 0x7d, 0xae, 0x54, 0x2b, \ + 0x8b, 0x65, 0x79, 0x91, 0xa1, 0xe2, 0x61, 0xc3, 0xcd, 0x40, 0x49, 0x08, \ + 0xee, 0x68, 0x0c, 0xf1, 0x8b, 0x86, 0xd2, 0x46, 0xbf, 0xd0, 0xb8, 0xaa, \ + 0x11, 0x03, 0x1e, 0x7f, 0x56, 0xa8, 0x1a, 0x1e, 0x44, 0x18, 0x0f, 0x0f, \ + 0x85, 0x8b, 0xda, 0x8b, 0x44, 0x5e, 0xe2, 0x18, 0xc6, 0x62, 0x2f, 0xc7, \ + 0x66, 0x8d, 0xfa, 0x5d, 0xd8, 0x7d, 0xf3, 0x27, 0x89, 0x29, 0x01, 0xc5, \ + 0x90, 0x0e, 0x3f, 0x27, 0xf1, 0x30, 0xc8, 0x4a, 0x0e, 0xef, 0xd6, 0xde, \ + 0xc7, 0xc7, 0x27, 0x6b, 0xc7, 0x05, 0x3d, 0x7a, 0xc4, 0x02, 0x3c, 0x9a, \ + 0x1d, 0x3e, 0x0f, 0xe8, 0x34, 0x98, 0x5b, 0xcb, 0x73, 0x4b, 0x52, 0x96, \ + 0xd8, 0x11, 0xa2, 0x2c, 0x80, 0x88, 0x69, 0x39, 0x5a, 0xd3, 0x0f, 0xb0, \ + 0xde, 0x59, 0x2f, 0x11, 0xc7, 0xf7, 0xea, 0x12, 0x01, 0x30, 0x97, 0x02, \ + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x4d, 0x30, 0x4b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, \ + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa5, 0x05, 0xe8, 0x64, 0xb8, 0xdc, \ + 0xdf, 0x60, 0x0f, 0x50, 0x12, 0x4d, 0x60, 0xa8, 0x64, 0xaf, 0x4d, 0x8b, \ + 0x43, 0x93, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, \ + 0x16, 0x80, 0x14, 0xb4, 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, \ + 0xb9, 0xd5, 0xa6, 0x95, 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, \ + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, \ + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x01, 0x73, 0x0b, 0x4a, 0xc5, \ + 0xcb, 0xa0, 0xde, 0xf1, 0x63, 0x1c, 0x76, 0x04, 0x2b, 0x13, 0x0d, 0xc0, \ + 0x84, 0x11, 0xc5, 0x8f, 0x3a, 0xa7, 0xc5, 0x9c, 0x35, 0x7a, 0x77, 0xb8, \ + 0x20, 0x14, 0x82, 0xee, 0x54, 0xf0, 0xf2, 0xb0, 0x52, 0xcb, 0x78, 0xce, \ + 0x59, 0x07, 0x4f, 0x51, 0x69, 0xfe, 0xd3, 0x2f, 0xe9, 0x09, 0xe7, 0x85, \ + 0x92, 0xd8, 0xba, 0xb1, 0xeb, 0xc5, 0x76, 0x5d, 0x61, 0x2d, 0xe9, 0x86, \ + 0xb5, 0xde, 0x2a, 0xf9, 0x3f, 0x53, 0x28, 0x42, 0x86, 0x83, 0x73, 0x43, \ + 0xe0, 0x04, 0x5f, 0x07, 0x90, 0x14, 0x65, 0x9f, 0x6e, 0x10, 0x7a, 0xbc, \ + 0x58, 0x19, 0x22, 0xc2, 0xeb, 0x39, 0x72, 0x51, 0x92, 0xd7, 0xb4, 0x1d, \ + 0x75, 0x2f, 0xd3, 0x3a, 0x2b, 0x01, 0xe7, 0xdb, 0x50, 0xae, 0xe2, 0xf1, \ + 0xd4, 0x4d, 0x5b, 0x3c, 0xbb, 0x41, 0x2b, 0x2a, 0xa4, 0xe2, 0x4a, 0x02, \ + 0xe5, 0x60, 0x14, 0x2c, 0x9c, 0x1f, 0xa6, 0xcc, 0x06, 0x4b, 0x25, 0x89, \ + 0x4e, 0x96, 0x30, 0x22, 0x9c, 0x5c, 0x58, 0x4d, 0xc3, 0xda, 0xd0, 0x6e, \ + 0x50, 0x1e, 0x8c, 0x65, 0xf5, 0xd9, 0x17, 0x35, 0xa6, 0x58, 0x43, 0xb2, \ + 0x29, 0xb7, 0xa8, 0x5e, 0x35, 0xde, 0xf0, 0x60, 0x42, 0x1a, 0x01, 0xcb, \ + 0xcb, 0x0b, 0xd8, 0x0e, 0xc1, 0x90, 0xdf, 0xa1, 0xd2, 0x1a, 0xd1, 0x2c, \ + 0x02, 0xf4, 0x76, 0x41, 0xa4, 0xcb, 0x4b, 0x15, 0x98, 0x71, 0xf9, 0x35, \ + 0x7d, 0xb0, 0xe7, 0xe2, 0x34, 0x96, 0x91, 0xbe, 0x32, 0x67, 0x2d, 0x6b, \ + 0xd3, 0x55, 0x04, 0x8a, 0x01, 0x50, 0xb4, 0xe3, 0x62, 0x78, 0x6c, 0x11, \ + 0x15, 0xa5, 0x2a, 0x11, 0xc1, 0x49, 0x1c, 0x9b, 0xc4, 0x10, 0x65, 0x60, \ + 0x87, 0xd9, 0x1e, 0x69, 0x59, 0x4e, 0x8f, 0x6b, 0xeb, 0xc1, 0xfe, 0x6b, \ + 0xe2, 0x63, 0x78, 0x95, 0x6e, 0xe0, 0x2d, 0xd7, 0xa7, 0x37, 0xa8 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/server2.key. */ +/* BEGIN FILE string macro TEST_SRV_KEY_RSA_PEM tests/data_files/server2.key */ +#define TEST_SRV_KEY_RSA_PEM \ + "-----BEGIN RSA PRIVATE KEY-----\r\n" \ + "MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r\r\n" \ + "lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2\r\n" \ + "2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ\r\n" \ + "Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i\r\n" \ + "GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb\r\n" \ + "y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ\r\n" \ + "++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G\r\n" \ + "Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z\r\n" \ + "/r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm\r\n" \ + "WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He\r\n" \ + "GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa\r\n" \ + "TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28\r\n" \ + "CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK\r\n" \ + "nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u\r\n" \ + "AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g\r\n" \ + "sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s\r\n" \ + "mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic\r\n" \ + "BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv\r\n" \ + "whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b\r\n" \ + "vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs\r\n" \ + "3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP\r\n" \ + "3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED\r\n" \ + "ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH\r\n" \ + "4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE\r\n" \ + "TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg==\r\n" \ + "-----END RSA PRIVATE KEY-----\r\n" +/* END FILE */ + +/* This was generated from tests/data_files/server2.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_SRV_KEY_RSA_DER tests/data_files/server2.key.der */ +#define TEST_SRV_KEY_RSA_DER { \ + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, \ + 0xc1, 0x4d, 0xa3, 0xdd, 0xe7, 0xcd, 0x1d, 0xd1, 0x04, 0xd7, 0x49, 0x72, \ + 0xb8, 0x99, 0xac, 0x0e, 0x78, 0xe4, 0x3a, 0x3c, 0x4a, 0xcf, 0x3a, 0x13, \ + 0x16, 0xd0, 0x5a, 0xe4, 0xcd, 0xa3, 0x00, 0x88, 0xa7, 0xee, 0x1e, 0x6b, \ + 0x96, 0xa7, 0x52, 0xb4, 0x90, 0xef, 0x2d, 0x72, 0x7a, 0x3e, 0x24, 0x9a, \ + 0xfc, 0xb6, 0x34, 0xac, 0x24, 0xf5, 0x77, 0xe0, 0x26, 0x64, 0x8c, 0x9c, \ + 0xb0, 0x28, 0x7d, 0xa1, 0xda, 0xea, 0x8c, 0xe6, 0xc9, 0x1c, 0x96, 0xbc, \ + 0xfe, 0xc1, 0x04, 0x52, 0xb3, 0x36, 0xd4, 0xa3, 0xfa, 0xe1, 0xb1, 0x76, \ + 0xd8, 0x90, 0xc1, 0x61, 0xb4, 0x66, 0x52, 0x36, 0xa2, 0x26, 0x53, 0xaa, \ + 0xab, 0x74, 0x5e, 0x07, 0x7d, 0x19, 0x82, 0xdb, 0x2a, 0xd8, 0x1f, 0xa0, \ + 0xd9, 0x0d, 0x1c, 0x2d, 0x49, 0x66, 0xf7, 0x5b, 0x25, 0x73, 0x46, 0xe8, \ + 0x0b, 0x8a, 0x4f, 0x69, 0x0c, 0xb5, 0x00, 0x90, 0xe1, 0xda, 0x82, 0x10, \ + 0x66, 0x7d, 0xae, 0x54, 0x2b, 0x8b, 0x65, 0x79, 0x91, 0xa1, 0xe2, 0x61, \ + 0xc3, 0xcd, 0x40, 0x49, 0x08, 0xee, 0x68, 0x0c, 0xf1, 0x8b, 0x86, 0xd2, \ + 0x46, 0xbf, 0xd0, 0xb8, 0xaa, 0x11, 0x03, 0x1e, 0x7f, 0x56, 0xa8, 0x1a, \ + 0x1e, 0x44, 0x18, 0x0f, 0x0f, 0x85, 0x8b, 0xda, 0x8b, 0x44, 0x5e, 0xe2, \ + 0x18, 0xc6, 0x62, 0x2f, 0xc7, 0x66, 0x8d, 0xfa, 0x5d, 0xd8, 0x7d, 0xf3, \ + 0x27, 0x89, 0x29, 0x01, 0xc5, 0x90, 0x0e, 0x3f, 0x27, 0xf1, 0x30, 0xc8, \ + 0x4a, 0x0e, 0xef, 0xd6, 0xde, 0xc7, 0xc7, 0x27, 0x6b, 0xc7, 0x05, 0x3d, \ + 0x7a, 0xc4, 0x02, 0x3c, 0x9a, 0x1d, 0x3e, 0x0f, 0xe8, 0x34, 0x98, 0x5b, \ + 0xcb, 0x73, 0x4b, 0x52, 0x96, 0xd8, 0x11, 0xa2, 0x2c, 0x80, 0x88, 0x69, \ + 0x39, 0x5a, 0xd3, 0x0f, 0xb0, 0xde, 0x59, 0x2f, 0x11, 0xc7, 0xf7, 0xea, \ + 0x12, 0x01, 0x30, 0x97, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, \ + 0x01, 0x00, 0x97, 0x47, 0x44, 0xbc, 0x10, 0x81, 0xc5, 0x18, 0xe4, 0x59, \ + 0xfb, 0xe0, 0x2d, 0x3a, 0x0e, 0x9e, 0x10, 0xdc, 0x43, 0xfb, 0x15, 0x6c, \ + 0xd1, 0xfd, 0x48, 0x78, 0x6c, 0xf9, 0xed, 0x38, 0xe8, 0xdd, 0x09, 0xd7, \ + 0x5f, 0xb5, 0x41, 0x64, 0xd7, 0x63, 0xfa, 0x9d, 0x44, 0x0a, 0xf8, 0x42, \ + 0x13, 0xf1, 0xbb, 0x5e, 0x79, 0x20, 0x53, 0x98, 0x4b, 0x65, 0x7f, 0x86, \ + 0x67, 0x48, 0xe4, 0xcf, 0xfb, 0x6a, 0x24, 0xe2, 0x34, 0xbd, 0x14, 0x9d, \ + 0x2c, 0x16, 0xe2, 0xa4, 0x79, 0xd6, 0xa2, 0xec, 0x81, 0x43, 0x87, 0xbf, \ + 0x03, 0x5c, 0x88, 0x25, 0xd9, 0x41, 0xb6, 0xa5, 0xf1, 0x27, 0x52, 0x84, \ + 0xfe, 0x2b, 0x6e, 0x1d, 0x16, 0xcd, 0x73, 0x88, 0xf8, 0x90, 0xbf, 0x19, \ + 0xfe, 0xbe, 0xa9, 0xbf, 0x09, 0xd3, 0x23, 0x43, 0xd2, 0xc7, 0x61, 0x2a, \ + 0xb3, 0x4e, 0x3c, 0x61, 0xd4, 0xbd, 0xd8, 0xb4, 0xfa, 0xa8, 0x0b, 0xf8, \ + 0x7e, 0x56, 0xcd, 0x0f, 0x13, 0x27, 0xda, 0xe6, 0x3b, 0xb3, 0x8c, 0x9c, \ + 0x4b, 0x84, 0x3c, 0xc3, 0x52, 0x57, 0x9c, 0x27, 0x9a, 0x02, 0x76, 0x26, \ + 0x59, 0x82, 0x39, 0xc3, 0x13, 0xbe, 0x6e, 0xf4, 0x44, 0x2d, 0x1d, 0x8c, \ + 0x73, 0x3e, 0x43, 0x99, 0x59, 0xcb, 0xf2, 0x34, 0x72, 0x9a, 0x5e, 0xa5, \ + 0xeb, 0x9f, 0x36, 0x6d, 0x2b, 0xf9, 0xa2, 0xe7, 0xd1, 0x78, 0x52, 0x1b, \ + 0xc8, 0xf6, 0x5b, 0x41, 0x69, 0x57, 0x81, 0x89, 0xe9, 0xbb, 0xa1, 0xde, \ + 0x19, 0x37, 0x3b, 0x13, 0x5c, 0xca, 0x61, 0x01, 0x86, 0xff, 0xdf, 0x83, \ + 0x41, 0x49, 0x7f, 0xd6, 0xf4, 0x2e, 0x08, 0xfa, 0x90, 0xc2, 0x7c, 0xb4, \ + 0xb5, 0x0a, 0x17, 0xdb, 0x0e, 0x6d, 0x75, 0x8a, 0x5d, 0x31, 0xd5, 0x66, \ + 0xfb, 0x39, 0x0b, 0xb5, 0xb6, 0xa3, 0xcd, 0xd4, 0xef, 0x88, 0x92, 0x5a, \ + 0x4d, 0x6c, 0xcb, 0xea, 0x5b, 0x79, 0x02, 0x81, 0x81, 0x00, 0xdf, 0x3a, \ + 0xf9, 0x25, 0x5e, 0x24, 0x37, 0x26, 0x40, 0x97, 0x2f, 0xe0, 0x4a, 0xba, \ + 0x52, 0x1b, 0x51, 0xaf, 0x84, 0x06, 0x32, 0x24, 0x0c, 0xcf, 0x44, 0xa8, \ + 0x77, 0xa7, 0xad, 0xb5, 0x8c, 0x58, 0xcc, 0xc8, 0x31, 0xb7, 0x0d, 0xbc, \ + 0x08, 0x8a, 0xe0, 0xa6, 0x8c, 0xc2, 0x73, 0xe5, 0x1a, 0x64, 0x92, 0xe8, \ + 0xed, 0x4c, 0x6f, 0x0b, 0xa6, 0xa7, 0xf3, 0x9a, 0xf5, 0x6f, 0x69, 0xca, \ + 0x3c, 0x22, 0xd0, 0x15, 0xa8, 0x20, 0x27, 0x41, 0xf8, 0x43, 0x42, 0x7f, \ + 0xb1, 0x93, 0xa1, 0x04, 0x85, 0xda, 0xa0, 0x1c, 0xd6, 0xc6, 0xf7, 0x8a, \ + 0x9e, 0xea, 0x5c, 0x78, 0xa7, 0x55, 0xc4, 0x6b, 0x05, 0x8b, 0xc0, 0x83, \ + 0xcb, 0xce, 0x83, 0x05, 0xf8, 0xb2, 0x16, 0x2b, 0xdf, 0x06, 0x3f, 0xb8, \ + 0xec, 0x16, 0xda, 0x43, 0x33, 0xc1, 0x8f, 0xb0, 0xb8, 0xac, 0xae, 0xd4, \ + 0x94, 0xb8, 0xda, 0x6f, 0x6a, 0xc3, 0x02, 0x81, 0x81, 0x00, 0xdd, 0xae, \ + 0x00, 0xcd, 0xa0, 0x72, 0x1a, 0x05, 0x8a, 0xee, 0x2f, 0xd4, 0x71, 0x4b, \ + 0xf0, 0x3e, 0xe5, 0xc1, 0xe1, 0x29, 0x8b, 0xa6, 0x67, 0x30, 0x98, 0xe7, \ + 0x12, 0xef, 0xdd, 0x12, 0x01, 0x90, 0x24, 0x58, 0xf0, 0x76, 0x92, 0xe7, \ + 0x3d, 0xbb, 0x23, 0xe1, 0xce, 0xf9, 0xa1, 0xd4, 0x38, 0x1b, 0x3f, 0x20, \ + 0xb3, 0x0f, 0x65, 0x6a, 0x8f, 0x55, 0x57, 0x36, 0xee, 0xb2, 0x84, 0x44, \ + 0xfc, 0x91, 0x88, 0xe1, 0xa4, 0xdd, 0x3b, 0x4a, 0x40, 0x4d, 0x7c, 0x86, \ + 0xed, 0xe1, 0xb5, 0x42, 0xef, 0xb9, 0x61, 0xcd, 0x58, 0x19, 0x77, 0x02, \ + 0xae, 0x58, 0x80, 0xdb, 0x13, 0x3d, 0xc7, 0x1f, 0x9d, 0xed, 0xff, 0xac, \ + 0x98, 0xfc, 0xcd, 0xf9, 0x62, 0x04, 0x83, 0x91, 0x89, 0x0d, 0x86, 0x43, \ + 0x8c, 0x0c, 0xc7, 0x1b, 0x90, 0x4d, 0xbe, 0x2f, 0xc5, 0x7c, 0xcd, 0x42, \ + 0xf5, 0xd3, 0xad, 0x8e, 0xfd, 0x9d, 0x02, 0x81, 0x80, 0x17, 0x4b, 0x79, \ + 0x2a, 0x6c, 0x1b, 0x8d, 0x61, 0xc1, 0x85, 0xc5, 0x6a, 0x3b, 0x82, 0x1c, \ + 0x05, 0x5b, 0xcd, 0xdc, 0x12, 0x25, 0x73, 0x5b, 0x9e, 0xd9, 0x84, 0x57, \ + 0x10, 0x39, 0x71, 0x63, 0x96, 0xf4, 0xaf, 0xc3, 0x78, 0x5d, 0xc7, 0x8c, \ + 0x80, 0xa9, 0x96, 0xd7, 0xc3, 0x87, 0x02, 0x96, 0x71, 0x7e, 0x5f, 0x2e, \ + 0x3c, 0x36, 0xae, 0x59, 0x92, 0xd7, 0x3a, 0x09, 0x78, 0xb9, 0xea, 0x6f, \ + 0xc2, 0x16, 0x42, 0xdc, 0x4b, 0x96, 0xad, 0x2c, 0xb2, 0x20, 0x23, 0x61, \ + 0x2d, 0x8d, 0xb5, 0x02, 0x1e, 0xe1, 0x6c, 0x81, 0x01, 0x3c, 0x5d, 0xcb, \ + 0xdd, 0x9b, 0x0e, 0xc0, 0x2f, 0x94, 0x12, 0xb2, 0xfe, 0x75, 0x75, 0x8b, \ + 0x74, 0x1e, 0x7a, 0x26, 0x0c, 0xb7, 0x81, 0x96, 0x81, 0x79, 0x6e, 0xdb, \ + 0xbc, 0x3a, 0xc4, 0x9e, 0x87, 0x09, 0x6e, 0xa0, 0xa6, 0xec, 0x8b, 0xa4, \ + 0x85, 0x71, 0xce, 0x04, 0xaf, 0x02, 0x81, 0x81, 0x00, 0xc2, 0xa7, 0x47, \ + 0x07, 0x48, 0x6a, 0xc8, 0xd4, 0xb3, 0x20, 0xe1, 0x98, 0xee, 0xff, 0x5a, \ + 0x6f, 0x30, 0x7a, 0xa5, 0x47, 0x40, 0xdc, 0x16, 0x62, 0x42, 0xf1, 0x2c, \ + 0xdc, 0xb8, 0xc7, 0x55, 0xde, 0x07, 0x3c, 0x9d, 0xb1, 0xd0, 0xdf, 0x02, \ + 0x82, 0xb0, 0x48, 0x58, 0xe1, 0x34, 0xab, 0xcf, 0xb4, 0x85, 0x23, 0x26, \ + 0x78, 0x4f, 0x7a, 0x59, 0x6f, 0xfb, 0x8c, 0x3d, 0xdf, 0x3d, 0x6c, 0x02, \ + 0x47, 0x9c, 0xe5, 0x5e, 0x49, 0xf1, 0x05, 0x0b, 0x1f, 0xbf, 0x48, 0x0f, \ + 0xdc, 0x10, 0xb9, 0x3d, 0x1d, 0x10, 0x77, 0x2a, 0x73, 0xf9, 0xdf, 0xbd, \ + 0xcd, 0xf3, 0x1f, 0xeb, 0x6e, 0x64, 0xca, 0x2b, 0x78, 0x4f, 0xf8, 0x73, \ + 0xc2, 0x10, 0xef, 0x79, 0x95, 0x33, 0x1e, 0x79, 0x35, 0x09, 0xff, 0x88, \ + 0x1b, 0xb4, 0x3e, 0x4c, 0xe1, 0x27, 0x2e, 0x75, 0x80, 0x58, 0x11, 0x03, \ + 0x21, 0x23, 0x96, 0x9a, 0xb5, 0x02, 0x81, 0x80, 0x05, 0x12, 0x64, 0x71, \ + 0x83, 0x00, 0x1c, 0xfe, 0xef, 0x83, 0xea, 0xdd, 0x2c, 0xc8, 0x2c, 0x00, \ + 0x62, 0x1e, 0x8f, 0x3a, 0xdb, 0x1c, 0xab, 0xd6, 0x34, 0x8b, 0xd1, 0xb2, \ + 0x5a, 0x4f, 0x3d, 0x37, 0x38, 0x02, 0xe0, 0xd7, 0x70, 0xc1, 0xb0, 0x47, \ + 0xe0, 0x08, 0x1a, 0x84, 0xec, 0x48, 0xc5, 0x7c, 0x76, 0x83, 0x12, 0x67, \ + 0xab, 0x7c, 0x9f, 0x90, 0x97, 0xc8, 0x8f, 0x07, 0xf4, 0xb3, 0x60, 0xf2, \ + 0x3f, 0x49, 0x18, 0xdb, 0x2e, 0x94, 0x6b, 0x53, 0x9e, 0xa2, 0x63, 0xde, \ + 0x63, 0xd9, 0xab, 0x21, 0x2e, 0x2d, 0x0a, 0xe0, 0xd0, 0xe8, 0xba, 0xc4, \ + 0x4c, 0x1e, 0xa5, 0xf5, 0x51, 0xa8, 0xc4, 0x92, 0xf8, 0x7f, 0x21, 0xe7, \ + 0x65, 0xbf, 0x0b, 0xe6, 0x01, 0xaf, 0x9c, 0x1d, 0x5b, 0x6c, 0x3f, 0x1c, \ + 0x2f, 0xa6, 0x0f, 0x68, 0x38, 0x8e, 0x85, 0xc4, 0x6c, 0x78, 0x2f, 0x6f, \ + 0x06, 0x21, 0x2e, 0x56 \ +} +/* END FILE */ + +/* + * Test client Certificates + * + * Test client certificates are defined for each choice + * of the following parameters: + * - PEM or DER encoding + * - RSA or EC key + * + * Things to add: + * - hash type + * - multiple EC curve types + */ + +/* This is taken from tests/data_files/cli2.crt. */ +/* BEGIN FILE string macro TEST_CLI_CRT_EC_PEM tests/data_files/cli2.crt */ +#define TEST_CLI_CRT_EC_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIICLDCCAbKgAwIBAgIBDTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" \ + "MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjBBMQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UEChMIUG9sYXJTU0wxHzAdBgNVBAMTFlBvbGFyU1NMIFRlc3QgQ2xpZW50IDIw\r\n" \ + "WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARX5a6xc9/TrLuTuIH/Eq7u5lOszlVT\r\n" \ + "9jQOzC7jYyUL35ji81xgNpbA1RgUcOV/n9VLRRjlsGzVXPiWj4dwo+THo4GdMIGa\r\n" \ + "MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMG4GA1Ud\r\n" \ + "IwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GC\r\n" \ + "CQDBQ+J+YkPM6DAKBggqhkjOPQQDAgNoADBlAjBKZQ17IIOimbmoD/yN7o89u3BM\r\n" \ + "lgOsjnhw3fIOoLIWy2WOGsk/LGF++DzvrRzuNiACMQCd8iem1XS4JK7haj8xocpU\r\n" \ + "LwjQje5PDGHfd3h9tP38Qknu5bJqws0md2KOKHyeV0U=\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/cli2.crt.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CLI_CRT_EC_DER tests/data_files/cli2.crt.der */ +#define TEST_CLI_CRT_EC_DER { \ + 0x30, 0x82, 0x02, 0x2c, 0x30, 0x82, 0x01, 0xb2, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x0d, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, \ + 0x3d, 0x04, 0x03, 0x02, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, \ + 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, \ + 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x33, 0x30, 0x39, 0x32, 0x34, 0x31, 0x35, 0x35, 0x32, 0x30, 0x34, \ + 0x5a, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x35, \ + 0x32, 0x30, 0x34, 0x5a, 0x30, 0x41, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, \ + 0x16, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, 0x54, 0x65, \ + 0x73, 0x74, 0x20, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x32, 0x30, \ + 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, \ + 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, \ + 0x00, 0x04, 0x57, 0xe5, 0xae, 0xb1, 0x73, 0xdf, 0xd3, 0xac, 0xbb, 0x93, \ + 0xb8, 0x81, 0xff, 0x12, 0xae, 0xee, 0xe6, 0x53, 0xac, 0xce, 0x55, 0x53, \ + 0xf6, 0x34, 0x0e, 0xcc, 0x2e, 0xe3, 0x63, 0x25, 0x0b, 0xdf, 0x98, 0xe2, \ + 0xf3, 0x5c, 0x60, 0x36, 0x96, 0xc0, 0xd5, 0x18, 0x14, 0x70, 0xe5, 0x7f, \ + 0x9f, 0xd5, 0x4b, 0x45, 0x18, 0xe5, 0xb0, 0x6c, 0xd5, 0x5c, 0xf8, 0x96, \ + 0x8f, 0x87, 0x70, 0xa3, 0xe4, 0xc7, 0xa3, 0x81, 0x9d, 0x30, 0x81, 0x9a, \ + 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, \ + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x7a, 0x00, \ + 0x5f, 0x86, 0x64, 0xfc, 0xe0, 0x5d, 0xe5, 0x11, 0x10, 0x3b, 0xb2, 0xe6, \ + 0x3b, 0xc4, 0x26, 0x3f, 0xcf, 0xe2, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, \ + 0x23, 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, \ + 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, \ + 0xfb, 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, \ + 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0a, \ + 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x68, \ + 0x00, 0x30, 0x65, 0x02, 0x30, 0x4a, 0x65, 0x0d, 0x7b, 0x20, 0x83, 0xa2, \ + 0x99, 0xb9, 0xa8, 0x0f, 0xfc, 0x8d, 0xee, 0x8f, 0x3d, 0xbb, 0x70, 0x4c, \ + 0x96, 0x03, 0xac, 0x8e, 0x78, 0x70, 0xdd, 0xf2, 0x0e, 0xa0, 0xb2, 0x16, \ + 0xcb, 0x65, 0x8e, 0x1a, 0xc9, 0x3f, 0x2c, 0x61, 0x7e, 0xf8, 0x3c, 0xef, \ + 0xad, 0x1c, 0xee, 0x36, 0x20, 0x02, 0x31, 0x00, 0x9d, 0xf2, 0x27, 0xa6, \ + 0xd5, 0x74, 0xb8, 0x24, 0xae, 0xe1, 0x6a, 0x3f, 0x31, 0xa1, 0xca, 0x54, \ + 0x2f, 0x08, 0xd0, 0x8d, 0xee, 0x4f, 0x0c, 0x61, 0xdf, 0x77, 0x78, 0x7d, \ + 0xb4, 0xfd, 0xfc, 0x42, 0x49, 0xee, 0xe5, 0xb2, 0x6a, 0xc2, 0xcd, 0x26, \ + 0x77, 0x62, 0x8e, 0x28, 0x7c, 0x9e, 0x57, 0x45 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/cli2.key. */ +/* BEGIN FILE string macro TEST_CLI_KEY_EC_PEM tests/data_files/cli2.key */ +#define TEST_CLI_KEY_EC_PEM \ + "-----BEGIN EC PRIVATE KEY-----\r\n" \ + "MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49\r\n" \ + "AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW\r\n" \ + "wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw==\r\n" \ + "-----END EC PRIVATE KEY-----\r\n" +/* END FILE */ + +/* This is generated from tests/data_files/cli2.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CLI_KEY_EC_DER tests/data_files/cli2.key.der */ +#define TEST_CLI_KEY_EC_DER { \ + 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0xf6, 0xf7, 0x86, 0x64, 0xf1, \ + 0x67, 0x7f, 0xe6, 0x64, 0x8d, 0xef, 0xca, 0x4e, 0xe9, 0xdd, 0x4d, 0xf0, \ + 0x05, 0xff, 0x96, 0x22, 0x8a, 0x7a, 0x84, 0x38, 0x64, 0x17, 0x32, 0x61, \ + 0x98, 0xb7, 0x2a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, \ + 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0x57, 0xe5, 0xae, \ + 0xb1, 0x73, 0xdf, 0xd3, 0xac, 0xbb, 0x93, 0xb8, 0x81, 0xff, 0x12, 0xae, \ + 0xee, 0xe6, 0x53, 0xac, 0xce, 0x55, 0x53, 0xf6, 0x34, 0x0e, 0xcc, 0x2e, \ + 0xe3, 0x63, 0x25, 0x0b, 0xdf, 0x98, 0xe2, 0xf3, 0x5c, 0x60, 0x36, 0x96, \ + 0xc0, 0xd5, 0x18, 0x14, 0x70, 0xe5, 0x7f, 0x9f, 0xd5, 0x4b, 0x45, 0x18, \ + 0xe5, 0xb0, 0x6c, 0xd5, 0x5c, 0xf8, 0x96, 0x8f, 0x87, 0x70, 0xa3, 0xe4, \ + 0xc7 \ +} +/* END FILE */ + +/* This is taken from tests/data_files/cli-rsa-sha256.crt. */ +/* BEGIN FILE string macro TEST_CLI_CRT_RSA_PEM tests/data_files/cli-rsa-sha256.crt */ +#define TEST_CLI_CRT_RSA_PEM \ + "-----BEGIN CERTIFICATE-----\r\n" \ + "MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ + "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ + "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G\r\n" \ + "A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\r\n" \ + "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\r\n" \ + "M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\r\n" \ + "1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\r\n" \ + "MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\r\n" \ + "4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\r\n" \ + "/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\r\n" \ + "o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf\r\n" \ + "BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsFAAOC\r\n" \ + "AQEAlHabem2Tu69VUN7EipwnQn1dIHdgvT5i+iQHpSxY1crPnBbAeSdAXwsVEqLQ\r\n" \ + "gOOIAQD5VIITNuoGgo4i+4OpNh9u7ZkpRHla+/swsfrFWRRbBNP5Bcu74AGLstwU\r\n" \ + "zM8gIkBiyfM1Q1qDQISV9trlCG6O8vh8dp/rbI3rfzo99BOHXgFCrzXjCuW4vDsF\r\n" \ + "r+Dao26bX3sJ6UnEWg1H3o2x6PpUcvQ36h71/bz4TEbbUUEpe02V4QWuL+wrhHJL\r\n" \ + "U7o3SVE3Og7jPF8sat0a50YUWhwEFI256m02KAXLg89ueUyYKEr6rNwhcvXJpvU9\r\n" \ + "giIVvd0Sbjjnn7NC4VDbcXV8vw==\r\n" \ + "-----END CERTIFICATE-----\r\n" +/* END FILE */ + +/* This was generated from tests/data_files/cli-rsa-sha256.crt.der + using `xxd -i.` */ +/* BEGIN FILE binary macro TEST_CLI_CRT_RSA_DER tests/data_files/cli-rsa-sha256.crt.der */ +#define TEST_CLI_CRT_RSA_DER { \ + 0x30, 0x82, 0x03, 0x3f, 0x30, 0x82, 0x02, 0x27, 0xa0, 0x03, 0x02, 0x01, \ + 0x02, 0x02, 0x01, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, \ + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3b, 0x31, 0x0b, 0x30, \ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, \ + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, \ + 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, \ + 0x04, 0x03, 0x0c, 0x10, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, \ + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, \ + 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, 0x34, 0x30, 0x36, \ + 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x32, 0x31, 0x32, 0x31, 0x34, 0x34, \ + 0x34, 0x30, 0x36, 0x5a, 0x30, 0x3c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, \ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, \ + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, \ + 0x53, 0x4c, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, \ + 0x11, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x20, 0x43, 0x6c, \ + 0x69, 0x65, 0x6e, 0x74, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, \ + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, \ + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, \ + 0x01, 0x01, 0x00, 0xc8, 0x74, 0xc4, 0xcc, 0xb9, 0xf9, 0xb5, 0x79, 0xe9, \ + 0x45, 0xd9, 0x14, 0x60, 0xb0, 0x7d, 0xbb, 0x93, 0xf2, 0x6b, 0x1e, 0x9f, \ + 0x33, 0xad, 0x0d, 0x8f, 0x8a, 0x3c, 0x56, 0x65, 0xe5, 0xdc, 0x44, 0xd9, \ + 0xcc, 0x66, 0x85, 0x07, 0xd5, 0xf8, 0x27, 0xb0, 0x4a, 0x35, 0xd0, 0x63, \ + 0x9e, 0x0a, 0x6e, 0x1b, 0xb7, 0xda, 0xf0, 0x7e, 0xab, 0xee, 0x0c, 0x10, \ + 0x93, 0x86, 0x49, 0x18, 0x34, 0xf3, 0xa8, 0x2a, 0xd2, 0x57, 0xf5, 0x2e, \ + 0xd4, 0x2f, 0x77, 0x29, 0x84, 0x61, 0x4d, 0x82, 0x50, 0x8f, 0xa7, 0x95, \ + 0x48, 0x70, 0xf5, 0x6e, 0x4d, 0xb2, 0xd5, 0x13, 0xc3, 0xd2, 0x1a, 0xed, \ + 0xe6, 0x43, 0xea, 0x42, 0x14, 0xeb, 0x74, 0xea, 0xc0, 0xed, 0x1f, 0xd4, \ + 0x57, 0x4e, 0xa9, 0xf3, 0xa8, 0xed, 0xd2, 0xe0, 0xc1, 0x30, 0x71, 0x30, \ + 0x32, 0x30, 0xd5, 0xd3, 0xf6, 0x08, 0xd0, 0x56, 0x4f, 0x46, 0x8e, 0xf2, \ + 0x5f, 0xf9, 0x3d, 0x67, 0x91, 0x88, 0x30, 0x2e, 0x42, 0xb2, 0xdf, 0x7d, \ + 0xfb, 0xe5, 0x0c, 0x77, 0xff, 0xec, 0x31, 0xc0, 0x78, 0x8f, 0xbf, 0xc2, \ + 0x7f, 0xca, 0xad, 0x6c, 0x21, 0xd6, 0x8d, 0xd9, 0x8b, 0x6a, 0x8e, 0x6f, \ + 0xe0, 0x9b, 0xf8, 0x10, 0x56, 0xcc, 0xb3, 0x8e, 0x13, 0x15, 0xe6, 0x34, \ + 0x04, 0x66, 0xc7, 0xee, 0xf9, 0x36, 0x0e, 0x6a, 0x95, 0xf6, 0x09, 0x9a, \ + 0x06, 0x67, 0xf4, 0x65, 0x71, 0xf8, 0xca, 0xa4, 0xb1, 0x25, 0xe0, 0xfe, \ + 0x3c, 0x8b, 0x35, 0x04, 0x67, 0xba, 0xe0, 0x4f, 0x76, 0x85, 0xfc, 0x7f, \ + 0xfc, 0x36, 0x6b, 0xb5, 0xe9, 0xcd, 0x2d, 0x03, 0x62, 0x4e, 0xb3, 0x3d, \ + 0x00, 0xcf, 0xaf, 0x76, 0xa0, 0x69, 0x56, 0x83, 0x6a, 0xd2, 0xa8, 0xd4, \ + 0xe7, 0x50, 0x71, 0xe6, 0xb5, 0x36, 0x05, 0x77, 0x05, 0x6d, 0x7b, 0xc8, \ + 0xe4, 0xc4, 0xfd, 0x4c, 0xd5, 0x21, 0x5f, 0x02, 0x03, 0x01, 0x00, 0x01, \ + 0xa3, 0x4d, 0x30, 0x4b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, \ + 0x02, 0x30, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, \ + 0x04, 0x14, 0x71, 0xa1, 0x00, 0x73, 0x72, 0x40, 0x2f, 0x54, 0x76, 0x5e, \ + 0x33, 0xfc, 0x52, 0x8f, 0xbc, 0xf1, 0xdd, 0x6b, 0x46, 0x21, 0x30, 0x1f, \ + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb4, \ + 0x5a, 0xe4, 0xa5, 0xb3, 0xde, 0xd2, 0x52, 0xf6, 0xb9, 0xd5, 0xa6, 0x95, \ + 0x0f, 0xeb, 0x3e, 0xbc, 0xc7, 0xfd, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, \ + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, \ + 0x01, 0x01, 0x00, 0x94, 0x76, 0x9b, 0x7a, 0x6d, 0x93, 0xbb, 0xaf, 0x55, \ + 0x50, 0xde, 0xc4, 0x8a, 0x9c, 0x27, 0x42, 0x7d, 0x5d, 0x20, 0x77, 0x60, \ + 0xbd, 0x3e, 0x62, 0xfa, 0x24, 0x07, 0xa5, 0x2c, 0x58, 0xd5, 0xca, 0xcf, \ + 0x9c, 0x16, 0xc0, 0x79, 0x27, 0x40, 0x5f, 0x0b, 0x15, 0x12, 0xa2, 0xd0, \ + 0x80, 0xe3, 0x88, 0x01, 0x00, 0xf9, 0x54, 0x82, 0x13, 0x36, 0xea, 0x06, \ + 0x82, 0x8e, 0x22, 0xfb, 0x83, 0xa9, 0x36, 0x1f, 0x6e, 0xed, 0x99, 0x29, \ + 0x44, 0x79, 0x5a, 0xfb, 0xfb, 0x30, 0xb1, 0xfa, 0xc5, 0x59, 0x14, 0x5b, \ + 0x04, 0xd3, 0xf9, 0x05, 0xcb, 0xbb, 0xe0, 0x01, 0x8b, 0xb2, 0xdc, 0x14, \ + 0xcc, 0xcf, 0x20, 0x22, 0x40, 0x62, 0xc9, 0xf3, 0x35, 0x43, 0x5a, 0x83, \ + 0x40, 0x84, 0x95, 0xf6, 0xda, 0xe5, 0x08, 0x6e, 0x8e, 0xf2, 0xf8, 0x7c, \ + 0x76, 0x9f, 0xeb, 0x6c, 0x8d, 0xeb, 0x7f, 0x3a, 0x3d, 0xf4, 0x13, 0x87, \ + 0x5e, 0x01, 0x42, 0xaf, 0x35, 0xe3, 0x0a, 0xe5, 0xb8, 0xbc, 0x3b, 0x05, \ + 0xaf, 0xe0, 0xda, 0xa3, 0x6e, 0x9b, 0x5f, 0x7b, 0x09, 0xe9, 0x49, 0xc4, \ + 0x5a, 0x0d, 0x47, 0xde, 0x8d, 0xb1, 0xe8, 0xfa, 0x54, 0x72, 0xf4, 0x37, \ + 0xea, 0x1e, 0xf5, 0xfd, 0xbc, 0xf8, 0x4c, 0x46, 0xdb, 0x51, 0x41, 0x29, \ + 0x7b, 0x4d, 0x95, 0xe1, 0x05, 0xae, 0x2f, 0xec, 0x2b, 0x84, 0x72, 0x4b, \ + 0x53, 0xba, 0x37, 0x49, 0x51, 0x37, 0x3a, 0x0e, 0xe3, 0x3c, 0x5f, 0x2c, \ + 0x6a, 0xdd, 0x1a, 0xe7, 0x46, 0x14, 0x5a, 0x1c, 0x04, 0x14, 0x8d, 0xb9, \ + 0xea, 0x6d, 0x36, 0x28, 0x05, 0xcb, 0x83, 0xcf, 0x6e, 0x79, 0x4c, 0x98, \ + 0x28, 0x4a, 0xfa, 0xac, 0xdc, 0x21, 0x72, 0xf5, 0xc9, 0xa6, 0xf5, 0x3d, \ + 0x82, 0x22, 0x15, 0xbd, 0xdd, 0x12, 0x6e, 0x38, 0xe7, 0x9f, 0xb3, 0x42, \ + 0xe1, 0x50, 0xdb, 0x71, 0x75, 0x7c, 0xbf \ +} +/* END FILE */ + +/* This is taken from tests/data_files/cli-rsa.key. */ +/* BEGIN FILE string macro TEST_CLI_KEY_RSA_PEM tests/data_files/cli-rsa.key */ +#define TEST_CLI_KEY_RSA_PEM \ + "-----BEGIN RSA PRIVATE KEY-----\r\n" \ + "MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\r\n" \ + "B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\r\n" \ + "bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\r\n" \ + "Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\r\n" \ + "7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\r\n" \ + "dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\r\n" \ + "yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\r\n" \ + "4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\r\n" \ + "ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\r\n" \ + "zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\r\n" \ + "l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\r\n" \ + "DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\r\n" \ + "VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\r\n" \ + "Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\r\n" \ + "wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\r\n" \ + "c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\r\n" \ + "33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\r\n" \ + "ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\r\n" \ + "BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\r\n" \ + "KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\r\n" \ + "UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\r\n" \ + "7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\r\n" \ + "gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\r\n" \ + "bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\r\n" \ + "8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\r\n" \ + "-----END RSA PRIVATE KEY-----\r\n"/* END FILE */ + +/* This was generated from tests/data_files/cli-rsa.key.der using `xxd -i`. */ +/* BEGIN FILE binary macro TEST_CLI_KEY_RSA_DER tests/data_files/cli-rsa.key.der */ +#define TEST_CLI_KEY_RSA_DER { \ + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, \ + 0xc8, 0x74, 0xc4, 0xcc, 0xb9, 0xf9, 0xb5, 0x79, 0xe9, 0x45, 0xd9, 0x14, \ + 0x60, 0xb0, 0x7d, 0xbb, 0x93, 0xf2, 0x6b, 0x1e, 0x9f, 0x33, 0xad, 0x0d, \ + 0x8f, 0x8a, 0x3c, 0x56, 0x65, 0xe5, 0xdc, 0x44, 0xd9, 0xcc, 0x66, 0x85, \ + 0x07, 0xd5, 0xf8, 0x27, 0xb0, 0x4a, 0x35, 0xd0, 0x63, 0x9e, 0x0a, 0x6e, \ + 0x1b, 0xb7, 0xda, 0xf0, 0x7e, 0xab, 0xee, 0x0c, 0x10, 0x93, 0x86, 0x49, \ + 0x18, 0x34, 0xf3, 0xa8, 0x2a, 0xd2, 0x57, 0xf5, 0x2e, 0xd4, 0x2f, 0x77, \ + 0x29, 0x84, 0x61, 0x4d, 0x82, 0x50, 0x8f, 0xa7, 0x95, 0x48, 0x70, 0xf5, \ + 0x6e, 0x4d, 0xb2, 0xd5, 0x13, 0xc3, 0xd2, 0x1a, 0xed, 0xe6, 0x43, 0xea, \ + 0x42, 0x14, 0xeb, 0x74, 0xea, 0xc0, 0xed, 0x1f, 0xd4, 0x57, 0x4e, 0xa9, \ + 0xf3, 0xa8, 0xed, 0xd2, 0xe0, 0xc1, 0x30, 0x71, 0x30, 0x32, 0x30, 0xd5, \ + 0xd3, 0xf6, 0x08, 0xd0, 0x56, 0x4f, 0x46, 0x8e, 0xf2, 0x5f, 0xf9, 0x3d, \ + 0x67, 0x91, 0x88, 0x30, 0x2e, 0x42, 0xb2, 0xdf, 0x7d, 0xfb, 0xe5, 0x0c, \ + 0x77, 0xff, 0xec, 0x31, 0xc0, 0x78, 0x8f, 0xbf, 0xc2, 0x7f, 0xca, 0xad, \ + 0x6c, 0x21, 0xd6, 0x8d, 0xd9, 0x8b, 0x6a, 0x8e, 0x6f, 0xe0, 0x9b, 0xf8, \ + 0x10, 0x56, 0xcc, 0xb3, 0x8e, 0x13, 0x15, 0xe6, 0x34, 0x04, 0x66, 0xc7, \ + 0xee, 0xf9, 0x36, 0x0e, 0x6a, 0x95, 0xf6, 0x09, 0x9a, 0x06, 0x67, 0xf4, \ + 0x65, 0x71, 0xf8, 0xca, 0xa4, 0xb1, 0x25, 0xe0, 0xfe, 0x3c, 0x8b, 0x35, \ + 0x04, 0x67, 0xba, 0xe0, 0x4f, 0x76, 0x85, 0xfc, 0x7f, 0xfc, 0x36, 0x6b, \ + 0xb5, 0xe9, 0xcd, 0x2d, 0x03, 0x62, 0x4e, 0xb3, 0x3d, 0x00, 0xcf, 0xaf, \ + 0x76, 0xa0, 0x69, 0x56, 0x83, 0x6a, 0xd2, 0xa8, 0xd4, 0xe7, 0x50, 0x71, \ + 0xe6, 0xb5, 0x36, 0x05, 0x77, 0x05, 0x6d, 0x7b, 0xc8, 0xe4, 0xc4, 0xfd, \ + 0x4c, 0xd5, 0x21, 0x5f, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, \ + 0x00, 0x67, 0x4d, 0xb5, 0xf6, 0x03, 0x89, 0xaa, 0x7a, 0x6f, 0x3b, 0x2d, \ + 0xca, 0x10, 0xa2, 0x23, 0xc9, 0xbd, 0x4e, 0xda, 0xe1, 0x67, 0x0e, 0x0c, \ + 0x8a, 0xc6, 0x84, 0x68, 0xdf, 0xe5, 0x97, 0x75, 0xd2, 0x8d, 0xa3, 0x86, \ + 0xd9, 0xdb, 0xd5, 0xeb, 0x13, 0x19, 0x08, 0xc5, 0x7e, 0xe5, 0x37, 0x97, \ + 0x0c, 0x73, 0x80, 0x66, 0x76, 0x35, 0xf1, 0x88, 0xb5, 0xf2, 0xfc, 0xf3, \ + 0xe1, 0x4b, 0x76, 0x4e, 0x73, 0x45, 0xce, 0x2c, 0xc2, 0x10, 0x26, 0x0d, \ + 0x68, 0x0d, 0x9f, 0x49, 0x3d, 0xd6, 0x80, 0x89, 0xe7, 0xc5, 0x49, 0x15, \ + 0xdd, 0x85, 0xc0, 0xc8, 0xfe, 0x82, 0x37, 0x12, 0x5a, 0x0a, 0x6b, 0xf6, \ + 0x68, 0x0d, 0x32, 0x16, 0xbd, 0xa4, 0x15, 0x54, 0x9e, 0x68, 0xa1, 0xad, \ + 0xca, 0x6b, 0xe5, 0x8c, 0xda, 0x76, 0x35, 0x59, 0x2f, 0x9b, 0xb4, 0xe1, \ + 0xf1, 0xf0, 0x50, 0x04, 0xee, 0xc8, 0xec, 0x05, 0xe1, 0xcf, 0x8d, 0xe4, \ + 0xd2, 0x64, 0x7b, 0x5e, 0x63, 0xe0, 0x7b, 0x07, 0xbc, 0x02, 0x96, 0x4e, \ + 0x1b, 0x78, 0x6c, 0xb6, 0x43, 0x9a, 0x32, 0xf6, 0xd6, 0x02, 0xf5, 0x80, \ + 0xcc, 0x26, 0x6e, 0xa5, 0xd0, 0xe3, 0x65, 0x88, 0xce, 0x26, 0xa9, 0x40, \ + 0xe1, 0xe1, 0x00, 0xe0, 0x7f, 0x3f, 0xc3, 0xb1, 0x7c, 0xde, 0xbe, 0x42, \ + 0xba, 0x07, 0x81, 0x13, 0xc2, 0xe0, 0x11, 0x11, 0x23, 0x2c, 0xf8, 0xb2, \ + 0x7a, 0x3a, 0xd4, 0xe4, 0x7d, 0x5f, 0xb9, 0xb1, 0x18, 0xfa, 0x1d, 0x1d, \ + 0x97, 0x91, 0xd9, 0x04, 0x9e, 0xbc, 0xc9, 0xb4, 0xd7, 0x7d, 0x0e, 0x54, \ + 0xf6, 0x8f, 0xd0, 0x28, 0x0d, 0xdd, 0x77, 0x4b, 0x68, 0x04, 0x48, 0x61, \ + 0x75, 0x15, 0x03, 0x1b, 0x35, 0xad, 0x8e, 0xfc, 0x24, 0x11, 0x07, 0xea, \ + 0x17, 0x5a, 0xde, 0x19, 0x68, 0xff, 0xb6, 0x87, 0x7f, 0x80, 0x2a, 0x5f, \ + 0x0c, 0x58, 0xba, 0x5f, 0x41, 0x02, 0x81, 0x81, 0x00, 0xe3, 0x03, 0xaf, \ + 0xfe, 0x98, 0xd2, 0x0b, 0x7b, 0x72, 0xe9, 0x3b, 0x8e, 0xbc, 0xa5, 0xf6, \ + 0xac, 0xe5, 0x22, 0x06, 0xb2, 0xd7, 0x5e, 0xfd, 0x89, 0x4b, 0x16, 0x67, \ + 0x32, 0x83, 0x22, 0x58, 0x8e, 0x62, 0xa4, 0xb4, 0x2d, 0xf9, 0x16, 0x13, \ + 0x54, 0xf6, 0x9f, 0x2f, 0xf9, 0xbb, 0x0e, 0x7e, 0x8c, 0x6f, 0x08, 0xda, \ + 0xc8, 0xe9, 0x1c, 0x66, 0x10, 0x70, 0x93, 0x90, 0x8d, 0xcf, 0x90, 0x3a, \ + 0x43, 0x89, 0x49, 0xeb, 0x83, 0x2a, 0xfe, 0x5a, 0x87, 0xce, 0x74, 0x42, \ + 0x41, 0x0d, 0x8c, 0x73, 0x51, 0xbc, 0x7b, 0x20, 0xc5, 0xfd, 0xf6, 0x0b, \ + 0x65, 0xed, 0xa9, 0x2e, 0xfc, 0x0f, 0xf5, 0x50, 0xf9, 0x8d, 0x37, 0x36, \ + 0x9a, 0x20, 0xdf, 0xc3, 0xe3, 0x27, 0xbc, 0x98, 0x72, 0xc1, 0x14, 0x4b, \ + 0x71, 0xe9, 0x83, 0x14, 0xff, 0x24, 0xe2, 0x14, 0x15, 0xb6, 0x6f, 0x0f, \ + 0x32, 0x9d, 0xd9, 0x98, 0xd1, 0x02, 0x81, 0x81, 0x00, 0xe2, 0x0c, 0xfb, \ + 0xc3, 0x33, 0x9b, 0x47, 0x88, 0x27, 0xf2, 0x26, 0xde, 0xeb, 0x5e, 0xee, \ + 0x40, 0xf6, 0x63, 0x5b, 0x35, 0x23, 0xf5, 0xd5, 0x07, 0x61, 0xdf, 0xa2, \ + 0x9f, 0x58, 0x30, 0x04, 0x22, 0x2b, 0xb4, 0xd9, 0xda, 0x46, 0x7f, 0x48, \ + 0xf5, 0x4f, 0xd0, 0xea, 0xd7, 0xa0, 0x45, 0x8a, 0x62, 0x8b, 0x8c, 0xac, \ + 0x73, 0x5e, 0xfa, 0x36, 0x65, 0x3e, 0xba, 0x6c, 0xba, 0x5e, 0x6b, 0x92, \ + 0x29, 0x5e, 0x6a, 0x0f, 0xd6, 0xd2, 0xa5, 0x95, 0x86, 0xda, 0x72, 0xc5, \ + 0x9e, 0xc9, 0x6b, 0x37, 0x5e, 0x4b, 0x9b, 0x77, 0xe1, 0x67, 0x1a, 0x1e, \ + 0x30, 0xd8, 0x41, 0x68, 0x40, 0xd3, 0x9c, 0xb4, 0xf6, 0xeb, 0x2a, 0x22, \ + 0xdf, 0x78, 0x29, 0xd2, 0x64, 0x92, 0x5b, 0x2f, 0x78, 0x64, 0x4a, 0xa2, \ + 0xa6, 0x6b, 0x3e, 0x50, 0xb1, 0x7a, 0xb1, 0x8d, 0x59, 0xb4, 0x55, 0xba, \ + 0xb6, 0x91, 0x85, 0xa3, 0x2f, 0x02, 0x81, 0x80, 0x10, 0x1e, 0x19, 0xe7, \ + 0xbc, 0x97, 0xe5, 0x22, 0xcd, 0xa4, 0xcb, 0x8a, 0xb5, 0xd0, 0x1e, 0xb4, \ + 0x65, 0xcc, 0x45, 0xa7, 0x7a, 0xed, 0x0e, 0x99, 0x29, 0xd0, 0x9c, 0x61, \ + 0x14, 0xb8, 0x62, 0x8b, 0x31, 0x6b, 0xba, 0x33, 0x2d, 0x65, 0x28, 0xd8, \ + 0x36, 0x6e, 0x54, 0xec, 0xa9, 0x20, 0x3d, 0x51, 0xe1, 0x2c, 0x42, 0xc4, \ + 0x52, 0xf0, 0xa6, 0x3a, 0x72, 0x93, 0xb7, 0x86, 0xa9, 0xfe, 0xf6, 0x74, \ + 0x07, 0x12, 0x4d, 0x7b, 0x51, 0x99, 0x1f, 0x7a, 0x56, 0xe9, 0x20, 0x2f, \ + 0x18, 0x34, 0x29, 0x97, 0xdb, 0x06, 0xee, 0xeb, 0xbf, 0xbd, 0x31, 0x4f, \ + 0xfa, 0x50, 0xb1, 0xba, 0x49, 0xb3, 0xc4, 0x1d, 0x03, 0xae, 0xb0, 0xdc, \ + 0xbe, 0x8a, 0xc4, 0x90, 0xa3, 0x28, 0x9b, 0xb6, 0x42, 0x09, 0x1b, 0xd6, \ + 0x29, 0x9b, 0x19, 0xe9, 0x87, 0x87, 0xd9, 0x9f, 0x35, 0x05, 0xab, 0x91, \ + 0x8f, 0x6d, 0x7c, 0x91, 0x02, 0x81, 0x81, 0x00, 0x94, 0x57, 0xf0, 0xe0, \ + 0x28, 0xfd, 0xbd, 0xf3, 0x9c, 0x43, 0x4d, 0x3e, 0xfd, 0x37, 0x4f, 0x23, \ + 0x52, 0x8d, 0xe1, 0x4c, 0xfe, 0x4c, 0x55, 0x80, 0x82, 0xba, 0x3f, 0xfe, \ + 0x51, 0xe1, 0x30, 0xd5, 0x3b, 0xd9, 0x73, 0x1d, 0xcb, 0x25, 0xbc, 0xbb, \ + 0x3f, 0xa5, 0xda, 0x77, 0xa6, 0xb5, 0xfc, 0x1a, 0xaf, 0x79, 0xa1, 0xb2, \ + 0x14, 0xa2, 0x1f, 0x10, 0x52, 0x1a, 0x05, 0x40, 0x48, 0xb6, 0x4f, 0x34, \ + 0xd6, 0xc0, 0xc3, 0xa4, 0x36, 0x98, 0x73, 0x88, 0x0b, 0xd3, 0x45, 0xdc, \ + 0xee, 0x51, 0x6e, 0x04, 0x73, 0x99, 0x93, 0x12, 0x58, 0x96, 0xcb, 0x39, \ + 0x42, 0xb1, 0xa9, 0xb8, 0xe1, 0x25, 0xf5, 0x9c, 0x14, 0xb7, 0x92, 0x2b, \ + 0x14, 0xb0, 0x5d, 0x61, 0xa2, 0xaa, 0x34, 0x7c, 0xcd, 0x54, 0x2d, 0x69, \ + 0x08, 0xf7, 0xdb, 0xfc, 0x9c, 0x87, 0xe8, 0x3a, 0xf6, 0x1d, 0x4c, 0x6a, \ + 0x83, 0x15, 0x30, 0x01, 0x02, 0x81, 0x81, 0x00, 0x9c, 0x53, 0xa1, 0xb6, \ + 0x2f, 0xc0, 0x06, 0xf5, 0xdf, 0x5c, 0xd1, 0x4a, 0x4e, 0xc8, 0xbd, 0x6d, \ + 0x32, 0xf1, 0x5e, 0xe5, 0x3b, 0x70, 0xd0, 0xa8, 0xe5, 0x41, 0x57, 0x6c, \ + 0x87, 0x53, 0x0f, 0xeb, 0x28, 0xa0, 0x62, 0x8f, 0x43, 0x62, 0xec, 0x2e, \ + 0x6c, 0x71, 0x55, 0x5b, 0x6a, 0xf4, 0x74, 0x14, 0xea, 0x7a, 0x03, 0xf6, \ + 0xfc, 0xa4, 0xce, 0xc4, 0xac, 0xda, 0x1d, 0xf0, 0xb5, 0xa9, 0xfd, 0x11, \ + 0x18, 0x3b, 0x14, 0xa0, 0x90, 0x8d, 0x26, 0xb7, 0x75, 0x73, 0x0a, 0x02, \ + 0x2c, 0x6f, 0x0f, 0xd8, 0x41, 0x78, 0xc3, 0x73, 0x81, 0xac, 0xaa, 0xaf, \ + 0xf2, 0xee, 0x32, 0xb5, 0x8d, 0x05, 0xf9, 0x59, 0x5a, 0x9e, 0x3e, 0x65, \ + 0x9b, 0x74, 0xda, 0xa0, 0x74, 0x95, 0x17, 0x5f, 0x8d, 0x58, 0xfc, 0x8e, \ + 0x4e, 0x2c, 0x1e, 0xbc, 0x81, 0x02, 0x18, 0xac, 0x12, 0xc6, 0xf9, 0x64, \ + 0x8b, 0x87, 0xc3, 0x00 \ +} +/* END FILE */ + +/* + * + * Test certificates and keys as C variables + * + */ + +/* + * CA + */ + +const char mbedtls_test_ca_crt_ec_pem[] = TEST_CA_CRT_EC_PEM; +const char mbedtls_test_ca_key_ec_pem[] = TEST_CA_KEY_EC_PEM; +const char mbedtls_test_ca_pwd_ec_pem[] = TEST_CA_PWD_EC_PEM; +const char mbedtls_test_ca_key_rsa_pem[] = TEST_CA_KEY_RSA_PEM; +const char mbedtls_test_ca_pwd_rsa_pem[] = TEST_CA_PWD_RSA_PEM; +const char mbedtls_test_ca_crt_rsa_sha1_pem[] = TEST_CA_CRT_RSA_SHA1_PEM; +const char mbedtls_test_ca_crt_rsa_sha256_pem[] = TEST_CA_CRT_RSA_SHA256_PEM; + +const unsigned char mbedtls_test_ca_crt_ec_der[] = TEST_CA_CRT_EC_DER; +const unsigned char mbedtls_test_ca_key_ec_der[] = TEST_CA_KEY_EC_DER; +const unsigned char mbedtls_test_ca_key_rsa_der[] = TEST_CA_KEY_RSA_DER; +const unsigned char mbedtls_test_ca_crt_rsa_sha1_der[] = + TEST_CA_CRT_RSA_SHA1_DER; +const unsigned char mbedtls_test_ca_crt_rsa_sha256_der[] = + TEST_CA_CRT_RSA_SHA256_DER; + +const size_t mbedtls_test_ca_crt_ec_pem_len = + sizeof( mbedtls_test_ca_crt_ec_pem ); +const size_t mbedtls_test_ca_key_ec_pem_len = + sizeof( mbedtls_test_ca_key_ec_pem ); +const size_t mbedtls_test_ca_pwd_ec_pem_len = + sizeof( mbedtls_test_ca_pwd_ec_pem ) - 1; +const size_t mbedtls_test_ca_key_rsa_pem_len = + sizeof( mbedtls_test_ca_key_rsa_pem ); +const size_t mbedtls_test_ca_pwd_rsa_pem_len = + sizeof( mbedtls_test_ca_pwd_rsa_pem ) - 1; +const size_t mbedtls_test_ca_crt_rsa_sha1_pem_len = + sizeof( mbedtls_test_ca_crt_rsa_sha1_pem ); +const size_t mbedtls_test_ca_crt_rsa_sha256_pem_len = + sizeof( mbedtls_test_ca_crt_rsa_sha256_pem ); + +const size_t mbedtls_test_ca_crt_ec_der_len = + sizeof( mbedtls_test_ca_crt_ec_der ); +const size_t mbedtls_test_ca_key_ec_der_len = + sizeof( mbedtls_test_ca_key_ec_der ); +const size_t mbedtls_test_ca_pwd_ec_der_len = 0; +const size_t mbedtls_test_ca_key_rsa_der_len = + sizeof( mbedtls_test_ca_key_rsa_der ); +const size_t mbedtls_test_ca_pwd_rsa_der_len = 0; +const size_t mbedtls_test_ca_crt_rsa_sha1_der_len = + sizeof( mbedtls_test_ca_crt_rsa_sha1_der ); +const size_t mbedtls_test_ca_crt_rsa_sha256_der_len = + sizeof( mbedtls_test_ca_crt_rsa_sha256_der ); + +/* + * Server + */ + +const char mbedtls_test_srv_crt_ec_pem[] = TEST_SRV_CRT_EC_PEM; +const char mbedtls_test_srv_key_ec_pem[] = TEST_SRV_KEY_EC_PEM; +const char mbedtls_test_srv_pwd_ec_pem[] = ""; +const char mbedtls_test_srv_key_rsa_pem[] = TEST_SRV_KEY_RSA_PEM; +const char mbedtls_test_srv_pwd_rsa_pem[] = ""; +const char mbedtls_test_srv_crt_rsa_sha1_pem[] = TEST_SRV_CRT_RSA_SHA1_PEM; +const char mbedtls_test_srv_crt_rsa_sha256_pem[] = TEST_SRV_CRT_RSA_SHA256_PEM; + +const unsigned char mbedtls_test_srv_crt_ec_der[] = TEST_SRV_CRT_EC_DER; +const unsigned char mbedtls_test_srv_key_ec_der[] = TEST_SRV_KEY_EC_DER; +const unsigned char mbedtls_test_srv_key_rsa_der[] = TEST_SRV_KEY_RSA_DER; +const unsigned char mbedtls_test_srv_crt_rsa_sha1_der[] = + TEST_SRV_CRT_RSA_SHA1_DER; +const unsigned char mbedtls_test_srv_crt_rsa_sha256_der[] = + TEST_SRV_CRT_RSA_SHA256_DER; + +const size_t mbedtls_test_srv_crt_ec_pem_len = + sizeof( mbedtls_test_srv_crt_ec_pem ); +const size_t mbedtls_test_srv_key_ec_pem_len = + sizeof( mbedtls_test_srv_key_ec_pem ); +const size_t mbedtls_test_srv_pwd_ec_pem_len = + sizeof( mbedtls_test_srv_pwd_ec_pem ) - 1; +const size_t mbedtls_test_srv_key_rsa_pem_len = + sizeof( mbedtls_test_srv_key_rsa_pem ); +const size_t mbedtls_test_srv_pwd_rsa_pem_len = + sizeof( mbedtls_test_srv_pwd_rsa_pem ) - 1; +const size_t mbedtls_test_srv_crt_rsa_sha1_pem_len = + sizeof( mbedtls_test_srv_crt_rsa_sha1_pem ); +const size_t mbedtls_test_srv_crt_rsa_sha256_pem_len = + sizeof( mbedtls_test_srv_crt_rsa_sha256_pem ); + +const size_t mbedtls_test_srv_crt_ec_der_len = + sizeof( mbedtls_test_srv_crt_ec_der ); +const size_t mbedtls_test_srv_key_ec_der_len = + sizeof( mbedtls_test_srv_key_ec_der ); +const size_t mbedtls_test_srv_pwd_ec_der_len = 0; +const size_t mbedtls_test_srv_key_rsa_der_len = + sizeof( mbedtls_test_srv_key_rsa_der ); +const size_t mbedtls_test_srv_pwd_rsa_der_len = 0; +const size_t mbedtls_test_srv_crt_rsa_sha1_der_len = + sizeof( mbedtls_test_srv_crt_rsa_sha1_der ); +const size_t mbedtls_test_srv_crt_rsa_sha256_der_len = + sizeof( mbedtls_test_srv_crt_rsa_sha256_der ); + +/* + * Client + */ + +const char mbedtls_test_cli_crt_ec_pem[] = TEST_CLI_CRT_EC_PEM; +const char mbedtls_test_cli_key_ec_pem[] = TEST_CLI_KEY_EC_PEM; +const char mbedtls_test_cli_pwd_ec_pem[] = ""; +const char mbedtls_test_cli_key_rsa_pem[] = TEST_CLI_KEY_RSA_PEM; +const char mbedtls_test_cli_pwd_rsa_pem[] = ""; +const char mbedtls_test_cli_crt_rsa_pem[] = TEST_CLI_CRT_RSA_PEM; + +const unsigned char mbedtls_test_cli_crt_ec_der[] = TEST_CLI_CRT_EC_DER; +const unsigned char mbedtls_test_cli_key_ec_der[] = TEST_CLI_KEY_EC_DER; +const unsigned char mbedtls_test_cli_key_rsa_der[] = TEST_CLI_KEY_RSA_DER; +const unsigned char mbedtls_test_cli_crt_rsa_der[] = TEST_CLI_CRT_RSA_DER; + +const size_t mbedtls_test_cli_crt_ec_pem_len = + sizeof( mbedtls_test_cli_crt_ec_pem ); +const size_t mbedtls_test_cli_key_ec_pem_len = + sizeof( mbedtls_test_cli_key_ec_pem ); +const size_t mbedtls_test_cli_pwd_ec_pem_len = + sizeof( mbedtls_test_cli_pwd_ec_pem ) - 1; +const size_t mbedtls_test_cli_key_rsa_pem_len = + sizeof( mbedtls_test_cli_key_rsa_pem ); +const size_t mbedtls_test_cli_pwd_rsa_pem_len = + sizeof( mbedtls_test_cli_pwd_rsa_pem ) - 1; +const size_t mbedtls_test_cli_crt_rsa_pem_len = + sizeof( mbedtls_test_cli_crt_rsa_pem ); + +const size_t mbedtls_test_cli_crt_ec_der_len = + sizeof( mbedtls_test_cli_crt_ec_der ); +const size_t mbedtls_test_cli_key_ec_der_len = + sizeof( mbedtls_test_cli_key_ec_der ); +const size_t mbedtls_test_cli_key_rsa_der_len = + sizeof( mbedtls_test_cli_key_rsa_der ); +const size_t mbedtls_test_cli_crt_rsa_der_len = + sizeof( mbedtls_test_cli_crt_rsa_der ); + +/* + * + * Definitions of test CRTs without specification of all parameters, choosing + * them automatically according to the config. For example, mbedtls_test_ca_crt + * is one of mbedtls_test_ca_crt_{rsa|ec}_{sha1|sha256}_{pem|der}. + * + */ + +/* + * Dispatch between PEM and DER according to config + */ + +#if defined(MBEDTLS_PEM_PARSE_C) + +/* PEM encoded test CA certificates and keys */ + +#define TEST_CA_KEY_RSA TEST_CA_KEY_RSA_PEM +#define TEST_CA_PWD_RSA TEST_CA_PWD_RSA_PEM +#define TEST_CA_CRT_RSA_SHA256 TEST_CA_CRT_RSA_SHA256_PEM +#define TEST_CA_CRT_RSA_SHA1 TEST_CA_CRT_RSA_SHA1_PEM +#define TEST_CA_KEY_EC TEST_CA_KEY_EC_PEM +#define TEST_CA_PWD_EC TEST_CA_PWD_EC_PEM +#define TEST_CA_CRT_EC TEST_CA_CRT_EC_PEM + +/* PEM encoded test server certificates and keys */ + +#define TEST_SRV_KEY_RSA TEST_SRV_KEY_RSA_PEM +#define TEST_SRV_PWD_RSA "" +#define TEST_SRV_CRT_RSA_SHA256 TEST_SRV_CRT_RSA_SHA256_PEM +#define TEST_SRV_CRT_RSA_SHA1 TEST_SRV_CRT_RSA_SHA1_PEM +#define TEST_SRV_KEY_EC TEST_SRV_KEY_EC_PEM +#define TEST_SRV_PWD_EC "" +#define TEST_SRV_CRT_EC TEST_SRV_CRT_EC_PEM + +/* PEM encoded test client certificates and keys */ + +#define TEST_CLI_KEY_RSA TEST_CLI_KEY_RSA_PEM +#define TEST_CLI_PWD_RSA "" +#define TEST_CLI_CRT_RSA TEST_CLI_CRT_RSA_PEM +#define TEST_CLI_KEY_EC TEST_CLI_KEY_EC_PEM +#define TEST_CLI_PWD_EC "" +#define TEST_CLI_CRT_EC TEST_CLI_CRT_EC_PEM + +#else /* MBEDTLS_PEM_PARSE_C */ + +/* DER encoded test CA certificates and keys */ + +#define TEST_CA_KEY_RSA TEST_CA_KEY_RSA_DER +#define TEST_CA_PWD_RSA "" +#define TEST_CA_CRT_RSA_SHA256 TEST_CA_CRT_RSA_SHA256_DER +#define TEST_CA_CRT_RSA_SHA1 TEST_CA_CRT_RSA_SHA1_DER +#define TEST_CA_KEY_EC TEST_CA_KEY_EC_DER +#define TEST_CA_PWD_EC "" +#define TEST_CA_CRT_EC TEST_CA_CRT_EC_DER + +/* DER encoded test server certificates and keys */ + +#define TEST_SRV_KEY_RSA TEST_SRV_KEY_RSA_DER +#define TEST_SRV_PWD_RSA "" +#define TEST_SRV_CRT_RSA_SHA256 TEST_SRV_CRT_RSA_SHA256_DER +#define TEST_SRV_CRT_RSA_SHA1 TEST_SRV_CRT_RSA_SHA1_DER +#define TEST_SRV_KEY_EC TEST_SRV_KEY_EC_DER +#define TEST_SRV_PWD_EC "" +#define TEST_SRV_CRT_EC TEST_SRV_CRT_EC_DER + +/* DER encoded test client certificates and keys */ + +#define TEST_CLI_KEY_RSA TEST_CLI_KEY_RSA_DER +#define TEST_CLI_PWD_RSA "" +#define TEST_CLI_CRT_RSA TEST_CLI_CRT_RSA_DER +#define TEST_CLI_KEY_EC TEST_CLI_KEY_EC_DER +#define TEST_CLI_PWD_EC "" +#define TEST_CLI_CRT_EC TEST_CLI_CRT_EC_DER + +#endif /* MBEDTLS_PEM_PARSE_C */ + +const char mbedtls_test_ca_key_rsa[] = TEST_CA_KEY_RSA; +const char mbedtls_test_ca_pwd_rsa[] = TEST_CA_PWD_RSA; +const char mbedtls_test_ca_crt_rsa_sha256[] = TEST_CA_CRT_RSA_SHA256; +const char mbedtls_test_ca_crt_rsa_sha1[] = TEST_CA_CRT_RSA_SHA1; +const char mbedtls_test_ca_key_ec[] = TEST_CA_KEY_EC; +const char mbedtls_test_ca_pwd_ec[] = TEST_CA_PWD_EC; +const char mbedtls_test_ca_crt_ec[] = TEST_CA_CRT_EC; + +const char mbedtls_test_srv_key_rsa[] = TEST_SRV_KEY_RSA; +const char mbedtls_test_srv_pwd_rsa[] = TEST_SRV_PWD_RSA; +const char mbedtls_test_srv_crt_rsa_sha256[] = TEST_SRV_CRT_RSA_SHA256; +const char mbedtls_test_srv_crt_rsa_sha1[] = TEST_SRV_CRT_RSA_SHA1; +const char mbedtls_test_srv_key_ec[] = TEST_SRV_KEY_EC; +const char mbedtls_test_srv_pwd_ec[] = TEST_SRV_PWD_EC; +const char mbedtls_test_srv_crt_ec[] = TEST_SRV_CRT_EC; + +const char mbedtls_test_cli_key_rsa[] = TEST_CLI_KEY_RSA; +const char mbedtls_test_cli_pwd_rsa[] = TEST_CLI_PWD_RSA; +const char mbedtls_test_cli_crt_rsa[] = TEST_CLI_CRT_RSA; +const char mbedtls_test_cli_key_ec[] = TEST_CLI_KEY_EC; +const char mbedtls_test_cli_pwd_ec[] = TEST_CLI_PWD_EC; +const char mbedtls_test_cli_crt_ec[] = TEST_CLI_CRT_EC; + +const size_t mbedtls_test_ca_key_rsa_len = + sizeof( mbedtls_test_ca_key_rsa ); +const size_t mbedtls_test_ca_pwd_rsa_len = + sizeof( mbedtls_test_ca_pwd_rsa ) - 1; +const size_t mbedtls_test_ca_crt_rsa_sha256_len = + sizeof( mbedtls_test_ca_crt_rsa_sha256 ); +const size_t mbedtls_test_ca_crt_rsa_sha1_len = + sizeof( mbedtls_test_ca_crt_rsa_sha1 ); +const size_t mbedtls_test_ca_key_ec_len = + sizeof( mbedtls_test_ca_key_ec ); +const size_t mbedtls_test_ca_pwd_ec_len = + sizeof( mbedtls_test_ca_pwd_ec ) - 1; +const size_t mbedtls_test_ca_crt_ec_len = + sizeof( mbedtls_test_ca_crt_ec ); + +const size_t mbedtls_test_srv_key_rsa_len = + sizeof( mbedtls_test_srv_key_rsa ); +const size_t mbedtls_test_srv_pwd_rsa_len = + sizeof( mbedtls_test_srv_pwd_rsa ) -1; +const size_t mbedtls_test_srv_crt_rsa_sha256_len = + sizeof( mbedtls_test_srv_crt_rsa_sha256 ); +const size_t mbedtls_test_srv_crt_rsa_sha1_len = + sizeof( mbedtls_test_srv_crt_rsa_sha1 ); +const size_t mbedtls_test_srv_key_ec_len = + sizeof( mbedtls_test_srv_key_ec ); +const size_t mbedtls_test_srv_pwd_ec_len = + sizeof( mbedtls_test_srv_pwd_ec ) - 1; +const size_t mbedtls_test_srv_crt_ec_len = + sizeof( mbedtls_test_srv_crt_ec ); + +const size_t mbedtls_test_cli_key_rsa_len = + sizeof( mbedtls_test_cli_key_rsa ); +const size_t mbedtls_test_cli_pwd_rsa_len = + sizeof( mbedtls_test_cli_pwd_rsa ) - 1; +const size_t mbedtls_test_cli_crt_rsa_len = + sizeof( mbedtls_test_cli_crt_rsa ); +const size_t mbedtls_test_cli_key_ec_len = + sizeof( mbedtls_test_cli_key_ec ); +const size_t mbedtls_test_cli_pwd_ec_len = + sizeof( mbedtls_test_cli_pwd_ec ) - 1; +const size_t mbedtls_test_cli_crt_ec_len = + sizeof( mbedtls_test_cli_crt_ec ); + +/* + * Dispatch between SHA-1 and SHA-256 + */ #if defined(MBEDTLS_SHA256_C) -#define TEST_CA_CRT_RSA_SHA256 \ -"-----BEGIN CERTIFICATE-----\r\n" \ -"MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ -"MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ -"MTcwNTA0MTY1NzAxWhcNMjcwNTA1MTY1NzAxWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ -"A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ -"CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ -"mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ -"50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ -"YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ -"R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ -"KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ -"gZUwgZIwHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/MGMGA1UdIwRcMFqA\r\n" \ -"FLRa5KWz3tJS9rnVppUP6z68x/3/oT+kPTA7MQswCQYDVQQGEwJOTDERMA8GA1UE\r\n" \ -"CgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0GCAQAwDAYDVR0T\r\n" \ -"BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAHK/HHrTZMnnVMpde1io+voAtql7j\r\n" \ -"4sRhLrjD7o3THtwRbDa2diCvpq0Sq23Ng2LMYoXsOxoL/RQK3iN7UKxV3MKPEr0w\r\n" \ -"XQS+kKQqiT2bsfrjnWMVHZtUOMpm6FNqcdGm/Rss3vKda2lcKl8kUnq/ylc1+QbB\r\n" \ -"G6A6tUvQcr2ZyWfVg+mM5XkhTrOOXus2OLikb4WwEtJTJRNE0f+yPODSUz0/vT57\r\n" \ -"ApH0CnB80bYJshYHPHHymOtleAB8KSYtqm75g/YNobjnjB6cm4HkW3OZRVIl6fYY\r\n" \ -"n20NRVA1Vjs6GAROr4NqW4k/+LofY9y0LLDE+p0oIEKXIsIvhPr39swxSA==\r\n" \ -"-----END CERTIFICATE-----\r\n" - -const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA_SHA256; -const size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa ); -#define TEST_CA_CRT_RSA_SOME - -static const char mbedtls_test_ca_crt_rsa_sha256[] = TEST_CA_CRT_RSA_SHA256; +#define TEST_CA_CRT_RSA TEST_CA_CRT_RSA_SHA256 +#define TEST_SRV_CRT_RSA TEST_SRV_CRT_RSA_SHA256 +#else +#define TEST_CA_CRT_RSA TEST_CA_CRT_RSA_SHA1 +#define TEST_SRV_CRT_RSA TEST_SRV_CRT_RSA_SHA1 +#endif /* MBEDTLS_SHA256_C */ -#endif +const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA; +const char mbedtls_test_srv_crt_rsa[] = TEST_SRV_CRT_RSA; -#if !defined(TEST_CA_CRT_RSA_SOME) || defined(MBEDTLS_SHA1_C) -#define TEST_CA_CRT_RSA_SHA1 \ -"-----BEGIN CERTIFICATE-----\r\n" \ -"MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" \ -"MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ -"MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ -"A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ -"CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ -"mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ -"50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ -"YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ -"R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ -"KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ -"gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\r\n" \ -"/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\r\n" \ -"BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\r\n" \ -"dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\r\n" \ -"SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\r\n" \ -"DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\r\n" \ -"pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\r\n" \ -"m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\r\n" \ -"7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\r\n" \ -"-----END CERTIFICATE-----\r\n" - -#if !defined (TEST_CA_CRT_RSA_SOME) -const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA_SHA1; -const size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa ); -#endif +const size_t mbedtls_test_ca_crt_rsa_len = + sizeof( mbedtls_test_ca_crt_rsa ); +const size_t mbedtls_test_srv_crt_rsa_len = + sizeof( mbedtls_test_srv_crt_rsa ); -static const char mbedtls_test_ca_crt_rsa_sha1[] = TEST_CA_CRT_RSA_SHA1; +/* + * Dispatch between RSA and EC + */ -#endif +#if defined(MBEDTLS_RSA_C) + +#define TEST_CA_KEY TEST_CA_KEY_RSA +#define TEST_CA_PWD TEST_CA_PWD_RSA +#define TEST_CA_CRT TEST_CA_CRT_RSA + +#define TEST_SRV_KEY TEST_SRV_KEY_RSA +#define TEST_SRV_PWD TEST_SRV_PWD_RSA +#define TEST_SRV_CRT TEST_SRV_CRT_RSA + +#define TEST_CLI_KEY TEST_CLI_KEY_RSA +#define TEST_CLI_PWD TEST_CLI_PWD_RSA +#define TEST_CLI_CRT TEST_CLI_CRT_RSA + +#else /* no RSA, so assume ECDSA */ + +#define TEST_CA_KEY TEST_CA_KEY_EC +#define TEST_CA_PWD TEST_CA_PWD_EC +#define TEST_CA_CRT TEST_CA_CRT_EC + +#define TEST_SRV_KEY TEST_SRV_KEY_EC +#define TEST_SRV_PWD TEST_SRV_PWD_EC +#define TEST_SRV_CRT TEST_SRV_CRT_EC + +#define TEST_CLI_KEY TEST_CLI_KEY_EC +#define TEST_CLI_PWD TEST_CLI_PWD_EC +#define TEST_CLI_CRT TEST_CLI_CRT_EC -const char mbedtls_test_ca_key_rsa[] = -"-----BEGIN RSA PRIVATE KEY-----\r\n" -"Proc-Type: 4,ENCRYPTED\r\n" -"DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B\r\n" -"\r\n" -"9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA\r\n" -"7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq\r\n" -"Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo\r\n" -"PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb\r\n" -"GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9\r\n" -"gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq\r\n" -"QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w\r\n" -"PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x\r\n" -"vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU\r\n" -"WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X\r\n" -"JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR\r\n" -"KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe\r\n" -"Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J\r\n" -"9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2\r\n" -"iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/\r\n" -"tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT\r\n" -"P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL\r\n" -"1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb\r\n" -"nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5\r\n" -"X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq\r\n" -"rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz\r\n" -"L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l\r\n" -"I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR\r\n" -"wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde\r\n" -"P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2\r\n" -"-----END RSA PRIVATE KEY-----\r\n"; -const size_t mbedtls_test_ca_key_rsa_len = sizeof( mbedtls_test_ca_key_rsa ); - -const char mbedtls_test_ca_pwd_rsa[] = "PolarSSLTest"; -const size_t mbedtls_test_ca_pwd_rsa_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1; - -/* tests/data_files/server2.crt */ -const char mbedtls_test_srv_crt_rsa[] = -"-----BEGIN CERTIFICATE-----\r\n" -"MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" -"MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" -"MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" -"A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n" -"AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n" -"owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n" -"NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n" -"tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n" -"hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n" -"HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n" -"VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n" -"FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAAFzC0rF\r\n" -"y6De8WMcdgQrEw3AhBHFjzqnxZw1ene4IBSC7lTw8rBSy3jOWQdPUWn+0y/pCeeF\r\n" -"kti6sevFdl1hLemGtd4q+T9TKEKGg3ND4ARfB5AUZZ9uEHq8WBkiwus5clGS17Qd\r\n" -"dS/TOisB59tQruLx1E1bPLtBKyqk4koC5WAULJwfpswGSyWJTpYwIpxcWE3D2tBu\r\n" -"UB6MZfXZFzWmWEOyKbeoXjXe8GBCGgHLywvYDsGQ36HSGtEsAvR2QaTLSxWYcfk1\r\n" -"fbDn4jSWkb4yZy1r01UEigFQtONieGwRFaUqEcFJHJvEEGVgh9keaVlOj2vrwf5r\r\n" -"4mN4lW7gLdenN6g=\r\n" -"-----END CERTIFICATE-----\r\n"; -const size_t mbedtls_test_srv_crt_rsa_len = sizeof( mbedtls_test_srv_crt_rsa ); - -/* tests/data_files/server2.key */ -const char mbedtls_test_srv_key_rsa[] = -"-----BEGIN RSA PRIVATE KEY-----\r\n" -"MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r\r\n" -"lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2\r\n" -"2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ\r\n" -"Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i\r\n" -"GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb\r\n" -"y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ\r\n" -"++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G\r\n" -"Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z\r\n" -"/r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm\r\n" -"WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He\r\n" -"GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa\r\n" -"TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28\r\n" -"CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK\r\n" -"nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u\r\n" -"AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g\r\n" -"sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s\r\n" -"mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic\r\n" -"BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv\r\n" -"whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b\r\n" -"vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs\r\n" -"3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP\r\n" -"3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED\r\n" -"ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH\r\n" -"4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE\r\n" -"TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg==\r\n" -"-----END RSA PRIVATE KEY-----\r\n"; -const size_t mbedtls_test_srv_key_rsa_len = sizeof( mbedtls_test_srv_key_rsa ); - -/* tests/data_files/cli-rsa-sha256.crt */ -const char mbedtls_test_cli_crt_rsa[] = -"-----BEGIN CERTIFICATE-----\r\n" -"MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" -"MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" -"MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G\r\n" -"A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\r\n" -"BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\r\n" -"M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\r\n" -"1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\r\n" -"MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\r\n" -"4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\r\n" -"/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\r\n" -"o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf\r\n" -"BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsFAAOC\r\n" -"AQEAlHabem2Tu69VUN7EipwnQn1dIHdgvT5i+iQHpSxY1crPnBbAeSdAXwsVEqLQ\r\n" -"gOOIAQD5VIITNuoGgo4i+4OpNh9u7ZkpRHla+/swsfrFWRRbBNP5Bcu74AGLstwU\r\n" -"zM8gIkBiyfM1Q1qDQISV9trlCG6O8vh8dp/rbI3rfzo99BOHXgFCrzXjCuW4vDsF\r\n" -"r+Dao26bX3sJ6UnEWg1H3o2x6PpUcvQ36h71/bz4TEbbUUEpe02V4QWuL+wrhHJL\r\n" -"U7o3SVE3Og7jPF8sat0a50YUWhwEFI256m02KAXLg89ueUyYKEr6rNwhcvXJpvU9\r\n" -"giIVvd0Sbjjnn7NC4VDbcXV8vw==\r\n" -"-----END CERTIFICATE-----\r\n"; -const size_t mbedtls_test_cli_crt_rsa_len = sizeof( mbedtls_test_cli_crt_rsa ); - -/* tests/data_files/cli-rsa.key */ -const char mbedtls_test_cli_key_rsa[] = -"-----BEGIN RSA PRIVATE KEY-----\r\n" -"MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\r\n" -"B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\r\n" -"bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\r\n" -"Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\r\n" -"7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\r\n" -"dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\r\n" -"yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\r\n" -"4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\r\n" -"ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\r\n" -"zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\r\n" -"l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\r\n" -"DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\r\n" -"VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\r\n" -"Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\r\n" -"wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\r\n" -"c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\r\n" -"33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\r\n" -"ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\r\n" -"BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\r\n" -"KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\r\n" -"UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\r\n" -"7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\r\n" -"gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\r\n" -"bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\r\n" -"8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\r\n" -"-----END RSA PRIVATE KEY-----\r\n"; -const size_t mbedtls_test_cli_key_rsa_len = sizeof( mbedtls_test_cli_key_rsa ); #endif /* MBEDTLS_RSA_C */ -#if defined(MBEDTLS_PEM_PARSE_C) -/* Concatenation of all available CA certificates */ -const char mbedtls_test_cas_pem[] = -#ifdef TEST_CA_CRT_RSA_SHA1 - TEST_CA_CRT_RSA_SHA1 -#endif -#ifdef TEST_CA_CRT_RSA_SHA256 - TEST_CA_CRT_RSA_SHA256 -#endif -#ifdef TEST_CA_CRT_EC - TEST_CA_CRT_EC -#endif - ""; -const size_t mbedtls_test_cas_pem_len = sizeof( mbedtls_test_cas_pem ); -#endif +/* API stability forces us to declare + * mbedtls_test_{ca|srv|cli}_{key|pwd|crt} + * as pointers. */ +static const char test_ca_key[] = TEST_CA_KEY; +static const char test_ca_pwd[] = TEST_CA_PWD; +static const char test_ca_crt[] = TEST_CA_CRT; + +static const char test_srv_key[] = TEST_SRV_KEY; +static const char test_srv_pwd[] = TEST_SRV_PWD; +static const char test_srv_crt[] = TEST_SRV_CRT; + +static const char test_cli_key[] = TEST_CLI_KEY; +static const char test_cli_pwd[] = TEST_CLI_PWD; +static const char test_cli_crt[] = TEST_CLI_CRT; + +const char *mbedtls_test_ca_key = test_ca_key; +const char *mbedtls_test_ca_pwd = test_ca_pwd; +const char *mbedtls_test_ca_crt = test_ca_crt; + +const char *mbedtls_test_srv_key = test_srv_key; +const char *mbedtls_test_srv_pwd = test_srv_pwd; +const char *mbedtls_test_srv_crt = test_srv_crt; + +const char *mbedtls_test_cli_key = test_cli_key; +const char *mbedtls_test_cli_pwd = test_cli_pwd; +const char *mbedtls_test_cli_crt = test_cli_crt; + +const size_t mbedtls_test_ca_key_len = + sizeof( test_ca_key ); +const size_t mbedtls_test_ca_pwd_len = + sizeof( test_ca_pwd ) - 1; +const size_t mbedtls_test_ca_crt_len = + sizeof( test_ca_crt ); -/* List of all available CA certificates */ +const size_t mbedtls_test_srv_key_len = + sizeof( test_srv_key ); +const size_t mbedtls_test_srv_pwd_len = + sizeof( test_srv_pwd ) - 1; +const size_t mbedtls_test_srv_crt_len = + sizeof( test_srv_crt ); + +const size_t mbedtls_test_cli_key_len = + sizeof( test_cli_key ); +const size_t mbedtls_test_cli_pwd_len = + sizeof( test_cli_pwd ) - 1; +const size_t mbedtls_test_cli_crt_len = + sizeof( test_cli_crt ); + +/* + * + * Lists of certificates + * + */ + +/* List of CAs in PEM or DER, depending on config */ const char * mbedtls_test_cas[] = { -#if defined(TEST_CA_CRT_RSA_SHA1) +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA1_C) mbedtls_test_ca_crt_rsa_sha1, #endif -#if defined(TEST_CA_CRT_RSA_SHA256) +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C) mbedtls_test_ca_crt_rsa_sha256, #endif #if defined(MBEDTLS_ECDSA_C) @@ -359,10 +1704,10 @@ const char * mbedtls_test_cas[] = { NULL }; const size_t mbedtls_test_cas_len[] = { -#if defined(TEST_CA_CRT_RSA_SHA1) +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA1_C) sizeof( mbedtls_test_ca_crt_rsa_sha1 ), #endif -#if defined(TEST_CA_CRT_RSA_SHA256) +#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C) sizeof( mbedtls_test_ca_crt_rsa_sha256 ), #endif #if defined(MBEDTLS_ECDSA_C) @@ -371,36 +1716,53 @@ const size_t mbedtls_test_cas_len[] = { 0 }; +/* List of all available CA certificates in DER format */ +const unsigned char * mbedtls_test_cas_der[] = { #if defined(MBEDTLS_RSA_C) -const char *mbedtls_test_ca_crt = mbedtls_test_ca_crt_rsa; /* SHA1 or SHA256 */ -const char *mbedtls_test_ca_key = mbedtls_test_ca_key_rsa; -const char *mbedtls_test_ca_pwd = mbedtls_test_ca_pwd_rsa; -const char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_rsa; -const char *mbedtls_test_srv_key = mbedtls_test_srv_key_rsa; -const char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_rsa; -const char *mbedtls_test_cli_key = mbedtls_test_cli_key_rsa; -const size_t mbedtls_test_ca_crt_len = sizeof( mbedtls_test_ca_crt_rsa ); -const size_t mbedtls_test_ca_key_len = sizeof( mbedtls_test_ca_key_rsa ); -const size_t mbedtls_test_ca_pwd_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1; -const size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_rsa ); -const size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_rsa ); -const size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_rsa ); -const size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_rsa ); -#else /* ! MBEDTLS_RSA_C, so MBEDTLS_ECDSA_C */ -const char *mbedtls_test_ca_crt = mbedtls_test_ca_crt_ec; -const char *mbedtls_test_ca_key = mbedtls_test_ca_key_ec; -const char *mbedtls_test_ca_pwd = mbedtls_test_ca_pwd_ec; -const char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_ec; -const char *mbedtls_test_srv_key = mbedtls_test_srv_key_ec; -const char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_ec; -const char *mbedtls_test_cli_key = mbedtls_test_cli_key_ec; -const size_t mbedtls_test_ca_crt_len = sizeof( mbedtls_test_ca_crt_ec ); -const size_t mbedtls_test_ca_key_len = sizeof( mbedtls_test_ca_key_ec ); -const size_t mbedtls_test_ca_pwd_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1; -const size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_ec ); -const size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_ec ); -const size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_ec ); -const size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_ec ); +#if defined(MBEDTLS_SHA256_C) + mbedtls_test_ca_crt_rsa_sha256_der, +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA1_C) + mbedtls_test_ca_crt_rsa_sha1_der, +#endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECDSA_C) + mbedtls_test_ca_crt_ec_der, +#endif /* MBEDTLS_ECDSA_C */ + NULL +}; + +const size_t mbedtls_test_cas_der_len[] = { +#if defined(MBEDTLS_RSA_C) +#if defined(MBEDTLS_SHA256_C) + sizeof( mbedtls_test_ca_crt_rsa_sha256_der ), +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA1_C) + sizeof( mbedtls_test_ca_crt_rsa_sha1_der ), +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECDSA_C) + sizeof( mbedtls_test_ca_crt_ec_der ), +#endif /* MBEDTLS_ECDSA_C */ + 0 +}; + +/* Concatenation of all available CA certificates in PEM format */ +#if defined(MBEDTLS_PEM_PARSE_C) +const char mbedtls_test_cas_pem[] = +#if defined(MBEDTLS_RSA_C) +#if defined(MBEDTLS_SHA256_C) + TEST_CA_CRT_RSA_SHA256_PEM +#endif /* MBEDTLS_SHA256_C */ +#if defined(MBEDTLS_SHA1_C) + TEST_CA_CRT_RSA_SHA1_PEM +#endif /* MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_RSA_C */ +#if defined(MBEDTLS_ECDSA_C) + TEST_CA_CRT_EC_PEM +#endif /* MBEDTLS_ECDSA_C */ + ""; +const size_t mbedtls_test_cas_pem_len = sizeof( mbedtls_test_cas_pem ); +#endif /* MBEDTLS_PEM_PARSE_C */ #endif /* MBEDTLS_CERTS_C */ diff --git a/thirdparty/mbedtls/library/chacha20.c b/thirdparty/mbedtls/library/chacha20.c index 0757163e2f..8a3610f0e0 100644 --- a/thirdparty/mbedtls/library/chacha20.c +++ b/thirdparty/mbedtls/library/chacha20.c @@ -60,14 +60,14 @@ MBEDTLS_INTERNAL_VALIDATE( cond ) #define BYTES_TO_U32_LE( data, offset ) \ - ( (uint32_t) data[offset] \ - | (uint32_t) ( (uint32_t) data[( offset ) + 1] << 8 ) \ - | (uint32_t) ( (uint32_t) data[( offset ) + 2] << 16 ) \ - | (uint32_t) ( (uint32_t) data[( offset ) + 3] << 24 ) \ + ( (uint32_t) (data)[offset] \ + | (uint32_t) ( (uint32_t) (data)[( offset ) + 1] << 8 ) \ + | (uint32_t) ( (uint32_t) (data)[( offset ) + 2] << 16 ) \ + | (uint32_t) ( (uint32_t) (data)[( offset ) + 3] << 24 ) \ ) #define ROTL32( value, amount ) \ - ( (uint32_t) ( value << amount ) | ( value >> ( 32 - amount ) ) ) + ( (uint32_t) ( (value) << (amount) ) | ( (value) >> ( 32 - (amount) ) ) ) #define CHACHA20_CTR_INDEX ( 12U ) diff --git a/thirdparty/mbedtls/library/debug.c b/thirdparty/mbedtls/library/debug.c index 824cd0236e..36510cdd56 100644 --- a/thirdparty/mbedtls/library/debug.c +++ b/thirdparty/mbedtls/library/debug.c @@ -86,8 +86,13 @@ void mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level, char str[DEBUG_BUF_SIZE]; int ret; - if( NULL == ssl || NULL == ssl->conf || NULL == ssl->conf->f_dbg || level > debug_threshold ) + if( NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + level > debug_threshold ) + { return; + } va_start( argp, format ); #if defined(_WIN32) @@ -121,8 +126,13 @@ void mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level, { char str[DEBUG_BUF_SIZE]; - if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) + if( NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + level > debug_threshold ) + { return; + } /* * With non-blocking I/O and examples that just retry immediately, @@ -146,8 +156,13 @@ void mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level, char txt[17]; size_t i, idx = 0; - if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) + if( NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + level > debug_threshold ) + { return; + } mbedtls_snprintf( str + idx, sizeof( str ) - idx, "dumping '%s' (%u bytes)\n", text, (unsigned int) len ); @@ -199,8 +214,13 @@ void mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level, { char str[DEBUG_BUF_SIZE]; - if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) + if( NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + level > debug_threshold ) + { return; + } mbedtls_snprintf( str, sizeof( str ), "%s(X)", text ); mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->X ); @@ -219,8 +239,14 @@ void mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level, int j, k, zeros = 1; size_t i, n, idx = 0; - if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || X == NULL || level > debug_threshold ) + if( NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + NULL == X || + level > debug_threshold ) + { return; + } for( n = X->n - 1; n > 0; n-- ) if( X->p[n] != 0 ) @@ -345,8 +371,14 @@ void mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level, char str[DEBUG_BUF_SIZE]; int i = 0; - if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || crt == NULL || level > debug_threshold ) + if( NULL == ssl || + NULL == ssl->conf || + NULL == ssl->conf->f_dbg || + NULL == crt || + level > debug_threshold ) + { return; + } while( crt != NULL ) { diff --git a/thirdparty/mbedtls/library/des.c b/thirdparty/mbedtls/library/des.c index ca9e071f32..8a33d82e50 100644 --- a/thirdparty/mbedtls/library/des.c +++ b/thirdparty/mbedtls/library/des.c @@ -257,50 +257,57 @@ static const uint32_t RHs[16] = /* * Initial Permutation macro */ -#define DES_IP(X,Y) \ -{ \ - T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ - T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ - T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ - T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ - Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \ - T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \ - X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \ -} +#define DES_IP(X,Y) \ + do \ + { \ + T = (((X) >> 4) ^ (Y)) & 0x0F0F0F0F; (Y) ^= T; (X) ^= (T << 4); \ + T = (((X) >> 16) ^ (Y)) & 0x0000FFFF; (Y) ^= T; (X) ^= (T << 16); \ + T = (((Y) >> 2) ^ (X)) & 0x33333333; (X) ^= T; (Y) ^= (T << 2); \ + T = (((Y) >> 8) ^ (X)) & 0x00FF00FF; (X) ^= T; (Y) ^= (T << 8); \ + (Y) = (((Y) << 1) | ((Y) >> 31)) & 0xFFFFFFFF; \ + T = ((X) ^ (Y)) & 0xAAAAAAAA; (Y) ^= T; (X) ^= T; \ + (X) = (((X) << 1) | ((X) >> 31)) & 0xFFFFFFFF; \ + } while( 0 ) /* * Final Permutation macro */ -#define DES_FP(X,Y) \ -{ \ - X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \ - T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \ - Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \ - T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ - T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ - T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ - T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ -} +#define DES_FP(X,Y) \ + do \ + { \ + (X) = (((X) << 31) | ((X) >> 1)) & 0xFFFFFFFF; \ + T = ((X) ^ (Y)) & 0xAAAAAAAA; (X) ^= T; (Y) ^= T; \ + (Y) = (((Y) << 31) | ((Y) >> 1)) & 0xFFFFFFFF; \ + T = (((Y) >> 8) ^ (X)) & 0x00FF00FF; (X) ^= T; (Y) ^= (T << 8); \ + T = (((Y) >> 2) ^ (X)) & 0x33333333; (X) ^= T; (Y) ^= (T << 2); \ + T = (((X) >> 16) ^ (Y)) & 0x0000FFFF; (Y) ^= T; (X) ^= (T << 16); \ + T = (((X) >> 4) ^ (Y)) & 0x0F0F0F0F; (Y) ^= T; (X) ^= (T << 4); \ + } while( 0 ) /* * DES round macro */ -#define DES_ROUND(X,Y) \ -{ \ - T = *SK++ ^ X; \ - Y ^= SB8[ (T ) & 0x3F ] ^ \ - SB6[ (T >> 8) & 0x3F ] ^ \ - SB4[ (T >> 16) & 0x3F ] ^ \ - SB2[ (T >> 24) & 0x3F ]; \ - \ - T = *SK++ ^ ((X << 28) | (X >> 4)); \ - Y ^= SB7[ (T ) & 0x3F ] ^ \ - SB5[ (T >> 8) & 0x3F ] ^ \ - SB3[ (T >> 16) & 0x3F ] ^ \ - SB1[ (T >> 24) & 0x3F ]; \ -} - -#define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; } +#define DES_ROUND(X,Y) \ + do \ + { \ + T = *SK++ ^ (X); \ + (Y) ^= SB8[ (T ) & 0x3F ] ^ \ + SB6[ (T >> 8) & 0x3F ] ^ \ + SB4[ (T >> 16) & 0x3F ] ^ \ + SB2[ (T >> 24) & 0x3F ]; \ + \ + T = *SK++ ^ (((X) << 28) | ((X) >> 4)); \ + (Y) ^= SB7[ (T ) & 0x3F ] ^ \ + SB5[ (T >> 8) & 0x3F ] ^ \ + SB3[ (T >> 16) & 0x3F ] ^ \ + SB1[ (T >> 24) & 0x3F ]; \ + } while( 0 ) + +#define SWAP(a,b) \ + do \ + { \ + uint32_t t = (a); (a) = (b); (b) = t; t = 0; \ + } while( 0 ) void mbedtls_des_init( mbedtls_des_context *ctx ) { diff --git a/thirdparty/mbedtls/library/dhm.c b/thirdparty/mbedtls/library/dhm.c index fb6937e854..8255632a99 100644 --- a/thirdparty/mbedtls/library/dhm.c +++ b/thirdparty/mbedtls/library/dhm.c @@ -649,12 +649,28 @@ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ) #if defined(MBEDTLS_SELF_TEST) +#if defined(MBEDTLS_PEM_PARSE_C) static const char mbedtls_test_dhm_params[] = "-----BEGIN DH PARAMETERS-----\r\n" "MIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh\r\n" "1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32\r\n" "9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC\r\n" "-----END DH PARAMETERS-----\r\n"; +#else /* MBEDTLS_PEM_PARSE_C */ +static const char mbedtls_test_dhm_params[] = { + 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0x9e, 0x35, 0xf4, 0x30, 0x44, + 0x3a, 0x09, 0x90, 0x4f, 0x3a, 0x39, 0xa9, 0x79, 0x79, 0x7d, 0x07, 0x0d, + 0xf5, 0x33, 0x78, 0xe7, 0x9c, 0x24, 0x38, 0xbe, 0xf4, 0xe7, 0x61, 0xf3, + 0xc7, 0x14, 0x55, 0x33, 0x28, 0x58, 0x9b, 0x04, 0x1c, 0x80, 0x9b, 0xe1, + 0xd6, 0xc6, 0xb5, 0xf1, 0xfc, 0x9f, 0x47, 0xd3, 0xa2, 0x54, 0x43, 0x18, + 0x82, 0x53, 0xa9, 0x92, 0xa5, 0x68, 0x18, 0xb3, 0x7b, 0xa9, 0xde, 0x5a, + 0x40, 0xd3, 0x62, 0xe5, 0x6e, 0xff, 0x0b, 0xe5, 0x41, 0x74, 0x74, 0xc1, + 0x25, 0xc1, 0x99, 0x27, 0x2c, 0x8f, 0xe4, 0x1d, 0xea, 0x73, 0x3d, 0xf6, + 0xf6, 0x62, 0xc9, 0x2a, 0xe7, 0x65, 0x56, 0xe7, 0x55, 0xd1, 0x0c, 0x64, + 0xe6, 0xa5, 0x09, 0x68, 0xf6, 0x7f, 0xc6, 0xea, 0x73, 0xd0, 0xdc, 0xa8, + 0x56, 0x9b, 0xe2, 0xba, 0x20, 0x4e, 0x23, 0x58, 0x0d, 0x8b, 0xca, 0x2f, + 0x49, 0x75, 0xb3, 0x02, 0x01, 0x02 }; +#endif /* MBEDTLS_PEM_PARSE_C */ static const size_t mbedtls_test_dhm_params_len = sizeof( mbedtls_test_dhm_params ); diff --git a/thirdparty/mbedtls/library/ecdh.c b/thirdparty/mbedtls/library/ecdh.c index da95c60dad..c5726877d5 100644 --- a/thirdparty/mbedtls/library/ecdh.c +++ b/thirdparty/mbedtls/library/ecdh.c @@ -49,6 +49,16 @@ typedef mbedtls_ecdh_context mbedtls_ecdh_context_mbed; #endif +static mbedtls_ecp_group_id mbedtls_ecdh_grp_id( + const mbedtls_ecdh_context *ctx ) +{ +#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) + return( ctx->grp.id ); +#else + return( ctx->grp_id ); +#endif +} + #if !defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) /* * Generate public key (restartable version) @@ -442,8 +452,21 @@ int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, ECDH_VALIDATE_RET( side == MBEDTLS_ECDH_OURS || side == MBEDTLS_ECDH_THEIRS ); - if( ( ret = mbedtls_ecdh_setup( ctx, key->grp.id ) ) != 0 ) - return( ret ); + if( mbedtls_ecdh_grp_id( ctx ) == MBEDTLS_ECP_DP_NONE ) + { + /* This is the first call to get_params(). Set up the context + * for use with the group. */ + if( ( ret = mbedtls_ecdh_setup( ctx, key->grp.id ) ) != 0 ) + return( ret ); + } + else + { + /* This is not the first call to get_params(). Check that the + * current key's group is the same as the context's, which was set + * from the first key's group. */ + if( mbedtls_ecdh_grp_id( ctx ) != key->grp.id ) + return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); + } #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_get_params_internal( ctx, key, side ) ); diff --git a/thirdparty/mbedtls/library/ecdsa.c b/thirdparty/mbedtls/library/ecdsa.c index 1204ef9949..dc19384d61 100644 --- a/thirdparty/mbedtls/library/ecdsa.c +++ b/thirdparty/mbedtls/library/ecdsa.c @@ -800,11 +800,16 @@ cleanup: int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { + int ret = 0; ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( f_rng != NULL ); - return( mbedtls_ecp_group_load( &ctx->grp, gid ) || - mbedtls_ecp_gen_keypair( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) ); + ret = mbedtls_ecp_group_load( &ctx->grp, gid ); + if( ret != 0 ) + return( ret ); + + return( mbedtls_ecp_gen_keypair( &ctx->grp, &ctx->d, + &ctx->Q, f_rng, p_rng ) ); } #endif /* !MBEDTLS_ECDSA_GENKEY_ALT */ diff --git a/thirdparty/mbedtls/library/ecp.c b/thirdparty/mbedtls/library/ecp.c index ecea5910e0..db36191b9b 100644 --- a/thirdparty/mbedtls/library/ecp.c +++ b/thirdparty/mbedtls/library/ecp.c @@ -1046,25 +1046,29 @@ cleanup: #define INC_MUL_COUNT #endif -#define MOD_MUL( N ) do { MBEDTLS_MPI_CHK( ecp_modp( &N, grp ) ); INC_MUL_COUNT } \ - while( 0 ) +#define MOD_MUL( N ) \ + do \ + { \ + MBEDTLS_MPI_CHK( ecp_modp( &(N), grp ) ); \ + INC_MUL_COUNT \ + } while( 0 ) /* * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_sub_mpi * N->s < 0 is a very fast test, which fails only if N is 0 */ -#define MOD_SUB( N ) \ - while( N.s < 0 && mbedtls_mpi_cmp_int( &N, 0 ) != 0 ) \ - MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &N, &N, &grp->P ) ) +#define MOD_SUB( N ) \ + while( (N).s < 0 && mbedtls_mpi_cmp_int( &(N), 0 ) != 0 ) \ + MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &(N), &(N), &grp->P ) ) /* * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_add_mpi and mbedtls_mpi_mul_int. * We known P, N and the result are positive, so sub_abs is correct, and * a bit faster. */ -#define MOD_ADD( N ) \ - while( mbedtls_mpi_cmp_mpi( &N, &grp->P ) >= 0 ) \ - MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &N, &N, &grp->P ) ) +#define MOD_ADD( N ) \ + while( mbedtls_mpi_cmp_mpi( &(N), &grp->P ) >= 0 ) \ + MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &(N), &(N), &grp->P ) ) #if defined(ECP_SHORTWEIERSTRASS) /* diff --git a/thirdparty/mbedtls/library/ecp_curves.c b/thirdparty/mbedtls/library/ecp_curves.c index 731621dc3c..282481d053 100644 --- a/thirdparty/mbedtls/library/ecp_curves.c +++ b/thirdparty/mbedtls/library/ecp_curves.c @@ -51,11 +51,11 @@ */ #if defined(MBEDTLS_HAVE_INT32) -#define BYTES_TO_T_UINT_4( a, b, c, d ) \ - ( (mbedtls_mpi_uint) a << 0 ) | \ - ( (mbedtls_mpi_uint) b << 8 ) | \ - ( (mbedtls_mpi_uint) c << 16 ) | \ - ( (mbedtls_mpi_uint) d << 24 ) +#define BYTES_TO_T_UINT_4( a, b, c, d ) \ + ( (mbedtls_mpi_uint) (a) << 0 ) | \ + ( (mbedtls_mpi_uint) (b) << 8 ) | \ + ( (mbedtls_mpi_uint) (c) << 16 ) | \ + ( (mbedtls_mpi_uint) (d) << 24 ) #define BYTES_TO_T_UINT_2( a, b ) \ BYTES_TO_T_UINT_4( a, b, 0, 0 ) @@ -67,14 +67,14 @@ #else /* 64-bits */ #define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \ - ( (mbedtls_mpi_uint) a << 0 ) | \ - ( (mbedtls_mpi_uint) b << 8 ) | \ - ( (mbedtls_mpi_uint) c << 16 ) | \ - ( (mbedtls_mpi_uint) d << 24 ) | \ - ( (mbedtls_mpi_uint) e << 32 ) | \ - ( (mbedtls_mpi_uint) f << 40 ) | \ - ( (mbedtls_mpi_uint) g << 48 ) | \ - ( (mbedtls_mpi_uint) h << 56 ) + ( (mbedtls_mpi_uint) (a) << 0 ) | \ + ( (mbedtls_mpi_uint) (b) << 8 ) | \ + ( (mbedtls_mpi_uint) (c) << 16 ) | \ + ( (mbedtls_mpi_uint) (d) << 24 ) | \ + ( (mbedtls_mpi_uint) (e) << 32 ) | \ + ( (mbedtls_mpi_uint) (f) << 40 ) | \ + ( (mbedtls_mpi_uint) (g) << 48 ) | \ + ( (mbedtls_mpi_uint) (h) << 56 ) #define BYTES_TO_T_UINT_4( a, b, c, d ) \ BYTES_TO_T_UINT_8( a, b, c, d, 0, 0, 0, 0 ) @@ -890,7 +890,7 @@ static inline void carry64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *carry ) } #define WIDTH 8 / sizeof( mbedtls_mpi_uint ) -#define A( i ) N->p + i * WIDTH +#define A( i ) N->p + (i) * WIDTH #define ADD( i ) add64( p, A( i ), &c ) #define NEXT p += WIDTH; carry64( p, &c ) #define LAST p += WIDTH; *p = c; while( ++p < end ) *p = 0 @@ -955,7 +955,8 @@ cleanup: #else /* 64-bit */ #define MAX32 N->n * 2 -#define A( j ) j % 2 ? (uint32_t)( N->p[j/2] >> 32 ) : (uint32_t)( N->p[j/2] ) +#define A( j ) (j) % 2 ? (uint32_t)( N->p[(j)/2] >> 32 ) : \ + (uint32_t)( N->p[(j)/2] ) #define STORE32 \ if( i % 2 ) { \ N->p[i/2] &= 0x00000000FFFFFFFF; \ @@ -989,20 +990,21 @@ static inline void sub32( uint32_t *dst, uint32_t src, signed char *carry ) * Helpers for the main 'loop' * (see fix_negative for the motivation of C) */ -#define INIT( b ) \ - int ret; \ - signed char c = 0, cc; \ - uint32_t cur; \ - size_t i = 0, bits = b; \ - mbedtls_mpi C; \ - mbedtls_mpi_uint Cp[ b / 8 / sizeof( mbedtls_mpi_uint) + 1 ]; \ - \ - C.s = 1; \ - C.n = b / 8 / sizeof( mbedtls_mpi_uint) + 1; \ - C.p = Cp; \ - memset( Cp, 0, C.n * sizeof( mbedtls_mpi_uint ) ); \ - \ - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, b * 2 / 8 / sizeof( mbedtls_mpi_uint ) ) ); \ +#define INIT( b ) \ + int ret; \ + signed char c = 0, cc; \ + uint32_t cur; \ + size_t i = 0, bits = (b); \ + mbedtls_mpi C; \ + mbedtls_mpi_uint Cp[ (b) / 8 / sizeof( mbedtls_mpi_uint) + 1 ]; \ + \ + C.s = 1; \ + C.n = (b) / 8 / sizeof( mbedtls_mpi_uint) + 1; \ + C.p = Cp; \ + memset( Cp, 0, C.n * sizeof( mbedtls_mpi_uint ) ); \ + \ + MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, (b) * 2 / 8 / \ + sizeof( mbedtls_mpi_uint ) ) ); \ LOAD32; #define NEXT \ diff --git a/thirdparty/mbedtls/library/entropy_poll.c b/thirdparty/mbedtls/library/entropy_poll.c index ba56b70f77..4556f88a55 100644 --- a/thirdparty/mbedtls/library/entropy_poll.c +++ b/thirdparty/mbedtls/library/entropy_poll.c @@ -61,43 +61,28 @@ #define _WIN32_WINNT 0x0400 #endif #include <windows.h> -#include <bcrypt.h> -#if defined(_MSC_VER) && _MSC_VER <= 1600 -/* Visual Studio 2010 and earlier issue a warning when both <stdint.h> and - * <intsafe.h> are included, as they redefine a number of <TYPE>_MAX constants. - * These constants are guaranteed to be the same, though, so we suppress the - * warning when including intsafe.h. - */ -#pragma warning( push ) -#pragma warning( disable : 4005 ) -#endif -#include <intsafe.h> -#if defined(_MSC_VER) && _MSC_VER <= 1600 -#pragma warning( pop ) -#endif +#include <wincrypt.h> int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { - ULONG len_as_ulong = 0; + HCRYPTPROV provider; ((void) data); *olen = 0; - /* - * BCryptGenRandom takes ULONG for size, which is smaller than size_t on - * 64-bit Windows platforms. Ensure len's value can be safely converted into - * a ULONG. - */ - if ( FAILED( SizeTToULong( len, &len_as_ulong ) ) ) + if( CryptAcquireContext( &provider, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE ) { return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); } - if ( !BCRYPT_SUCCESS( BCryptGenRandom( NULL, output, len_as_ulong, BCRYPT_USE_SYSTEM_PREFERRED_RNG ) ) ) + if( CryptGenRandom( provider, (DWORD) len, output ) == FALSE ) { + CryptReleaseContext( provider, 0 ); return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); } + CryptReleaseContext( provider, 0 ); *olen = len; return( 0 ); diff --git a/thirdparty/mbedtls/library/havege.c b/thirdparty/mbedtls/library/havege.c index 4dcac02875..54f897c6e7 100644 --- a/thirdparty/mbedtls/library/havege.c +++ b/thirdparty/mbedtls/library/havege.c @@ -54,7 +54,7 @@ * ------------------------------------------------------------------------ */ -#define SWAP(X,Y) { int *T = X; X = Y; Y = T; } +#define SWAP(X,Y) { int *T = (X); (X) = (Y); (Y) = T; } #define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; #define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; diff --git a/thirdparty/mbedtls/library/md4.c b/thirdparty/mbedtls/library/md4.c index 3f8ddff31d..828fd42999 100644 --- a/thirdparty/mbedtls/library/md4.c +++ b/thirdparty/mbedtls/library/md4.c @@ -137,15 +137,21 @@ int mbedtls_internal_md4_process( mbedtls_md4_context *ctx, GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( X[15], data, 60 ); -#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) +#define S(x,n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n)))) A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; -#define F(x, y, z) ((x & y) | ((~x) & z)) -#define P(a,b,c,d,x,s) { a += F(b,c,d) + x; a = S(a,s); } +#define F(x, y, z) (((x) & (y)) | ((~(x)) & (z))) +#define P(a,b,c,d,x,s) \ + do \ + { \ + (a) += F((b),(c),(d)) + (x); \ + (a) = S((a),(s)); \ + } while( 0 ) + P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 1], 7 ); @@ -167,8 +173,13 @@ int mbedtls_internal_md4_process( mbedtls_md4_context *ctx, #undef P #undef F -#define F(x,y,z) ((x & y) | (x & z) | (y & z)) -#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x5A827999; a = S(a,s); } +#define F(x,y,z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define P(a,b,c,d,x,s) \ + do \ + { \ + (a) += F((b),(c),(d)) + (x) + 0x5A827999; \ + (a) = S((a),(s)); \ + } while( 0 ) P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 4], 5 ); @@ -190,8 +201,13 @@ int mbedtls_internal_md4_process( mbedtls_md4_context *ctx, #undef P #undef F -#define F(x,y,z) (x ^ y ^ z) -#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x6ED9EBA1; a = S(a,s); } +#define F(x,y,z) ((x) ^ (y) ^ (z)) +#define P(a,b,c,d,x,s) \ + do \ + { \ + (a) += F((b),(c),(d)) + (x) + 0x6ED9EBA1; \ + (a) = S((a),(s)); \ + } while( 0 ) P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 8], 9 ); diff --git a/thirdparty/mbedtls/library/md5.c b/thirdparty/mbedtls/library/md5.c index 2a740cda81..a93da8a061 100644 --- a/thirdparty/mbedtls/library/md5.c +++ b/thirdparty/mbedtls/library/md5.c @@ -136,19 +136,22 @@ int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( X[15], data, 60 ); -#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) +#define S(x,n) \ + ( ( (x) << (n) ) | ( ( (x) & 0xFFFFFFFF) >> ( 32 - (n) ) ) ) -#define P(a,b,c,d,k,s,t) \ -{ \ - a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ -} +#define P(a,b,c,d,k,s,t) \ + do \ + { \ + (a) += F((b),(c),(d)) + X[(k)] + (t); \ + (a) = S((a),(s)) + (b); \ + } while( 0 ) A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; -#define F(x,y,z) (z ^ (x & (y ^ z))) +#define F(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) P( A, B, C, D, 0, 7, 0xD76AA478 ); P( D, A, B, C, 1, 12, 0xE8C7B756 ); @@ -169,7 +172,7 @@ int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, #undef F -#define F(x,y,z) (y ^ (z & (x ^ y))) +#define F(x,y,z) ((y) ^ ((z) & ((x) ^ (y)))) P( A, B, C, D, 1, 5, 0xF61E2562 ); P( D, A, B, C, 6, 9, 0xC040B340 ); @@ -190,7 +193,7 @@ int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, #undef F -#define F(x,y,z) (x ^ y ^ z) +#define F(x,y,z) ((x) ^ (y) ^ (z)) P( A, B, C, D, 5, 4, 0xFFFA3942 ); P( D, A, B, C, 8, 11, 0x8771F681 ); @@ -211,7 +214,7 @@ int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, #undef F -#define F(x,y,z) (y ^ (x | ~z)) +#define F(x,y,z) ((y) ^ ((x) | ~(z))) P( A, B, C, D, 0, 6, 0xF4292244 ); P( D, A, B, C, 7, 10, 0x432AFF97 ); diff --git a/thirdparty/mbedtls/library/oid.c b/thirdparty/mbedtls/library/oid.c index edea950f8f..33f437cbe6 100644 --- a/thirdparty/mbedtls/library/oid.c +++ b/thirdparty/mbedtls/library/oid.c @@ -54,22 +54,24 @@ * Macro to generate an internal function for oid_XXX_from_asn1() (used by * the other functions) */ -#define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST ) \ -static const TYPE_T * oid_ ## NAME ## _from_asn1( const mbedtls_asn1_buf *oid ) \ -{ \ - const TYPE_T *p = LIST; \ - const mbedtls_oid_descriptor_t *cur = (const mbedtls_oid_descriptor_t *) p; \ - if( p == NULL || oid == NULL ) return( NULL ); \ - while( cur->asn1 != NULL ) { \ - if( cur->asn1_len == oid->len && \ - memcmp( cur->asn1, oid->p, oid->len ) == 0 ) { \ - return( p ); \ - } \ - p++; \ - cur = (const mbedtls_oid_descriptor_t *) p; \ - } \ - return( NULL ); \ -} +#define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST ) \ + static const TYPE_T * oid_ ## NAME ## _from_asn1( \ + const mbedtls_asn1_buf *oid ) \ + { \ + const TYPE_T *p = (LIST); \ + const mbedtls_oid_descriptor_t *cur = \ + (const mbedtls_oid_descriptor_t *) p; \ + if( p == NULL || oid == NULL ) return( NULL ); \ + while( cur->asn1 != NULL ) { \ + if( cur->asn1_len == oid->len && \ + memcmp( cur->asn1, oid->p, oid->len ) == 0 ) { \ + return( p ); \ + } \ + p++; \ + cur = (const mbedtls_oid_descriptor_t *) p; \ + } \ + return( NULL ); \ + } /* * Macro to generate a function for retrieving a single attribute from the @@ -103,12 +105,13 @@ int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) */ #define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \ ATTR2_TYPE, ATTR2) \ -int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 ) \ +int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, \ + ATTR2_TYPE * ATTR2 ) \ { \ const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \ - if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \ - *ATTR1 = data->ATTR1; \ - *ATTR2 = data->ATTR2; \ + if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \ + *(ATTR1) = data->ATTR1; \ + *(ATTR2) = data->ATTR2; \ return( 0 ); \ } @@ -119,16 +122,16 @@ int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 #define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \ int FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen ) \ { \ - const TYPE_T *cur = LIST; \ + const TYPE_T *cur = (LIST); \ while( cur->descriptor.asn1 != NULL ) { \ - if( cur->ATTR1 == ATTR1 ) { \ + if( cur->ATTR1 == (ATTR1) ) { \ *oid = cur->descriptor.asn1; \ *olen = cur->descriptor.asn1_len; \ return( 0 ); \ } \ cur++; \ } \ - return( MBEDTLS_ERR_OID_NOT_FOUND ); \ + return( MBEDTLS_ERR_OID_NOT_FOUND ); \ } /* @@ -140,9 +143,9 @@ int FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen ) \ int FN_NAME( ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid , \ size_t *olen ) \ { \ - const TYPE_T *cur = LIST; \ + const TYPE_T *cur = (LIST); \ while( cur->descriptor.asn1 != NULL ) { \ - if( cur->ATTR1 == ATTR1 && cur->ATTR2 == ATTR2 ) { \ + if( cur->ATTR1 == (ATTR1) && cur->ATTR2 == (ATTR2) ) { \ *oid = cur->descriptor.asn1; \ *olen = cur->descriptor.asn1_len; \ return( 0 ); \ diff --git a/thirdparty/mbedtls/library/poly1305.c b/thirdparty/mbedtls/library/poly1305.c index b274119181..2b56c5f7ef 100644 --- a/thirdparty/mbedtls/library/poly1305.c +++ b/thirdparty/mbedtls/library/poly1305.c @@ -58,10 +58,10 @@ #define POLY1305_BLOCK_SIZE_BYTES ( 16U ) #define BYTES_TO_U32_LE( data, offset ) \ - ( (uint32_t) data[offset] \ - | (uint32_t) ( (uint32_t) data[( offset ) + 1] << 8 ) \ - | (uint32_t) ( (uint32_t) data[( offset ) + 2] << 16 ) \ - | (uint32_t) ( (uint32_t) data[( offset ) + 3] << 24 ) \ + ( (uint32_t) (data)[offset] \ + | (uint32_t) ( (uint32_t) (data)[( offset ) + 1] << 8 ) \ + | (uint32_t) ( (uint32_t) (data)[( offset ) + 2] << 16 ) \ + | (uint32_t) ( (uint32_t) (data)[( offset ) + 3] << 24 ) \ ) /* diff --git a/thirdparty/mbedtls/library/ripemd160.c b/thirdparty/mbedtls/library/ripemd160.c index bd25ada62c..0791ae4cc9 100644 --- a/thirdparty/mbedtls/library/ripemd160.c +++ b/thirdparty/mbedtls/library/ripemd160.c @@ -147,22 +147,29 @@ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx, D = Dp = ctx->state[3]; E = Ep = ctx->state[4]; -#define F1( x, y, z ) ( x ^ y ^ z ) -#define F2( x, y, z ) ( ( x & y ) | ( ~x & z ) ) -#define F3( x, y, z ) ( ( x | ~y ) ^ z ) -#define F4( x, y, z ) ( ( x & z ) | ( y & ~z ) ) -#define F5( x, y, z ) ( x ^ ( y | ~z ) ) - -#define S( x, n ) ( ( x << n ) | ( x >> (32 - n) ) ) - -#define P( a, b, c, d, e, r, s, f, k ) \ - a += f( b, c, d ) + X[r] + k; \ - a = S( a, s ) + e; \ - c = S( c, 10 ); - -#define P2( a, b, c, d, e, r, s, rp, sp ) \ - P( a, b, c, d, e, r, s, F, K ); \ - P( a ## p, b ## p, c ## p, d ## p, e ## p, rp, sp, Fp, Kp ); +#define F1( x, y, z ) ( (x) ^ (y) ^ (z) ) +#define F2( x, y, z ) ( ( (x) & (y) ) | ( ~(x) & (z) ) ) +#define F3( x, y, z ) ( ( (x) | ~(y) ) ^ (z) ) +#define F4( x, y, z ) ( ( (x) & (z) ) | ( (y) & ~(z) ) ) +#define F5( x, y, z ) ( (x) ^ ( (y) | ~(z) ) ) + +#define S( x, n ) ( ( (x) << (n) ) | ( (x) >> (32 - (n)) ) ) + +#define P( a, b, c, d, e, r, s, f, k ) \ + do \ + { \ + (a) += f( (b), (c), (d) ) + X[r] + (k); \ + (a) = S( (a), (s) ) + (e); \ + (c) = S( (c), 10 ); \ + } while( 0 ) + +#define P2( a, b, c, d, e, r, s, rp, sp ) \ + do \ + { \ + P( (a), (b), (c), (d), (e), (r), (s), F, K ); \ + P( a ## p, b ## p, c ## p, d ## p, e ## p, \ + (rp), (sp), Fp, Kp ); \ + } while( 0 ) #define F F1 #define K 0x00000000 diff --git a/thirdparty/mbedtls/library/sha1.c b/thirdparty/mbedtls/library/sha1.c index e8d4096fbb..355c83d2f7 100644 --- a/thirdparty/mbedtls/library/sha1.c +++ b/thirdparty/mbedtls/library/sha1.c @@ -152,19 +152,21 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, GET_UINT32_BE( W[14], data, 56 ); GET_UINT32_BE( W[15], data, 60 ); -#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) - -#define R(t) \ -( \ - temp = W[( t - 3 ) & 0x0F] ^ W[( t - 8 ) & 0x0F] ^ \ - W[( t - 14 ) & 0x0F] ^ W[ t & 0x0F], \ - ( W[t & 0x0F] = S(temp,1) ) \ -) - -#define P(a,b,c,d,e,x) \ -{ \ - e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ -} +#define S(x,n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n)))) + +#define R(t) \ + ( \ + temp = W[( (t) - 3 ) & 0x0F] ^ W[( (t) - 8 ) & 0x0F] ^ \ + W[( (t) - 14 ) & 0x0F] ^ W[ (t) & 0x0F], \ + ( W[(t) & 0x0F] = S(temp,1) ) \ + ) + +#define P(a,b,c,d,e,x) \ + do \ + { \ + (e) += S((a),5) + F((b),(c),(d)) + K + (x); \ + (b) = S((b),30); \ + } while( 0 ) A = ctx->state[0]; B = ctx->state[1]; @@ -172,7 +174,7 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, D = ctx->state[3]; E = ctx->state[4]; -#define F(x,y,z) (z ^ (x & (y ^ z))) +#define F(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) #define K 0x5A827999 P( A, B, C, D, E, W[0] ); @@ -199,7 +201,7 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, #undef K #undef F -#define F(x,y,z) (x ^ y ^ z) +#define F(x,y,z) ((x) ^ (y) ^ (z)) #define K 0x6ED9EBA1 P( A, B, C, D, E, R(20) ); @@ -226,7 +228,7 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, #undef K #undef F -#define F(x,y,z) ((x & y) | (z & (x | y))) +#define F(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) #define K 0x8F1BBCDC P( A, B, C, D, E, R(40) ); @@ -253,7 +255,7 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, #undef K #undef F -#define F(x,y,z) (x ^ y ^ z) +#define F(x,y,z) ((x) ^ (y) ^ (z)) #define K 0xCA62C1D6 P( A, B, C, D, E, R(60) ); diff --git a/thirdparty/mbedtls/library/sha256.c b/thirdparty/mbedtls/library/sha256.c index 8a540adfbe..2dc0e1a2c9 100644 --- a/thirdparty/mbedtls/library/sha256.c +++ b/thirdparty/mbedtls/library/sha256.c @@ -172,8 +172,8 @@ static const uint32_t K[] = 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, }; -#define SHR(x,n) ((x & 0xFFFFFFFF) >> n) -#define ROTR(x,n) (SHR(x,n) | (x << (32 - n))) +#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n)) +#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n)))) #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3)) #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10)) @@ -181,21 +181,22 @@ static const uint32_t K[] = #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22)) #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25)) -#define F0(x,y,z) ((x & y) | (z & (x | y))) -#define F1(x,y,z) (z ^ (x & (y ^ z))) +#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) +#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) #define R(t) \ -( \ - W[t] = S1(W[t - 2]) + W[t - 7] + \ - S0(W[t - 15]) + W[t - 16] \ -) - -#define P(a,b,c,d,e,f,g,h,x,K) \ -{ \ - temp1 = h + S3(e) + F1(e,f,g) + K + x; \ - temp2 = S2(a) + F0(a,b,c); \ - d += temp1; h = temp1 + temp2; \ -} + ( \ + W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \ + S0(W[(t) - 15]) + W[(t) - 16] \ + ) + +#define P(a,b,c,d,e,f,g,h,x,K) \ + do \ + { \ + temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \ + temp2 = S2(a) + F0((a),(b),(c)); \ + (d) += temp1; (h) = temp1 + temp2; \ + } while( 0 ) int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ) diff --git a/thirdparty/mbedtls/library/sha512.c b/thirdparty/mbedtls/library/sha512.c index 941ecda762..bdd20b284a 100644 --- a/thirdparty/mbedtls/library/sha512.c +++ b/thirdparty/mbedtls/library/sha512.c @@ -224,8 +224,8 @@ int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx, SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( (const unsigned char *)data != NULL ); -#define SHR(x,n) (x >> n) -#define ROTR(x,n) (SHR(x,n) | (x << (64 - n))) +#define SHR(x,n) ((x) >> (n)) +#define ROTR(x,n) (SHR((x),(n)) | ((x) << (64 - (n)))) #define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) #define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6)) @@ -233,15 +233,16 @@ int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx, #define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39)) #define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41)) -#define F0(x,y,z) ((x & y) | (z & (x | y))) -#define F1(x,y,z) (z ^ (x & (y ^ z))) +#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) +#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) -#define P(a,b,c,d,e,f,g,h,x,K) \ -{ \ - temp1 = h + S3(e) + F1(e,f,g) + K + x; \ - temp2 = S2(a) + F0(a,b,c); \ - d += temp1; h = temp1 + temp2; \ -} +#define P(a,b,c,d,e,f,g,h,x,K) \ + do \ + { \ + temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \ + temp2 = S2(a) + F0((a),(b),(c)); \ + (d) += temp1; (h) = temp1 + temp2; \ + } while( 0 ) for( i = 0; i < 16; i++ ) { diff --git a/thirdparty/mbedtls/library/ssl_ciphersuites.c b/thirdparty/mbedtls/library/ssl_ciphersuites.c index 745474effe..518f7dde00 100644 --- a/thirdparty/mbedtls/library/ssl_ciphersuites.c +++ b/thirdparty/mbedtls/library/ssl_ciphersuites.c @@ -43,11 +43,11 @@ /* * Ordered from most preferred to least preferred in terms of security. * - * Current rule (except rc4, weak and null which come last): + * Current rule (except RC4 and 3DES, weak and null which come last): * 1. By key exchange: * Forward-secure non-PSK > forward-secure PSK > ECJPAKE > other non-PSK > other PSK * 2. By key length and cipher: - * ChaCha > AES-256 > Camellia-256 > ARIA-256 > AES-128 > Camellia-128 > ARIA-128 > 3DES + * ChaCha > AES-256 > Camellia-256 > ARIA-256 > AES-128 > Camellia-128 > ARIA-128 * 3. By cipher mode when relevant GCM > CCM > CBC > CCM_8 * 4. By hash function used when relevant * 5. By key exchange/auth again: EC > non-EC @@ -126,11 +126,6 @@ static const int ciphersuite_preference[] = MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, - /* All remaining >= 128-bit ephemeral suites */ - MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, - MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, - MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, - /* The PSK ephemeral suites */ MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, @@ -162,9 +157,6 @@ static const int ciphersuite_preference[] = MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, - MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, - MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, - /* The ECJPAKE suite */ MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, @@ -228,11 +220,6 @@ static const int ciphersuite_preference[] = MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256, - /* All remaining >= 128-bit suites */ - MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, - MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, - MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, - /* The RSA PSK suites */ MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, @@ -251,8 +238,6 @@ static const int ciphersuite_preference[] = MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, - MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, - /* The PSK suites */ MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, @@ -275,6 +260,16 @@ static const int ciphersuite_preference[] = MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256, + /* 3DES suites */ + MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, + MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, /* RC4 suites */ @@ -2187,6 +2182,26 @@ const int *mbedtls_ssl_list_ciphersuites( void ) static int supported_ciphersuites[MAX_CIPHERSUITES]; static int supported_init = 0; +static int ciphersuite_is_removed( const mbedtls_ssl_ciphersuite_t *cs_info ) +{ + (void)cs_info; + +#if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) + if( cs_info->cipher == MBEDTLS_CIPHER_ARC4_128 ) + return( 1 ); +#endif /* MBEDTLS_REMOVE_ARC4_CIPHERSUITES */ + +#if defined(MBEDTLS_REMOVE_3DES_CIPHERSUITES) + if( cs_info->cipher == MBEDTLS_CIPHER_DES_EDE3_ECB || + cs_info->cipher == MBEDTLS_CIPHER_DES_EDE3_CBC ) + { + return( 1 ); + } +#endif /* MBEDTLS_REMOVE_3DES_CIPHERSUITES */ + + return( 0 ); +} + const int *mbedtls_ssl_list_ciphersuites( void ) { /* @@ -2202,14 +2217,12 @@ const int *mbedtls_ssl_list_ciphersuites( void ) *p != 0 && q < supported_ciphersuites + MAX_CIPHERSUITES - 1; p++ ) { -#if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) const mbedtls_ssl_ciphersuite_t *cs_info; if( ( cs_info = mbedtls_ssl_ciphersuite_from_id( *p ) ) != NULL && - cs_info->cipher != MBEDTLS_CIPHER_ARC4_128 ) -#else - if( mbedtls_ssl_ciphersuite_from_id( *p ) != NULL ) -#endif + !ciphersuite_is_removed( cs_info ) ) + { *(q++) = *p; + } } *q = 0; diff --git a/thirdparty/mbedtls/library/version_features.c b/thirdparty/mbedtls/library/version_features.c index 4c36d3caaa..24143d052c 100644 --- a/thirdparty/mbedtls/library/version_features.c +++ b/thirdparty/mbedtls/library/version_features.c @@ -300,6 +300,9 @@ static const char *features[] = { #if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) "MBEDTLS_REMOVE_ARC4_CIPHERSUITES", #endif /* MBEDTLS_REMOVE_ARC4_CIPHERSUITES */ +#if defined(MBEDTLS_REMOVE_3DES_CIPHERSUITES) + "MBEDTLS_REMOVE_3DES_CIPHERSUITES", +#endif /* MBEDTLS_REMOVE_3DES_CIPHERSUITES */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) "MBEDTLS_ECP_DP_SECP192R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ diff --git a/thirdparty/mbedtls/library/x509.c b/thirdparty/mbedtls/library/x509.c index 52b5b649f7..a562df7ca3 100644 --- a/thirdparty/mbedtls/library/x509.c +++ b/thirdparty/mbedtls/library/x509.c @@ -67,8 +67,15 @@ #include <time.h> #endif -#define CHECK(code) if( ( ret = code ) != 0 ){ return( ret ); } -#define CHECK_RANGE(min, max, val) if( val < min || val > max ){ return( ret ); } +#define CHECK(code) if( ( ret = ( code ) ) != 0 ){ return( ret ); } +#define CHECK_RANGE(min, max, val) \ + do \ + { \ + if( ( val ) < ( min ) || ( val ) > ( max ) ) \ + { \ + return( ret ); \ + } \ + } while( 0 ) /* * CertificateSerialNumber ::= INTEGER @@ -354,6 +361,8 @@ static int x509_get_attr_type_value( unsigned char **p, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); + end = *p + len; + if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); @@ -387,6 +396,12 @@ static int x509_get_attr_type_value( unsigned char **p, val->p = *p; *p += val->len; + if( *p != end ) + { + return( MBEDTLS_ERR_X509_INVALID_NAME + + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); + } + cur->next = NULL; return( 0 ); @@ -693,30 +708,25 @@ int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x50 * be either manually updated or extensions should be parsed!) */ int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *ext, int tag ) + mbedtls_x509_buf *ext, int tag ) { int ret; size_t len; - if( *p == end ) - return( 0 ); - - ext->tag = **p; - - if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len, - MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag ) ) != 0 ) - return( ret ); + /* Extension structure use EXPLICIT tagging. That is, the actual + * `Extensions` structure is wrapped by a tag-length pair using + * the respective context-specific tag. */ + ret = mbedtls_asn1_get_tag( p, end, &ext->len, + MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag ); + if( ret != 0 ) + return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); - ext->p = *p; - end = *p + ext->len; + ext->tag = MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag; + ext->p = *p; + end = *p + ext->len; /* * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension - * - * Extension ::= SEQUENCE { - * extnID OBJECT IDENTIFIER, - * critical BOOLEAN DEFAULT FALSE, - * extnValue OCTET STRING } */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) @@ -1001,8 +1011,8 @@ int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ) */ int mbedtls_x509_self_test( int verbose ) { + int ret = 0; #if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_SHA256_C) - int ret; uint32_t flags; mbedtls_x509_crt cacert; mbedtls_x509_crt clicert; @@ -1010,6 +1020,7 @@ int mbedtls_x509_self_test( int verbose ) if( verbose != 0 ) mbedtls_printf( " X.509 certificate load: " ); + mbedtls_x509_crt_init( &cacert ); mbedtls_x509_crt_init( &clicert ); ret = mbedtls_x509_crt_parse( &clicert, (const unsigned char *) mbedtls_test_cli_crt, @@ -1019,11 +1030,9 @@ int mbedtls_x509_self_test( int verbose ) if( verbose != 0 ) mbedtls_printf( "failed\n" ); - return( ret ); + goto cleanup; } - mbedtls_x509_crt_init( &cacert ); - ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_ca_crt, mbedtls_test_ca_crt_len ); if( ret != 0 ) @@ -1031,7 +1040,7 @@ int mbedtls_x509_self_test( int verbose ) if( verbose != 0 ) mbedtls_printf( "failed\n" ); - return( ret ); + goto cleanup; } if( verbose != 0 ) @@ -1043,20 +1052,19 @@ int mbedtls_x509_self_test( int verbose ) if( verbose != 0 ) mbedtls_printf( "failed\n" ); - return( ret ); + goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n\n"); +cleanup: mbedtls_x509_crt_free( &cacert ); mbedtls_x509_crt_free( &clicert ); - - return( 0 ); #else ((void) verbose); - return( 0 ); #endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA1_C */ + return( ret ); } #endif /* MBEDTLS_SELF_TEST */ diff --git a/thirdparty/mbedtls/library/x509_crl.c b/thirdparty/mbedtls/library/x509_crl.c index 8450f87e03..00f8545d7c 100644 --- a/thirdparty/mbedtls/library/x509_crl.c +++ b/thirdparty/mbedtls/library/x509_crl.c @@ -103,17 +103,17 @@ static int x509_get_crl_ext( unsigned char **p, { int ret; + if( *p == end ) + return( 0 ); + /* * crlExtensions [0] EXPLICIT Extensions OPTIONAL * -- if present, version MUST be v2 */ if( ( ret = mbedtls_x509_get_ext( p, end, ext, 0 ) ) != 0 ) - { - if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) - return( 0 ); - return( ret ); - } + + end = ext->p + ext->len; while( *p < end ) { diff --git a/thirdparty/mbedtls/library/x509_crt.c b/thirdparty/mbedtls/library/x509_crt.c index 35a134950e..97e1d72e3c 100644 --- a/thirdparty/mbedtls/library/x509_crt.c +++ b/thirdparty/mbedtls/library/x509_crt.c @@ -65,19 +65,6 @@ #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #include <windows.h> -#if defined(_MSC_VER) && _MSC_VER <= 1600 -/* Visual Studio 2010 and earlier issue a warning when both <stdint.h> and - * <intsafe.h> are included, as they redefine a number of <TYPE>_MAX constants. - * These constants are guaranteed to be the same, though, so we suppress the - * warning when including intsafe.h. - */ -#pragma warning( push ) -#pragma warning( disable : 4005 ) -#endif -#include <intsafe.h> -#if defined(_MSC_VER) && _MSC_VER <= 1600 -#pragma warning( pop ) -#endif #else #include <time.h> #endif @@ -381,7 +368,7 @@ static void x509_crt_verify_chain_reset( for( i = 0; i < MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE; i++ ) { ver_chain->items[i].crt = NULL; - ver_chain->items[i].flags = -1; + ver_chain->items[i].flags = (uint32_t) -1; } ver_chain->len = 0; @@ -406,7 +393,7 @@ static int x509_get_version( unsigned char **p, return( 0 ); } - return( ret ); + return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } end = *p + len; @@ -473,7 +460,7 @@ static int x509_get_uid( unsigned char **p, if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); - return( ret ); + return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } uid->p = *p; @@ -712,14 +699,13 @@ static int x509_get_crt_ext( unsigned char **p, size_t len; unsigned char *end_ext_data, *end_ext_octet; - if( ( ret = mbedtls_x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 ) - { - if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) - return( 0 ); + if( *p == end ) + return( 0 ); + if( ( ret = mbedtls_x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 ) return( ret ); - } + end = crt->v3_ext.p + crt->v3_ext.len; while( *p < end ) { /* @@ -1291,7 +1277,6 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) char filename[MAX_PATH]; char *p; size_t len = strlen( path ); - int lengthAsInt = 0; WIN32_FIND_DATAW file_data; HANDLE hFind; @@ -1306,18 +1291,7 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) p = filename + len; filename[len++] = '*'; - if ( FAILED ( SizeTToInt( len, &lengthAsInt ) ) ) - return( MBEDTLS_ERR_X509_FILE_IO_ERROR ); - - /* - * Note this function uses the code page CP_ACP, and assumes the incoming - * string is encoded in ANSI, before translating it into Unicode. If the - * incoming string were changed to be UTF-8, then the length check needs to - * change to check the number of characters, not the number of bytes, in the - * incoming string are less than MAX_PATH to avoid a buffer overrun with - * MultiByteToWideChar(). - */ - w_ret = MultiByteToWideChar( CP_ACP, 0, filename, lengthAsInt, szDir, + w_ret = MultiByteToWideChar( CP_ACP, 0, filename, (int)len, szDir, MAX_PATH - 3 ); if( w_ret == 0 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); @@ -1334,11 +1308,8 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) if( file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) continue; - if ( FAILED( SizeTToInt( wcslen( file_data.cFileName ), &lengthAsInt ) ) ) - return( MBEDTLS_ERR_X509_FILE_IO_ERROR ); - w_ret = WideCharToMultiByte( CP_ACP, 0, file_data.cFileName, - lengthAsInt, + lstrlenW( file_data.cFileName ), p, (int) len - 1, NULL, NULL ); if( w_ret == 0 ) @@ -1467,7 +1438,7 @@ static int x509_info_subject_alt_name( char **buf, size_t *size, } #define CERT_TYPE(type,name) \ - if( ns_cert_type & type ) \ + if( ns_cert_type & (type) ) \ PRINT_ITEM( name ); static int x509_info_cert_type( char **buf, size_t *size, @@ -1494,7 +1465,7 @@ static int x509_info_cert_type( char **buf, size_t *size, } #define KEY_USAGE(code,name) \ - if( key_usage & code ) \ + if( key_usage & (code) ) \ PRINT_ITEM( name ); static int x509_info_key_usage( char **buf, size_t *size, diff --git a/thirdparty/mbedtls/library/x509_csr.c b/thirdparty/mbedtls/library/x509_csr.c index f84425728a..c8c08c87b2 100644 --- a/thirdparty/mbedtls/library/x509_csr.c +++ b/thirdparty/mbedtls/library/x509_csr.c @@ -279,15 +279,24 @@ int mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, siz { mbedtls_pem_init( &pem ); ret = mbedtls_pem_read_buffer( &pem, - "-----BEGIN CERTIFICATE REQUEST-----", - "-----END CERTIFICATE REQUEST-----", - buf, NULL, 0, &use_len ); + "-----BEGIN CERTIFICATE REQUEST-----", + "-----END CERTIFICATE REQUEST-----", + buf, NULL, 0, &use_len ); + if( ret == MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) + { + ret = mbedtls_pem_read_buffer( &pem, + "-----BEGIN NEW CERTIFICATE REQUEST-----", + "-----END NEW CERTIFICATE REQUEST-----", + buf, NULL, 0, &use_len ); + } if( ret == 0 ) + { /* * Was PEM encoded, parse the result */ ret = mbedtls_x509_csr_parse_der( csr, pem.buf, pem.buflen ); + } mbedtls_pem_free( &pem ); if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) diff --git a/thirdparty/mbedtls/library/x509write_crt.c b/thirdparty/mbedtls/library/x509write_crt.c index b1ef216c95..10497e752b 100644 --- a/thirdparty/mbedtls/library/x509write_crt.c +++ b/thirdparty/mbedtls/library/x509write_crt.c @@ -218,26 +218,51 @@ int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert * } #endif /* MBEDTLS_SHA1_C */ +static size_t crt_get_unused_bits_for_named_bitstring( unsigned char bitstring, + size_t bit_offset ) +{ + size_t unused_bits; + + /* Count the unused bits removing trailing 0s */ + for( unused_bits = bit_offset; unused_bits < 8; unused_bits++ ) + if( ( ( bitstring >> unused_bits ) & 0x1 ) != 0 ) + break; + + return( unused_bits ); +} + int mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx, unsigned int key_usage ) { unsigned char buf[4], ku; unsigned char *c; int ret; - - /* We currently only support 7 bits, from 0x80 to 0x02 */ - if( ( key_usage & ~0xfe ) != 0 ) + size_t unused_bits; + const unsigned int allowed_bits = MBEDTLS_X509_KU_DIGITAL_SIGNATURE | + MBEDTLS_X509_KU_NON_REPUDIATION | + MBEDTLS_X509_KU_KEY_ENCIPHERMENT | + MBEDTLS_X509_KU_DATA_ENCIPHERMENT | + MBEDTLS_X509_KU_KEY_AGREEMENT | + MBEDTLS_X509_KU_KEY_CERT_SIGN | + MBEDTLS_X509_KU_CRL_SIGN; + + /* Check that nothing other than the allowed flags is set */ + if( ( key_usage & ~allowed_bits ) != 0 ) return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE ); c = buf + 4; - ku = (unsigned char) key_usage; + ku = (unsigned char)key_usage; + unused_bits = crt_get_unused_bits_for_named_bitstring( ku, 1 ); + ret = mbedtls_asn1_write_bitstring( &c, buf, &ku, 8 - unused_bits ); - if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ku, 7 ) ) != 4 ) + if( ret < 0 ) return( ret ); + else if( ret < 3 || ret > 4 ) + return( MBEDTLS_ERR_X509_INVALID_FORMAT ); ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_KEY_USAGE, MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ), - 1, buf, 4 ); + 1, c, (size_t)ret ); if( ret != 0 ) return( ret ); @@ -249,16 +274,22 @@ int mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx, { unsigned char buf[4]; unsigned char *c; + size_t unused_bits; int ret; c = buf + 4; - if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 ) + unused_bits = crt_get_unused_bits_for_named_bitstring( ns_cert_type, 0 ); + ret = mbedtls_asn1_write_bitstring( &c, + buf, + &ns_cert_type, + 8 - unused_bits ); + if( ret < 3 || ret > 4 ) return( ret ); ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE, MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ), - 0, buf, 4 ); + 0, c, (size_t)ret ); if( ret != 0 ) return( ret ); diff --git a/thirdparty/mbedtls/library/x509write_csr.c b/thirdparty/mbedtls/library/x509write_csr.c index 66cee56014..d70ba0ed92 100644 --- a/thirdparty/mbedtls/library/x509write_csr.c +++ b/thirdparty/mbedtls/library/x509write_csr.c @@ -81,20 +81,39 @@ int mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx, 0, val, val_len ); } +static size_t csr_get_unused_bits_for_named_bitstring( unsigned char bitstring, + size_t bit_offset ) +{ + size_t unused_bits; + + /* Count the unused bits removing trailing 0s */ + for( unused_bits = bit_offset; unused_bits < 8; unused_bits++ ) + if( ( ( bitstring >> unused_bits ) & 0x1 ) != 0 ) + break; + + return( unused_bits ); +} + int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ) { unsigned char buf[4]; unsigned char *c; + size_t unused_bits; int ret; c = buf + 4; - if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &key_usage, 7 ) ) != 4 ) + unused_bits = csr_get_unused_bits_for_named_bitstring( key_usage, 0 ); + ret = mbedtls_asn1_write_bitstring( &c, buf, &key_usage, 8 - unused_bits ); + + if( ret < 0 ) return( ret ); + else if( ret < 3 || ret > 4 ) + return( MBEDTLS_ERR_X509_INVALID_FORMAT ); ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_KEY_USAGE, MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ), - buf, 4 ); + c, (size_t)ret ); if( ret != 0 ) return( ret ); @@ -106,16 +125,25 @@ int mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx, { unsigned char buf[4]; unsigned char *c; + size_t unused_bits; int ret; c = buf + 4; - if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 ) + unused_bits = csr_get_unused_bits_for_named_bitstring( ns_cert_type, 0 ); + ret = mbedtls_asn1_write_bitstring( &c, + buf, + &ns_cert_type, + 8 - unused_bits ); + + if( ret < 0 ) + return( ret ); + else if( ret < 3 || ret > 4 ) return( ret ); ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE, MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ), - buf, 4 ); + c, (size_t)ret ); if( ret != 0 ) return( ret ); diff --git a/thirdparty/misc/stb_vorbis.c b/thirdparty/misc/stb_vorbis.c index 88276026ef..71af404dae 100644 --- a/thirdparty/misc/stb_vorbis.c +++ b/thirdparty/misc/stb_vorbis.c @@ -1,4 +1,4 @@ -// Ogg Vorbis audio decoder - v1.15 - public domain +// Ogg Vorbis audio decoder - v1.16 - public domain // http://nothings.org/stb_vorbis/ // // Original version written by Sean Barrett in 2007. @@ -33,6 +33,7 @@ // Timur Gagiev // // Partial history: +// 1.16 - 2019-03-04 - fix warnings // 1.15 - 2019-02-07 - explicit failure if Ogg Skeleton data is found // 1.14 - 2018-02-11 - delete bogus dealloca usage // 1.13 - 2018-01-29 - fix truncation of last frame (hopefully) @@ -4990,7 +4991,13 @@ stb_vorbis * stb_vorbis_open_file(FILE *file, int close_on_free, int *error, con stb_vorbis * stb_vorbis_open_filename(const char *filename, int *error, const stb_vorbis_alloc *alloc) { - FILE *f = fopen(filename, "rb"); + FILE *f; +#if defined(_WIN32) && defined(__STDC_WANT_SECURE_LIB__) + if (0 != fopen_s(&f, filename, "rb")) + f = NULL; +#else + f = fopen(filename, "rb"); +#endif if (f) return stb_vorbis_open_file(f, TRUE, error, alloc); if (error) *error = VORBIS_file_open_failure; diff --git a/thirdparty/pcre2/AUTHORS b/thirdparty/pcre2/AUTHORS index d5592bbc5b..8d4e15a247 100644 --- a/thirdparty/pcre2/AUTHORS +++ b/thirdparty/pcre2/AUTHORS @@ -8,7 +8,7 @@ Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2018 University of Cambridge +Copyright (c) 1997-2019 University of Cambridge All rights reserved @@ -19,7 +19,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2010-2018 Zoltan Herczeg +Copyright(c) 2010-2019 Zoltan Herczeg All rights reserved. @@ -30,7 +30,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2009-2018 Zoltan Herczeg +Copyright(c) 2009-2019 Zoltan Herczeg All rights reserved. #### diff --git a/thirdparty/pcre2/LICENCE b/thirdparty/pcre2/LICENCE index b0f8804fff..142b3b3f9a 100644 --- a/thirdparty/pcre2/LICENCE +++ b/thirdparty/pcre2/LICENCE @@ -26,7 +26,7 @@ Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2018 University of Cambridge +Copyright (c) 1997-2019 University of Cambridge All rights reserved. @@ -37,7 +37,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2010-2018 Zoltan Herczeg +Copyright(c) 2010-2019 Zoltan Herczeg All rights reserved. @@ -48,7 +48,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2009-2018 Zoltan Herczeg +Copyright(c) 2009-2019 Zoltan Herczeg All rights reserved. diff --git a/thirdparty/pcre2/src/config.h b/thirdparty/pcre2/src/config.h index 89a52ef848..25d45eeb38 100644 --- a/thirdparty/pcre2/src/config.h +++ b/thirdparty/pcre2/src/config.h @@ -35,6 +35,10 @@ sure both macros are undefined; an emulation function will then be used. */ */ /* #undef BSR_ANYCRLF */ +/* Define to any value to disable the use of the z and t modifiers in + formatting settings such as %zu or %td (this is rarely needed). */ +/* #undef DISABLE_PERCENT_ZT */ + /* If you are compiling for a system that uses EBCDIC instead of ASCII character codes, define this macro to any value. When EBCDIC is set, PCRE2 assumes that all input strings are in EBCDIC. If you do not define this @@ -214,7 +218,7 @@ sure both macros are undefined; an emulation function will then be used. */ #define PACKAGE_NAME "PCRE2" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "PCRE2 10.32" +#define PACKAGE_STRING "PCRE2 10.33" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre2" @@ -223,7 +227,7 @@ sure both macros are undefined; an emulation function will then be used. */ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "10.32" +#define PACKAGE_VERSION "10.33" /* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested parentheses (of any kind) in a pattern. This limits the amount of system @@ -299,6 +303,11 @@ sure both macros are undefined; an emulation function will then be used. */ /* Define to any value to enable callout script support in pcre2grep. */ /* #undef SUPPORT_PCRE2GREP_CALLOUT */ +/* Define to any value to enable fork support in pcre2grep callout scripts. + This will have no effect unless SUPPORT_PCRE2GREP_CALLOUT is also defined. + */ +/* #undef SUPPORT_PCRE2GREP_CALLOUT_FORK */ + /* Define to any value to enable JIT support in pcre2grep. Note that this will have no effect unless SUPPORT_JIT is also defined. */ /* #undef SUPPORT_PCRE2GREP_JIT */ @@ -343,7 +352,7 @@ sure both macros are undefined; an emulation function will then be used. */ #endif /* Version number of package */ -#define VERSION "10.32" +#define VERSION "10.33" /* Define to 1 if on MINIX. */ /* #undef _MINIX */ diff --git a/thirdparty/pcre2/src/pcre2.h b/thirdparty/pcre2/src/pcre2.h index 3d2feb7a6b..102b5d91f1 100644 --- a/thirdparty/pcre2/src/pcre2.h +++ b/thirdparty/pcre2/src/pcre2.h @@ -42,15 +42,9 @@ POSSIBILITY OF SUCH DAMAGE. /* The current PCRE version information. */ #define PCRE2_MAJOR 10 -#define PCRE2_MINOR 32 +#define PCRE2_MINOR 33 #define PCRE2_PRERELEASE -#define PCRE2_DATE 2018-09-10 - -/* For the benefit of systems without stdint.h, an alternative is to use -inttypes.h. The existence of these headers is checked by configure or CMake. */ - -#define PCRE2_HAVE_STDINT_H 1 -#define PCRE2_HAVE_INTTYPES_H 1 +#define PCRE2_DATE 2019-04-16 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE2, the appropriate @@ -87,18 +81,15 @@ set, we ensure here that it has no effect. */ #define PCRE2_CALL_CONVENTION #endif -/* Have to include limits.h, stdlib.h and stdint.h (or inttypes.h) to ensure -that size_t and uint8_t, UCHAR_MAX, etc are defined. If the system has neither -header, the relevant values must be provided by some other means. */ +/* Have to include limits.h, stdlib.h, and inttypes.h to ensure that size_t and +uint8_t, UCHAR_MAX, etc are defined. Some systems that do have inttypes.h do +not have stdint.h, which is why we use inttypes.h, which according to the C +standard is a superset of stdint.h. If none of these headers are available, +the relevant values must be provided by some other means. */ #include <limits.h> #include <stdlib.h> - -#if PCRE2_HAVE_STDINT_H -#include <stdint.h> -#elif PCRE2_HAVE_INTTYPES_H #include <inttypes.h> -#endif /* Allow for C++ users compiling this directly. */ @@ -158,43 +149,37 @@ D is inspected during pcre2_dfa_match() execution #define PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL 0x00000002u /* C */ #define PCRE2_EXTRA_MATCH_WORD 0x00000004u /* C */ #define PCRE2_EXTRA_MATCH_LINE 0x00000008u /* C */ +#define PCRE2_EXTRA_ESCAPED_CR_IS_LF 0x00000010u /* C */ +#define PCRE2_EXTRA_ALT_BSUX 0x00000020u /* C */ /* These are for pcre2_jit_compile(). */ #define PCRE2_JIT_COMPLETE 0x00000001u /* For full matching */ #define PCRE2_JIT_PARTIAL_SOFT 0x00000002u #define PCRE2_JIT_PARTIAL_HARD 0x00000004u - -/* These are for pcre2_match(), pcre2_dfa_match(), and pcre2_jit_match(). Note -that PCRE2_ANCHORED and PCRE2_NO_UTF_CHECK can also be passed to these -functions (though pcre2_jit_match() ignores the latter since it bypasses all -sanity checks). */ - -#define PCRE2_NOTBOL 0x00000001u -#define PCRE2_NOTEOL 0x00000002u -#define PCRE2_NOTEMPTY 0x00000004u /* ) These two must be kept */ -#define PCRE2_NOTEMPTY_ATSTART 0x00000008u /* ) adjacent to each other. */ -#define PCRE2_PARTIAL_SOFT 0x00000010u -#define PCRE2_PARTIAL_HARD 0x00000020u - -/* These are additional options for pcre2_dfa_match(). */ - -#define PCRE2_DFA_RESTART 0x00000040u -#define PCRE2_DFA_SHORTEST 0x00000080u - -/* These are additional options for pcre2_substitute(), which passes any others -through to pcre2_match(). */ - -#define PCRE2_SUBSTITUTE_GLOBAL 0x00000100u -#define PCRE2_SUBSTITUTE_EXTENDED 0x00000200u -#define PCRE2_SUBSTITUTE_UNSET_EMPTY 0x00000400u -#define PCRE2_SUBSTITUTE_UNKNOWN_UNSET 0x00000800u -#define PCRE2_SUBSTITUTE_OVERFLOW_LENGTH 0x00001000u - -/* A further option for pcre2_match(), not allowed for pcre2_dfa_match(), -ignored for pcre2_jit_match(). */ - -#define PCRE2_NO_JIT 0x00002000u +#define PCRE2_JIT_INVALID_UTF 0x00000100u + +/* These are for pcre2_match(), pcre2_dfa_match(), pcre2_jit_match(), and +pcre2_substitute(). Some are allowed only for one of the functions, and in +these cases it is noted below. Note that PCRE2_ANCHORED, PCRE2_ENDANCHORED and +PCRE2_NO_UTF_CHECK can also be passed to these functions (though +pcre2_jit_match() ignores the latter since it bypasses all sanity checks). */ + +#define PCRE2_NOTBOL 0x00000001u +#define PCRE2_NOTEOL 0x00000002u +#define PCRE2_NOTEMPTY 0x00000004u /* ) These two must be kept */ +#define PCRE2_NOTEMPTY_ATSTART 0x00000008u /* ) adjacent to each other. */ +#define PCRE2_PARTIAL_SOFT 0x00000010u +#define PCRE2_PARTIAL_HARD 0x00000020u +#define PCRE2_DFA_RESTART 0x00000040u /* pcre2_dfa_match() only */ +#define PCRE2_DFA_SHORTEST 0x00000080u /* pcre2_dfa_match() only */ +#define PCRE2_SUBSTITUTE_GLOBAL 0x00000100u /* pcre2_substitute() only */ +#define PCRE2_SUBSTITUTE_EXTENDED 0x00000200u /* pcre2_substitute() only */ +#define PCRE2_SUBSTITUTE_UNSET_EMPTY 0x00000400u /* pcre2_substitute() only */ +#define PCRE2_SUBSTITUTE_UNKNOWN_UNSET 0x00000800u /* pcre2_substitute() only */ +#define PCRE2_SUBSTITUTE_OVERFLOW_LENGTH 0x00001000u /* pcre2_substitute() only */ +#define PCRE2_NO_JIT 0x00002000u /* Not for pcre2_dfa_match() */ +#define PCRE2_COPY_MATCHED_SUBJECT 0x00004000u /* Options for pcre2_pattern_convert(). */ @@ -318,6 +303,8 @@ pcre2_pattern_convert(). */ #define PCRE2_ERROR_BAD_LITERAL_OPTIONS 192 #define PCRE2_ERROR_SUPPORTED_ONLY_IN_UNICODE 193 #define PCRE2_ERROR_INVALID_HYPHEN_IN_OPTIONS 194 +#define PCRE2_ERROR_ALPHA_ASSERTION_UNKNOWN 195 +#define PCRE2_ERROR_SCRIPT_RUN_NOT_AVAILABLE 196 /* "Expected" matching error codes: no match and partial match. */ @@ -504,10 +491,10 @@ typedef struct pcre2_real_jit_stack pcre2_jit_stack; \ typedef pcre2_jit_stack *(*pcre2_jit_callback)(void *); -/* The structure for passing out data via the pcre_callout_function. We use a -structure so that new fields can be added on the end in future versions, -without changing the API of the function, thereby allowing old clients to work -without modification. Define the generic version in a macro; the width-specific +/* The structures for passing out data via callout functions. We use structures +so that new fields can be added on the end in future versions, without changing +the API of the function, thereby allowing old clients to work without +modification. Define the generic versions in a macro; the width-specific versions are generated from this macro below. */ /* Flags for the callout_flags field. These are cleared after a callout. */ @@ -549,7 +536,19 @@ typedef struct pcre2_callout_enumerate_block { \ PCRE2_SIZE callout_string_length; /* Length of string compiled into pattern */ \ PCRE2_SPTR callout_string; /* String compiled into pattern */ \ /* ------------------------------------------------------------------ */ \ -} pcre2_callout_enumerate_block; +} pcre2_callout_enumerate_block; \ +\ +typedef struct pcre2_substitute_callout_block { \ + uint32_t version; /* Identifies version of block */ \ + /* ------------------------ Version 0 ------------------------------- */ \ + PCRE2_SPTR input; /* Pointer to input subject string */ \ + PCRE2_SPTR output; /* Pointer to output buffer */ \ + PCRE2_SIZE output_offsets[2]; /* Changed portion of the output */ \ + PCRE2_SIZE *ovector; /* Pointer to current ovector */ \ + uint32_t oveccount; /* Count of pairs set in ovector */ \ + uint32_t subscount; /* Substitution number */ \ + /* ------------------------------------------------------------------ */ \ +} pcre2_substitute_callout_block; /* List the generic forms of all other functions in macros, which will be @@ -605,6 +604,9 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ pcre2_set_callout(pcre2_match_context *, \ int (*)(pcre2_callout_block *, void *), void *); \ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ + pcre2_set_substitute_callout(pcre2_match_context *, \ + int (*)(pcre2_substitute_callout_block *, void *), void *); \ +PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ pcre2_set_depth_limit(pcre2_match_context *, uint32_t); \ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ pcre2_set_heap_limit(pcre2_match_context *, uint32_t); \ @@ -807,6 +809,7 @@ pcre2_compile are called by application code. */ #define pcre2_callout_block PCRE2_SUFFIX(pcre2_callout_block_) #define pcre2_callout_enumerate_block PCRE2_SUFFIX(pcre2_callout_enumerate_block_) +#define pcre2_substitute_callout_block PCRE2_SUFFIX(pcre2_substitute_callout_block_) #define pcre2_general_context PCRE2_SUFFIX(pcre2_general_context_) #define pcre2_compile_context PCRE2_SUFFIX(pcre2_compile_context_) #define pcre2_convert_context PCRE2_SUFFIX(pcre2_convert_context_) @@ -872,6 +875,7 @@ pcre2_compile are called by application code. */ #define pcre2_set_newline PCRE2_SUFFIX(pcre2_set_newline_) #define pcre2_set_parens_nest_limit PCRE2_SUFFIX(pcre2_set_parens_nest_limit_) #define pcre2_set_offset_limit PCRE2_SUFFIX(pcre2_set_offset_limit_) +#define pcre2_set_substitute_callout PCRE2_SUFFIX(pcre2_set_substitute_callout_) #define pcre2_substitute PCRE2_SUFFIX(pcre2_substitute_) #define pcre2_substring_copy_byname PCRE2_SUFFIX(pcre2_substring_copy_byname_) #define pcre2_substring_copy_bynumber PCRE2_SUFFIX(pcre2_substring_copy_bynumber_) diff --git a/thirdparty/pcre2/src/pcre2_auto_possess.c b/thirdparty/pcre2/src/pcre2_auto_possess.c index 2ce152e952..6d7b7c4a4d 100644 --- a/thirdparty/pcre2/src/pcre2_auto_possess.c +++ b/thirdparty/pcre2/src/pcre2_auto_possess.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -605,6 +605,15 @@ for(;;) if (cb->had_recurse) return FALSE; break; + /* A script run might have to backtrack if the iterated item can match + characters from more than one script. So give up unless repeating an + explicit character. */ + + case OP_SCRIPT_RUN: + if (base_list[0] != OP_CHAR && base_list[0] != OP_CHARI) + return FALSE; + break; + /* Atomic sub-patterns and assertions can always auto-possessify their last iterator. However, if the group was entered as a result of checking a previous iterator, this is not possible. */ @@ -614,7 +623,6 @@ for(;;) case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: - return !entered_a_group; } @@ -1043,7 +1051,7 @@ for(;;) if (chr > 255) break; class_bitset = (uint8_t *) ((list_ptr == list ? code : base_end) - list_ptr[2]); - if ((class_bitset[chr >> 3] & (1 << (chr & 7))) != 0) return FALSE; + if ((class_bitset[chr >> 3] & (1u << (chr & 7))) != 0) return FALSE; break; #ifdef SUPPORT_WIDE_CHARS diff --git a/thirdparty/pcre2/src/pcre2_chartables.c b/thirdparty/pcre2/src/pcre2_chartables.c index 4046500c00..0e07edb494 100644 --- a/thirdparty/pcre2/src/pcre2_chartables.c +++ b/thirdparty/pcre2/src/pcre2_chartables.c @@ -157,8 +157,8 @@ graph print, punct, and cntrl. Other classes are built from combinations. */ /* This table identifies various classes of character by individual bits: 0x01 white space character 0x02 letter - 0x04 decimal digit - 0x08 hexadecimal digit + 0x04 lower case letter + 0x08 decimal digit 0x10 alphanumeric or '_' */ @@ -168,16 +168,16 @@ graph print, punct, and cntrl. Other classes are built from combinations. */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - ' */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ( - / */ - 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ - 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */ - 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, /* 0 - 7 */ + 0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */ + 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* @ - G */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ 0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x10, /* X - _ */ - 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ - 0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00, /* x -127 */ + 0x00,0x16,0x16,0x16,0x16,0x16,0x16,0x16, /* ` - g */ + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, /* h - o */ + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, /* p - w */ + 0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00, /* x -127 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ diff --git a/thirdparty/pcre2/src/pcre2_compile.c b/thirdparty/pcre2/src/pcre2_compile.c index 6bb1de3610..068735ae8e 100644 --- a/thirdparty/pcre2/src/pcre2_compile.c +++ b/thirdparty/pcre2/src/pcre2_compile.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -240,49 +240,57 @@ code (meta_extra_lengths, just below) must be updated to remain in step. */ #define META_RANGE_LITERAL 0x801f0000u /* range defined literally */ #define META_RECURSE 0x80200000u /* Recursion */ #define META_RECURSE_BYNAME 0x80210000u /* (?&name) */ +#define META_SCRIPT_RUN 0x80220000u /* (*script_run:...) */ /* These must be kept together to make it easy to check that an assertion is present where expected in a conditional group. */ -#define META_LOOKAHEAD 0x80220000u /* (?= */ -#define META_LOOKAHEADNOT 0x80230000u /* (?! */ -#define META_LOOKBEHIND 0x80240000u /* (?<= */ -#define META_LOOKBEHINDNOT 0x80250000u /* (?<! */ +#define META_LOOKAHEAD 0x80230000u /* (?= */ +#define META_LOOKAHEADNOT 0x80240000u /* (?! */ +#define META_LOOKBEHIND 0x80250000u /* (?<= */ +#define META_LOOKBEHINDNOT 0x80260000u /* (?<! */ /* These must be kept in this order, with consecutive values, and the _ARG versions of COMMIT, PRUNE, SKIP, and THEN immediately after their non-argument versions. */ -#define META_MARK 0x80260000u /* (*MARK) */ -#define META_ACCEPT 0x80270000u /* (*ACCEPT) */ -#define META_FAIL 0x80280000u /* (*FAIL) */ -#define META_COMMIT 0x80290000u /* These */ -#define META_COMMIT_ARG 0x802a0000u /* pairs */ -#define META_PRUNE 0x802b0000u /* must */ -#define META_PRUNE_ARG 0x802c0000u /* be */ -#define META_SKIP 0x802d0000u /* kept */ -#define META_SKIP_ARG 0x802e0000u /* in */ -#define META_THEN 0x802f0000u /* this */ -#define META_THEN_ARG 0x80300000u /* order */ +#define META_MARK 0x80270000u /* (*MARK) */ +#define META_ACCEPT 0x80280000u /* (*ACCEPT) */ +#define META_FAIL 0x80290000u /* (*FAIL) */ +#define META_COMMIT 0x802a0000u /* These */ +#define META_COMMIT_ARG 0x802b0000u /* pairs */ +#define META_PRUNE 0x802c0000u /* must */ +#define META_PRUNE_ARG 0x802d0000u /* be */ +#define META_SKIP 0x802e0000u /* kept */ +#define META_SKIP_ARG 0x802f0000u /* in */ +#define META_THEN 0x80300000u /* this */ +#define META_THEN_ARG 0x80310000u /* order */ /* These must be kept in groups of adjacent 3 values, and all together. */ -#define META_ASTERISK 0x80310000u /* * */ -#define META_ASTERISK_PLUS 0x80320000u /* *+ */ -#define META_ASTERISK_QUERY 0x80330000u /* *? */ -#define META_PLUS 0x80340000u /* + */ -#define META_PLUS_PLUS 0x80350000u /* ++ */ -#define META_PLUS_QUERY 0x80360000u /* +? */ -#define META_QUERY 0x80370000u /* ? */ -#define META_QUERY_PLUS 0x80380000u /* ?+ */ -#define META_QUERY_QUERY 0x80390000u /* ?? */ -#define META_MINMAX 0x803a0000u /* {n,m} repeat */ -#define META_MINMAX_PLUS 0x803b0000u /* {n,m}+ repeat */ -#define META_MINMAX_QUERY 0x803c0000u /* {n,m}? repeat */ +#define META_ASTERISK 0x80320000u /* * */ +#define META_ASTERISK_PLUS 0x80330000u /* *+ */ +#define META_ASTERISK_QUERY 0x80340000u /* *? */ +#define META_PLUS 0x80350000u /* + */ +#define META_PLUS_PLUS 0x80360000u /* ++ */ +#define META_PLUS_QUERY 0x80370000u /* +? */ +#define META_QUERY 0x80380000u /* ? */ +#define META_QUERY_PLUS 0x80390000u /* ?+ */ +#define META_QUERY_QUERY 0x803a0000u /* ?? */ +#define META_MINMAX 0x803b0000u /* {n,m} repeat */ +#define META_MINMAX_PLUS 0x803c0000u /* {n,m}+ repeat */ +#define META_MINMAX_QUERY 0x803d0000u /* {n,m}? repeat */ #define META_FIRST_QUANTIFIER META_ASTERISK #define META_LAST_QUANTIFIER META_MINMAX_QUERY +/* This is a special "meta code" that is used only to distinguish (*asr: from +(*sr: in the table of aphabetic assertions. It is never stored in the parsed +pattern because (*asr: is turned into (*sr:(*atomic: at that stage. There is +therefore no need for it to have a length entry, so use a high value. */ + +#define META_ATOMIC_SCRIPT_RUN 0x8fff0000u + /* Table of extra lengths for each of the meta codes. Must be kept in step with the definitions above. For some items these values are a basic length to which a variable amount has to be added. */ @@ -322,6 +330,7 @@ static unsigned char meta_extra_lengths[] = { 0, /* META_RANGE_LITERAL */ SIZEOFFSET, /* META_RECURSE */ 1+SIZEOFFSET, /* META_RECURSE_BYNAME */ + 0, /* META_SCRIPT_RUN */ 0, /* META_LOOKAHEAD */ 0, /* META_LOOKAHEADNOT */ SIZEOFFSET, /* META_LOOKBEHIND */ @@ -359,17 +368,17 @@ enum { PSKIP_ALT, PSKIP_CLASS, PSKIP_KET }; experimenting to figure out how to stop gcc 5.3.0 from warning with -Wconversion. This version gets a warning: - #define SETBIT(a,b) a[(b)/8] |= (uint8_t)(1 << ((b)&7)) + #define SETBIT(a,b) a[(b)/8] |= (uint8_t)(1u << ((b)&7)) Let's hope the apparently less efficient version isn't actually so bad if the compiler is clever with identical subexpressions. */ -#define SETBIT(a,b) a[(b)/8] = (uint8_t)(a[(b)/8] | (1 << ((b)&7))) +#define SETBIT(a,b) a[(b)/8] = (uint8_t)(a[(b)/8] | (1u << ((b)&7))) /* Private flags added to firstcu and reqcu. */ -#define REQ_CASELESS (1 << 0) /* Indicates caselessness */ -#define REQ_VARY (1 << 1) /* reqcu followed non-literal item */ +#define REQ_CASELESS (1u << 0) /* Indicates caselessness */ +#define REQ_VARY (1u << 1) /* reqcu followed non-literal item */ /* Negative values for the firstcu and reqcu flags */ #define REQ_UNSET (-2) /* Not yet found anything */ #define REQ_NONE (-1) /* Found not fixed char */ @@ -615,6 +624,46 @@ static const uint32_t verbops[] = { OP_MARK, OP_ACCEPT, OP_FAIL, OP_COMMIT, OP_COMMIT_ARG, OP_PRUNE, OP_PRUNE_ARG, OP_SKIP, OP_SKIP_ARG, OP_THEN, OP_THEN_ARG }; +/* Table of "alpha assertions" like (*pla:...), similar to the (*VERB) table. */ + +typedef struct alasitem { + unsigned int len; /* Length of name */ + uint32_t meta; /* Base META_ code */ +} alasitem; + +static const char alasnames[] = + STRING_pla0 + STRING_plb0 + STRING_nla0 + STRING_nlb0 + STRING_positive_lookahead0 + STRING_positive_lookbehind0 + STRING_negative_lookahead0 + STRING_negative_lookbehind0 + STRING_atomic0 + STRING_sr0 + STRING_asr0 + STRING_script_run0 + STRING_atomic_script_run; + +static const alasitem alasmeta[] = { + { 3, META_LOOKAHEAD }, + { 3, META_LOOKBEHIND }, + { 3, META_LOOKAHEADNOT }, + { 3, META_LOOKBEHINDNOT }, + { 18, META_LOOKAHEAD }, + { 19, META_LOOKBEHIND }, + { 18, META_LOOKAHEADNOT }, + { 19, META_LOOKBEHINDNOT }, + { 6, META_ATOMIC }, + { 2, META_SCRIPT_RUN }, /* sr = script run */ + { 3, META_ATOMIC_SCRIPT_RUN }, /* asr = atomic script run */ + { 10, META_SCRIPT_RUN }, /* script run */ + { 17, META_ATOMIC_SCRIPT_RUN } /* atomic script run */ +}; + +static const int alascount = sizeof(alasmeta)/sizeof(alasitem); + /* Offsets from OP_STAR for case-independent and negative repeat opcodes. */ static uint32_t chartypeoffset[] = { @@ -714,7 +763,8 @@ are allowed. */ #define PUBLIC_COMPILE_EXTRA_OPTIONS \ (PUBLIC_LITERAL_COMPILE_EXTRA_OPTIONS| \ - PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES|PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) + PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES|PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL| \ + PCRE2_EXTRA_ESCAPED_CR_IS_LF|PCRE2_EXTRA_ALT_BSUX) /* Compile time error code numbers. They are given names so that they can more easily be tracked. When a new number is added, the tables called eint1 and @@ -731,7 +781,7 @@ enum { ERR0 = COMPILE_ERROR_BASE, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERR88, ERR89, ERR90, - ERR91, ERR92, ERR93, ERR94 }; + ERR91, ERR92, ERR93, ERR94, ERR95, ERR96 }; /* This is a table of start-of-pattern options such as (*UTF) and settings such as (*LIMIT_MATCH=nnnn) and (*CRLF). For completeness and backward @@ -962,6 +1012,7 @@ for (;;) case META_NOCAPTURE: fprintf(stderr, "META (?:"); break; case META_LOOKAHEAD: fprintf(stderr, "META (?="); break; case META_LOOKAHEADNOT: fprintf(stderr, "META (?!"); break; + case META_SCRIPT_RUN: fprintf(stderr, "META (*sr:"); break; case META_KET: fprintf(stderr, "META )"); break; case META_ALT: fprintf(stderr, "META | %d", meta_arg); break; @@ -1191,7 +1242,7 @@ if (code != NULL) if ((code->flags & PCRE2_DEREF_TABLES) != 0) { /* Decoded tables belong to the codes after deserialization, and they must - be freed when there are no more reference to them. The *ref_count should + be freed when there are no more references to them. The *ref_count should always be > 0. */ ref_count = (PCRE2_SIZE *)(code->tables + tables_length); @@ -1398,7 +1449,7 @@ Arguments: errorcodeptr points to the errorcode variable (containing zero) options the current options bits isclass TRUE if inside a character class - cb compile data block + cb compile data block or NULL when called from pcre2_substitute() Returns: zero => a data character positive => a special escape sequence @@ -1408,7 +1459,8 @@ Returns: zero => a data character int PRIV(check_escape)(PCRE2_SPTR *ptrptr, PCRE2_SPTR ptrend, uint32_t *chptr, - int *errorcodeptr, uint32_t options, BOOL isclass, compile_block *cb) + int *errorcodeptr, uint32_t options, uint32_t extra_options, BOOL isclass, + compile_block *cb) { BOOL utf = (options & PCRE2_UTF) != 0; PCRE2_SPTR ptr = *ptrptr; @@ -1429,14 +1481,25 @@ GETCHARINCTEST(c, ptr); /* Get character value, increment pointer */ /* Non-alphanumerics are literals, so we just leave the value in c. An initial value test saves a memory lookup for code points outside the alphanumeric -range. Otherwise, do a table lookup. A non-zero result is something that can be -returned immediately. Otherwise further processing is required. */ +range. */ if (c < ESCAPES_FIRST || c > ESCAPES_LAST) {} /* Definitely literal */ +/* Otherwise, do a table lookup. Non-zero values need little processing here. A +positive value is a literal value for something like \n. A negative value is +the negation of one of the ESC_ macros that is passed back for handling by the +calling function. Some extra checking is needed for \N because only \N{U+dddd} +is supported. If the value is zero, further processing is handled below. */ + else if ((i = escapes[c - ESCAPES_FIRST]) != 0) { - if (i > 0) c = (uint32_t)i; else /* Positive is a data character */ + if (i > 0) + { + c = (uint32_t)i; + if (c == CHAR_CR && (extra_options & PCRE2_EXTRA_ESCAPED_CR_IS_LF) != 0) + c = CHAR_LF; + } + else /* Negative table entry */ { escape = -i; /* Else return a special escape */ if (cb != NULL && (escape == ESC_P || escape == ESC_p || escape == ESC_X)) @@ -1486,23 +1549,29 @@ else if ((i = escapes[c - ESCAPES_FIRST]) != 0) } } -/* Escapes that need further processing, including those that are unknown. -When called from pcre2_substitute(), only \c, \o, and \x are recognized (and \u -when BSUX is set). */ +/* Escapes that need further processing, including those that are unknown, have +a zero entry in the lookup table. When called from pcre2_substitute(), only \c, +\o, and \x are recognized (\u and \U can never appear as they are used for case +forcing). */ else { + int s; PCRE2_SPTR oldptr; BOOL overflow; - int s; + BOOL alt_bsux = + ((options & PCRE2_ALT_BSUX) | (extra_options & PCRE2_EXTRA_ALT_BSUX)) != 0; /* Filter calls from pcre2_substitute(). */ - if (cb == NULL && c != CHAR_c && c != CHAR_o && c != CHAR_x && - (c != CHAR_u || (options & PCRE2_ALT_BSUX) != 0)) + if (cb == NULL) { - *errorcodeptr = ERR3; - return 0; + if (c != CHAR_c && c != CHAR_o && c != CHAR_x) + { + *errorcodeptr = ERR3; + return 0; + } + alt_bsux = FALSE; /* Do not modify \x handling */ } switch (c) @@ -1516,40 +1585,75 @@ else *errorcodeptr = ERR37; break; - /* \u is unrecognized when PCRE2_ALT_BSUX is not set. When it is treated - specially, \u must be followed by four hex digits. Otherwise it is a - lowercase u letter. */ + /* \u is unrecognized when neither PCRE2_ALT_BSUX nor PCRE2_EXTRA_ALT_BSUX + is set. Otherwise, \u must be followed by exactly four hex digits or, if + PCRE2_EXTRA_ALT_BSUX is set, by any number of hex digits in braces. + Otherwise it is a lowercase u letter. This gives some compatibility with + ECMAScript (aka JavaScript). */ case CHAR_u: - if ((options & PCRE2_ALT_BSUX) == 0) *errorcodeptr = ERR37; else + if (!alt_bsux) *errorcodeptr = ERR37; else { uint32_t xc; - if (ptrend - ptr < 4) break; /* Less than 4 chars */ - if ((cc = XDIGIT(ptr[0])) == 0xff) break; /* Not a hex digit */ - if ((xc = XDIGIT(ptr[1])) == 0xff) break; /* Not a hex digit */ - cc = (cc << 4) | xc; - if ((xc = XDIGIT(ptr[2])) == 0xff) break; /* Not a hex digit */ - cc = (cc << 4) | xc; - if ((xc = XDIGIT(ptr[3])) == 0xff) break; /* Not a hex digit */ - c = (cc << 4) | xc; - ptr += 4; + + if (ptr >= ptrend) break; + if (*ptr == CHAR_LEFT_CURLY_BRACKET && + (extra_options & PCRE2_EXTRA_ALT_BSUX) != 0) + { + PCRE2_SPTR hptr = ptr + 1; + cc = 0; + + while (hptr < ptrend && (xc = XDIGIT(*hptr)) != 0xff) + { + if ((cc & 0xf0000000) != 0) /* Test for 32-bit overflow */ + { + *errorcodeptr = ERR77; + ptr = hptr; /* Show where */ + break; /* *hptr != } will cause another break below */ + } + cc = (cc << 4) | xc; + hptr++; + } + + if (hptr == ptr + 1 || /* No hex digits */ + hptr >= ptrend || /* Hit end of input */ + *hptr != CHAR_RIGHT_CURLY_BRACKET) /* No } terminator */ + break; /* Hex escape not recognized */ + + c = cc; /* Accept the code point */ + ptr = hptr + 1; + } + + else /* Must be exactly 4 hex digits */ + { + if (ptrend - ptr < 4) break; /* Less than 4 chars */ + if ((cc = XDIGIT(ptr[0])) == 0xff) break; /* Not a hex digit */ + if ((xc = XDIGIT(ptr[1])) == 0xff) break; /* Not a hex digit */ + cc = (cc << 4) | xc; + if ((xc = XDIGIT(ptr[2])) == 0xff) break; /* Not a hex digit */ + cc = (cc << 4) | xc; + if ((xc = XDIGIT(ptr[3])) == 0xff) break; /* Not a hex digit */ + c = (cc << 4) | xc; + ptr += 4; + } + if (utf) { if (c > 0x10ffffU) *errorcodeptr = ERR77; else if (c >= 0xd800 && c <= 0xdfff && - (cb->cx->extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0) - *errorcodeptr = ERR73; + (extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0) + *errorcodeptr = ERR73; } else if (c > MAX_NON_UTF_CHAR) *errorcodeptr = ERR77; } break; - /* \U is unrecognized unless PCRE2_ALT_BSUX is set, in which case it is an - upper case letter. */ + /* \U is unrecognized unless PCRE2_ALT_BSUX or PCRE2_EXTRA_ALT_BSUX is set, + in which case it is an upper case letter. */ case CHAR_U: - if ((options & PCRE2_ALT_BSUX) == 0) *errorcodeptr = ERR37; + if (!alt_bsux) *errorcodeptr = ERR37; break; /* In a character class, \g is just a literal "g". Outside a character @@ -1728,8 +1832,8 @@ else } else if (ptr < ptrend && *ptr++ == CHAR_RIGHT_CURLY_BRACKET) { - if (utf && c >= 0xd800 && c <= 0xdfff && (cb == NULL || - (cb->cx->extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0)) + if (utf && c >= 0xd800 && c <= 0xdfff && + (extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0) { ptr--; *errorcodeptr = ERR73; @@ -1743,11 +1847,11 @@ else } break; - /* \x is complicated. When PCRE2_ALT_BSUX is set, \x must be followed by - two hexadecimal digits. Otherwise it is a lowercase x letter. */ + /* When PCRE2_ALT_BSUX or PCRE2_EXTRA_ALT_BSUX is set, \x must be followed + by two hexadecimal digits. Otherwise it is a lowercase x letter. */ case CHAR_x: - if ((options & PCRE2_ALT_BSUX) != 0) + if (alt_bsux) { uint32_t xc; if (ptrend - ptr < 2) break; /* Less than 2 characters */ @@ -1755,9 +1859,9 @@ else if ((xc = XDIGIT(ptr[1])) == 0xff) break; /* Not a hex digit */ c = (cc << 4) | xc; ptr += 2; - } /* End PCRE2_ALT_BSUX handling */ + } - /* Handle \x in Perl's style. \x{ddd} is a character number which can be + /* Handle \x in Perl's style. \x{ddd} is a character code which can be greater than 0xff in UTF-8 or non-8bit mode, but only if the ddd are hex digits. If not, { used to be treated as a data character. However, Perl seems to read hex digits up to the first non-such, and ignore the rest, so @@ -1801,8 +1905,8 @@ else } else if (ptr < ptrend && *ptr++ == CHAR_RIGHT_CURLY_BRACKET) { - if (utf && c >= 0xd800 && c <= 0xdfff && (cb == NULL || - (cb->cx->extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0)) + if (utf && c >= 0xd800 && c <= 0xdfff && + (extra_options & PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES) == 0) { ptr--; *errorcodeptr = ERR73; @@ -1874,9 +1978,9 @@ else c ^= 0x40; /* Handle \c in an EBCDIC environment. The special case \c? is converted to - 255 (0xff) or 95 (0x5f) if other character suggest we are using th POSIX-BC - encoding. (This is the way Perl indicates that it handles \c?.) The other - valid sequences correspond to a list of specific characters. */ + 255 (0xff) or 95 (0x5f) if other characters suggest we are using the + POSIX-BC encoding. (This is the way Perl indicates that it handles \c?.) + The other valid sequences correspond to a list of specific characters. */ #else if (c == CHAR_QUESTION_MARK) @@ -2120,9 +2224,10 @@ return -1; *************************************************/ /* This function is called from parse_regex() below whenever it needs to read -the name of a subpattern or a (*VERB). The initial pointer must be to the -character before the name. If that character is '*' we are reading a verb name. -The pointer is updated to point after the name, for a VERB, or after tha name's +the name of a subpattern or a (*VERB) or an (*alpha_assertion). The initial +pointer must be to the character before the name. If that character is '*' we +are reading a verb or alpha assertion name. The pointer is updated to point +after the name, for a VERB or alpha assertion name, or after tha name's terminator for a subpattern name. Returning both the offset and the name pointer is redundant information, but some callers use one and some the other, so it is simplest just to return both. @@ -2130,6 +2235,7 @@ so it is simplest just to return both. Arguments: ptrptr points to the character pointer variable ptrend points to the end of the input string + utf true if the input is UTF-encoded terminator the terminator of a subpattern name must be this offsetptr where to put the offset from the start of the pattern nameptr where to put a pointer to the name in the input @@ -2142,48 +2248,88 @@ Returns: TRUE if a name was read */ static BOOL -read_name(PCRE2_SPTR *ptrptr, PCRE2_SPTR ptrend, uint32_t terminator, +read_name(PCRE2_SPTR *ptrptr, PCRE2_SPTR ptrend, BOOL utf, uint32_t terminator, PCRE2_SIZE *offsetptr, PCRE2_SPTR *nameptr, uint32_t *namelenptr, int *errorcodeptr, compile_block *cb) { PCRE2_SPTR ptr = *ptrptr; -BOOL is_verb = (*ptr == CHAR_ASTERISK); -uint32_t namelen = 0; -uint32_t ctype = is_verb? ctype_letter : ctype_word; +BOOL is_group = (*ptr != CHAR_ASTERISK); -if (++ptr >= ptrend) +if (++ptr >= ptrend) /* No characters in name */ { - *errorcodeptr = is_verb? ERR60: /* Verb not recognized or malformed */ - ERR62; /* Subpattern name expected */ + *errorcodeptr = is_group? ERR62: /* Subpattern name expected */ + ERR60; /* Verb not recognized or malformed */ goto FAILED; } *nameptr = ptr; *offsetptr = (PCRE2_SIZE)(ptr - cb->start_pattern); -if (IS_DIGIT(*ptr)) +/* In UTF mode, a group name may contain letters and decimal digits as defined +by Unicode properties, and underscores, but must not start with a digit. */ + +#ifdef SUPPORT_UNICODE +if (utf && is_group) { - *errorcodeptr = ERR44; /* Group name must not start with digit */ - goto FAILED; + uint32_t c, type; + + GETCHAR(c, ptr); + type = UCD_CHARTYPE(c); + + if (type == ucp_Nd) + { + *errorcodeptr = ERR44; + goto FAILED; + } + + for(;;) + { + if (type != ucp_Nd && PRIV(ucp_gentype)[type] != ucp_L && + c != CHAR_UNDERSCORE) break; + ptr++; + FORWARDCHARTEST(ptr, ptrend); + if (ptr >= ptrend) break; + GETCHAR(c, ptr); + type = UCD_CHARTYPE(c); + } } +else +#else +(void)utf; /* Avoid compiler warning */ +#endif /* SUPPORT_UNICODE */ + +/* Handle non-group names and group names in non-UTF modes. A group name must +not start with a digit. If either of the others start with a digit it just +won't be recognized. */ -while (ptr < ptrend && MAX_255(*ptr) && (cb->ctypes[*ptr] & ctype) != 0) { - ptr++; - namelen++; - if (namelen > MAX_NAME_SIZE) + if (is_group && IS_DIGIT(*ptr)) { - *errorcodeptr = ERR48; + *errorcodeptr = ERR44; goto FAILED; } + + while (ptr < ptrend && MAX_255(*ptr) && (cb->ctypes[*ptr] & ctype_word) != 0) + { + ptr++; + } } +/* Check name length */ + +if (ptr > *nameptr + MAX_NAME_SIZE) + { + *errorcodeptr = ERR48; + goto FAILED; + } +*namelenptr = ptr - *nameptr; + /* Subpattern names must not be empty, and their terminator is checked here. -(What follows a verb name is checked separately.) */ +(What follows a verb or alpha assertion name is checked separately.) */ -if (!is_verb) +if (is_group) { - if (namelen == 0) + if (ptr == *nameptr) { *errorcodeptr = ERR62; /* Subpattern name expected */ goto FAILED; @@ -2196,7 +2342,6 @@ if (!is_verb) ptr++; } -*namelenptr = namelen; *ptrptr = ptr; return TRUE; @@ -2289,6 +2434,7 @@ typedef struct nest_save { #define NSF_RESET 0x0001u #define NSF_CONDASSERT 0x0002u +#define NSF_ATOMICSR 0x0004u /* Options that are changeable within the pattern must be tracked during parsing. Some (e.g. PCRE2_EXTENDED) are implemented entirely during parsing, @@ -2333,6 +2479,7 @@ uint32_t *parsed_pattern = cb->parsed_pattern; uint32_t *parsed_pattern_end = cb->parsed_pattern_end; uint32_t meta_quantifier = 0; uint32_t add_after_mark = 0; +uint32_t extra_options = cb->cx->extra_options; uint16_t nest_depth = 0; int after_manual_callout = 0; int expect_cond_assert = 0; @@ -2356,12 +2503,12 @@ nest_save *top_nest, *end_nests; /* Insert leading items for word and line matching (features provided for the benefit of pcre2grep). */ -if ((cb->cx->extra_options & PCRE2_EXTRA_MATCH_LINE) != 0) +if ((extra_options & PCRE2_EXTRA_MATCH_LINE) != 0) { *parsed_pattern++ = META_CIRCUMFLEX; *parsed_pattern++ = META_NOCAPTURE; } -else if ((cb->cx->extra_options & PCRE2_EXTRA_MATCH_WORD) != 0) +else if ((extra_options & PCRE2_EXTRA_MATCH_WORD) != 0) { *parsed_pattern++ = META_ESCAPE + ESC_b; *parsed_pattern++ = META_NOCAPTURE; @@ -2526,7 +2673,7 @@ while (ptr < ptrend) if ((options & PCRE2_ALT_VERBNAMES) != 0) { escape = PRIV(check_escape)(&ptr, ptrend, &c, &errorcode, options, - FALSE, cb); + cb->cx->extra_options, FALSE, cb); if (errorcode != 0) goto FAILED; } else escape = 0; /* Treat all as literal */ @@ -2639,23 +2786,30 @@ while (ptr < ptrend) if (expect_cond_assert > 0) { BOOL ok = c == CHAR_LEFT_PARENTHESIS && ptrend - ptr >= 3 && - ptr[0] == CHAR_QUESTION_MARK; - if (ok) switch(ptr[1]) + (ptr[0] == CHAR_QUESTION_MARK || ptr[0] == CHAR_ASTERISK); + if (ok) { - case CHAR_C: - ok = expect_cond_assert == 2; - break; + if (ptr[0] == CHAR_ASTERISK) /* New alpha assertion format, possibly */ + { + ok = MAX_255(ptr[1]) && (cb->ctypes[ptr[1]] & ctype_lcletter) != 0; + } + else switch(ptr[1]) /* Traditional symbolic format */ + { + case CHAR_C: + ok = expect_cond_assert == 2; + break; - case CHAR_EQUALS_SIGN: - case CHAR_EXCLAMATION_MARK: - break; + case CHAR_EQUALS_SIGN: + case CHAR_EXCLAMATION_MARK: + break; - case CHAR_LESS_THAN_SIGN: - ok = ptr[2] == CHAR_EQUALS_SIGN || ptr[2] == CHAR_EXCLAMATION_MARK; - break; + case CHAR_LESS_THAN_SIGN: + ok = ptr[2] == CHAR_EQUALS_SIGN || ptr[2] == CHAR_EXCLAMATION_MARK; + break; - default: - ok = FALSE; + default: + ok = FALSE; + } } if (!ok) @@ -2709,11 +2863,11 @@ while (ptr < ptrend) case CHAR_BACKSLASH: tempptr = ptr; escape = PRIV(check_escape)(&ptr, ptrend, &c, &errorcode, options, - FALSE, cb); + cb->cx->extra_options, FALSE, cb); if (errorcode != 0) { ESCAPE_FAILED: - if ((cb->cx->extra_options & PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) == 0) + if ((extra_options & PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) == 0) goto FAILED; ptr = tempptr; if (ptr >= ptrend) c = CHAR_BACKSLASH; else @@ -2907,7 +3061,7 @@ while (ptr < ptrend) /* Not a numerical recursion */ - if (!read_name(&ptr, ptrend, terminator, &offset, &name, &namelen, + if (!read_name(&ptr, ptrend, utf, terminator, &offset, &name, &namelen, &errorcode, cb)) goto ESCAPE_FAILED; /* \k and \g when used with braces are back references, whereas \g used @@ -3270,12 +3424,12 @@ while (ptr < ptrend) else { tempptr = ptr; - escape = PRIV(check_escape)(&ptr, ptrend, &c, &errorcode, - options, TRUE, cb); + escape = PRIV(check_escape)(&ptr, ptrend, &c, &errorcode, options, + cb->cx->extra_options, TRUE, cb); + if (errorcode != 0) { - CLASS_ESCAPE_FAILED: - if ((cb->cx->extra_options & PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) == 0) + if ((extra_options & PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL) == 0) goto FAILED; ptr = tempptr; if (ptr >= ptrend) c = CHAR_BACKSLASH; else @@ -3285,30 +3439,32 @@ while (ptr < ptrend) escape = 0; /* Treat as literal character */ } - if (escape == 0) /* Escaped character code point is in c */ + switch(escape) { + case 0: /* Escaped character code point is in c */ char_is_literal = FALSE; goto CLASS_LITERAL; - } - - /* These three escapes do not alter the class range state. */ - if (escape == ESC_b) - { - c = CHAR_BS; /* \b is backspace in a class */ + case ESC_b: + c = CHAR_BS; /* \b is backspace in a class */ char_is_literal = FALSE; goto CLASS_LITERAL; - } - else if (escape == ESC_Q) - { + case ESC_Q: inescq = TRUE; /* Enter literal mode */ goto CLASS_CONTINUE; - } - else if (escape == ESC_E) /* Ignore orphan \E */ + case ESC_E: /* Ignore orphan \E */ goto CLASS_CONTINUE; + case ESC_B: /* Always an error in a class */ + case ESC_R: + case ESC_X: + errorcode = ERR7; + ptr--; + goto FAILED; + } + /* The second part of a range can be a single-character escape sequence (detected above), but not any of the other escapes. Perl treats a hyphen as a literal in such circumstances. However, in Perl's @@ -3318,7 +3474,7 @@ while (ptr < ptrend) if (class_range_state == RANGE_STARTED) { errorcode = ERR50; - goto CLASS_ESCAPE_FAILED; + goto FAILED; /* Not CLASS_ESCAPE_FAILED; always an error */ } /* Of the remaining escapes, only those that define characters are @@ -3328,8 +3484,8 @@ while (ptr < ptrend) switch(escape) { case ESC_N: - errorcode = ERR71; /* Not supported in a class */ - goto CLASS_ESCAPE_FAILED; + errorcode = ERR71; + goto FAILED; case ESC_H: case ESC_h: @@ -3392,14 +3548,14 @@ while (ptr < ptrend) } #else errorcode = ERR45; - goto CLASS_ESCAPE_FAILED; + goto FAILED; #endif break; /* End \P and \p */ default: /* All others are not allowed in a class */ errorcode = ERR7; ptr--; - goto CLASS_ESCAPE_FAILED; + goto FAILED; } /* Perl gives a warning unless a following hyphen is the last character @@ -3440,7 +3596,8 @@ while (ptr < ptrend) case CHAR_LEFT_PARENTHESIS: if (ptr >= ptrend) goto UNCLOSED_PARENTHESIS; - /* If ( is not followed by ? it is either a capture or a special verb. */ + /* If ( is not followed by ? it is either a capture or a special verb or an + alpha assertion. */ if (*ptr != CHAR_QUESTION_MARK) { @@ -3460,17 +3617,122 @@ while (ptr < ptrend) else *parsed_pattern++ = META_NOCAPTURE; } + /* Do nothing for (* followed by end of pattern or ) so it gives a "bad + quantifier" error rather than "(*MARK) must have an argument". */ - /* ---- Handle (*VERB) and (*VERB:NAME) ---- */ + else if (ptrend - ptr <= 1 || (c = ptr[1]) == CHAR_RIGHT_PARENTHESIS) + break; + + /* Handle "alpha assertions" such as (*pla:...). Most of these are + synonyms for the historical symbolic assertions, but the script run ones + are new. They are distinguished by starting with a lower case letter. + Checking both ends of the alphabet makes this work in all character + codes. */ + + else if (CHMAX_255(c) && (cb->ctypes[c] & ctype_lcletter) != 0) + { + uint32_t meta; + + vn = alasnames; + if (!read_name(&ptr, ptrend, utf, 0, &offset, &name, &namelen, + &errorcode, cb)) goto FAILED; + if (ptr >= ptrend || *ptr != CHAR_COLON) + { + errorcode = ERR95; /* Malformed */ + goto FAILED; + } + + /* Scan the table of alpha assertion names */ + + for (i = 0; i < alascount; i++) + { + if (namelen == alasmeta[i].len && + PRIV(strncmp_c8)(name, vn, namelen) == 0) + break; + vn += alasmeta[i].len + 1; + } + + if (i >= alascount) + { + errorcode = ERR95; /* Alpha assertion not recognized */ + goto FAILED; + } + + /* Check for expecting an assertion condition. If so, only lookaround + assertions are valid. */ + + meta = alasmeta[i].meta; + if (prev_expect_cond_assert > 0 && + (meta < META_LOOKAHEAD || meta > META_LOOKBEHINDNOT)) + { + errorcode = ERR28; /* Assertion expected */ + goto FAILED; + } + + /* The lookaround alphabetic synonyms can be almost entirely handled by + jumping to the code that handles the traditional symbolic forms. */ + + switch(meta) + { + default: + errorcode = ERR89; /* Unknown code; should never occur because */ + goto FAILED; /* the meta values come from a table above. */ + + case META_ATOMIC: + goto ATOMIC_GROUP; + + case META_LOOKAHEAD: + goto POSITIVE_LOOK_AHEAD; + + case META_LOOKAHEADNOT: + goto NEGATIVE_LOOK_AHEAD; + + case META_LOOKBEHIND: + case META_LOOKBEHINDNOT: + *parsed_pattern++ = meta; + ptr--; + goto POST_LOOKBEHIND; - /* Do nothing for (*) so it gives a "bad quantifier" error rather than - "(*MARK) must have an argument". */ + /* The script run facilities are handled here. Unicode support is + required (give an error if not, as this is a security issue). Always + record a META_SCRIPT_RUN item. Then, for the atomic version, insert + META_ATOMIC and remember that we need two META_KETs at the end. */ - else if (ptrend - ptr > 1 && ptr[1] != CHAR_RIGHT_PARENTHESIS) + case META_SCRIPT_RUN: + case META_ATOMIC_SCRIPT_RUN: +#ifdef SUPPORT_UNICODE + *parsed_pattern++ = META_SCRIPT_RUN; + nest_depth++; + ptr++; + if (meta == META_ATOMIC_SCRIPT_RUN) + { + *parsed_pattern++ = META_ATOMIC; + if (top_nest == NULL) top_nest = (nest_save *)(cb->start_workspace); + else if (++top_nest >= end_nests) + { + errorcode = ERR84; + goto FAILED; + } + top_nest->nest_depth = nest_depth; + top_nest->flags = NSF_ATOMICSR; + top_nest->options = options & PARSE_TRACKED_OPTIONS; + } + break; +#else /* SUPPORT_UNICODE */ + errorcode = ERR96; + goto FAILED; +#endif + } + } + + + /* ---- Handle (*VERB) and (*VERB:NAME) ---- */ + + else { vn = verbnames; - if (!read_name(&ptr, ptrend, 0, &offset, &name, &namelen, &errorcode, - cb)) goto FAILED; + if (!read_name(&ptr, ptrend, utf, 0, &offset, &name, &namelen, + &errorcode, cb)) goto FAILED; if (ptr >= ptrend || (*ptr != CHAR_COLON && *ptr != CHAR_RIGHT_PARENTHESIS)) { @@ -3725,7 +3987,7 @@ while (ptr < ptrend) errorcode = ERR41; goto FAILED; } - if (!read_name(&ptr, ptrend, CHAR_RIGHT_PARENTHESIS, &offset, &name, + if (!read_name(&ptr, ptrend, utf, CHAR_RIGHT_PARENTHESIS, &offset, &name, &namelen, &errorcode, cb)) goto FAILED; *parsed_pattern++ = META_BACKREF_BYNAME; *parsed_pattern++ = namelen; @@ -3785,7 +4047,7 @@ while (ptr < ptrend) case CHAR_AMPERSAND: RECURSE_BY_NAME: - if (!read_name(&ptr, ptrend, CHAR_RIGHT_PARENTHESIS, &offset, &name, + if (!read_name(&ptr, ptrend, utf, CHAR_RIGHT_PARENTHESIS, &offset, &name, &namelen, &errorcode, cb)) goto FAILED; *parsed_pattern++ = META_RECURSE_BYNAME; *parsed_pattern++ = namelen; @@ -3933,14 +4195,15 @@ while (ptr < ptrend) if (++ptr >= ptrend) goto UNCLOSED_PARENTHESIS; nest_depth++; - /* If the next character is ? there must be an assertion next (optionally - preceded by a callout). We do not check this here, but instead we set - expect_cond_assert to 2. If this is still greater than zero (callouts - decrement it) when the next assertion is read, it will be marked as a - condition that must not be repeated. A value greater than zero also - causes checking that an assertion (possibly with callout) follows. */ + /* If the next character is ? or * there must be an assertion next + (optionally preceded by a callout). We do not check this here, but + instead we set expect_cond_assert to 2. If this is still greater than + zero (callouts decrement it) when the next assertion is read, it will be + marked as a condition that must not be repeated. A value greater than + zero also causes checking that an assertion (possibly with callout) + follows. */ - if (*ptr == CHAR_QUESTION_MARK) + if (*ptr == CHAR_QUESTION_MARK || *ptr == CHAR_ASTERISK) { *parsed_pattern++ = META_COND_ASSERT; ptr--; /* Pull pointer back to the opening parenthesis. */ @@ -4032,7 +4295,7 @@ while (ptr < ptrend) terminator = CHAR_RIGHT_PARENTHESIS; ptr--; /* Point to char before name */ } - if (!read_name(&ptr, ptrend, terminator, &offset, &name, &namelen, + if (!read_name(&ptr, ptrend, utf, terminator, &offset, &name, &namelen, &errorcode, cb)) goto FAILED; /* Handle (?(R&name) */ @@ -4086,6 +4349,7 @@ while (ptr < ptrend) /* ---- Atomic group ---- */ case CHAR_GREATER_THAN_SIGN: + ATOMIC_GROUP: /* Come from (*atomic: */ *parsed_pattern++ = META_ATOMIC; nest_depth++; ptr++; @@ -4095,11 +4359,13 @@ while (ptr < ptrend) /* ---- Lookahead assertions ---- */ case CHAR_EQUALS_SIGN: + POSITIVE_LOOK_AHEAD: /* Come from (*pla: */ *parsed_pattern++ = META_LOOKAHEAD; ptr++; goto POST_ASSERTION; case CHAR_EXCLAMATION_MARK: + NEGATIVE_LOOK_AHEAD: /* Come from (*nla: */ *parsed_pattern++ = META_LOOKAHEADNOT; ptr++; goto POST_ASSERTION; @@ -4119,6 +4385,8 @@ while (ptr < ptrend) } *parsed_pattern++ = (ptr[1] == CHAR_EQUALS_SIGN)? META_LOOKBEHIND : META_LOOKBEHINDNOT; + + POST_LOOKBEHIND: /* Come from (*plb: and (*nlb: */ *has_lookbehind = TRUE; offset = (PCRE2_SIZE)(ptr - cb->start_pattern - 2); PUTOFFSET(offset, parsed_pattern); @@ -4161,7 +4429,7 @@ while (ptr < ptrend) terminator = CHAR_APOSTROPHE; /* Terminator */ DEFINE_NAME: - if (!read_name(&ptr, ptrend, terminator, &offset, &name, &namelen, + if (!read_name(&ptr, ptrend, utf, terminator, &offset, &name, &namelen, &errorcode, cb)) goto FAILED; /* We have a name for this capturing group. It is also assigned a number, @@ -4280,6 +4548,14 @@ while (ptr < ptrend) cb->bracount = top_nest->max_group; if ((top_nest->flags & NSF_CONDASSERT) != 0) okquantifier = FALSE; + + if ((top_nest->flags & NSF_ATOMICSR) != 0) + { + *parsed_pattern++ = META_KET; + } + + + if (top_nest == (nest_save *)(cb->start_workspace)) top_nest = NULL; else top_nest--; } @@ -4311,12 +4587,12 @@ parsed_pattern = manage_callouts(ptr, &previous_callout, auto_callout, /* Insert trailing items for word and line matching (features provided for the benefit of pcre2grep). */ -if ((cb->cx->extra_options & PCRE2_EXTRA_MATCH_LINE) != 0) +if ((extra_options & PCRE2_EXTRA_MATCH_LINE) != 0) { *parsed_pattern++ = META_KET; *parsed_pattern++ = META_DOLLAR; } -else if ((cb->cx->extra_options & PCRE2_EXTRA_MATCH_WORD) != 0) +else if ((extra_options & PCRE2_EXTRA_MATCH_WORD) != 0) { *parsed_pattern++ = META_KET; *parsed_pattern++ = META_ESCAPE + ESC_b; @@ -4421,6 +4697,14 @@ for (;;) code += GET(code, 1) + 1 + LINK_SIZE; break; + case OP_MARK: + case OP_COMMIT_ARG: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + code += code[1] + PRIV(OP_lengths)[*code]; + break; + default: return code; } @@ -5516,10 +5800,10 @@ for (;; pptr++) if (range_is_literal && (cb->ctypes[c] & ctype_letter) != 0 && (cb->ctypes[d] & ctype_letter) != 0 && - (d <= CHAR_z) == (d <= CHAR_z)) + (c <= CHAR_z) == (d <= CHAR_z)) { uint32_t uc = (d <= CHAR_z)? 0 : 64; - uint32_t C = d - uc; + uint32_t C = c - uc; uint32_t D = d - uc; if (C <= CHAR_i) @@ -5664,7 +5948,10 @@ for (;; pptr++) (void)memmove(code + (32 / sizeof(PCRE2_UCHAR)), code, CU2BYTES(class_uchardata - code)); if (negate_class && !xclass_has_prop) - for (i = 0; i < 32; i++) classbits[i] = ~classbits[i]; + { + /* Using 255 ^ instead of ~ avoids clang sanitize warning. */ + for (i = 0; i < 32; i++) classbits[i] = 255 ^ classbits[i]; + } memcpy(code, classbits, 32); code = class_uchardata + (32 / sizeof(PCRE2_UCHAR)); } @@ -5687,7 +5974,10 @@ for (;; pptr++) if (lengthptr == NULL) /* Save time in the pre-compile phase */ { if (negate_class) - for (i = 0; i < 32; i++) classbits[i] = ~classbits[i]; + { + /* Using 255 ^ instead of ~ avoids clang sanitize warning. */ + for (i = 0; i < 32; i++) classbits[i] = 255 ^ classbits[i]; + } memcpy(code, classbits, 32); } code += 32 / sizeof(PCRE2_UCHAR); @@ -5901,7 +6191,7 @@ for (;; pptr++) } goto GROUP_PROCESS_NOTE_EMPTY; - /* The DEFINE condition is always false. It's internal groups may never + /* The DEFINE condition is always false. Its internal groups may never be called, so matched_char must remain false, hence the jump to GROUP_PROCESS rather than GROUP_PROCESS_NOTE_EMPTY. */ @@ -5997,6 +6287,10 @@ for (;; pptr++) bravalue = OP_ONCE; goto GROUP_PROCESS_NOTE_EMPTY; + case META_SCRIPT_RUN: + bravalue = OP_SCRIPT_RUN; + goto GROUP_PROCESS_NOTE_EMPTY; + case META_NOCAPTURE: bravalue = OP_BRA; /* Fall through */ @@ -6237,8 +6531,8 @@ for (;; pptr++) groupnumber = ng->number; /* For a recursion, that's all that is needed. We can now go to - the code above that handles numerical recursion, applying it to - the first group with the given name. */ + the code that handles numerical recursion, applying it to the first + group with the given name. */ if (meta == META_RECURSE_BYNAME) { @@ -6632,6 +6926,7 @@ for (;; pptr++) case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: + case OP_SCRIPT_RUN: case OP_BRA: case OP_CBRA: case OP_COND: @@ -6844,16 +7139,16 @@ for (;; pptr++) } /* If the maximum is unlimited, set a repeater in the final copy. For - ONCE brackets, that's all we need to do. However, possessively repeated - ONCE brackets can be converted into non-capturing brackets, as the - behaviour of (?:xx)++ is the same as (?>xx)++ and this saves having to - deal with possessive ONCEs specially. + SCRIPT_RUN and ONCE brackets, that's all we need to do. However, + possessively repeated ONCE brackets can be converted into non-capturing + brackets, as the behaviour of (?:xx)++ is the same as (?>xx)++ and this + saves having to deal with possessive ONCEs specially. Otherwise, when we are doing the actual compile phase, check to see whether this group is one that could match an empty string. If so, convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so that runtime checking can be done. [This check is also applied to ONCE - groups at runtime, but in a different way.] + and SCRIPT_RUN groups at runtime, but in a different way.] Then, if the quantifier was possessive and the bracket is not a conditional, we convert the BRA code to the POS form, and the KET code to @@ -6877,13 +7172,14 @@ for (;; pptr++) if (*bracode == OP_ONCE && possessive_quantifier) *bracode = OP_BRA; - /* For non-possessive ONCE brackets, all we need to do is to - set the KET. */ + /* For non-possessive ONCE and for SCRIPT_RUN brackets, all we need + to do is to set the KET. */ - if (*bracode == OP_ONCE) *ketcode = OP_KETRMAX + repeat_type; + if (*bracode == OP_ONCE || *bracode == OP_SCRIPT_RUN) + *ketcode = OP_KETRMAX + repeat_type; - /* Handle non-ONCE brackets and possessive ONCEs (which have been - converted to non-capturing above). */ + /* Handle non-SCRIPT_RUN and non-ONCE brackets and possessive ONCEs + (which have been converted to non-capturing above). */ else { @@ -7267,9 +7563,8 @@ for (;; pptr++) scanned and these numbers are replaced by offsets within the pattern. It is done like this to avoid problems with forward references and adjusting offsets when groups are duplicated and moved (as discovered in previous - implementations). Note that a recursion does not have a set first character - (relevant if it is repeated, because it will then be wrapped with ONCE - brackets). */ + implementations). Note that a recursion does not have a set first + character. */ case META_RECURSE: GETPLUSOFFSET(offset, pptr); @@ -7286,6 +7581,8 @@ for (;; pptr++) groupsetfirstcu = FALSE; cb->had_recurse = TRUE; if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE; + zerofirstcu = firstcu; + zerofirstcuflags = firstcuflags; break; @@ -7340,9 +7637,20 @@ for (;; pptr++) { uint32_t ptype = *(++pptr) >> 16; uint32_t pdata = *pptr & 0xffff; - *code++ = (meta_arg == ESC_p)? OP_PROP : OP_NOTPROP; - *code++ = ptype; - *code++ = pdata; + + /* The special case of \p{Any} is compiled to OP_ALLANY so as to benefit + from the auto-anchoring code. */ + + if (meta_arg == ESC_p && ptype == PT_ANY) + { + *code++ = OP_ALLANY; + } + else + { + *code++ = (meta_arg == ESC_p)? OP_PROP : OP_NOTPROP; + *code++ = ptype; + *code++ = pdata; + } break; /* End META_ESCAPE */ } #endif @@ -8240,6 +8548,7 @@ do { case OP_SCBRAPOS: case OP_ASSERT: case OP_ONCE: + case OP_SCRIPT_RUN: d = find_firstassertedcu(scode, &dflags, inassert + ((op==OP_ASSERT)?1:0)); if (dflags < 0) return 0; @@ -8439,6 +8748,7 @@ for (;; pptr++) case META_LOOKBEHIND: case META_LOOKBEHINDNOT: case META_NOCAPTURE: + case META_SCRIPT_RUN: nestlevel++; break; @@ -8851,6 +9161,7 @@ for (;; pptr++) case META_ATOMIC: case META_NOCAPTURE: + case META_SCRIPT_RUN: pptr++; CHECK_GROUP: grouplength = get_grouplength(&pptr, TRUE, errcodeptr, lcptr, group, @@ -9030,6 +9341,7 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++) case META_QUERY_QUERY: case META_RANGE_ESCAPED: case META_RANGE_LITERAL: + case META_SCRIPT_RUN: case META_SKIP: case META_THEN: break; diff --git a/thirdparty/pcre2/src/pcre2_context.c b/thirdparty/pcre2/src/pcre2_context.c index 2c14df0080..9c2886a6d0 100644 --- a/thirdparty/pcre2/src/pcre2_context.c +++ b/thirdparty/pcre2/src/pcre2_context.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2017 University of Cambridge + New API code Copyright (c) 2016-2018 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -163,11 +163,13 @@ when no context is supplied to a match function. */ const pcre2_match_context PRIV(default_match_context) = { { default_malloc, default_free, NULL }, #ifdef SUPPORT_JIT - NULL, - NULL, + NULL, /* JIT callback */ + NULL, /* JIT callback data */ #endif - NULL, - NULL, + NULL, /* Callout function */ + NULL, /* Callout data */ + NULL, /* Substitute callout function */ + NULL, /* Substitute callout data */ PCRE2_UNSET, /* Offset limit */ HEAP_LIMIT, MATCH_LIMIT, @@ -404,6 +406,16 @@ return 0; } PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION +pcre2_set_substitute_callout(pcre2_match_context *mcontext, + int (*substitute_callout)(pcre2_substitute_callout_block *, void *), + void *substitute_callout_data) +{ +mcontext->substitute_callout = substitute_callout; +mcontext->substitute_callout_data = substitute_callout_data; +return 0; +} + +PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION pcre2_set_heap_limit(pcre2_match_context *mcontext, uint32_t limit) { mcontext->heap_limit = limit; diff --git a/thirdparty/pcre2/src/pcre2_convert.c b/thirdparty/pcre2/src/pcre2_convert.c index 1dd5c337dc..d45b6fee97 100644 --- a/thirdparty/pcre2/src/pcre2_convert.c +++ b/thirdparty/pcre2/src/pcre2_convert.c @@ -276,7 +276,7 @@ while (plength > 0) break; case CHAR_BACKSLASH: - if (plength <= 0) return PCRE2_ERROR_END_BACKSLASH; + if (plength == 0) return PCRE2_ERROR_END_BACKSLASH; if (extended) nextisliteral = TRUE; else { if (*posix < 127 && strchr(posix_meta_escapes, *posix) != NULL) diff --git a/thirdparty/pcre2/src/pcre2_dfa_match.c b/thirdparty/pcre2/src/pcre2_dfa_match.c index 9b43237da7..bbf3e21064 100644 --- a/thirdparty/pcre2/src/pcre2_dfa_match.c +++ b/thirdparty/pcre2/src/pcre2_dfa_match.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -85,7 +85,8 @@ in others, so I abandoned this code. */ #define PUBLIC_DFA_MATCH_OPTIONS \ (PCRE2_ANCHORED|PCRE2_ENDANCHORED|PCRE2_NOTBOL|PCRE2_NOTEOL|PCRE2_NOTEMPTY| \ PCRE2_NOTEMPTY_ATSTART|PCRE2_NO_UTF_CHECK|PCRE2_PARTIAL_HARD| \ - PCRE2_PARTIAL_SOFT|PCRE2_DFA_SHORTEST|PCRE2_DFA_RESTART) + PCRE2_PARTIAL_SOFT|PCRE2_DFA_SHORTEST|PCRE2_DFA_RESTART| \ + PCRE2_COPY_MATCHED_SUBJECT) /************************************************* @@ -173,6 +174,7 @@ static const uint8_t coptable[] = { 0, /* Assert behind */ 0, /* Assert behind not */ 0, /* ONCE */ + 0, /* SCRIPT_RUN */ 0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */ 0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */ 0, 0, /* CREF, DNCREF */ @@ -247,6 +249,7 @@ static const uint8_t poptable[] = { 0, /* Assert behind */ 0, /* Assert behind not */ 0, /* ONCE */ + 0, /* SCRIPT_RUN */ 0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */ 0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */ 0, 0, /* CREF, DNCREF */ @@ -316,8 +319,8 @@ finding the minimum heap requirement for a match. */ typedef struct RWS_anchor { struct RWS_anchor *next; - unsigned int size; /* Number of ints */ - unsigned int free; /* Number of ints */ + uint32_t size; /* Number of ints */ + uint32_t free; /* Number of ints */ } RWS_anchor; #define RWS_ANCHOR_SIZE (sizeof(RWS_anchor)/sizeof(int)) @@ -413,20 +416,24 @@ if (rws->next != NULL) new = rws->next; } -/* All sizes are in units of sizeof(int), except for mb->heaplimit, which is in -kibibytes. */ +/* Sizes in the RWS_anchor blocks are in units of sizeof(int), but +mb->heap_limit and mb->heap_used are in kibibytes. Play carefully, to avoid +overflow. */ else { - unsigned int newsize = rws->size * 2; - unsigned int heapleft = (unsigned int) - (((1024/sizeof(int))*mb->heap_limit - mb->heap_used)); - if (newsize > heapleft) newsize = heapleft; + uint32_t newsize = (rws->size >= UINT32_MAX/2)? UINT32_MAX/2 : rws->size * 2; + uint32_t newsizeK = newsize/(1024/sizeof(int)); + + if (newsizeK + mb->heap_used > mb->heap_limit) + newsizeK = (uint32_t)(mb->heap_limit - mb->heap_used); + newsize = newsizeK*(1024/sizeof(int)); + if (newsize < RWS_RSIZE + ovecsize + RWS_ANCHOR_SIZE) return PCRE2_ERROR_HEAPLIMIT; new = mb->memctl.malloc(newsize*sizeof(int), mb->memctl.memory_data); if (new == NULL) return PCRE2_ERROR_NOMEMORY; - mb->heap_used += newsize; + mb->heap_used += newsizeK; new->next = NULL; new->size = newsize; rws->next = new; @@ -2560,7 +2567,7 @@ for (;;) if (clen > 0) { isinclass = (c > 255)? (codevalue == OP_NCLASS) : - ((((uint8_t *)(code + 1))[c/8] & (1 << (c&7))) != 0); + ((((uint8_t *)(code + 1))[c/8] & (1u << (c&7))) != 0); } } @@ -2753,7 +2760,7 @@ for (;;) /* There is also an always-true condition */ else if (condcode == OP_TRUE) - { ADD_ACTIVE(state_offset + LINK_SIZE + 2 + IMM2_SIZE, 0); } + { ADD_ACTIVE(state_offset + LINK_SIZE + 2, 0); } /* The only supported version of OP_RREF is for the value RREF_ANY, which means "test if in any recursion". We can't test for specifically @@ -3226,6 +3233,8 @@ pcre2_dfa_match(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length, pcre2_match_context *mcontext, int *workspace, PCRE2_SIZE wscount) { int rc; +int was_zero_terminated = 0; + const pcre2_real_code *re = (const pcre2_real_code *)code; PCRE2_SPTR start_match; @@ -3265,7 +3274,11 @@ rws->free = RWS_BASE_SIZE - RWS_ANCHOR_SIZE; /* A length equal to PCRE2_ZERO_TERMINATED implies a zero-terminated subject string. */ -if (length == PCRE2_ZERO_TERMINATED) length = PRIV(strlen)(subject); +if (length == PCRE2_ZERO_TERMINATED) + { + length = PRIV(strlen)(subject); + was_zero_terminated = 1; + } /* Plausibility checks */ @@ -3518,10 +3531,20 @@ if ((re->flags & PCRE2_LASTSET) != 0) } } +/* If the match data block was previously used with PCRE2_COPY_MATCHED_SUBJECT, +free the memory that was obtained. */ + +if ((match_data->flags & PCRE2_MD_COPIED_SUBJECT) != 0) + { + match_data->memctl.free((void *)match_data->subject, + match_data->memctl.memory_data); + match_data->flags &= ~PCRE2_MD_COPIED_SUBJECT; + } + /* Fill in fields that are always returned in the match data. */ match_data->code = re; -match_data->subject = subject; +match_data->subject = NULL; /* Default for no match */ match_data->mark = NULL; match_data->matchedby = PCRE2_MATCHEDBY_DFA_INTERPRETER; @@ -3586,7 +3609,7 @@ for (;;) #if PCRE2_CODE_UNIT_WIDTH != 8 if (c > 255) c = 255; #endif - ok = (start_bits[c/8] & (1 << (c&7))) != 0; + ok = (start_bits[c/8] & (1u << (c&7))) != 0; } } if (!ok) break; @@ -3697,7 +3720,7 @@ for (;;) #if PCRE2_CODE_UNIT_WIDTH != 8 if (c > 255) c = 255; #endif - if ((start_bits[c/8] & (1 << (c&7))) != 0) break; + if ((start_bits[c/8] & (1u << (c&7))) != 0) break; start_match++; } @@ -3816,6 +3839,20 @@ for (;;) match_data->rightchar = (PCRE2_SIZE)( mb->last_used_ptr - subject); match_data->startchar = (PCRE2_SIZE)(start_match - subject); match_data->rc = rc; + + if (rc >= 0 &&(options & PCRE2_COPY_MATCHED_SUBJECT) != 0) + { + length = CU2BYTES(length + was_zero_terminated); + match_data->subject = match_data->memctl.malloc(length, + match_data->memctl.memory_data); + if (match_data->subject == NULL) return PCRE2_ERROR_NOMEMORY; + memcpy((void *)match_data->subject, subject, length); + match_data->flags |= PCRE2_MD_COPIED_SUBJECT; + } + else + { + if (rc >= 0 || rc == PCRE2_ERROR_PARTIAL) match_data->subject = subject; + } goto EXIT; } diff --git a/thirdparty/pcre2/src/pcre2_error.c b/thirdparty/pcre2/src/pcre2_error.c index 4b3b3f1bc0..1d02cf14a3 100644 --- a/thirdparty/pcre2/src/pcre2_error.c +++ b/thirdparty/pcre2/src/pcre2_error.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -71,7 +71,7 @@ static const unsigned char compile_error_texts[] = /* 5 */ "number too big in {} quantifier\0" "missing terminating ] for character class\0" - "invalid escape sequence in character class\0" + "escape sequence is invalid in character class\0" "range out of order in character class\0" "quantifier does not follow a repeatable item\0" /* 10 */ @@ -95,7 +95,7 @@ static const unsigned char compile_error_texts[] = /* 25 */ "lookbehind assertion is not fixed length\0" "a relative value of zero is not allowed\0" - "conditional group contains more than two branches\0" + "conditional subpattern contains more than two branches\0" "assertion expected after (?( or (?(?C)\0" "digit expected after (?+ or (?-\0" /* 30 */ @@ -113,21 +113,21 @@ static const unsigned char compile_error_texts[] = /* 40 */ "invalid escape sequence in (*VERB) name\0" "unrecognized character after (?P\0" - "syntax error in subpattern name (missing terminator)\0" + "syntax error in subpattern name (missing terminator?)\0" "two named subpatterns have the same name (PCRE2_DUPNAMES not set)\0" - "group name must start with a non-digit\0" + "subpattern name must start with a non-digit\0" /* 45 */ "this version of PCRE2 does not have support for \\P, \\p, or \\X\0" "malformed \\P or \\p sequence\0" "unknown property name after \\P or \\p\0" - "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)\0" + "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " code units)\0" "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0" /* 50 */ "invalid range in character class\0" "octal value is greater than \\377 in 8-bit non-UTF-8 mode\0" "internal error: overran compiling workspace\0" "internal error: previously-checked referenced subpattern not found\0" - "DEFINE group contains more than one branch\0" + "DEFINE subpattern contains more than one branch\0" /* 55 */ "missing opening brace after \\o\0" "internal error: unknown newline setting\0" @@ -137,7 +137,7 @@ static const unsigned char compile_error_texts[] = "obsolete error (should not occur)\0" /* Was the above */ /* 60 */ "(*VERB) not recognized or malformed\0" - "group number is too big\0" + "subpattern number is too big\0" "subpattern name expected\0" "internal error: parsed pattern overflow\0" "non-octal character in \\o{} (closing brace missing?)\0" @@ -181,6 +181,9 @@ static const unsigned char compile_error_texts[] = "invalid option bits with PCRE2_LITERAL\0" "\\N{U+dddd} is supported only in Unicode (UTF) mode\0" "invalid hyphen in option setting\0" + /* 95 */ + "(*alpha_assertion) not recognized\0" + "script runs require Unicode support, which this version of PCRE2 does not have\0" ; /* Match-time and UTF error texts are in the same format. */ diff --git a/thirdparty/pcre2/src/pcre2_extuni.c b/thirdparty/pcre2/src/pcre2_extuni.c index 237211abf7..5a719e9cb4 100644 --- a/thirdparty/pcre2/src/pcre2_extuni.c +++ b/thirdparty/pcre2/src/pcre2_extuni.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -100,7 +100,7 @@ while (eptr < end_subject) int len = 1; if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } rgb = UCD_GRAPHBREAK(c); - if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + if ((PRIV(ucp_gbtable)[lgb] & (1u << rgb)) == 0) break; /* Not breaking between Regional Indicators is allowed only if there are an even number of preceding RIs. */ diff --git a/thirdparty/pcre2/src/pcre2_internal.h b/thirdparty/pcre2/src/pcre2_internal.h index 8750f2f174..814d91bddb 100644 --- a/thirdparty/pcre2/src/pcre2_internal.h +++ b/thirdparty/pcre2/src/pcre2_internal.h @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -148,16 +148,7 @@ pcre2_match() because of the way it backtracks. */ /* When checking for integer overflow in pcre2_compile(), we need to handle large integers. If a 64-bit integer type is available, we can use that. Otherwise we have to cast to double, which of course requires floating point -arithmetic. Handle this by defining a macro for the appropriate type. If -stdint.h is available, include it; it may define INT64_MAX. Systems that do not -have stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set -by "configure". */ - -#if defined HAVE_STDINT_H -#include <stdint.h> -#elif defined HAVE_INTTYPES_H -#include <inttypes.h> -#endif +arithmetic. Handle this by defining a macro for the appropriate type. */ #if defined INT64_MAX || defined int64_t #define INT64_OR_DOUBLE int64_t @@ -535,6 +526,10 @@ enum { PCRE2_MATCHEDBY_INTERPRETER, /* pcre2_match() */ PCRE2_MATCHEDBY_DFA_INTERPRETER, /* pcre2_dfa_match() */ PCRE2_MATCHEDBY_JIT }; /* pcre2_jit_match() */ +/* Values for the flags field in a match data block. */ + +#define PCRE2_MD_COPIED_SUBJECT 0x01u + /* Magic number to provide a small check against being handed junk. */ #define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ @@ -569,11 +564,11 @@ these tables. */ without checking pcre2_jit_compile.c, which has an assertion to ensure that ctype_word has the value 16. */ -#define ctype_space 0x01 -#define ctype_letter 0x02 -#define ctype_digit 0x04 -#define ctype_xdigit 0x08 /* not actually used any more */ -#define ctype_word 0x10 /* alphanumeric or '_' */ +#define ctype_space 0x01 +#define ctype_letter 0x02 +#define ctype_lcletter 0x04 +#define ctype_digit 0x08 +#define ctype_word 0x10 /* alphanumeric or '_' */ /* Offsets of the various tables from the base tables pointer, and total length of the tables. */ @@ -874,34 +869,48 @@ a positive value. */ #define STR_RIGHT_CURLY_BRACKET "}" #define STR_TILDE "~" -#define STRING_ACCEPT0 "ACCEPT\0" -#define STRING_COMMIT0 "COMMIT\0" -#define STRING_F0 "F\0" -#define STRING_FAIL0 "FAIL\0" -#define STRING_MARK0 "MARK\0" -#define STRING_PRUNE0 "PRUNE\0" -#define STRING_SKIP0 "SKIP\0" -#define STRING_THEN "THEN" - -#define STRING_alpha0 "alpha\0" -#define STRING_lower0 "lower\0" -#define STRING_upper0 "upper\0" -#define STRING_alnum0 "alnum\0" -#define STRING_ascii0 "ascii\0" -#define STRING_blank0 "blank\0" -#define STRING_cntrl0 "cntrl\0" -#define STRING_digit0 "digit\0" -#define STRING_graph0 "graph\0" -#define STRING_print0 "print\0" -#define STRING_punct0 "punct\0" -#define STRING_space0 "space\0" -#define STRING_word0 "word\0" -#define STRING_xdigit "xdigit" - -#define STRING_DEFINE "DEFINE" -#define STRING_VERSION "VERSION" -#define STRING_WEIRD_STARTWORD "[:<:]]" -#define STRING_WEIRD_ENDWORD "[:>:]]" +#define STRING_ACCEPT0 "ACCEPT\0" +#define STRING_COMMIT0 "COMMIT\0" +#define STRING_F0 "F\0" +#define STRING_FAIL0 "FAIL\0" +#define STRING_MARK0 "MARK\0" +#define STRING_PRUNE0 "PRUNE\0" +#define STRING_SKIP0 "SKIP\0" +#define STRING_THEN "THEN" + +#define STRING_atomic0 "atomic\0" +#define STRING_pla0 "pla\0" +#define STRING_plb0 "plb\0" +#define STRING_nla0 "nla\0" +#define STRING_nlb0 "nlb\0" +#define STRING_sr0 "sr\0" +#define STRING_asr0 "asr\0" +#define STRING_positive_lookahead0 "positive_lookahead\0" +#define STRING_positive_lookbehind0 "positive_lookbehind\0" +#define STRING_negative_lookahead0 "negative_lookahead\0" +#define STRING_negative_lookbehind0 "negative_lookbehind\0" +#define STRING_script_run0 "script_run\0" +#define STRING_atomic_script_run "atomic_script_run" + +#define STRING_alpha0 "alpha\0" +#define STRING_lower0 "lower\0" +#define STRING_upper0 "upper\0" +#define STRING_alnum0 "alnum\0" +#define STRING_ascii0 "ascii\0" +#define STRING_blank0 "blank\0" +#define STRING_cntrl0 "cntrl\0" +#define STRING_digit0 "digit\0" +#define STRING_graph0 "graph\0" +#define STRING_print0 "print\0" +#define STRING_punct0 "punct\0" +#define STRING_space0 "space\0" +#define STRING_word0 "word\0" +#define STRING_xdigit "xdigit" + +#define STRING_DEFINE "DEFINE" +#define STRING_VERSION "VERSION" +#define STRING_WEIRD_STARTWORD "[:<:]]" +#define STRING_WEIRD_ENDWORD "[:>:]]" #define STRING_CR_RIGHTPAR "CR)" #define STRING_LF_RIGHTPAR "LF)" @@ -1150,34 +1159,48 @@ only. */ #define STR_RIGHT_CURLY_BRACKET "\175" #define STR_TILDE "\176" -#define STRING_ACCEPT0 STR_A STR_C STR_C STR_E STR_P STR_T "\0" -#define STRING_COMMIT0 STR_C STR_O STR_M STR_M STR_I STR_T "\0" -#define STRING_F0 STR_F "\0" -#define STRING_FAIL0 STR_F STR_A STR_I STR_L "\0" -#define STRING_MARK0 STR_M STR_A STR_R STR_K "\0" -#define STRING_PRUNE0 STR_P STR_R STR_U STR_N STR_E "\0" -#define STRING_SKIP0 STR_S STR_K STR_I STR_P "\0" -#define STRING_THEN STR_T STR_H STR_E STR_N - -#define STRING_alpha0 STR_a STR_l STR_p STR_h STR_a "\0" -#define STRING_lower0 STR_l STR_o STR_w STR_e STR_r "\0" -#define STRING_upper0 STR_u STR_p STR_p STR_e STR_r "\0" -#define STRING_alnum0 STR_a STR_l STR_n STR_u STR_m "\0" -#define STRING_ascii0 STR_a STR_s STR_c STR_i STR_i "\0" -#define STRING_blank0 STR_b STR_l STR_a STR_n STR_k "\0" -#define STRING_cntrl0 STR_c STR_n STR_t STR_r STR_l "\0" -#define STRING_digit0 STR_d STR_i STR_g STR_i STR_t "\0" -#define STRING_graph0 STR_g STR_r STR_a STR_p STR_h "\0" -#define STRING_print0 STR_p STR_r STR_i STR_n STR_t "\0" -#define STRING_punct0 STR_p STR_u STR_n STR_c STR_t "\0" -#define STRING_space0 STR_s STR_p STR_a STR_c STR_e "\0" -#define STRING_word0 STR_w STR_o STR_r STR_d "\0" -#define STRING_xdigit STR_x STR_d STR_i STR_g STR_i STR_t - -#define STRING_DEFINE STR_D STR_E STR_F STR_I STR_N STR_E -#define STRING_VERSION STR_V STR_E STR_R STR_S STR_I STR_O STR_N -#define STRING_WEIRD_STARTWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET -#define STRING_WEIRD_ENDWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET +#define STRING_ACCEPT0 STR_A STR_C STR_C STR_E STR_P STR_T "\0" +#define STRING_COMMIT0 STR_C STR_O STR_M STR_M STR_I STR_T "\0" +#define STRING_F0 STR_F "\0" +#define STRING_FAIL0 STR_F STR_A STR_I STR_L "\0" +#define STRING_MARK0 STR_M STR_A STR_R STR_K "\0" +#define STRING_PRUNE0 STR_P STR_R STR_U STR_N STR_E "\0" +#define STRING_SKIP0 STR_S STR_K STR_I STR_P "\0" +#define STRING_THEN STR_T STR_H STR_E STR_N + +#define STRING_atomic0 STR_a STR_t STR_o STR_m STR_i STR_c "\0" +#define STRING_pla0 STR_p STR_l STR_a "\0" +#define STRING_plb0 STR_p STR_l STR_b "\0" +#define STRING_nla0 STR_n STR_l STR_a "\0" +#define STRING_nlb0 STR_n STR_l STR_b "\0" +#define STRING_sr0 STR_s STR_r "\0" +#define STRING_asr0 STR_a STR_s STR_r "\0" +#define STRING_positive_lookahead0 STR_p STR_o STR_s STR_i STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_a STR_h STR_e STR_a STR_d "\0" +#define STRING_positive_lookbehind0 STR_p STR_o STR_s STR_i STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_b STR_e STR_h STR_i STR_n STR_d "\0" +#define STRING_negative_lookahead0 STR_n STR_e STR_g STR_a STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_a STR_h STR_e STR_a STR_d "\0" +#define STRING_negative_lookbehind0 STR_n STR_e STR_g STR_a STR_t STR_i STR_v STR_e STR_UNDERSCORE STR_l STR_o STR_o STR_k STR_b STR_e STR_h STR_i STR_n STR_d "\0" +#define STRING_script_run0 STR_s STR_c STR_r STR_i STR_p STR_t STR_UNDERSCORE STR_r STR_u STR_n "\0" +#define STRING_atomic_script_run STR_a STR_t STR_o STR_m STR_i STR_c STR_UNDERSCORE STR_s STR_c STR_r STR_i STR_p STR_t STR_UNDERSCORE STR_r STR_u STR_n + +#define STRING_alpha0 STR_a STR_l STR_p STR_h STR_a "\0" +#define STRING_lower0 STR_l STR_o STR_w STR_e STR_r "\0" +#define STRING_upper0 STR_u STR_p STR_p STR_e STR_r "\0" +#define STRING_alnum0 STR_a STR_l STR_n STR_u STR_m "\0" +#define STRING_ascii0 STR_a STR_s STR_c STR_i STR_i "\0" +#define STRING_blank0 STR_b STR_l STR_a STR_n STR_k "\0" +#define STRING_cntrl0 STR_c STR_n STR_t STR_r STR_l "\0" +#define STRING_digit0 STR_d STR_i STR_g STR_i STR_t "\0" +#define STRING_graph0 STR_g STR_r STR_a STR_p STR_h "\0" +#define STRING_print0 STR_p STR_r STR_i STR_n STR_t "\0" +#define STRING_punct0 STR_p STR_u STR_n STR_c STR_t "\0" +#define STRING_space0 STR_s STR_p STR_a STR_c STR_e "\0" +#define STRING_word0 STR_w STR_o STR_r STR_d "\0" +#define STRING_xdigit STR_x STR_d STR_i STR_g STR_i STR_t + +#define STRING_DEFINE STR_D STR_E STR_F STR_I STR_N STR_E +#define STRING_VERSION STR_V STR_E STR_R STR_S STR_I STR_O STR_N +#define STRING_WEIRD_STARTWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET +#define STRING_WEIRD_ENDWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET #define STRING_CR_RIGHTPAR STR_C STR_R STR_RIGHT_PARENTHESIS #define STRING_LF_RIGHTPAR STR_L STR_F STR_RIGHT_PARENTHESIS @@ -1485,70 +1508,71 @@ enum { OP_ASSERTBACK, /* 128 Positive lookbehind */ OP_ASSERTBACK_NOT, /* 129 Negative lookbehind */ - /* ONCE, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately after the - assertions, with ONCE first, as there's a test for >= ONCE for a subpattern - that isn't an assertion. The POS versions must immediately follow the non-POS - versions in each case. */ + /* ONCE, SCRIPT_RUN, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come + immediately after the assertions, with ONCE first, as there's a test for >= + ONCE for a subpattern that isn't an assertion. The POS versions must + immediately follow the non-POS versions in each case. */ OP_ONCE, /* 130 Atomic group, contains captures */ - OP_BRA, /* 131 Start of non-capturing bracket */ - OP_BRAPOS, /* 132 Ditto, with unlimited, possessive repeat */ - OP_CBRA, /* 133 Start of capturing bracket */ - OP_CBRAPOS, /* 134 Ditto, with unlimited, possessive repeat */ - OP_COND, /* 135 Conditional group */ + OP_SCRIPT_RUN, /* 131 Non-capture, but check characters' scripts */ + OP_BRA, /* 132 Start of non-capturing bracket */ + OP_BRAPOS, /* 133 Ditto, with unlimited, possessive repeat */ + OP_CBRA, /* 134 Start of capturing bracket */ + OP_CBRAPOS, /* 135 Ditto, with unlimited, possessive repeat */ + OP_COND, /* 136 Conditional group */ /* These five must follow the previous five, in the same order. There's a check for >= SBRA to distinguish the two sets. */ - OP_SBRA, /* 136 Start of non-capturing bracket, check empty */ - OP_SBRAPOS, /* 137 Ditto, with unlimited, possessive repeat */ - OP_SCBRA, /* 138 Start of capturing bracket, check empty */ - OP_SCBRAPOS, /* 139 Ditto, with unlimited, possessive repeat */ - OP_SCOND, /* 140 Conditional group, check empty */ + OP_SBRA, /* 137 Start of non-capturing bracket, check empty */ + OP_SBRAPOS, /* 138 Ditto, with unlimited, possessive repeat */ + OP_SCBRA, /* 139 Start of capturing bracket, check empty */ + OP_SCBRAPOS, /* 140 Ditto, with unlimited, possessive repeat */ + OP_SCOND, /* 141 Conditional group, check empty */ /* The next two pairs must (respectively) be kept together. */ - OP_CREF, /* 141 Used to hold a capture number as condition */ - OP_DNCREF, /* 142 Used to point to duplicate names as a condition */ - OP_RREF, /* 143 Used to hold a recursion number as condition */ - OP_DNRREF, /* 144 Used to point to duplicate names as a condition */ - OP_FALSE, /* 145 Always false (used by DEFINE and VERSION) */ - OP_TRUE, /* 146 Always true (used by VERSION) */ + OP_CREF, /* 142 Used to hold a capture number as condition */ + OP_DNCREF, /* 143 Used to point to duplicate names as a condition */ + OP_RREF, /* 144 Used to hold a recursion number as condition */ + OP_DNRREF, /* 145 Used to point to duplicate names as a condition */ + OP_FALSE, /* 146 Always false (used by DEFINE and VERSION) */ + OP_TRUE, /* 147 Always true (used by VERSION) */ - OP_BRAZERO, /* 147 These two must remain together and in this */ - OP_BRAMINZERO, /* 148 order. */ - OP_BRAPOSZERO, /* 149 */ + OP_BRAZERO, /* 148 These two must remain together and in this */ + OP_BRAMINZERO, /* 149 order. */ + OP_BRAPOSZERO, /* 150 */ /* These are backtracking control verbs */ - OP_MARK, /* 150 always has an argument */ - OP_PRUNE, /* 151 */ - OP_PRUNE_ARG, /* 152 same, but with argument */ - OP_SKIP, /* 153 */ - OP_SKIP_ARG, /* 154 same, but with argument */ - OP_THEN, /* 155 */ - OP_THEN_ARG, /* 156 same, but with argument */ - OP_COMMIT, /* 157 */ - OP_COMMIT_ARG, /* 158 same, but with argument */ + OP_MARK, /* 151 always has an argument */ + OP_PRUNE, /* 152 */ + OP_PRUNE_ARG, /* 153 same, but with argument */ + OP_SKIP, /* 154 */ + OP_SKIP_ARG, /* 155 same, but with argument */ + OP_THEN, /* 156 */ + OP_THEN_ARG, /* 157 same, but with argument */ + OP_COMMIT, /* 158 */ + OP_COMMIT_ARG, /* 159 same, but with argument */ /* These are forced failure and success verbs. FAIL and ACCEPT do accept an argument, but these cases can be compiled as, for example, (*MARK:X)(*FAIL) without the need for a special opcode. */ - OP_FAIL, /* 159 */ - OP_ACCEPT, /* 160 */ - OP_ASSERT_ACCEPT, /* 161 Used inside assertions */ - OP_CLOSE, /* 162 Used before OP_ACCEPT to close open captures */ + OP_FAIL, /* 160 */ + OP_ACCEPT, /* 161 */ + OP_ASSERT_ACCEPT, /* 162 Used inside assertions */ + OP_CLOSE, /* 163 Used before OP_ACCEPT to close open captures */ /* This is used to skip a subpattern with a {0} quantifier */ - OP_SKIPZERO, /* 163 */ + OP_SKIPZERO, /* 164 */ /* This is used to identify a DEFINE group during compilation so that it can be checked for having only one branch. It is changed to OP_FALSE before compilation finishes. */ - OP_DEFINE, /* 164 */ + OP_DEFINE, /* 165 */ /* This is not an opcode, but is used to check that tables indexed by opcode are the correct length, in order to catch updating errors - there have been @@ -1596,6 +1620,7 @@ some cases doesn't actually use these names at all). */ "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos", \ "Reverse", "Assert", "Assert not", "AssertB", "AssertB not", \ "Once", \ + "Script run", \ "Bra", "BraPos", "CBra", "CBraPos", \ "Cond", \ "SBra", "SBraPos", "SCBra", "SCBraPos", \ @@ -1679,6 +1704,7 @@ in UTF-8 mode. The code that uses this table must know about such things. */ 1+LINK_SIZE, /* Assert behind */ \ 1+LINK_SIZE, /* Assert behind not */ \ 1+LINK_SIZE, /* ONCE */ \ + 1+LINK_SIZE, /* SCRIPT_RUN */ \ 1+LINK_SIZE, /* BRA */ \ 1+LINK_SIZE, /* BRAPOS */ \ 1+LINK_SIZE+IMM2_SIZE, /* CBRA */ \ @@ -1747,6 +1773,8 @@ typedef struct { uint8_t gbprop; /* ucp_gbControl, etc. (grapheme break property) */ uint8_t caseset; /* offset to multichar other cases or zero */ int32_t other_case; /* offset to other case, or zero if none */ + int16_t scriptx; /* script extension value */ + int16_t dummy; /* spare - to round to multiple of 4 bytes */ } ucd_record; /* UCD access macros */ @@ -1769,6 +1797,7 @@ typedef struct { #define UCD_GRAPHBREAK(ch) GET_UCD(ch)->gbprop #define UCD_CASESET(ch) GET_UCD(ch)->caseset #define UCD_OTHERCASE(ch) ((uint32_t)((int)ch + (int)(GET_UCD(ch)->other_case))) +#define UCD_SCRIPTX(ch) GET_UCD(ch)->scriptx /* Header for serialized pcre2 codes. */ @@ -1826,6 +1855,8 @@ extern const uint8_t PRIV(utf8_table4)[]; #define _pcre2_hspace_list PCRE2_SUFFIX(_pcre2_hspace_list_) #define _pcre2_vspace_list PCRE2_SUFFIX(_pcre2_vspace_list_) #define _pcre2_ucd_caseless_sets PCRE2_SUFFIX(_pcre2_ucd_caseless_sets_) +#define _pcre2_ucd_digit_sets PCRE2_SUFFIX(_pcre2_ucd_digit_sets_) +#define _pcre2_ucd_script_sets PCRE2_SUFFIX(_pcre2_ucd_script_sets_) #define _pcre2_ucd_records PCRE2_SUFFIX(_pcre2_ucd_records_) #define _pcre2_ucd_stage1 PCRE2_SUFFIX(_pcre2_ucd_stage1_) #define _pcre2_ucd_stage2 PCRE2_SUFFIX(_pcre2_ucd_stage2_) @@ -1847,6 +1878,8 @@ extern const uint8_t PRIV(default_tables)[]; extern const uint32_t PRIV(hspace_list)[]; extern const uint32_t PRIV(vspace_list)[]; extern const uint32_t PRIV(ucd_caseless_sets)[]; +extern const uint32_t PRIV(ucd_digit_sets)[]; +extern const uint8_t PRIV(ucd_script_sets)[]; extern const ucd_record PRIV(ucd_records)[]; #if PCRE2_CODE_UNIT_WIDTH == 32 extern const ucd_record PRIV(dummy_ucd_record)[]; @@ -1894,6 +1927,7 @@ is available. */ #define _pcre2_jit_get_target PCRE2_SUFFIX(_pcre2_jit_get_target_) #define _pcre2_memctl_malloc PCRE2_SUFFIX(_pcre2_memctl_malloc_) #define _pcre2_ord2utf PCRE2_SUFFIX(_pcre2_ord2utf_) +#define _pcre2_script_run PCRE2_SUFFIX(_pcre2_script_run_) #define _pcre2_strcmp PCRE2_SUFFIX(_pcre2_strcmp_) #define _pcre2_strcmp_c8 PCRE2_SUFFIX(_pcre2_strcmp_c8_) #define _pcre2_strcpy_c8 PCRE2_SUFFIX(_pcre2_strcpy_c8_) @@ -1908,7 +1942,7 @@ is available. */ extern int _pcre2_auto_possessify(PCRE2_UCHAR *, BOOL, const compile_block *); extern int _pcre2_check_escape(PCRE2_SPTR *, PCRE2_SPTR, uint32_t *, - int *, uint32_t, BOOL, compile_block *); + int *, uint32_t, uint32_t, BOOL, compile_block *); extern PCRE2_SPTR _pcre2_extuni(uint32_t, PCRE2_SPTR, PCRE2_SPTR, PCRE2_SPTR, BOOL, int *); extern PCRE2_SPTR _pcre2_find_bracket(PCRE2_SPTR, BOOL, int); @@ -1920,6 +1954,7 @@ extern size_t _pcre2_jit_get_size(void *); const char * _pcre2_jit_get_target(void); extern void * _pcre2_memctl_malloc(size_t, pcre2_memctl *); extern unsigned int _pcre2_ord2utf(uint32_t, PCRE2_UCHAR *); +extern BOOL _pcre2_script_run(PCRE2_SPTR, PCRE2_SPTR, BOOL); extern int _pcre2_strcmp(PCRE2_SPTR, PCRE2_SPTR); extern int _pcre2_strcmp_c8(PCRE2_SPTR, const char *); extern PCRE2_SIZE _pcre2_strcpy_c8(PCRE2_UCHAR *, const char *); diff --git a/thirdparty/pcre2/src/pcre2_intmodedep.h b/thirdparty/pcre2/src/pcre2_intmodedep.h index 62626d0a8a..bf3a235984 100644 --- a/thirdparty/pcre2/src/pcre2_intmodedep.h +++ b/thirdparty/pcre2/src/pcre2_intmodedep.h @@ -585,6 +585,8 @@ typedef struct pcre2_real_match_context { #endif int (*callout)(pcre2_callout_block *, void *); void *callout_data; + int (*substitute_callout)(pcre2_substitute_callout_block *, void *); + void *substitute_callout_data; PCRE2_SIZE offset_limit; uint32_t heap_limit; uint32_t match_limit; @@ -656,7 +658,8 @@ typedef struct pcre2_real_match_data { PCRE2_SIZE leftchar; /* Offset to leftmost code unit */ PCRE2_SIZE rightchar; /* Offset to rightmost code unit */ PCRE2_SIZE startchar; /* Offset to starting code unit */ - uint16_t matchedby; /* Type of match (normal, JIT, DFA) */ + uint8_t matchedby; /* Type of match (normal, JIT, DFA) */ + uint8_t flags; /* Various flags */ uint16_t oveccount; /* Number of pairs */ int rc; /* The return code from the match */ PCRE2_SIZE ovector[131072]; /* Must be last in the structure */ diff --git a/thirdparty/pcre2/src/pcre2_jit_compile.c b/thirdparty/pcre2/src/pcre2_jit_compile.c index 32e985b793..1f21bfb6ad 100644 --- a/thirdparty/pcre2/src/pcre2_jit_compile.c +++ b/thirdparty/pcre2/src/pcre2_jit_compile.c @@ -477,12 +477,22 @@ typedef struct compiler_common { BOOL alt_circumflex; #ifdef SUPPORT_UNICODE BOOL utf; + BOOL invalid_utf; BOOL use_ucp; + /* Points to saving area for iref. */ + sljit_s32 iref_ptr; jump_list *getucd; + jump_list *getucdtype; #if PCRE2_CODE_UNIT_WIDTH == 8 jump_list *utfreadchar; - jump_list *utfreadchar16; jump_list *utfreadtype8; + jump_list *utfpeakcharback; +#endif +#if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16 + jump_list *utfreadchar_invalid; + jump_list *utfreadnewline_invalid; + jump_list *utfmoveback_invalid; + jump_list *utfpeakcharback_invalid; #endif #endif /* SUPPORT_UNICODE */ } compiler_common; @@ -616,7 +626,183 @@ the start pointers when the end of the capturing group has not yet reached. */ #define READ_CHAR_MAX 0x7fffffff -#define INVALID_UTF_CHAR 888 +#define INVALID_UTF_CHAR -1 +#define UNASSIGNED_UTF_CHAR 888 + +#if defined SUPPORT_UNICODE +#if PCRE2_CODE_UNIT_WIDTH == 8 + +#define GETCHARINC_INVALID(c, ptr, end, invalid_action) \ + { \ + if (ptr[0] <= 0x7f) \ + c = *ptr++; \ + else if (ptr + 1 < end && ptr[1] >= 0x80 && ptr[1] < 0xc0) \ + { \ + c = ptr[1] - 0x80; \ + \ + if (ptr[0] >= 0xc2 && ptr[0] <= 0xdf) \ + { \ + c |= (ptr[0] - 0xc0) << 6; \ + ptr += 2; \ + } \ + else if (ptr + 2 < end && ptr[2] >= 0x80 && ptr[2] < 0xc0) \ + { \ + c = c << 6 | (ptr[2] - 0x80); \ + \ + if (ptr[0] >= 0xe0 && ptr[0] <= 0xef) \ + { \ + c |= (ptr[0] - 0xe0) << 12; \ + ptr += 3; \ + \ + if (c < 0x800 || (c >= 0xd800 && c < 0xe000)) \ + { \ + invalid_action; \ + } \ + } \ + else if (ptr + 3 < end && ptr[3] >= 0x80 && ptr[3] < 0xc0) \ + { \ + c = c << 6 | (ptr[3] - 0x80); \ + \ + if (ptr[0] >= 0xf0 && ptr[0] <= 0xf4) \ + { \ + c |= (ptr[0] - 0xf0) << 18; \ + ptr += 4; \ + \ + if (c >= 0x110000 || c < 0x10000) \ + { \ + invalid_action; \ + } \ + } \ + else \ + { \ + invalid_action; \ + } \ + } \ + else \ + { \ + invalid_action; \ + } \ + } \ + else \ + { \ + invalid_action; \ + } \ + } \ + else \ + { \ + invalid_action; \ + } \ + } + +#define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \ + { \ + if (ptr[-1] <= 0x7f) \ + c = *ptr--; \ + else if (ptr - 1 > start && ptr[-1] >= 0x80 && ptr[-1] < 0xc0) \ + { \ + c = ptr[-1] - 0x80; \ + \ + if (ptr[-2] >= 0xc2 && ptr[-2] <= 0xdf) \ + { \ + c |= (ptr[-2] - 0xc0) << 6; \ + ptr -= 2; \ + } \ + else if (ptr - 2 > start && ptr[-2] >= 0x80 && ptr[-2] < 0xc0) \ + { \ + c = c << 6 | (ptr[-2] - 0x80); \ + \ + if (ptr[-3] >= 0xe0 && ptr[-3] <= 0xef) \ + { \ + c |= (ptr[-3] - 0xe0) << 12; \ + ptr -= 3; \ + \ + if (c < 0x800 || (c >= 0xd800 && c < 0xe000)) \ + { \ + invalid_action; \ + } \ + } \ + else if (ptr - 3 > start && ptr[-3] >= 0x80 && ptr[-3] < 0xc0) \ + { \ + c = c << 6 | (ptr[-3] - 0x80); \ + \ + if (ptr[-4] >= 0xf0 && ptr[-4] <= 0xf4) \ + { \ + c |= (ptr[-4] - 0xf0) << 18; \ + ptr -= 4; \ + \ + if (c >= 0x110000 || c < 0x10000) \ + { \ + invalid_action; \ + } \ + } \ + else \ + { \ + invalid_action; \ + } \ + } \ + else \ + { \ + invalid_action; \ + } \ + } \ + else \ + { \ + invalid_action; \ + } \ + } \ + else \ + { \ + invalid_action; \ + } \ + } + +#elif PCRE2_CODE_UNIT_WIDTH == 16 + +#define GETCHARINC_INVALID(c, ptr, end, invalid_action) \ + { \ + if (ptr[0] < 0xd800 || ptr[0] >= 0xe000) \ + c = *ptr++; \ + else if (ptr[0] < 0xdc00 && ptr + 1 < end && ptr[1] >= 0xdc00 && ptr[1] < 0xe000) \ + { \ + c = (((ptr[0] - 0xd800) << 10) | (ptr[1] - 0xdc00)) + 0x10000; \ + ptr += 2; \ + } \ + else \ + { \ + invalid_action; \ + } \ + } + +#define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \ + { \ + if (ptr[-1] < 0xd800 || ptr[-1] >= 0xe000) \ + c = *ptr--; \ + else if (ptr[-1] >= 0xdc00 && ptr - 1 > start && ptr[-2] >= 0xd800 && ptr[-2] < 0xdc00) \ + { \ + c = (((ptr[-2] - 0xd800) << 10) | (ptr[-1] - 0xdc00)) + 0x10000; \ + ptr -= 2; \ + } \ + else \ + { \ + invalid_action; \ + } \ + } + + +#elif PCRE2_CODE_UNIT_WIDTH == 32 + +#define GETCHARINC_INVALID(c, ptr, end, invalid_action) \ + { \ + if (ptr[0] < 0x110000) \ + c = *ptr++; \ + else \ + { \ + invalid_action; \ + } \ + } + +#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ +#endif /* SUPPORT_UNICODE */ static PCRE2_SPTR bracketend(PCRE2_SPTR cc) { @@ -716,6 +902,7 @@ switch(*cc) case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: + case OP_SCRIPT_RUN: case OP_BRA: case OP_BRAPOS: case OP_CBRA: @@ -869,8 +1056,16 @@ while (cc < ccend) cc += 1; break; - case OP_REF: case OP_REFI: +#ifdef SUPPORT_UNICODE + if (common->iref_ptr == 0) + { + common->iref_ptr = common->ovector_start; + common->ovector_start += 3 * sizeof(sljit_sw); + } +#endif /* SUPPORT_UNICODE */ + /* Fall through. */ + case OP_REF: common->optimized_cbracket[GET2(cc, 1)] = 0; cc += 1 + IMM2_SIZE; break; @@ -1375,6 +1570,7 @@ while (cc < ccend) case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: + case OP_SCRIPT_RUN: case OP_BRAPOS: case OP_SBRA: case OP_SBRAPOS: @@ -1951,6 +2147,7 @@ while (cc < ccend) case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: + case OP_SCRIPT_RUN: case OP_BRAPOS: case OP_SBRA: case OP_SBRAPOS: @@ -2174,14 +2371,14 @@ if (base_reg != TMP2) else { status.saved_tmp_regs[1] = RETURN_ADDR; - if (sljit_get_register_index (RETURN_ADDR) == -1) + if (sljit_get_register_index(RETURN_ADDR) == -1) status.tmp_regs[1] = STR_PTR; else status.tmp_regs[1] = RETURN_ADDR; } status.saved_tmp_regs[2] = TMP3; -if (sljit_get_register_index (TMP3) == -1) +if (sljit_get_register_index(TMP3) == -1) status.tmp_regs[2] = STR_END; else status.tmp_regs[2] = TMP3; @@ -2274,6 +2471,7 @@ while (cc < ccend) case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: + case OP_SCRIPT_RUN: case OP_BRAPOS: case OP_SBRA: case OP_SBRAPOS: @@ -3059,13 +3257,13 @@ return (0 << 8) | bit; #ifdef SUPPORT_UNICODE if (common->utf && c > 65535) { - if (bit >= (1 << 10)) + if (bit >= (1u << 10)) bit >>= 10; else return (bit < 256) ? ((2 << 8) | bit) : ((3 << 8) | (bit >> 8)); } #endif /* SUPPORT_UNICODE */ -return (bit < 256) ? ((0 << 8) | bit) : ((1 << 8) | (bit >> 8)); +return (bit < 256) ? ((0u << 8) | bit) : ((1u << 8) | (bit >> 8)); #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ } @@ -3159,95 +3357,152 @@ else JUMPHERE(jump); } -static void peek_char(compiler_common *common, sljit_u32 max) +static void peek_char(compiler_common *common, sljit_u32 max, sljit_s32 dst, sljit_sw dstw, jump_list **backtracks) { /* Reads the character into TMP1, keeps STR_PTR. -Does not check STR_END. TMP2 Destroyed. */ +Does not check STR_END. TMP2, dst, RETURN_ADDR Destroyed. */ DEFINE_COMPILER; #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 struct sljit_jump *jump; -#endif +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */ SLJIT_UNUSED_ARG(max); +SLJIT_UNUSED_ARG(dst); +SLJIT_UNUSED_ARG(dstw); +SLJIT_UNUSED_ARG(backtracks); -OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + +#ifdef SUPPORT_UNICODE +#if PCRE2_CODE_UNIT_WIDTH == 8 if (common->utf) { if (max < 128) return; - jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x80); + OP1(SLJIT_MOV, dst, dstw, STR_PTR, 0); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); - add_jump(compiler, &common->utfreadchar, JUMP(SLJIT_FAST_CALL)); - OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + add_jump(compiler, common->invalid_utf ? &common->utfreadchar_invalid : &common->utfreadchar, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, STR_PTR, 0, dst, dstw); + if (backtracks && common->invalid_utf) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR)); JUMPHERE(jump); } -#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */ - -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16 +#elif PCRE2_CODE_UNIT_WIDTH == 16 if (common->utf) { if (max < 0xd800) return; OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); - jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1); - /* TMP2 contains the high surrogate. */ - OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); - OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x40); - OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10); - OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3ff); - OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); - JUMPHERE(jump); - } -#endif -} -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 - -static BOOL is_char7_bitset(const sljit_u8 *bitset, BOOL nclass) -{ -/* Tells whether the character codes below 128 are enough -to determine a match. */ -const sljit_u8 value = nclass ? 0xff : 0; -const sljit_u8 *end = bitset + 32; + if (common->invalid_utf) + { + jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800); + OP1(SLJIT_MOV, dst, dstw, STR_PTR, 0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, STR_PTR, 0, dst, dstw); + if (backtracks && common->invalid_utf) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR)); + } + else + { + /* TMP2 contains the high surrogate. */ + jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000 - 0xdc00); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); + } -bitset += 16; -do + JUMPHERE(jump); + } +#elif PCRE2_CODE_UNIT_WIDTH == 32 +if (common->invalid_utf) { - if (*bitset++ != value) - return FALSE; + if (backtracks != NULL) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000)); + else + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x110000); + CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR); + } } -while (bitset < end); -return TRUE; +#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ +#endif /* SUPPORT_UNICODE */ } -static void read_char7_type(compiler_common *common, BOOL full_read) +static void peek_char_back(compiler_common *common, sljit_u32 max, jump_list **backtracks) { -/* Reads the precise character type of a character into TMP1, if the character -is less than 128. Otherwise it returns with zero. Does not check STR_END. The -full_read argument tells whether characters above max are accepted or not. */ +/* Reads one character back without moving STR_PTR. TMP2 must +contain the start of the subject buffer. Affects TMP1, TMP2, and RETURN_ADDR. */ DEFINE_COMPILER; -struct sljit_jump *jump; -SLJIT_ASSERT(common->utf); +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +struct sljit_jump *jump; +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */ -OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0); -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +SLJIT_UNUSED_ARG(max); +SLJIT_UNUSED_ARG(backtracks); -OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); -if (full_read) +#ifdef SUPPORT_UNICODE +#if PCRE2_CODE_UNIT_WIDTH == 8 +if (common->utf) { - jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xc0); - OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0); - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + if (max < 128) return; + + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x80); + if (common->invalid_utf) + { + add_jump(compiler, &common->utfpeakcharback_invalid, JUMP(SLJIT_FAST_CALL)); + if (backtracks != NULL) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR)); + } + else + add_jump(compiler, &common->utfpeakcharback, JUMP(SLJIT_FAST_CALL)); JUMPHERE(jump); } +#elif PCRE2_CODE_UNIT_WIDTH == 16 +if (common->utf) + { + if (max < 0xd800) return; + + if (common->invalid_utf) + { + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800); + add_jump(compiler, &common->utfpeakcharback_invalid, JUMP(SLJIT_FAST_CALL)); + if (backtracks != NULL) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR)); + } + else + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xdc00); + jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe000 - 0xdc00); + /* TMP2 contains the low surrogate. */ + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x10000); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 10); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); + } + JUMPHERE(jump); + } +#elif PCRE2_CODE_UNIT_WIDTH == 32 + if (common->invalid_utf) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000)); +#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ +#endif /* SUPPORT_UNICODE */ } -#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */ +#define READ_CHAR_UPDATE_STR_PTR 0x1 +#define READ_CHAR_UTF8_NEWLINE 0x2 +#define READ_CHAR_NEWLINE (READ_CHAR_UPDATE_STR_PTR | READ_CHAR_UTF8_NEWLINE) +#define READ_CHAR_VALID_UTF 0x4 -static void read_char_range(compiler_common *common, sljit_u32 min, sljit_u32 max, BOOL update_str_ptr) +static void read_char(compiler_common *common, sljit_u32 min, sljit_u32 max, + jump_list **backtracks, sljit_u32 options) { /* Reads the precise value of a character into TMP1, if the character is between min and max (c >= min && c <= max). Otherwise it returns with a value @@ -3260,24 +3515,41 @@ struct sljit_jump *jump; struct sljit_jump *jump2; #endif -SLJIT_UNUSED_ARG(update_str_ptr); SLJIT_UNUSED_ARG(min); SLJIT_UNUSED_ARG(max); +SLJIT_UNUSED_ARG(backtracks); +SLJIT_UNUSED_ARG(options); SLJIT_ASSERT(min <= max); OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 +#ifdef SUPPORT_UNICODE +#if PCRE2_CODE_UNIT_WIDTH == 8 if (common->utf) { - if (max < 128 && !update_str_ptr) return; + if (max < 128 && !(options & READ_CHAR_UPDATE_STR_PTR)) return; + + if (common->invalid_utf && !(options & READ_CHAR_VALID_UTF)) + { + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x80); + + if (options & READ_CHAR_UTF8_NEWLINE) + add_jump(compiler, &common->utfreadnewline_invalid, JUMP(SLJIT_FAST_CALL)); + else + add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL)); + + if (backtracks != NULL) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR)); + JUMPHERE(jump); + return; + } jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); if (min >= 0x10000) { OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xf0); - if (update_str_ptr) + if (options & READ_CHAR_UPDATE_STR_PTR) OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0x7); @@ -3289,19 +3561,19 @@ if (common->utf) OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2)); - if (!update_str_ptr) + if (!(options & READ_CHAR_UPDATE_STR_PTR)) OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3)); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); JUMPHERE(jump2); - if (update_str_ptr) + if (options & READ_CHAR_UPDATE_STR_PTR) OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0); } else if (min >= 0x800 && max <= 0xffff) { OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xe0); - if (update_str_ptr) + if (options & READ_CHAR_UPDATE_STR_PTR) OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xf); @@ -3309,17 +3581,19 @@ if (common->utf) OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); - if (!update_str_ptr) + if (!(options & READ_CHAR_UPDATE_STR_PTR)) OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); JUMPHERE(jump2); - if (update_str_ptr) + if (options & READ_CHAR_UPDATE_STR_PTR) OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0); } else if (max >= 0x800) - add_jump(compiler, (max < 0x10000) ? &common->utfreadchar16 : &common->utfreadchar, JUMP(SLJIT_FAST_CALL)); + { + add_jump(compiler, &common->utfreadchar, JUMP(SLJIT_FAST_CALL)); + } else if (max < 128) { OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); @@ -3328,7 +3602,7 @@ if (common->utf) else { OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); - if (!update_str_ptr) + if (!(options & READ_CHAR_UPDATE_STR_PTR)) OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); else OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); @@ -3336,51 +3610,141 @@ if (common->utf) OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); - if (update_str_ptr) + if (options & READ_CHAR_UPDATE_STR_PTR) OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0); } JUMPHERE(jump); } -#endif - -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16 +#elif PCRE2_CODE_UNIT_WIDTH == 16 if (common->utf) { + if (max < 0xd800 && !(options & READ_CHAR_UPDATE_STR_PTR)) return; + + if (common->invalid_utf && !(options & READ_CHAR_VALID_UTF)) + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); + jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800); + + if (options & READ_CHAR_UTF8_NEWLINE) + add_jump(compiler, &common->utfreadnewline_invalid, JUMP(SLJIT_FAST_CALL)); + else + add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL)); + + if (backtracks != NULL) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR)); + JUMPHERE(jump); + return; + } + if (max >= 0x10000) { OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); - jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1); + jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800); /* TMP2 contains the high surrogate. */ OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); - OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x40); OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); - OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3ff); - OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000 - 0xdc00); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); JUMPHERE(jump); return; } - if (max < 0xd800 && !update_str_ptr) return; - /* Skip low surrogate if necessary. */ OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); - jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1); - if (update_str_ptr) - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); - if (max >= 0xd800) - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x10000); - JUMPHERE(jump); + + if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && sljit_get_register_index(RETURN_ADDR) >= 0) + { + if (options & READ_CHAR_UPDATE_STR_PTR) + OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x400); + if (options & READ_CHAR_UPDATE_STR_PTR) + CMOV(SLJIT_LESS, STR_PTR, RETURN_ADDR, 0); + if (max >= 0xd800) + CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, 0x10000); + } + else + { + jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400); + if (options & READ_CHAR_UPDATE_STR_PTR) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + if (max >= 0xd800) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x10000); + JUMPHERE(jump); + } } -#endif +#elif PCRE2_CODE_UNIT_WIDTH == 32 +if (common->invalid_utf) + { + if (backtracks != NULL) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000)); + else + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x110000); + CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR); + } + } +#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ +#endif /* SUPPORT_UNICODE */ +} + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 + +static BOOL is_char7_bitset(const sljit_u8 *bitset, BOOL nclass) +{ +/* Tells whether the character codes below 128 are enough +to determine a match. */ +const sljit_u8 value = nclass ? 0xff : 0; +const sljit_u8 *end = bitset + 32; + +bitset += 16; +do + { + if (*bitset++ != value) + return FALSE; + } +while (bitset < end); +return TRUE; } -static SLJIT_INLINE void read_char(compiler_common *common) +static void read_char7_type(compiler_common *common, jump_list **backtracks, BOOL negated) { -read_char_range(common, 0, READ_CHAR_MAX, TRUE); +/* Reads the precise character type of a character into TMP1, if the character +is less than 128. Otherwise it returns with zero. Does not check STR_END. The +full_read argument tells whether characters above max are accepted or not. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +SLJIT_ASSERT(common->utf); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +/* All values > 127 are zero in ctypes. */ +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); + +if (negated) + { + jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x80); + + if (common->invalid_utf) + { + add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); + } + else + { + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + } + JUMPHERE(jump); + } } -static void read_char8_type(compiler_common *common, BOOL update_str_ptr) +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */ + +static void read_char8_type(compiler_common *common, jump_list **backtracks, BOOL negated) { /* Reads the character type into TMP1, updates STR_PTR. Does not check STR_END. */ DEFINE_COMPILER; @@ -3391,7 +3755,8 @@ struct sljit_jump *jump; struct sljit_jump *jump2; #endif -SLJIT_UNUSED_ARG(update_str_ptr); +SLJIT_UNUSED_ARG(backtracks); +SLJIT_UNUSED_ARG(negated); OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); @@ -3399,18 +3764,38 @@ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 if (common->utf) { - /* This can be an extra read in some situations, but hopefully - it is needed in most cases. */ + /* The result of this read may be unused, but saves an "else" part. */ OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); - jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xc0); - if (!update_str_ptr) + jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x80); + + if (!negated) { + if (common->invalid_utf) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); - OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2); + if (common->invalid_utf) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe0 - 0xc2)); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); - OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); - OP2(SLJIT_OR, TMP2, 0, TMP2, 0, TMP1, 0); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x80); + if (common->invalid_utf) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40)); + + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); + jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); + JUMPHERE(jump2); + } + else if (common->invalid_utf) + { + add_jump(compiler, &common->utfreadchar_invalid, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, TMP2, 0, TMP1, 0); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); @@ -3418,43 +3803,98 @@ if (common->utf) } else add_jump(compiler, &common->utfreadtype8, JUMP(SLJIT_FAST_CALL)); + JUMPHERE(jump); return; } #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */ +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 32 +if (common->invalid_utf && negated) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x110000)); +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 32 */ + #if PCRE2_CODE_UNIT_WIDTH != 8 /* The ctypes array contains only 256 values. */ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255); -#endif +#endif /* PCRE2_CODE_UNIT_WIDTH != 8 */ OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); #if PCRE2_CODE_UNIT_WIDTH != 8 JUMPHERE(jump); -#endif +#endif /* PCRE2_CODE_UNIT_WIDTH != 8 */ #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16 -if (common->utf && update_str_ptr) +if (common->utf && negated) { /* Skip low surrogate if necessary. */ + if (!common->invalid_utf) + { + OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800); + + if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && sljit_get_register_index(RETURN_ADDR) >= 0) + { + OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x400); + CMOV(SLJIT_LESS, STR_PTR, RETURN_ADDR, 0); + } + else + { + jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPHERE(jump); + } + return; + } + OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800); - jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1); + jump = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400)); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xdc00); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400)); + JUMPHERE(jump); + return; } #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16 */ } -static void skip_char_back(compiler_common *common) +static void move_back(compiler_common *common, jump_list **backtracks, BOOL must_be_valid) { -/* Goes one character back. Affects STR_PTR and TMP1. Does not check begin. */ +/* Goes one character back. TMP2 must contain the start of +the subject buffer. Affects STR_PTR and TMP1. Does not modify +STR_PTR for invalid character sequences. */ DEFINE_COMPILER; + +SLJIT_UNUSED_ARG(backtracks); +SLJIT_UNUSED_ARG(must_be_valid); + #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +struct sljit_jump *jump; +#endif + +#ifdef SUPPORT_UNICODE #if PCRE2_CODE_UNIT_WIDTH == 8 struct sljit_label *label; if (common->utf) { + if (!must_be_valid && common->invalid_utf) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x80); + add_jump(compiler, &common->utfmoveback_invalid, JUMP(SLJIT_FAST_CALL)); + if (backtracks != NULL) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0)); + JUMPHERE(jump); + return; + } + label = LABEL(); OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1)); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); @@ -3467,16 +3907,45 @@ if (common->utf) { OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1)); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + if (!must_be_valid && common->invalid_utf) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800); + jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xe000 - 0xd800); + add_jump(compiler, &common->utfmoveback_invalid, JUMP(SLJIT_FAST_CALL)); + if (backtracks != NULL) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0)); + JUMPHERE(jump); + return; + } + /* Skip low surrogate if necessary. */ OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xdc00); OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); - OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0); return; } -#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */ -#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */ +#elif PCRE2_CODE_UNIT_WIDTH == 32 +if (common->invalid_utf && !must_be_valid) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1)); + if (backtracks != NULL) + { + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + return; + } + + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x110000); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_LESS); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + return; + } +#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ +#endif /* SUPPORT_UNICODE */ OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); } @@ -3519,13 +3988,12 @@ else static void do_utfreadchar(compiler_common *common) { /* Fast decoding a UTF-8 character. TMP1 contains the first byte -of the character (>= 0xc0). Return char value in TMP1, length in TMP2. */ +of the character (>= 0xc0). Return char value in TMP1. */ DEFINE_COMPILER; struct sljit_jump *jump; sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); -OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); @@ -3534,13 +4002,12 @@ OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); jump = JUMP(SLJIT_NOT_ZERO); /* Two byte sequence. */ +OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3000); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); -OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(2)); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); JUMPHERE(jump); OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); -OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x800); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); @@ -3548,55 +4015,18 @@ OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x10000); jump = JUMP(SLJIT_NOT_ZERO); /* Three byte sequence. */ +OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0000); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); -OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(3)); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); /* Four byte sequence. */ JUMPHERE(jump); OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2)); -OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000); -OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xf0000); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3)); -OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); -OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); -OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(4)); -sljit_emit_fast_return(compiler, RETURN_ADDR, 0); -} - -static void do_utfreadchar16(compiler_common *common) -{ -/* Fast decoding a UTF-8 character. TMP1 contains the first byte -of the character (>= 0xc0). Return value in TMP1. */ -DEFINE_COMPILER; -struct sljit_jump *jump; - -sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); -OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); -OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); - -/* Searching for the first zero. */ -OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); -jump = JUMP(SLJIT_NOT_ZERO); -/* Two byte sequence. */ -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); -sljit_emit_fast_return(compiler, RETURN_ADDR, 0); - -JUMPHERE(jump); -OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x400); -OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_NOT_ZERO); -/* This code runs only in 8 bit mode. No need to shift the value. */ -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); -OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); -OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x800); -OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); -OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); -OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); -/* Three byte sequence. */ -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); } @@ -3636,8 +4066,644 @@ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); } +static void do_utfreadchar_invalid(compiler_common *common) +{ +/* Slow decoding a UTF-8 character. TMP1 contains the first byte +of the character (>= 0xc0). Return char value in TMP1. STR_PTR is +undefined for invalid characters. */ +DEFINE_COMPILER; +sljit_s32 i; +sljit_s32 has_cmov = sljit_has_cpu_feature(SLJIT_HAS_CMOV); +struct sljit_jump *jump; +struct sljit_jump *buffer_end_close; +struct sljit_label *three_byte_entry; +struct sljit_label *exit_invalid_label; +struct sljit_jump *exit_invalid[11]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc2); + +/* Usually more than 3 characters remained in the subject buffer. */ +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3)); + +/* Not a valid start of a multi-byte sequence, no more bytes read. */ +exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xf5 - 0xc2); + +buffer_end_close = CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-3)); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +/* If TMP2 is in 0x80-0xbf range, TMP1 is also increased by (0x2 << 6). */ +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80); +exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40); + +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); +jump = JUMP(SLJIT_NOT_ZERO); + +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump); + +/* Three-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x40); + CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, 0x20000); + exit_invalid[2] = NULL; + } +else + exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40); + +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x10000); +jump = JUMP(SLJIT_NOT_ZERO); + +three_byte_entry = LABEL(); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x2d800); +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); + CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0xd800); + exit_invalid[3] = NULL; + } +else + exit_invalid[3] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); + CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR); + exit_invalid[4] = NULL; + } +else + exit_invalid[4] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump); + +/* Four-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x40); + CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, 0); + exit_invalid[5] = NULL; + } +else + exit_invalid[5] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc10000); +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x100000); + CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0x10000); + exit_invalid[6] = NULL; + } +else + exit_invalid[6] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000); + +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(buffer_end_close); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); +exit_invalid[7] = CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0); + +/* Two-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +/* If TMP2 is in 0x80-0xbf range, TMP1 is also increased by (0x2 << 6). */ +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80); +exit_invalid[8] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40); + +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); +jump = JUMP(SLJIT_NOT_ZERO); + +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +/* Three-byte sequence. */ +JUMPHERE(jump); +exit_invalid[9] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x40); + CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR); + exit_invalid[10] = NULL; + } +else + exit_invalid[10] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40); + +/* One will be substracted from STR_PTR later. */ +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + +/* Four byte sequences are not possible. */ +CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x30000, three_byte_entry); + +exit_invalid_label = LABEL(); +for (i = 0; i < 11; i++) + sljit_set_label(exit_invalid[i], exit_invalid_label); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfreadnewline_invalid(compiler_common *common) +{ +/* Slow decoding a UTF-8 character, specialized for newlines. +TMP1 contains the first byte of the character (>= 0xc0). Return +char value in TMP1. */ +DEFINE_COMPILER; +struct sljit_label *loop; +struct sljit_label *skip_start; +struct sljit_label *three_byte_exit; +struct sljit_jump *jump[5]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +if (common->nltype != NLTYPE_ANY) + { + SLJIT_ASSERT(common->nltype != NLTYPE_FIXED || common->newline < 128); + + /* All newlines are ascii, just skip intermediate octets. */ + jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + loop = LABEL(); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc0); + CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0x80, loop); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + JUMPHERE(jump[0]); + + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); + sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + return; + } + +jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +jump[1] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xc2); +jump[2] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xe2); + +skip_start = LABEL(); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc0); +jump[3] = CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0x80); + +/* Skip intermediate octets. */ +loop = LABEL(); +jump[4] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc0); +CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0x80, loop); + +JUMPHERE(jump[3]); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +three_byte_exit = LABEL(); +JUMPHERE(jump[0]); +JUMPHERE(jump[4]); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +/* Two byte long newline: 0x85. */ +JUMPHERE(jump[1]); +CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0x85, skip_start); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x85); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +/* Three byte long newlines: 0x2028 and 0x2029. */ +JUMPHERE(jump[2]); +CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0x80, skip_start); +CMPTO(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0, three_byte_exit); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +OP2(SLJIT_SUB, TMP1, 0, TMP2, 0, SLJIT_IMM, 0x80); +CMPTO(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x40, skip_start); + +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0x2000); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfmoveback_invalid(compiler_common *common) +{ +/* Goes one character back. */ +DEFINE_COMPILER; +sljit_s32 i; +struct sljit_jump *jump; +struct sljit_jump *buffer_start_close; +struct sljit_label *exit_ok_label; +struct sljit_label *exit_invalid_label; +struct sljit_jump *exit_invalid[7]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3)); +exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xc0); + +/* Two-byte sequence. */ +buffer_start_close = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2)); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0); +jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x20); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +/* Three-byte sequence. */ +JUMPHERE(jump); +exit_invalid[1] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, -0x40); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0); +jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x10); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +/* Four-byte sequence. */ +JUMPHERE(jump); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0 - 0x80); +exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x40); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xf0); +exit_invalid[3] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x05); + +exit_ok_label = LABEL(); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +/* Two-byte sequence. */ +JUMPHERE(buffer_start_close); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + +exit_invalid[4] = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0); +CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x20, exit_ok_label); + +/* Three-byte sequence. */ +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +exit_invalid[5] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, -0x40); +exit_invalid[6] = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0); +CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10, exit_ok_label); + +/* Four-byte sequences are not possible. */ + +exit_invalid_label = LABEL(); +sljit_set_label(exit_invalid[5], exit_invalid_label); +sljit_set_label(exit_invalid[6], exit_invalid_label); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(exit_invalid[4]); +/* -2 + 4 = 2 */ +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + +exit_invalid_label = LABEL(); +for (i = 0; i < 4; i++) + sljit_set_label(exit_invalid[i], exit_invalid_label); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(4)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfpeakcharback(compiler_common *common) +{ +/* Peak a character back. */ +DEFINE_COMPILER; +struct sljit_jump *jump[2]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0); +jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x20); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-3)); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0); +jump[1] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-4)); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xe0 - 0x80); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf0); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +JUMPHERE(jump[1]); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +JUMPHERE(jump[0]); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x80); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfpeakcharback_invalid(compiler_common *common) +{ +/* Peak a character back. */ +DEFINE_COMPILER; +sljit_s32 i; +sljit_s32 has_cmov = sljit_has_cpu_feature(SLJIT_HAS_CMOV); +struct sljit_jump *jump[2]; +struct sljit_label *two_byte_entry; +struct sljit_label *three_byte_entry; +struct sljit_label *exit_invalid_label; +struct sljit_jump *exit_invalid[8]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(3)); +exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xc0); +jump[0] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0); + +/* Two-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2); +jump[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x1e); + +two_byte_entry = LABEL(); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); +/* If TMP1 is in 0x80-0xbf range, TMP1 is also increased by (0x2 << 6). */ +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump[1]); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2 - 0x80); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x80); +exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +/* Three-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-3)); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xe0); +jump[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x10); + +three_byte_entry = LABEL(); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 12); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800); +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); + CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, -0xd800); + exit_invalid[2] = NULL; + } +else + exit_invalid[2] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800); + +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800); +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); + CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR); + exit_invalid[3] = NULL; + } +else + exit_invalid[3] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x800); + +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump[1]); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xe0 - 0x80); +exit_invalid[4] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 12); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +/* Four-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-4)); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf0); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 18); +/* ADD is used instead of OR because of the SUB 0x10000 above. */ +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); + +if (has_cmov) + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x100000); + CMOV(SLJIT_GREATER_EQUAL, TMP1, SLJIT_IMM, INVALID_UTF_CHAR - 0x10000); + exit_invalid[5] = NULL; + } +else + exit_invalid[5] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x100000); + +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump[0]); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +jump[0] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0); + +/* Two-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2); +CMPTO(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x1e, two_byte_entry); + +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2 - 0x80); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x80); +exit_invalid[6] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x40); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +/* Three-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-3)); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xe0); +CMPTO(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x10, three_byte_entry); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump[0]); +exit_invalid[7] = CMP(SLJIT_GREATER, TMP2, 0, STR_PTR, 0); + +/* Two-byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xc2); +CMPTO(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0x1e, two_byte_entry); + +exit_invalid_label = LABEL(); +for (i = 0; i < 8; i++) + sljit_set_label(exit_invalid[i], exit_invalid_label); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */ +#if PCRE2_CODE_UNIT_WIDTH == 16 + +static void do_utfreadchar_invalid(compiler_common *common) +{ +/* Slow decoding a UTF-16 character. TMP1 contains the first half +of the character (>= 0xd800). Return char value in TMP1. STR_PTR is +undefined for invalid characters. */ +DEFINE_COMPILER; +struct sljit_jump *exit_invalid[3]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +/* TMP2 contains the high surrogate. */ +exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00); +exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xdc00); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x10000); +exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x400); + +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(exit_invalid[0]); +JUMPHERE(exit_invalid[1]); +JUMPHERE(exit_invalid[2]); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfreadnewline_invalid(compiler_common *common) +{ +/* Slow decoding a UTF-16 character, specialized for newlines. +TMP1 contains the first half of the character (>= 0xd800). Return +char value in TMP1. */ + +DEFINE_COMPILER; +struct sljit_jump *exit_invalid[2]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +/* TMP2 contains the high surrogate. */ +exit_invalid[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00); + +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xdc00); +OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x400); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x10000); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCHAR_SHIFT); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(exit_invalid[0]); +JUMPHERE(exit_invalid[1]); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfmoveback_invalid(compiler_common *common) +{ +/* Goes one character back. */ +DEFINE_COMPILER; +struct sljit_jump *exit_invalid[3]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +exit_invalid[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x400); +exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800); +exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x400); + +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 1); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(exit_invalid[0]); +JUMPHERE(exit_invalid[1]); +JUMPHERE(exit_invalid[2]); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfpeakcharback_invalid(compiler_common *common) +{ +/* Peak a character back. */ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_jump *exit_invalid[3]; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0xe000); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +exit_invalid[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xdc00); +exit_invalid[1] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, STR_PTR, 0); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000 - 0xdc00); +OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800); +exit_invalid[2] = CMP(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 0x400); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); + +JUMPHERE(jump); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(exit_invalid[0]); +JUMPHERE(exit_invalid[1]); +JUMPHERE(exit_invalid[2]); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +#endif /* PCRE2_CODE_UNIT_WIDTH == 16 */ + /* UCD_BLOCK_SIZE must be 128 (see the assert below). */ #define UCD_BLOCK_MASK 127 #define UCD_BLOCK_SHIFT 7 @@ -3653,12 +4719,12 @@ struct sljit_jump *jump; #if defined SLJIT_DEBUG && SLJIT_DEBUG /* dummy_ucd_record */ -const ucd_record *record = GET_UCD(INVALID_UTF_CHAR); -SLJIT_ASSERT(record->script == ucp_Common && record->chartype == ucp_Cn && record->gbprop == ucp_gbOther); +const ucd_record *record = GET_UCD(UNASSIGNED_UTF_CHAR); +SLJIT_ASSERT(record->script == ucp_Unknown && record->chartype == ucp_Cn && record->gbprop == ucp_gbOther); SLJIT_ASSERT(record->caseset == 0 && record->other_case == 0); #endif -SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 8); +SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 12); sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); @@ -3666,7 +4732,47 @@ sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); if (!common->utf) { jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, MAX_UTF_CODE_POINT + 1); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, UNASSIGNED_UTF_CHAR); + JUMPHERE(jump); + } +#endif + +OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); +OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1)); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2)); +OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_getucdtype(compiler_common *common) +{ +/* Search the UCD record for the character comes in TMP1. +Returns chartype in TMP1 and UCD offset in TMP2. */ +DEFINE_COMPILER; +#if PCRE2_CODE_UNIT_WIDTH == 32 +struct sljit_jump *jump; +#endif + +#if defined SLJIT_DEBUG && SLJIT_DEBUG +/* dummy_ucd_record */ +const ucd_record *record = GET_UCD(UNASSIGNED_UTF_CHAR); +SLJIT_ASSERT(record->script == ucp_Unknown && record->chartype == ucp_Cn && record->gbprop == ucp_gbOther); +SLJIT_ASSERT(record->caseset == 0 && record->other_case == 0); +#endif + +SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 12); + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +#if PCRE2_CODE_UNIT_WIDTH == 32 +if (!common->utf) + { + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, MAX_UTF_CODE_POINT + 1); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, UNASSIGNED_UTF_CHAR); JUMPHERE(jump); } #endif @@ -3679,8 +4785,19 @@ OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2)); OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1); + +// PH hacking +//fprintf(stderr, "~~A\n"); + OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype)); -OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); + + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 0); + +// OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); } @@ -3695,8 +4812,9 @@ struct sljit_jump *start; struct sljit_jump *end = NULL; struct sljit_jump *end2 = NULL; #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 -struct sljit_jump *singlechar; -#endif +struct sljit_label *loop; +struct sljit_jump *jump; +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */ jump_list *newline = NULL; sljit_u32 overall_options = common->re->overall_options; BOOL hascrorlf = (common->re->flags & PCRE2_HASCRORLF) != 0; @@ -3733,7 +4851,7 @@ if ((overall_options & PCRE2_FIRSTLINE) != 0) mainloop = LABEL(); /* Continual stores does not cause data dependency. */ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0); - read_char_range(common, common->nlmin, common->nlmax, TRUE); + read_char(common, common->nlmin, common->nlmax, NULL, READ_CHAR_NEWLINE); check_newlinechar(common, common->nltype, &newline, TRUE); CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, mainloop); JUMPHERE(end); @@ -3753,11 +4871,9 @@ else if ((overall_options & PCRE2_USE_OFFSET_LIMIT) != 0) OP1(SLJIT_MOV, TMP2, 0, STR_END, 0); end = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, (sljit_sw) PCRE2_UNSET); OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); -#if PCRE2_CODE_UNIT_WIDTH == 16 - OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); -#elif PCRE2_CODE_UNIT_WIDTH == 32 - OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 2); -#endif +#if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32 + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); +#endif /* PCRE2_CODE_UNIT_WIDTH == [16|32] */ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); end2 = CMP(SLJIT_LESS_EQUAL, TMP2, 0, STR_END, 0); @@ -3781,7 +4897,7 @@ if (newlinecheck) OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); #if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32 OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); -#endif +#endif /* PCRE2_CODE_UNIT_WIDTH == [16|32] */ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); end2 = JUMP(SLJIT_JUMP); } @@ -3789,9 +4905,9 @@ if (newlinecheck) mainloop = LABEL(); /* Increasing the STR_PTR here requires one less jump in the most common case. */ -#ifdef SUPPORT_UNICODE -if (common->utf) readuchar = TRUE; -#endif +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +if (common->utf && !common->invalid_utf) readuchar = TRUE; +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */ if (newlinecheck) readuchar = TRUE; if (readuchar) @@ -3803,23 +4919,55 @@ if (newlinecheck) OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 #if PCRE2_CODE_UNIT_WIDTH == 8 -if (common->utf) +if (common->invalid_utf) + { + /* Skip continuation code units. */ + loop = LABEL(); + jump = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x80); + CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x40, loop); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPHERE(jump); + } +else if (common->utf) { - singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); - JUMPHERE(singlechar); + JUMPHERE(jump); } #elif PCRE2_CODE_UNIT_WIDTH == 16 -if (common->utf) +if (common->invalid_utf) { - singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800); - OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); - OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); - OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); - OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); - JUMPHERE(singlechar); + /* Skip continuation code units. */ + loop = LABEL(); + jump = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xdc00); + CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x400, loop); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPHERE(jump); + } +else if (common->utf) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xd800); + + if (sljit_has_cpu_feature(SLJIT_HAS_CMOV)) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x400); + CMOV(SLJIT_LESS, STR_PTR, TMP2, 0); + } + else + { + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x400); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_LESS); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + } } #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */ #endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */ @@ -4305,16 +5453,16 @@ return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00); static sljit_s32 character_to_int32(PCRE2_UCHAR chr) { -sljit_s32 value = (sljit_s32)chr; +sljit_u32 value = chr; #if PCRE2_CODE_UNIT_WIDTH == 8 #define SSE2_COMPARE_TYPE_INDEX 0 -return (value << 24) | (value << 16) | (value << 8) | value; +return (sljit_s32)((value << 24) | (value << 16) | (value << 8) | value); #elif PCRE2_CODE_UNIT_WIDTH == 16 #define SSE2_COMPARE_TYPE_INDEX 1 -return (value << 16) | value; +return (sljit_s32)((value << 16) | value); #elif PCRE2_CODE_UNIT_WIDTH == 32 #define SSE2_COMPARE_TYPE_INDEX 2 -return value; +return (sljit_s32)(value); #else #error "Unsupported unit width" #endif @@ -5120,7 +6268,7 @@ for (i = 0; i < max; i++) } #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) && !(defined _WIN64) -if (check_fast_forward_char_pair_sse2(common, chars, max)) +if (sljit_has_cpu_feature(SLJIT_HAS_SSE2) && check_fast_forward_char_pair_sse2(common, chars, max)) return TRUE; #endif @@ -5356,14 +6504,15 @@ if (common->nltype == NLTYPE_FIXED && common->newline > 255) } OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +/* Example: match /^/ to \r\n from offset 1. */ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0); -skip_char_back(common); +move_back(common, NULL, FALSE); loop = LABEL(); common->ff_newline_shortcut = loop; -read_char_range(common, common->nlmin, common->nlmax, TRUE); +read_char(common, common->nlmin, common->nlmax, NULL, READ_CHAR_NEWLINE); lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); if (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF) foundcr = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); @@ -5544,7 +6693,7 @@ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), -sizeof(sljit_sw)); jump = CMP(SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0); OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); -if (sljit_get_register_index (TMP3) < 0) +if (sljit_get_register_index(TMP3) < 0) { OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -(2 * sizeof(sljit_sw))); OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_sw), SLJIT_MEM1(STACK_TOP), -(3 * sizeof(sljit_sw))); @@ -5569,7 +6718,7 @@ sljit_emit_fast_return(compiler, RETURN_ADDR, 0); JUMPHERE(jump); OP1(SLJIT_NEG, TMP2, 0, TMP2, 0); OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); -if (sljit_get_register_index (TMP3) < 0) +if (sljit_get_register_index(TMP3) < 0) { OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -(2 * sizeof(sljit_sw))); OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2 * sizeof(sljit_sw)); @@ -5588,21 +6737,29 @@ static void check_wordboundary(compiler_common *common) DEFINE_COMPILER; struct sljit_jump *skipread; jump_list *skipread_list = NULL; +jump_list *invalid_utf = NULL; #if PCRE2_CODE_UNIT_WIDTH != 8 || defined SUPPORT_UNICODE struct sljit_jump *jump; -#endif +#endif /* PCRE2_CODE_UNIT_WIDTH != 8 || SUPPORT_UNICODE */ SLJIT_COMPILE_ASSERT(ctype_word == 0x10, ctype_word_must_be_16); sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); -/* Get type of the previous char, and put it to LOCALS1. */ +/* Get type of the previous char, and put it to TMP3. */ OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); -OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); -OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, SLJIT_IMM, 0); -skipread = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP1, 0); -skip_char_back(common); -check_start_used_ptr(common); -read_char(common); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); +OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0); +skipread = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0); + +if (common->mode == PCRE2_JIT_COMPLETE) + peek_char_back(common, READ_CHAR_MAX, &invalid_utf); +else + { + move_back(common, &invalid_utf, FALSE); + check_start_used_ptr(common); + /* No need precise read since match fails anyway. */ + read_char(common, 0, READ_CHAR_MAX, &invalid_utf, READ_CHAR_UPDATE_STR_PTR); + } /* Testing char type. */ #ifdef SUPPORT_UNICODE @@ -5610,7 +6767,7 @@ if (common->use_ucp) { OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1); jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE); - add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, &common->getucdtype, JUMP(SLJIT_FAST_CALL)); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll); OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); @@ -5618,23 +6775,22 @@ if (common->use_ucp) OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); JUMPHERE(jump); - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP2, 0); + OP1(SLJIT_MOV, TMP3, 0, TMP2, 0); } else -#endif +#endif /* SUPPORT_UNICODE */ { #if PCRE2_CODE_UNIT_WIDTH != 8 jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); #elif defined SUPPORT_UNICODE - /* Here LOCALS1 has already been zeroed. */ + /* Here TMP3 has already been zeroed. */ jump = NULL; if (common->utf) jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */ OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), common->ctypes); OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 4 /* ctype_word */); - OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP1, 0); + OP2(SLJIT_AND, TMP3, 0, TMP1, 0, SLJIT_IMM, 1); #if PCRE2_CODE_UNIT_WIDTH != 8 JUMPHERE(jump); #elif defined SUPPORT_UNICODE @@ -5646,7 +6802,7 @@ JUMPHERE(skipread); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); check_str_end(common, &skipread_list); -peek_char(common, READ_CHAR_MAX); +peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, &invalid_utf); /* Testing char type. This is a code duplication. */ #ifdef SUPPORT_UNICODE @@ -5654,7 +6810,7 @@ if (common->use_ucp) { OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1); jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE); - add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, &common->getucdtype, JUMP(SLJIT_FAST_CALL)); OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll); OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); @@ -5664,7 +6820,7 @@ if (common->use_ucp) JUMPHERE(jump); } else -#endif +#endif /* SUPPORT_UNICODE */ { #if PCRE2_CODE_UNIT_WIDTH != 8 /* TMP2 may be destroyed by peek_char. */ @@ -5688,8 +6844,22 @@ else } set_jumps(skipread_list, LABEL()); -OP2(SLJIT_XOR | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); -sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); +OP2(SLJIT_XOR | SLJIT_SET_Z, TMP2, 0, TMP2, 0, TMP3, 0); +sljit_emit_fast_return(compiler, TMP1, 0); + +#ifdef SUPPORT_UNICODE +if (common->invalid_utf) + { + SLJIT_ASSERT(invalid_utf != NULL); + + set_jumps(invalid_utf, LABEL()); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, -1); + sljit_emit_fast_return(compiler, TMP1, 0); + return; + } +#endif /* SUPPORT_UNICODE */ } static BOOL optimize_class_ranges(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks) @@ -5856,9 +7026,6 @@ int i, j, k, len, c; if (!sljit_has_cpu_feature(SLJIT_HAS_CMOV)) return FALSE; -if (invert) - nclass = !nclass; - len = 0; for (i = 0; i < 32; i++) @@ -5940,6 +7107,9 @@ if (j != 0) } } +if (invert) + nclass = !nclass; + type = nclass ? SLJIT_NOT_EQUAL : SLJIT_EQUAL; add_jump(compiler, backtracks, CMP(type, TMP2, 0, SLJIT_IMM, 0)); return TRUE; @@ -6225,37 +7395,6 @@ OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); sljit_emit_fast_return(compiler, TMP1, 0); } -#if defined SUPPORT_UNICODE - -static PCRE2_SPTR SLJIT_FUNC do_utf_caselesscmp(PCRE2_SPTR src1, PCRE2_SPTR src2, PCRE2_SPTR end1, PCRE2_SPTR end2) -{ -/* This function would be ineffective to do in JIT level. */ -sljit_u32 c1, c2; -const ucd_record *ur; -const sljit_u32 *pp; - -while (src1 < end1) - { - if (src2 >= end2) - return (PCRE2_SPTR)1; - GETCHARINC(c1, src1); - GETCHARINC(c2, src2); - ur = GET_UCD(c2); - if (c1 != c2 && c1 != c2 + ur->other_case) - { - pp = PRIV(ucd_caseless_sets) + ur->caseset; - for (;;) - { - if (c1 < *pp) return NULL; - if (c1 == *pp++) break; - } - } - } -return src2; -} - -#endif /* SUPPORT_UNICODE */ - static PCRE2_SPTR byte_sequence_compare(compiler_common *common, BOOL caseless, PCRE2_SPTR cc, compare_context *context, jump_list **backtracks) { @@ -6297,7 +7436,7 @@ if (context->sourcereg == -1) OP1(SLJIT_MOV_U16, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); else #endif - OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); #elif PCRE2_CODE_UNIT_WIDTH == 16 #if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED if (context->length >= 4) @@ -6444,7 +7583,7 @@ PCRE2_SPTR ccbegin; int compares, invertcmp, numberofcmps; #if defined SUPPORT_UNICODE && (PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16) BOOL utf = common->utf; -#endif +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == [8|16] */ #ifdef SUPPORT_UNICODE BOOL needstype = FALSE, needsscript = FALSE, needschar = FALSE; @@ -6452,7 +7591,7 @@ BOOL charsaved = FALSE; int typereg = TMP1; const sljit_u32 *other_cases; sljit_uw typeoffset; -#endif +#endif /* SUPPORT_UNICODE */ /* Scanning the necessary info. */ cc++; @@ -6476,7 +7615,7 @@ while (*cc != XCL_END) if (c < min) min = c; #ifdef SUPPORT_UNICODE needschar = TRUE; -#endif +#endif /* SUPPORT_UNICODE */ } else if (*cc == XCL_RANGE) { @@ -6487,7 +7626,7 @@ while (*cc != XCL_END) if (c > max) max = c; #ifdef SUPPORT_UNICODE needschar = TRUE; -#endif +#endif /* SUPPORT_UNICODE */ } #ifdef SUPPORT_UNICODE else @@ -6555,13 +7694,16 @@ while (*cc != XCL_END) } cc += 2; } -#endif +#endif /* SUPPORT_UNICODE */ } SLJIT_ASSERT(compares > 0); /* We are not necessary in utf mode even in 8 bit mode. */ cc = ccbegin; -read_char_range(common, min, max, (cc[-1] & XCL_NOT) != 0); +if ((cc[-1] & XCL_NOT) != 0) + read_char(common, min, max, backtracks, READ_CHAR_UPDATE_STR_PTR); +else + read_char(common, min, max, NULL, 0); if ((cc[-1] & XCL_HASPROP) == 0) { @@ -6594,13 +7736,13 @@ else if ((cc[-1] & XCL_MAP) != 0) OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0); #ifdef SUPPORT_UNICODE charsaved = TRUE; -#endif +#endif /* SUPPORT_UNICODE */ if (!optimize_class(common, (const sljit_u8 *)cc, FALSE, TRUE, list)) { #if PCRE2_CODE_UNIT_WIDTH == 8 jump = NULL; if (common->utf) -#endif +#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */ jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); @@ -6612,7 +7754,7 @@ else if ((cc[-1] & XCL_MAP) != 0) #if PCRE2_CODE_UNIT_WIDTH == 8 if (common->utf) -#endif +#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */ JUMPHERE(jump); } @@ -6630,10 +7772,10 @@ if (needstype || needsscript) if (!common->utf) { jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, MAX_UTF_CODE_POINT + 1); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, UNASSIGNED_UTF_CHAR); JUMPHERE(jump); } -#endif +#endif /* PCRE2_CODE_UNIT_WIDTH == 32 */ OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); @@ -6647,8 +7789,18 @@ if (needstype || needsscript) /* Before anything else, we deal with scripts. */ if (needsscript) { +// PH hacking +//fprintf(stderr, "~~B\n"); + + OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script)); - OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); + + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 0); + + // OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); ccbegin = cc; @@ -6686,33 +7838,49 @@ if (needstype || needsscript) } if (needschar) - { OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0); - } if (needstype) { if (!needschar) { +// PH hacking +//fprintf(stderr, "~~C\n"); + OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); + OP2(SLJIT_ADD, TMP1, 0, TMP2, 0, TMP1, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype)); - OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); + + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 0); + +// OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); } else { +// PH hacking +//fprintf(stderr, "~~D\n"); + OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3); + + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); + OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0); + OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype)); typereg = RETURN_ADDR; } } } -#endif +#endif /* SUPPORT_UNICODE */ /* Generating code. */ charoffset = 0; numberofcmps = 0; #ifdef SUPPORT_UNICODE typeoffset = 0; -#endif +#endif /* SUPPORT_UNICODE */ while (*cc != XCL_END) { @@ -6979,7 +8147,7 @@ while (*cc != XCL_END) } cc += 2; } -#endif +#endif /* SUPPORT_UNICODE */ if (jump != NULL) add_jump(compiler, compares > 0 ? list : backtracks, jump); @@ -7020,6 +8188,15 @@ switch(type) case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: add_jump(compiler, &common->wordboundary, JUMP(SLJIT_FAST_CALL)); +#ifdef SUPPORT_UNICODE + if (common->invalid_utf) + { + OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_SIG_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0); + add_jump(compiler, backtracks, JUMP(SLJIT_SIG_LESS)); + add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO)); + return cc; + } +#endif /* SUPPORT_UNICODE */ sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO)); return cc; @@ -7078,13 +8255,13 @@ switch(type) } else { - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STR_PTR, 0); - read_char_range(common, common->nlmin, common->nlmax, TRUE); + OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0); + read_char(common, common->nlmin, common->nlmax, backtracks, READ_CHAR_UPDATE_STR_PTR); add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0)); add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL)); sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(SLJIT_ZERO)); - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); + OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0); } JUMPHERE(jump[2]); JUMPHERE(jump[3]); @@ -7143,7 +8320,7 @@ switch(type) } else { - peek_char(common, common->nlmax); + peek_char(common, common->nlmax, TMP3, 0, NULL); check_newlinechar(common, common->nltype, backtracks, FALSE); } JUMPHERE(jump[0]); @@ -7158,10 +8335,10 @@ switch(type) return cc; case OP_CIRCM: - OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); - jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0); - OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0); + OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); jump[0] = JUMP(SLJIT_JUMP); JUMPHERE(jump[1]); @@ -7171,8 +8348,8 @@ switch(type) if (common->nltype == NLTYPE_FIXED && common->newline > 255) { - OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); - add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, TMP1, 0)); + OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, TMP2, 0)); OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); @@ -7180,8 +8357,7 @@ switch(type) } else { - skip_char_back(common); - read_char_range(common, common->nlmin, common->nlmax, TRUE); + peek_char_back(common, common->nlmax, backtracks); check_newlinechar(common, common->nltype, backtracks, FALSE); } JUMPHERE(jump[0]); @@ -7195,12 +8371,12 @@ switch(type) #ifdef SUPPORT_UNICODE if (common->utf) { - OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); - OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, length); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, length); label = LABEL(); - add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP3, 0)); - skip_char_back(common); - OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); + add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0)); + move_back(common, backtracks, FALSE); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP3, 0, TMP3, 0, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, label); } else @@ -7225,21 +8401,28 @@ static PCRE2_SPTR SLJIT_FUNC do_extuni_utf(jit_arguments *args, PCRE2_SPTR cc) { PCRE2_SPTR start_subject = args->begin; PCRE2_SPTR end_subject = args->end; -int lgb, rgb, len, ricount; -PCRE2_SPTR prevcc, bptr; +int lgb, rgb, ricount; +PCRE2_SPTR prevcc, startcc, bptr; +BOOL first = TRUE; uint32_t c; prevcc = cc; -GETCHARINC(c, cc); -lgb = UCD_GRAPHBREAK(c); - -while (cc < end_subject) +startcc = NULL; +do { - len = 1; - GETCHARLEN(c, cc, len); + GETCHARINC(c, cc); rgb = UCD_GRAPHBREAK(c); - if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + if (first) + { + lgb = rgb; + startcc = cc; + first = FALSE; + continue; + } + + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) + break; /* Not breaking between Regional Indicators is allowed only if there are an even number of preceding RIs. */ @@ -7256,7 +8439,8 @@ while (cc < end_subject) BACKCHAR(bptr); GETCHAR(c, bptr); - if (UCD_GRAPHBREAK(c) != ucp_gbRegionalIndicator) break; + if (UCD_GRAPHBREAK(c) != ucp_gbRegionalIndicator) + break; ricount++; } @@ -7271,14 +8455,80 @@ while (cc < end_subject) lgb != ucp_gbExtended_Pictographic) lgb = rgb; - prevcc = cc; - cc += len; + prevcc = startcc; + startcc = cc; } +while (cc < end_subject); -return cc; +return startcc; } -#endif +static PCRE2_SPTR SLJIT_FUNC do_extuni_utf_invalid(jit_arguments *args, PCRE2_SPTR cc) +{ +PCRE2_SPTR start_subject = args->begin; +PCRE2_SPTR end_subject = args->end; +int lgb, rgb, ricount; +PCRE2_SPTR prevcc, startcc, bptr; +BOOL first = TRUE; +uint32_t c; + +prevcc = cc; +startcc = NULL; +do + { + GETCHARINC_INVALID(c, cc, end_subject, break); + rgb = UCD_GRAPHBREAK(c); + + if (first) + { + lgb = rgb; + startcc = cc; + first = FALSE; + continue; + } + + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) + break; + + /* Not breaking between Regional Indicators is allowed only if there + are an even number of preceding RIs. */ + + if (lgb == ucp_gbRegionalIndicator && rgb == ucp_gbRegionalIndicator) + { + ricount = 0; + bptr = prevcc; + + /* bptr is pointing to the left-hand character */ + while (bptr > start_subject) + { + GETCHARBACK_INVALID(c, bptr, start_subject, break); + + if (UCD_GRAPHBREAK(c) != ucp_gbRegionalIndicator) + break; + + ricount++; + } + + if ((ricount & 1) != 0) + break; /* Grapheme break required */ + } + + /* If Extend or ZWJ follows Extended_Pictographic, do not update lgb; this + allows any number of them before a following Extended_Pictographic. */ + + if ((rgb != ucp_gbExtend && rgb != ucp_gbZWJ) || + lgb != ucp_gbExtended_Pictographic) + lgb = rgb; + + prevcc = startcc; + startcc = cc; + } +while (cc < end_subject); + +return startcc; +} + +#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */ static PCRE2_SPTR SLJIT_FUNC do_extuni_no_utf(jit_arguments *args, PCRE2_SPTR cc) { @@ -7289,14 +8539,23 @@ PCRE2_SPTR bptr; uint32_t c; GETCHARINC(c, cc); +#if PCRE2_CODE_UNIT_WIDTH == 32 +if (c >= 0x110000) + return NULL; +#endif /* PCRE2_CODE_UNIT_WIDTH == 32 */ lgb = UCD_GRAPHBREAK(c); while (cc < end_subject) { c = *cc; +#if PCRE2_CODE_UNIT_WIDTH == 32 + if (c >= 0x110000) + break; +#endif /* PCRE2_CODE_UNIT_WIDTH == 32 */ rgb = UCD_GRAPHBREAK(c); - if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) + break; /* Not breaking between Regional Indicators is allowed only if there are an even number of preceding RIs. */ @@ -7311,13 +8570,18 @@ while (cc < end_subject) { bptr--; c = *bptr; +#if PCRE2_CODE_UNIT_WIDTH == 32 + if (c >= 0x110000) + break; +#endif /* PCRE2_CODE_UNIT_WIDTH == 32 */ if (UCD_GRAPHBREAK(c) != ucp_gbRegionalIndicator) break; ricount++; } - if ((ricount & 1) != 0) break; /* Grapheme break required */ + if ((ricount & 1) != 0) + break; /* Grapheme break required */ } /* If Extend or ZWJ follows Extended_Pictographic, do not update lgb; this @@ -7333,7 +8597,7 @@ while (cc < end_subject) return cc; } -#endif +#endif /* SUPPORT_UNICODE */ static PCRE2_SPTR compile_char1_matchingpath(compiler_common *common, PCRE2_UCHAR type, PCRE2_SPTR cc, jump_list **backtracks, BOOL check_str_ptr) { @@ -7356,10 +8620,10 @@ switch(type) detect_partial_match(common, backtracks); #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 if (common->utf && is_char7_bitset((const sljit_u8*)common->ctypes - cbit_length + cbit_digit, FALSE)) - read_char7_type(common, type == OP_NOT_DIGIT); + read_char7_type(common, backtracks, type == OP_NOT_DIGIT); else #endif - read_char8_type(common, type == OP_NOT_DIGIT); + read_char8_type(common, backtracks, type == OP_NOT_DIGIT); /* Flip the starting bit in the negative case. */ OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_digit); add_jump(compiler, backtracks, JUMP(type == OP_DIGIT ? SLJIT_ZERO : SLJIT_NOT_ZERO)); @@ -7371,10 +8635,10 @@ switch(type) detect_partial_match(common, backtracks); #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 if (common->utf && is_char7_bitset((const sljit_u8*)common->ctypes - cbit_length + cbit_space, FALSE)) - read_char7_type(common, type == OP_NOT_WHITESPACE); + read_char7_type(common, backtracks, type == OP_NOT_WHITESPACE); else #endif - read_char8_type(common, type == OP_NOT_WHITESPACE); + read_char8_type(common, backtracks, type == OP_NOT_WHITESPACE); OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_space); add_jump(compiler, backtracks, JUMP(type == OP_WHITESPACE ? SLJIT_ZERO : SLJIT_NOT_ZERO)); return cc; @@ -7385,10 +8649,10 @@ switch(type) detect_partial_match(common, backtracks); #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 if (common->utf && is_char7_bitset((const sljit_u8*)common->ctypes - cbit_length + cbit_word, FALSE)) - read_char7_type(common, type == OP_NOT_WORDCHAR); + read_char7_type(common, backtracks, type == OP_NOT_WORDCHAR); else #endif - read_char8_type(common, type == OP_NOT_WORDCHAR); + read_char8_type(common, backtracks, type == OP_NOT_WORDCHAR); OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_word); add_jump(compiler, backtracks, JUMP(type == OP_WORDCHAR ? SLJIT_ZERO : SLJIT_NOT_ZERO)); return cc; @@ -7396,7 +8660,7 @@ switch(type) case OP_ANY: if (check_str_ptr) detect_partial_match(common, backtracks); - read_char_range(common, common->nlmin, common->nlmax, TRUE); + read_char(common, common->nlmin, common->nlmax, backtracks, READ_CHAR_UPDATE_STR_PTR); if (common->nltype == NLTYPE_FIXED && common->newline > 255) { jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff); @@ -7418,12 +8682,18 @@ switch(type) case OP_ALLANY: if (check_str_ptr) detect_partial_match(common, backtracks); -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +#ifdef SUPPORT_UNICODE if (common->utf) { + if (common->invalid_utf) + { + read_char(common, 0, READ_CHAR_MAX, backtracks, READ_CHAR_UPDATE_STR_PTR); + return cc; + } + +#if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16 OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); -#if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16 #if PCRE2_CODE_UNIT_WIDTH == 8 jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); @@ -7435,12 +8705,12 @@ switch(type) OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); -#endif +#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */ JUMPHERE(jump[0]); -#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */ return cc; +#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */ } -#endif +#endif /* SUPPORT_UNICODE */ OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); return cc; @@ -7467,7 +8737,7 @@ switch(type) case OP_ANYNL: if (check_str_ptr) detect_partial_match(common, backtracks); - read_char_range(common, common->bsr_nlmin, common->bsr_nlmax, FALSE); + read_char(common, common->bsr_nlmin, common->bsr_nlmax, NULL, 0); jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); /* We don't need to handle soft partial matching case. */ end_list = NULL; @@ -7490,7 +8760,12 @@ switch(type) case OP_HSPACE: if (check_str_ptr) detect_partial_match(common, backtracks); - read_char_range(common, 0x9, 0x3000, type == OP_NOT_HSPACE); + + if (type == OP_NOT_HSPACE) + read_char(common, 0x9, 0x3000, backtracks, READ_CHAR_UPDATE_STR_PTR); + else + read_char(common, 0x9, 0x3000, NULL, 0); + add_jump(compiler, &common->hspace, JUMP(SLJIT_FAST_CALL)); sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(type == OP_NOT_HSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO)); @@ -7500,7 +8775,12 @@ switch(type) case OP_VSPACE: if (check_str_ptr) detect_partial_match(common, backtracks); - read_char_range(common, 0xa, 0x2029, type == OP_NOT_VSPACE); + + if (type == OP_NOT_VSPACE) + read_char(common, 0xa, 0x2029, backtracks, READ_CHAR_UPDATE_STR_PTR); + else + read_char(common, 0xa, 0x2029, NULL, 0); + add_jump(compiler, &common->vspace, JUMP(SLJIT_FAST_CALL)); sljit_set_current_flags(compiler, SLJIT_SET_Z); add_jump(compiler, backtracks, JUMP(type == OP_NOT_VSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO)); @@ -7516,9 +8796,12 @@ switch(type) #if PCRE2_CODE_UNIT_WIDTH != 32 sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, - common->utf ? SLJIT_FUNC_OFFSET(do_extuni_utf) : SLJIT_FUNC_OFFSET(do_extuni_no_utf)); + common->utf ? (common->invalid_utf ? SLJIT_FUNC_OFFSET(do_extuni_utf_invalid) : SLJIT_FUNC_OFFSET(do_extuni_utf)) : SLJIT_FUNC_OFFSET(do_extuni_no_utf)); + if (common->invalid_utf) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0)); #else sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_extuni_no_utf)); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0)); #endif OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); @@ -7539,11 +8822,15 @@ switch(type) #ifdef SUPPORT_UNICODE if (common->utf && HAS_EXTRALEN(*cc)) length += GET_EXTRALEN(*cc); #endif - if (common->mode == PCRE2_JIT_COMPLETE && check_str_ptr - && (type == OP_CHAR || !char_has_othercase(common, cc) || char_get_othercase_bit(common, cc) != 0)) + + if (check_str_ptr && common->mode != PCRE2_JIT_COMPLETE) + detect_partial_match(common, backtracks); + + if (type == OP_CHAR || !char_has_othercase(common, cc) || char_get_othercase_bit(common, cc) != 0) { OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length)); - add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0)); + if (length > 1 || (check_str_ptr && common->mode == PCRE2_JIT_COMPLETE)) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0)); context.length = IN_UCHARS(length); context.sourcereg = -1; @@ -7553,8 +8840,6 @@ switch(type) return byte_sequence_compare(common, type == OP_CHARI, cc, &context, backtracks); } - if (check_str_ptr) - detect_partial_match(common, backtracks); #ifdef SUPPORT_UNICODE if (common->utf) { @@ -7564,24 +8849,28 @@ switch(type) #endif c = *cc; - if (type == OP_CHAR || !char_has_othercase(common, cc)) + SLJIT_ASSERT(type == OP_CHARI && char_has_othercase(common, cc)); + + if (check_str_ptr && common->mode == PCRE2_JIT_COMPLETE) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + + oc = char_othercase(common, c); + read_char(common, c < oc ? c : oc, c > oc ? c : oc, NULL, 0); + + SLJIT_ASSERT(!is_powerof2(c ^ oc)); + + if (sljit_has_cpu_feature(SLJIT_HAS_CMOV)) { - read_char_range(common, c, c, FALSE); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, oc); + CMOV(SLJIT_EQUAL, TMP1, SLJIT_IMM, c); add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c)); - return cc + length; } - oc = char_othercase(common, c); - read_char_range(common, c < oc ? c : oc, c > oc ? c : oc, FALSE); - bit = c ^ oc; - if (is_powerof2(bit)) + else { - OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, bit); - add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c | bit)); - return cc + length; + jump[0] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, oc)); + JUMPHERE(jump[0]); } - jump[0] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c); - add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, oc)); - JUMPHERE(jump[0]); return cc + length; case OP_NOT: @@ -7595,7 +8884,7 @@ switch(type) { #if PCRE2_CODE_UNIT_WIDTH == 8 c = *cc; - if (c < 128) + if (c < 128 && !common->invalid_utf) { OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); if (type == OP_NOT || !char_has_othercase(common, cc)) @@ -7626,13 +8915,13 @@ switch(type) if (type == OP_NOT || !char_has_othercase(common, cc)) { - read_char_range(common, c, c, TRUE); + read_char(common, c, c, backtracks, READ_CHAR_UPDATE_STR_PTR); add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c)); } else { oc = char_othercase(common, c); - read_char_range(common, c < oc ? c : oc, c > oc ? c : oc, TRUE); + read_char(common, c < oc ? c : oc, c > oc ? c : oc, backtracks, READ_CHAR_UPDATE_STR_PTR); bit = c ^ oc; if (is_powerof2(bit)) { @@ -7654,9 +8943,15 @@ switch(type) #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 bit = (common->utf && is_char7_bitset((const sljit_u8 *)cc, type == OP_NCLASS)) ? 127 : 255; - read_char_range(common, 0, bit, type == OP_NCLASS); + if (type == OP_NCLASS) + read_char(common, 0, bit, backtracks, READ_CHAR_UPDATE_STR_PTR); + else + read_char(common, 0, bit, NULL, 0); #else - read_char_range(common, 0, 255, type == OP_NCLASS); + if (type == OP_NCLASS) + read_char(common, 0, 255, backtracks, READ_CHAR_UPDATE_STR_PTR); + else + read_char(common, 0, 255, NULL, 0); #endif if (optimize_class(common, (const sljit_u8 *)cc, type == OP_NCLASS, FALSE, backtracks)) @@ -7843,6 +9138,14 @@ int offset = 0; struct sljit_jump *jump = NULL; struct sljit_jump *partial; struct sljit_jump *nopartial; +#if defined SUPPORT_UNICODE +struct sljit_label *loop; +struct sljit_label *caseless_loop; +jump_list *no_match = NULL; +int source_reg = COUNT_MATCH; +int source_end_reg = ARGUMENTS; +int char1_reg = STACK_LIMIT; +#endif /* SUPPORT_UNICODE */ if (ref) { @@ -7858,34 +9161,98 @@ else #if defined SUPPORT_UNICODE if (common->utf && *cc == OP_REFI) { - SLJIT_ASSERT(TMP1 == SLJIT_R0 && STR_PTR == SLJIT_R1); + SLJIT_ASSERT(common->iref_ptr != 0); + if (ref) - OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); else - OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); - if (withchecks) - jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_R2, 0); - /* No free saved registers so save data on stack. */ + if (withchecks && emptyfail) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, TMP2, 0)); - OP1(SLJIT_MOV, SLJIT_R3, 0, STR_END, 0); - sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp)); - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->iref_ptr, source_reg, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw), source_end_reg, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw) * 2, char1_reg, 0); + + OP1(SLJIT_MOV, source_reg, 0, TMP1, 0); + OP1(SLJIT_MOV, source_end_reg, 0, TMP2, 0); + + loop = LABEL(); + jump = CMP(SLJIT_GREATER_EQUAL, source_reg, 0, source_end_reg, 0); + partial = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + /* Read original character. It must be a valid UTF character. */ + OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0); + OP1(SLJIT_MOV, STR_PTR, 0, source_reg, 0); + + read_char(common, 0, READ_CHAR_MAX, NULL, READ_CHAR_UPDATE_STR_PTR | READ_CHAR_VALID_UTF); + + OP1(SLJIT_MOV, source_reg, 0, STR_PTR, 0); + OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0); + OP1(SLJIT_MOV, char1_reg, 0, TMP1, 0); + + /* Read second character. */ + read_char(common, 0, READ_CHAR_MAX, &no_match, READ_CHAR_UPDATE_STR_PTR); + + CMPTO(SLJIT_EQUAL, TMP1, 0, char1_reg, 0, loop); + +// PH hacking +//fprintf(stderr, "~~E\n"); + + OP1(SLJIT_MOV, TMP3, 0, TMP1, 0); + + add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); + + OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2); + + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3); + + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); + + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records)); + + OP1(SLJIT_MOV_S32, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(ucd_record, other_case)); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(ucd_record, caseset)); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP3, 0); + CMPTO(SLJIT_EQUAL, TMP1, 0, char1_reg, 0, loop); + + add_jump(compiler, &no_match, CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_caseless_sets)); + + caseless_loop = LABEL(); + OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(TMP2), 0); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, sizeof(uint32_t)); + OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, char1_reg, 0); + JUMPTO(SLJIT_EQUAL, loop); + JUMPTO(SLJIT_LESS, caseless_loop); + + set_jumps(no_match, LABEL()); if (common->mode == PCRE2_JIT_COMPLETE) - add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1)); - else - { - OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1); + JUMPHERE(partial); - add_jump(compiler, backtracks, JUMP(SLJIT_LESS)); + OP1(SLJIT_MOV, source_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr); + OP1(SLJIT_MOV, source_end_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw)); + OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw) * 2); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + + if (common->mode != PCRE2_JIT_COMPLETE) + { + JUMPHERE(partial); + OP1(SLJIT_MOV, source_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr); + OP1(SLJIT_MOV, source_end_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw)); + OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw) * 2); - nopartial = JUMP(SLJIT_NOT_EQUAL); - OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0); check_partial(common, FALSE); add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); - JUMPHERE(nopartial); } + + JUMPHERE(jump); + OP1(SLJIT_MOV, source_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr); + OP1(SLJIT_MOV, source_end_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw)); + OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), common->iref_ptr + sizeof(sljit_sw) * 2); + return; } else #endif /* SUPPORT_UNICODE */ @@ -8862,6 +10229,42 @@ if (common->optimized_cbracket[offset >> 1] == 0) return stacksize; } +static PCRE2_SPTR SLJIT_FUNC do_script_run(PCRE2_SPTR ptr, PCRE2_SPTR endptr) +{ + if (PRIV(script_run)(ptr, endptr, FALSE)) + return endptr; + return NULL; +} + +#ifdef SUPPORT_UNICODE + +static PCRE2_SPTR SLJIT_FUNC do_script_run_utf(PCRE2_SPTR ptr, PCRE2_SPTR endptr) +{ + if (PRIV(script_run)(ptr, endptr, TRUE)) + return endptr; + return NULL; +} + +#endif /* SUPPORT_UNICODE */ + +static SLJIT_INLINE void match_script_run_common(compiler_common *common, int private_data_ptr, backtrack_common *parent) +{ +DEFINE_COMPILER; + +SLJIT_ASSERT(TMP1 == SLJIT_R0 && STR_PTR == SLJIT_R1); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); +#ifdef SUPPORT_UNICODE +sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, + common->utf ? SLJIT_FUNC_OFFSET(do_script_run_utf) : SLJIT_FUNC_OFFSET(do_script_run)); +#else +sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_script_run)); +#endif + +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); +add_jump(compiler, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0)); +} + /* Handling bracketed expressions is probably the most complex part. @@ -8997,7 +10400,7 @@ if (opcode == OP_CBRA || opcode == OP_SCBRA) BACKTRACK_AS(bracket_backtrack)->private_data_ptr = private_data_ptr; matchingpath += IMM2_SIZE; } -else if (opcode == OP_ONCE || opcode == OP_SBRA || opcode == OP_SCOND) +else if (opcode == OP_ONCE || opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND) { /* Other brackets simply allocate the next entry. */ private_data_ptr = PRIVATE_DATA(ccbegin); @@ -9036,35 +10439,32 @@ if (bra == OP_BRAMINZERO) free_stack(common, 1); braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); } - else + else if (opcode == OP_ONCE || opcode >= OP_SBRA) { - if (opcode == OP_ONCE || opcode >= OP_SBRA) + jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + /* Nothing stored during the first run. */ + skip = JUMP(SLJIT_JUMP); + JUMPHERE(jump); + /* Checking zero-length iteration. */ + if (opcode != OP_ONCE || BACKTRACK_AS(bracket_backtrack)->u.framesize < 0) { - jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); - /* Nothing stored during the first run. */ - skip = JUMP(SLJIT_JUMP); - JUMPHERE(jump); - /* Checking zero-length iteration. */ - if (opcode != OP_ONCE || BACKTRACK_AS(bracket_backtrack)->u.framesize < 0) - { - /* When we come from outside, private_data_ptr contains the previous STR_PTR. */ - braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); - } - else - { - /* Except when the whole stack frame must be saved. */ - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); - braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-BACKTRACK_AS(bracket_backtrack)->u.framesize - 2)); - } - JUMPHERE(skip); + /* When we come from outside, private_data_ptr contains the previous STR_PTR. */ + braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); } else { - jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); - JUMPHERE(jump); + /* Except when the whole stack frame must be saved. */ + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-BACKTRACK_AS(bracket_backtrack)->u.framesize - 2)); } + JUMPHERE(skip); + } + else + { + jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + JUMPHERE(jump); } } @@ -9081,7 +10481,7 @@ if (ket == OP_KETRMIN) if (ket == OP_KETRMAX) { rmax_label = LABEL(); - if (has_alternatives && opcode != OP_ONCE && opcode < OP_SBRA && repeat_type == 0) + if (has_alternatives && opcode >= OP_BRA && opcode < OP_SBRA && repeat_type == 0) BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = rmax_label; } @@ -9185,7 +10585,7 @@ else if (opcode == OP_CBRA || opcode == OP_SCBRA) OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); } } -else if (opcode == OP_SBRA || opcode == OP_SCOND) +else if (opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND) { /* Saving the previous value. */ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); @@ -9314,6 +10714,9 @@ if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) if (opcode == OP_ONCE) match_once_common(common, ket, BACKTRACK_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head); +if (opcode == OP_SCRIPT_RUN) + match_script_run_common(common, private_data_ptr, backtrack); + stacksize = 0; if (repeat_type == OP_MINUPTO) { @@ -9383,13 +10786,15 @@ if (ket == OP_KETRMAX) if (opcode != OP_ONCE) free_stack(common, 1); } - else if (opcode == OP_ONCE || opcode >= OP_SBRA) + else if (opcode < OP_BRA || opcode >= OP_SBRA) { if (has_alternatives) BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL(); + /* Checking zero-length iteration. */ if (opcode != OP_ONCE) { + /* This case includes opcodes such as OP_SCRIPT_RUN. */ CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0, rmax_label); /* Drop STR_PTR for greedy plus quantifier. */ if (bra != OP_BRAZERO) @@ -9456,7 +10861,7 @@ if (opcode == OP_ONCE) /* We temporarily encode the needs_control_head in the lowest bit. Note: on the target architectures of SLJIT the ((x << 1) >> 1) returns the same value for small signed numbers (including negative numbers). */ - BACKTRACK_AS(bracket_backtrack)->u.framesize = (BACKTRACK_AS(bracket_backtrack)->u.framesize << 1) | (needs_control_head ? 1 : 0); + BACKTRACK_AS(bracket_backtrack)->u.framesize = (int)((unsigned)BACKTRACK_AS(bracket_backtrack)->u.framesize << 1) | (needs_control_head ? 1 : 0); } return cc + repeat_length; } @@ -9951,7 +11356,7 @@ if (exact > 1) #ifdef SUPPORT_UNICODE && !common->utf #endif - ) + && type != OP_ANYNL && type != OP_EXTUNI) { OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(exact)); add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER, TMP1, 0, STR_END, 0)); @@ -10634,6 +12039,7 @@ while (cc < ccend) break; case OP_ONCE: + case OP_SCRIPT_RUN: case OP_BRA: case OP_CBRA: case OP_COND: @@ -10787,14 +12193,14 @@ switch(opcode) if (CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit != 0) OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit); CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.chr, CURRENT_AS(char_iterator_backtrack)->matchingpath); - skip_char_back(common); + move_back(common, NULL, TRUE); CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP2, 0, label); } else { OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, base, offset1); - skip_char_back(common); + move_back(common, NULL, TRUE); OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath); } @@ -11240,6 +12646,9 @@ if (has_alternatives) compile_matchingpath(common, ccprev, cc, current); if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) return; + + if (opcode == OP_SCRIPT_RUN) + match_script_run_common(common, private_data_ptr, current); } /* Instructions after the current alternative is successfully matched. */ @@ -11368,7 +12777,7 @@ if (offset != 0) OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0); } } -else if (opcode == OP_SBRA || opcode == OP_SCOND) +else if (opcode == OP_SCRIPT_RUN || opcode == OP_SBRA || opcode == OP_SCOND) { OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(0)); free_stack(common, 1); @@ -11717,6 +13126,7 @@ while (current) break; case OP_ONCE: + case OP_SCRIPT_RUN: case OP_BRA: case OP_CBRA: case OP_COND: @@ -12016,6 +13426,9 @@ sljit_emit_fast_return(compiler, TMP2, 0); #undef COMPILE_BACKTRACKINGPATH #undef CURRENT_AS +#define PUBLIC_JIT_COMPILE_CONFIGURATION_OPTIONS \ + (PCRE2_JIT_INVALID_UTF) + static int jit_compile(pcre2_code *code, sljit_u32 mode) { pcre2_real_code *re = (pcre2_real_code *)code; @@ -12052,6 +13465,11 @@ common->re = re; common->name_table = (PCRE2_SPTR)((uint8_t *)re + sizeof(pcre2_real_code)); rootbacktrack.cc = common->name_table + re->name_count * re->name_entry_size; +#ifdef SUPPORT_UNICODE +common->invalid_utf = (mode & PCRE2_JIT_INVALID_UTF) != 0; +#endif /* SUPPORT_UNICODE */ +mode &= ~PUBLIC_JIT_COMPILE_CONFIGURATION_OPTIONS; + common->start = rootbacktrack.cc; common->read_only_data_head = NULL; common->fcc = tables + fcc_offset; @@ -12066,6 +13484,7 @@ switch(re->newline_convention) case PCRE2_NEWLINE_CRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; break; case PCRE2_NEWLINE_ANY: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break; case PCRE2_NEWLINE_ANYCRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break; + case PCRE2_NEWLINE_NUL: common->newline = CHAR_NUL; break; default: return PCRE2_ERROR_INTERNAL; } common->nlmax = READ_CHAR_MAX; @@ -12117,6 +13536,8 @@ if (common->utf) common->bsr_nlmax = (CHAR_CR > CHAR_NL) ? CHAR_CR : CHAR_NL; common->bsr_nlmin = (CHAR_CR < CHAR_NL) ? CHAR_CR : CHAR_NL; } +else + common->invalid_utf = FALSE; #endif /* SUPPORT_UNICODE */ ccend = bracketend(common->start); @@ -12557,22 +13978,49 @@ if (common->utfreadchar != NULL) set_jumps(common->utfreadchar, LABEL()); do_utfreadchar(common); } -if (common->utfreadchar16 != NULL) - { - set_jumps(common->utfreadchar16, LABEL()); - do_utfreadchar16(common); - } if (common->utfreadtype8 != NULL) { set_jumps(common->utfreadtype8, LABEL()); do_utfreadtype8(common); } +if (common->utfpeakcharback != NULL) + { + set_jumps(common->utfpeakcharback, LABEL()); + do_utfpeakcharback(common); + } #endif /* PCRE2_CODE_UNIT_WIDTH == 8 */ +#if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16 +if (common->utfreadchar_invalid != NULL) + { + set_jumps(common->utfreadchar_invalid, LABEL()); + do_utfreadchar_invalid(common); + } +if (common->utfreadnewline_invalid != NULL) + { + set_jumps(common->utfreadnewline_invalid, LABEL()); + do_utfreadnewline_invalid(common); + } +if (common->utfmoveback_invalid) + { + set_jumps(common->utfmoveback_invalid, LABEL()); + do_utfmoveback_invalid(common); + } +if (common->utfpeakcharback_invalid) + { + set_jumps(common->utfpeakcharback_invalid, LABEL()); + do_utfpeakcharback_invalid(common); + } +#endif /* PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16 */ if (common->getucd != NULL) { set_jumps(common->getucd, LABEL()); do_getucd(common); } +if (common->getucdtype != NULL) + { + set_jumps(common->getucdtype, LABEL()); + do_getucdtype(common); + } #endif /* SUPPORT_UNICODE */ SLJIT_FREE(common->optimized_cbracket, allocator_data); @@ -12644,7 +14092,7 @@ Returns: 0: success or (*NOJIT) was used */ #define PUBLIC_JIT_COMPILE_OPTIONS \ - (PCRE2_JIT_COMPLETE|PCRE2_JIT_PARTIAL_SOFT|PCRE2_JIT_PARTIAL_HARD) + (PCRE2_JIT_COMPLETE|PCRE2_JIT_PARTIAL_SOFT|PCRE2_JIT_PARTIAL_HARD|PCRE2_JIT_INVALID_UTF) PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION pcre2_jit_compile(pcre2_code *code, uint32_t options) @@ -12659,6 +14107,7 @@ return PCRE2_ERROR_JIT_BADOPTION; pcre2_real_code *re = (pcre2_real_code *)code; executable_functions *functions; +uint32_t excluded_options; int result; if (code == NULL) @@ -12673,21 +14122,24 @@ functions = (executable_functions *)re->executable_jit; if ((options & PCRE2_JIT_COMPLETE) != 0 && (functions == NULL || functions->executable_funcs[0] == NULL)) { - result = jit_compile(code, PCRE2_JIT_COMPLETE); + excluded_options = (PCRE2_JIT_PARTIAL_SOFT | PCRE2_JIT_PARTIAL_HARD); + result = jit_compile(code, options & ~excluded_options); if (result != 0) return result; } if ((options & PCRE2_JIT_PARTIAL_SOFT) != 0 && (functions == NULL || functions->executable_funcs[1] == NULL)) { - result = jit_compile(code, PCRE2_JIT_PARTIAL_SOFT); + excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_HARD); + result = jit_compile(code, options & ~excluded_options); if (result != 0) return result; } if ((options & PCRE2_JIT_PARTIAL_HARD) != 0 && (functions == NULL || functions->executable_funcs[2] == NULL)) { - result = jit_compile(code, PCRE2_JIT_PARTIAL_HARD); + excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_SOFT); + result = jit_compile(code, options & ~excluded_options); if (result != 0) return result; } diff --git a/thirdparty/pcre2/src/pcre2_jit_match.c b/thirdparty/pcre2/src/pcre2_jit_match.c index 5a66545bae..eee038644d 100644 --- a/thirdparty/pcre2/src/pcre2_jit_match.c +++ b/thirdparty/pcre2/src/pcre2_jit_match.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016 University of Cambridge + New API code Copyright (c) 2016-2018 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -152,8 +152,6 @@ else jit_stack = NULL; } -/* JIT only need two offsets for each ovector entry. Hence - the last 1/3 of the ovector will never be touched. */ max_oveccount = functions->top_bracket; if (oveccount > max_oveccount) @@ -173,7 +171,7 @@ else if (rc > (int)oveccount) rc = 0; match_data->code = re; -match_data->subject = subject; +match_data->subject = (rc >= 0 || rc == PCRE2_ERROR_PARTIAL)? subject : NULL; match_data->rc = rc; match_data->startchar = arguments.startchar_ptr - subject; match_data->leftchar = 0; diff --git a/thirdparty/pcre2/src/pcre2_maketables.c b/thirdparty/pcre2/src/pcre2_maketables.c index 537edba8c3..5921e90793 100644 --- a/thirdparty/pcre2/src/pcre2_maketables.c +++ b/thirdparty/pcre2/src/pcre2_maketables.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -114,17 +114,17 @@ test for alnum specially. */ memset(p, 0, cbit_length); for (i = 0; i < 256; i++) { - if (isdigit(i)) p[cbit_digit + i/8] |= 1 << (i&7); - if (isupper(i)) p[cbit_upper + i/8] |= 1 << (i&7); - if (islower(i)) p[cbit_lower + i/8] |= 1 << (i&7); - if (isalnum(i)) p[cbit_word + i/8] |= 1 << (i&7); - if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); - if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); - if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); - if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); - if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); - if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); - if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); + if (isdigit(i)) p[cbit_digit + i/8] |= 1u << (i&7); + if (isupper(i)) p[cbit_upper + i/8] |= 1u << (i&7); + if (islower(i)) p[cbit_lower + i/8] |= 1u << (i&7); + if (isalnum(i)) p[cbit_word + i/8] |= 1u << (i&7); + if (i == '_') p[cbit_word + i/8] |= 1u << (i&7); + if (isspace(i)) p[cbit_space + i/8] |= 1u << (i&7); + if (isxdigit(i))p[cbit_xdigit + i/8] |= 1u << (i&7); + if (isgraph(i)) p[cbit_graph + i/8] |= 1u << (i&7); + if (isprint(i)) p[cbit_print + i/8] |= 1u << (i&7); + if (ispunct(i)) p[cbit_punct + i/8] |= 1u << (i&7); + if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1u << (i&7); } p += cbit_length; @@ -138,8 +138,8 @@ for (i = 0; i < 256; i++) int x = 0; if (isspace(i)) x += ctype_space; if (isalpha(i)) x += ctype_letter; + if (islower(i)) x += ctype_lcletter; if (isdigit(i)) x += ctype_digit; - if (isxdigit(i)) x += ctype_xdigit; if (isalnum(i) || i == '_') x += ctype_word; *p++ = x; } diff --git a/thirdparty/pcre2/src/pcre2_match.c b/thirdparty/pcre2/src/pcre2_match.c index 8741e1432d..419561fd64 100644 --- a/thirdparty/pcre2/src/pcre2_match.c +++ b/thirdparty/pcre2/src/pcre2_match.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2015-2018 University of Cambridge + New API code Copyright (c) 2015-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -69,11 +69,12 @@ information, and fields within it. */ #define PUBLIC_MATCH_OPTIONS \ (PCRE2_ANCHORED|PCRE2_ENDANCHORED|PCRE2_NOTBOL|PCRE2_NOTEOL|PCRE2_NOTEMPTY| \ PCRE2_NOTEMPTY_ATSTART|PCRE2_NO_UTF_CHECK|PCRE2_PARTIAL_HARD| \ - PCRE2_PARTIAL_SOFT|PCRE2_NO_JIT) + PCRE2_PARTIAL_SOFT|PCRE2_NO_JIT|PCRE2_COPY_MATCHED_SUBJECT) #define PUBLIC_JIT_MATCH_OPTIONS \ (PCRE2_NO_UTF_CHECK|PCRE2_NOTBOL|PCRE2_NOTEOL|PCRE2_NOTEMPTY|\ - PCRE2_NOTEMPTY_ATSTART|PCRE2_PARTIAL_SOFT|PCRE2_PARTIAL_HARD) + PCRE2_NOTEMPTY_ATSTART|PCRE2_PARTIAL_SOFT|PCRE2_PARTIAL_HARD|\ + PCRE2_COPY_MATCHED_SUBJECT) /* Non-error returns from and within the match() function. Error returns are externally defined PCRE2_ERROR_xxx codes, which are all negative. */ @@ -1848,7 +1849,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); if (Fop == OP_CLASS) RRETURN(MATCH_NOMATCH); } else - if ((Lbyte_map[fc/8] & (1 << (fc&7))) == 0) RRETURN(MATCH_NOMATCH); + if ((Lbyte_map[fc/8] & (1u << (fc&7))) == 0) RRETURN(MATCH_NOMATCH); } } else @@ -1870,7 +1871,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); } else #endif - if ((Lbyte_map[fc/8] & (1 << (fc&7))) == 0) RRETURN(MATCH_NOMATCH); + if ((Lbyte_map[fc/8] & (1u << (fc&7))) == 0) RRETURN(MATCH_NOMATCH); } } @@ -1902,7 +1903,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); if (Fop == OP_CLASS) RRETURN(MATCH_NOMATCH); } else - if ((Lbyte_map[fc/8] & (1 << (fc&7))) == 0) RRETURN(MATCH_NOMATCH); + if ((Lbyte_map[fc/8] & (1u << (fc&7))) == 0) RRETURN(MATCH_NOMATCH); } } else @@ -1927,7 +1928,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); } else #endif - if ((Lbyte_map[fc/8] & (1 << (fc&7))) == 0) RRETURN(MATCH_NOMATCH); + if ((Lbyte_map[fc/8] & (1u << (fc&7))) == 0) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ @@ -1956,7 +1957,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); if (Fop == OP_CLASS) break; } else - if ((Lbyte_map[fc/8] & (1 << (fc&7))) == 0) break; + if ((Lbyte_map[fc/8] & (1u << (fc&7))) == 0) break; Feptr += len; } @@ -1993,7 +1994,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); } else #endif - if ((Lbyte_map[fc/8] & (1 << (fc&7))) == 0) break; + if ((Lbyte_map[fc/8] & (1u << (fc&7))) == 0) break; Feptr++; } @@ -4084,7 +4085,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); GETCHAR(fc, fptr); } lgb = UCD_GRAPHBREAK(fc); - if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + if ((PRIV(ucp_gbtable)[lgb] & (1u << rgb)) == 0) break; Feptr = fptr; rgb = lgb; } @@ -5014,6 +5015,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); must record a backtracking point and also set up a chained frame. */ case OP_ONCE: + case OP_SCRIPT_RUN: case OP_SBRA: Lframe_type = GF_NOCAPTURE | Fop; @@ -5526,6 +5528,14 @@ fprintf(stderr, "++ op=%d\n", *Fecode); case OP_ASSERTBACK_NOT: RRETURN(MATCH_MATCH); + /* At the end of a script run, apply the script-checking rules. This code + will never by exercised if Unicode support it not compiled, because in + that environment script runs cause an error at compile time. */ + + case OP_SCRIPT_RUN: + if (!PRIV(script_run)(P->eptr, Feptr, utf)) RRETURN(MATCH_NOMATCH); + break; + /* Whole-pattern recursion is coded as a recurse into group 0, so it won't be picked up here. Instead, we catch it when the OP_END is reached. Other recursion is handled here. */ @@ -6000,10 +6010,11 @@ pcre2_match(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length, pcre2_match_context *mcontext) { int rc; +int was_zero_terminated = 0; const uint8_t *start_bits = NULL; - const pcre2_real_code *re = (const pcre2_real_code *)code; + BOOL anchored; BOOL firstline; BOOL has_first_cu = FALSE; @@ -6043,7 +6054,11 @@ mb->stack_frames = (heapframe *)stack_frames_vector; /* A length equal to PCRE2_ZERO_TERMINATED implies a zero-terminated subject string. */ -if (length == PCRE2_ZERO_TERMINATED) length = PRIV(strlen)(subject); +if (length == PCRE2_ZERO_TERMINATED) + { + length = PRIV(strlen)(subject); + was_zero_terminated = 1; + } end_subject = subject + length; /* Plausibility checks */ @@ -6158,6 +6173,17 @@ if (mcontext != NULL && mcontext->offset_limit != PCRE2_UNSET && (re->overall_options & PCRE2_USE_OFFSET_LIMIT) == 0) return PCRE2_ERROR_BADOFFSETLIMIT; +/* If the match data block was previously used with PCRE2_COPY_MATCHED_SUBJECT, +free the memory that was obtained. Set the field to NULL for no match cases. */ + +if ((match_data->flags & PCRE2_MD_COPIED_SUBJECT) != 0) + { + match_data->memctl.free((void *)match_data->subject, + match_data->memctl.memory_data); + match_data->flags &= ~PCRE2_MD_COPIED_SUBJECT; + } +match_data->subject = NULL; + /* If the pattern was successfully studied with JIT support, run the JIT executable instead of the rest of this function. Most options must be set at compile time for the JIT code to be usable. Fallback to the normal code path if @@ -6169,7 +6195,19 @@ if (re->executable_jit != NULL && (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0) { rc = pcre2_jit_match(code, subject, length, start_offset, options, match_data, mcontext); - if (rc != PCRE2_ERROR_JIT_BADOPTION) return rc; + if (rc != PCRE2_ERROR_JIT_BADOPTION) + { + if (rc >= 0 && (options & PCRE2_COPY_MATCHED_SUBJECT) != 0) + { + length = CU2BYTES(length + was_zero_terminated); + match_data->subject = match_data->memctl.malloc(length, + match_data->memctl.memory_data); + if (match_data->subject == NULL) return PCRE2_ERROR_NOMEMORY; + memcpy((void *)match_data->subject, subject, length); + match_data->flags |= PCRE2_MD_COPIED_SUBJECT; + } + return rc; + } } #endif @@ -6421,7 +6459,7 @@ for(;;) #if PCRE2_CODE_UNIT_WIDTH != 8 if (c > 255) c = 255; #endif - ok = (start_bits[c/8] & (1 << (c&7))) != 0; + ok = (start_bits[c/8] & (1u << (c&7))) != 0; } } if (!ok) @@ -6538,7 +6576,7 @@ for(;;) #if PCRE2_CODE_UNIT_WIDTH != 8 if (c > 255) c = 255; #endif - if ((start_bits[c/8] & (1 << (c&7))) != 0) break; + if ((start_bits[c/8] & (1u << (c&7))) != 0) break; start_match++; } @@ -6809,13 +6847,13 @@ if (mb->match_frames != mb->stack_frames) /* Fill in fields that are always returned in the match data. */ match_data->code = re; -match_data->subject = subject; match_data->mark = mb->mark; match_data->matchedby = PCRE2_MATCHEDBY_INTERPRETER; /* Handle a fully successful match. Set the return code to the number of captured strings, or 0 if there were too many to fit into the ovector, and then -set the remaining returned values before returning. */ +set the remaining returned values before returning. Make a copy of the subject +string if requested. */ if (rc == MATCH_MATCH) { @@ -6825,6 +6863,16 @@ if (rc == MATCH_MATCH) match_data->leftchar = mb->start_used_ptr - subject; match_data->rightchar = ((mb->last_used_ptr > mb->end_match_ptr)? mb->last_used_ptr : mb->end_match_ptr) - subject; + if ((options & PCRE2_COPY_MATCHED_SUBJECT) != 0) + { + length = CU2BYTES(length + was_zero_terminated); + match_data->subject = match_data->memctl.malloc(length, + match_data->memctl.memory_data); + if (match_data->subject == NULL) return PCRE2_ERROR_NOMEMORY; + memcpy((void *)match_data->subject, subject, length); + match_data->flags |= PCRE2_MD_COPIED_SUBJECT; + } + else match_data->subject = subject; return match_data->rc; } @@ -6838,10 +6886,14 @@ match_data->mark = mb->nomatch_mark; if (rc != MATCH_NOMATCH && rc != PCRE2_ERROR_PARTIAL) match_data->rc = rc; -/* Handle a partial match. */ +/* Handle a partial match. If a "soft" partial match was requested, searching +for a complete match will have continued, and the value of rc at this point +will be MATCH_NOMATCH. For a "hard" partial match, it will already be +PCRE2_ERROR_PARTIAL. */ else if (match_partial != NULL) { + match_data->subject = subject; match_data->ovector[0] = match_partial - subject; match_data->ovector[1] = end_subject - subject; match_data->startchar = match_partial - subject; diff --git a/thirdparty/pcre2/src/pcre2_match_data.c b/thirdparty/pcre2/src/pcre2_match_data.c index b297f326b5..ccc5f6740e 100644 --- a/thirdparty/pcre2/src/pcre2_match_data.c +++ b/thirdparty/pcre2/src/pcre2_match_data.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2017 University of Cambridge + New API code Copyright (c) 2016-2018 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -63,6 +63,7 @@ yield = PRIV(memctl_malloc)( (pcre2_memctl *)gcontext); if (yield == NULL) return NULL; yield->oveccount = oveccount; +yield->flags = 0; return yield; } @@ -93,7 +94,12 @@ PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION pcre2_match_data_free(pcre2_match_data *match_data) { if (match_data != NULL) + { + if ((match_data->flags & PCRE2_MD_COPIED_SUBJECT) != 0) + match_data->memctl.free((void *)match_data->subject, + match_data->memctl.memory_data); match_data->memctl.free(match_data, match_data->memctl.memory_data); + } } diff --git a/thirdparty/pcre2/src/pcre2_script_run.c b/thirdparty/pcre2/src/pcre2_script_run.c new file mode 100644 index 0000000000..91a4833028 --- /dev/null +++ b/thirdparty/pcre2/src/pcre2_script_run.c @@ -0,0 +1,441 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Original API code Copyright (c) 1997-2012 University of Cambridge + New API code Copyright (c) 2016-2018 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* This module contains the function for checking a script run. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre2_internal.h" + + +/************************************************* +* Check script run * +*************************************************/ + +/* A script run is conceptually a sequence of characters all in the same +Unicode script. However, it isn't quite that simple. There are special rules +for scripts that are commonly used together, and also special rules for digits. +This function implements the appropriate checks, which is possible only when +PCRE2 is compiled with Unicode support. The function returns TRUE if there is +no Unicode support; however, it should never be called in that circumstance +because an error is given by pcre2_compile() if a script run is called for in a +version of PCRE2 compiled without Unicode support. + +Arguments: + pgr point to the first character + endptr point after the last character + utf TRUE if in UTF mode + +Returns: TRUE if this is a valid script run +*/ + +/* These dummy values must be less than the negation of the largest offset in +the PRIV(ucd_script_sets) vector, which is held in a 16-bit field in UCD +records (and is only likely to be a few hundred). */ + +#define SCRIPT_UNSET (-99999) +#define SCRIPT_HANPENDING (-99998) +#define SCRIPT_HANHIRAKATA (-99997) +#define SCRIPT_HANBOPOMOFO (-99996) +#define SCRIPT_HANHANGUL (-99995) +#define SCRIPT_LIST (-99994) + +#define INTERSECTION_LIST_SIZE 50 + +BOOL +PRIV(script_run)(PCRE2_SPTR ptr, PCRE2_SPTR endptr, BOOL utf) +{ +#ifdef SUPPORT_UNICODE +int require_script = SCRIPT_UNSET; +uint8_t intersection_list[INTERSECTION_LIST_SIZE]; +const uint8_t *require_list = NULL; +uint32_t require_digitset = 0; +uint32_t c; + +#if PCRE2_CODE_UNIT_WIDTH == 32 +(void)utf; /* Avoid compiler warning */ +#endif + +/* Any string containing fewer than 2 characters is a valid script run. */ + +if (ptr >= endptr) return TRUE; +GETCHARINCTEST(c, ptr); +if (ptr >= endptr) return TRUE; + +/* Scan strings of two or more characters, checking the Unicode characteristics +of each code point. We make use of the Script Extensions property. There is +special code for scripts that can be combined with characters from the Han +Chinese script. This may be used in conjunction with four other scripts in +these combinations: + +. Han with Hiragana and Katakana is allowed (for Japanese). +. Han with Bopomofo is allowed (for Taiwanese Mandarin). +. Han with Hangul is allowed (for Korean). + +If the first significant character's script is one of the four, the required +script type is immediately known. However, if the first significant +character's script is Han, we have to keep checking for a non-Han character. +Hence the SCRIPT_HANPENDING state. */ + +for (;;) + { + const ucd_record *ucd = GET_UCD(c); + int32_t scriptx = ucd->scriptx; + + /* If the script extension is Unknown, the string is not a valid script run. + Such characters can only form script runs of length one. */ + + if (scriptx == ucp_Unknown) return FALSE; + + /* A character whose script extension is Inherited is always accepted with + any script, and plays no further part in this testing. A character whose + script is Common is always accepted, but must still be tested for a digit + below. The scriptx value at this point is non-zero, because zero is + ucp_Unknown, tested for above. */ + + if (scriptx != ucp_Inherited) + { + if (scriptx != ucp_Common) + { + /* If the script extension value is positive, the character is not a mark + that can be used with many scripts. In the simple case we either set or + compare with the required script. However, handling the scripts that can + combine with Han are more complicated, as is the case when the previous + characters have been man-script marks. */ + + if (scriptx > 0) + { + switch(require_script) + { + /* Either the first significant character (require_script unset) or + after only Han characters. */ + + case SCRIPT_UNSET: + case SCRIPT_HANPENDING: + switch(scriptx) + { + case ucp_Han: + require_script = SCRIPT_HANPENDING; + break; + + case ucp_Hiragana: + case ucp_Katakana: + require_script = SCRIPT_HANHIRAKATA; + break; + + case ucp_Bopomofo: + require_script = SCRIPT_HANBOPOMOFO; + break; + + case ucp_Hangul: + require_script = SCRIPT_HANHANGUL; + break; + + /* Not a Han-related script. If expecting one, fail. Otherise set + the requirement to this script. */ + + default: + if (require_script == SCRIPT_HANPENDING) return FALSE; + require_script = scriptx; + break; + } + break; + + /* Previously encountered one of the "with Han" scripts. Check that + this character is appropriate. */ + + case SCRIPT_HANHIRAKATA: + if (scriptx != ucp_Han && scriptx != ucp_Hiragana && + scriptx != ucp_Katakana) + return FALSE; + break; + + case SCRIPT_HANBOPOMOFO: + if (scriptx != ucp_Han && scriptx != ucp_Bopomofo) return FALSE; + break; + + case SCRIPT_HANHANGUL: + if (scriptx != ucp_Han && scriptx != ucp_Hangul) return FALSE; + break; + + /* We have a list of scripts to check that is derived from one or + more previous characters. This is either one of the lists in + ucd_script_sets[] (for one previous character) or the intersection of + several lists for multiple characters. */ + + case SCRIPT_LIST: + { + const uint8_t *list; + for (list = require_list; *list != 0; list++) + { + if (*list == scriptx) break; + } + if (*list == 0) return FALSE; + } + + /* The rest of the string must be in this script, but we have to + allow for the Han complications. */ + + switch(scriptx) + { + case ucp_Han: + require_script = SCRIPT_HANPENDING; + break; + + case ucp_Hiragana: + case ucp_Katakana: + require_script = SCRIPT_HANHIRAKATA; + break; + + case ucp_Bopomofo: + require_script = SCRIPT_HANBOPOMOFO; + break; + + case ucp_Hangul: + require_script = SCRIPT_HANHANGUL; + break; + + default: + require_script = scriptx; + break; + } + break; + + /* This is the easy case when a single script is required. */ + + default: + if (scriptx != require_script) return FALSE; + break; + } + } /* End of handing positive scriptx */ + + /* If scriptx is negative, this character is a mark-type character that + has a list of permitted scripts. */ + + else + { + uint32_t chspecial; + const uint8_t *clist, *rlist; + const uint8_t *list = PRIV(ucd_script_sets) - scriptx; + + switch(require_script) + { + case SCRIPT_UNSET: + require_list = PRIV(ucd_script_sets) - scriptx; + require_script = SCRIPT_LIST; + break; + + /* An inspection of the Unicode 11.0.0 files shows that there are the + following types of Script Extension list that involve the Han, + Bopomofo, Hiragana, Katakana, and Hangul scripts: + + . Bopomofo + Han + . Han + Hiragana + Katakana + . Hiragana + Katakana + . Bopopmofo + Hangul + Han + Hiragana + Katakana + + The following code tries to make sense of this. */ + +#define FOUND_BOPOMOFO 1 +#define FOUND_HIRAGANA 2 +#define FOUND_KATAKANA 4 +#define FOUND_HANGUL 8 + + case SCRIPT_HANPENDING: + chspecial = 0; + for (; *list != 0; list++) + { + switch (*list) + { + case ucp_Bopomofo: chspecial |= FOUND_BOPOMOFO; break; + case ucp_Hiragana: chspecial |= FOUND_HIRAGANA; break; + case ucp_Katakana: chspecial |= FOUND_KATAKANA; break; + case ucp_Hangul: chspecial |= FOUND_HANGUL; break; + default: break; + } + } + + if (chspecial == 0) return FALSE; + + if (chspecial == FOUND_BOPOMOFO) + { + require_script = SCRIPT_HANBOPOMOFO; + } + else if (chspecial == (FOUND_HIRAGANA|FOUND_KATAKANA)) + { + require_script = SCRIPT_HANHIRAKATA; + } + + /* Otherwise it must be allowed with all of them, so remain in + the pending state. */ + + break; + + case SCRIPT_HANHIRAKATA: + for (; *list != 0; list++) + { + if (*list == ucp_Hiragana || *list == ucp_Katakana) break; + } + if (*list == 0) return FALSE; + break; + + case SCRIPT_HANBOPOMOFO: + for (; *list != 0; list++) + { + if (*list == ucp_Bopomofo) break; + } + if (*list == 0) return FALSE; + break; + + case SCRIPT_HANHANGUL: + for (; *list != 0; list++) + { + if (*list == ucp_Hangul) break; + } + if (*list == 0) return FALSE; + break; + + /* Previously encountered one or more characters that are allowed + with a list of scripts. Build the intersection of the required list + with this character's list in intersection_list[]. This code is + written so that it still works OK if the required list is already in + that vector. */ + + case SCRIPT_LIST: + { + int i = 0; + for (rlist = require_list; *rlist != 0; rlist++) + { + for (clist = list; *clist != 0; clist++) + { + if (*rlist == *clist) + { + intersection_list[i++] = *rlist; + break; + } + } + } + if (i == 0) return FALSE; /* No scripts in common */ + + /* If there's just one script in common, we can set it as the + unique required script. Otherwise, terminate the intersection list + and make it the required list. */ + + if (i == 1) + { + require_script = intersection_list[0]; + } + else + { + intersection_list[i] = 0; + require_list = intersection_list; + } + } + break; + + /* The previously set required script is a single script, not + Han-related. Check that it is in this character's list. */ + + default: + for (; *list != 0; list++) + { + if (*list == require_script) break; + } + if (*list == 0) return FALSE; + break; + } + } /* End of handling negative scriptx */ + } /* End of checking non-Common character */ + + /* The character is in an acceptable script. We must now ensure that all + decimal digits in the string come from the same set. Some scripts (e.g. + Common, Arabic) have more than one set of decimal digits. This code does + not allow mixing sets, even within the same script. The vector called + PRIV(ucd_digit_sets)[] contains, in its first element, the number of + following elements, and then, in ascending order, the code points of the + '9' characters in every set of 10 digits. Each set is identified by the + offset in the vector of its '9' character. An initial check of the first + value picks up ASCII digits quickly. Otherwise, a binary chop is used. */ + + if (ucd->chartype == ucp_Nd) + { + uint32_t digitset; + + if (c <= PRIV(ucd_digit_sets)[1]) digitset = 1; else + { + int mid; + int bot = 1; + int top = PRIV(ucd_digit_sets)[0]; + for (;;) + { + if (top <= bot + 1) /* <= rather than == is paranoia */ + { + digitset = top; + break; + } + mid = (top + bot) / 2; + if (c <= PRIV(ucd_digit_sets)[mid]) top = mid; else bot = mid; + } + } + + /* A required value of 0 means "unset". */ + + if (require_digitset == 0) require_digitset = digitset; + else if (digitset != require_digitset) return FALSE; + } /* End digit handling */ + } /* End checking non-Inherited character */ + + /* If we haven't yet got to the end, pick up the next character. */ + + if (ptr >= endptr) return TRUE; + GETCHARINCTEST(c, ptr); + } /* End checking loop */ + +#else /* NOT SUPPORT_UNICODE */ +(void)ptr; +(void)endptr; +(void)utf; +return TRUE; +#endif /* SUPPORT_UNICODE */ +} + +/* End of pcre2_script_run.c */ diff --git a/thirdparty/pcre2/src/pcre2_study.c b/thirdparty/pcre2/src/pcre2_study.c index acbf98b41b..e883c2eb4c 100644 --- a/thirdparty/pcre2/src/pcre2_study.c +++ b/thirdparty/pcre2/src/pcre2_study.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -54,7 +54,7 @@ collecting data (e.g. minimum matching length). */ /* Set a bit in the starting code unit bit map. */ -#define SET_BIT(c) re->start_bitmap[(c)/8] |= (1 << ((c)&7)) +#define SET_BIT(c) re->start_bitmap[(c)/8] |= (1u << ((c)&7)) /* Returns from set_start_bits() */ @@ -171,6 +171,7 @@ for (;;) /* Fall through */ case OP_ONCE: + case OP_SCRIPT_RUN: case OP_SBRA: case OP_BRAPOS: case OP_SBRAPOS: @@ -842,7 +843,7 @@ for (c = 0; c < table_limit; c++) if (table_limit == 32) return; for (c = 128; c < 256; c++) { - if ((re->tables[cbits_offset + c/8] & (1 << (c&7))) != 0) + if ((re->tables[cbits_offset + c/8] & (1u << (c&7))) != 0) { PCRE2_UCHAR buff[6]; (void)PRIV(ord2utf)(c, buff); @@ -1075,6 +1076,7 @@ do case OP_CBRAPOS: case OP_SCBRAPOS: case OP_ONCE: + case OP_SCRIPT_RUN: case OP_ASSERT: rc = set_start_bits(re, tcode, utf); if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc; @@ -1505,11 +1507,11 @@ do for (c = 0; c < 16; c++) re->start_bitmap[c] |= classmap[c]; for (c = 128; c < 256; c++) { - if ((classmap[c/8] & (1 << (c&7))) != 0) + if ((classmap[c/8] & (1u << (c&7))) != 0) { - int d = (c >> 6) | 0xc0; /* Set bit for this starter */ - re->start_bitmap[d/8] |= (1 << (d&7)); /* and then skip on to the */ - c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */ + int d = (c >> 6) | 0xc0; /* Set bit for this starter */ + re->start_bitmap[d/8] |= (1u << (d&7)); /* and then skip on to the */ + c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */ } } } diff --git a/thirdparty/pcre2/src/pcre2_substitute.c b/thirdparty/pcre2/src/pcre2_substitute.c index ab8d10908a..ec3dd66df9 100644 --- a/thirdparty/pcre2/src/pcre2_substitute.c +++ b/thirdparty/pcre2/src/pcre2_substitute.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -129,7 +129,7 @@ for (; ptr < ptrend; ptr++) ptr += 1; /* Must point after \ */ erc = PRIV(check_escape)(&ptr, ptrend, &ch, &errorcode, - code->overall_options, FALSE, NULL); + code->overall_options, code->extra_options, FALSE, NULL); ptr -= 1; /* Back to last code unit of escape */ if (errorcode != 0) { @@ -239,13 +239,17 @@ PCRE2_SIZE extra_needed = 0; PCRE2_SIZE buff_offset, buff_length, lengthleft, fraglength; PCRE2_SIZE *ovector; PCRE2_SIZE ovecsave[3]; +pcre2_substitute_callout_block scb; + +/* General initialization */ buff_offset = 0; lengthleft = buff_length = *blength; *blength = PCRE2_UNSET; ovecsave[0] = ovecsave[1] = ovecsave[2] = PCRE2_UNSET; -/* Partial matching is not valid. */ +/* Partial matching is not valid. This must come after setting *blength to +PCRE2_UNSET, so as not to imply an offset in the replacement. */ if ((options & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) != 0) return PCRE2_ERROR_BADOPTION; @@ -264,6 +268,13 @@ if (match_data == NULL) ovector = pcre2_get_ovector_pointer(match_data); ovector_count = pcre2_get_ovector_count(match_data); +/* Fixed things in the callout block */ + +scb.version = 0; +scb.input = subject; +scb.output = (PCRE2_SPTR)buffer; +scb.ovector = ovector; + /* Find lengths of zero-terminated strings and the end of the replacement. */ if (length == PCRE2_ZERO_TERMINATED) length = PRIV(strlen)(subject); @@ -390,7 +401,7 @@ do rc = PCRE2_ERROR_INTERNAL_DUPMATCH; goto EXIT; } - + /* Count substitutions with a paranoid check for integer overflow; surely no real call to this function would ever hit this! */ @@ -401,11 +412,14 @@ do } subs++; - /* Copy the text leading up to the match. */ + /* Copy the text leading up to the match, and remember where the insert + begins and how many ovector pairs are set. */ if (rc == 0) rc = ovector_count; fraglength = ovector[0] - start_offset; CHECKMEMCPY(subject + start_offset, fraglength); + scb.output_offsets[0] = buff_offset; + scb.oveccount = rc; /* Process the replacement string. Literal mode is set by \Q, but only in extended mode when backslashes are being interpreted. In extended mode we @@ -421,7 +435,7 @@ do if (ptr >= repend) { - if (ptrstackptr <= 0) break; /* End of replacement string */ + if (ptrstackptr == 0) break; /* End of replacement string */ repend = ptrstack[--ptrstackptr]; ptr = ptrstack[--ptrstackptr]; continue; @@ -702,7 +716,7 @@ do { if (((code->tables + cbits_offset + ((forcecase > 0)? cbit_upper:cbit_lower) - )[ch/8] & (1 << (ch%8))) == 0) + )[ch/8] & (1u << (ch%8))) == 0) ch = (code->tables + fcc_offset)[ch]; } forcecase = forcecasereset; @@ -760,7 +774,7 @@ do ptr++; /* Point after \ */ rc = PRIV(check_escape)(&ptr, repend, &ch, &errorcode, - code->overall_options, FALSE, NULL); + code->overall_options, code->extra_options, FALSE, NULL); if (errorcode != 0) goto BADESCAPE; switch(rc) @@ -804,7 +818,7 @@ do { if (((code->tables + cbits_offset + ((forcecase > 0)? cbit_upper:cbit_lower) - )[ch/8] & (1 << (ch%8))) == 0) + )[ch/8] & (1u << (ch%8))) == 0) ch = (code->tables + fcc_offset)[ch]; } forcecase = forcecasereset; @@ -821,10 +835,37 @@ do } /* End handling a literal code unit */ } /* End of loop for scanning the replacement. */ - /* The replacement has been copied to the output. Save the details of this - match. See above for how this data is used. If we matched an empty string, do - the magic for global matches. Finally, update the start offset to point to - the rest of the subject string. */ + /* The replacement has been copied to the output, or its size has been + remembered. Do the callout if there is one and we have done an actual + replacement. */ + + if (!overflowed && mcontext != NULL && mcontext->substitute_callout != NULL) + { + scb.subscount = subs; + scb.output_offsets[1] = buff_offset; + rc = mcontext->substitute_callout(&scb, mcontext->substitute_callout_data); + + /* A non-zero return means cancel this substitution. Instead, copy the + matched string fragment. */ + + if (rc != 0) + { + PCRE2_SIZE newlength = scb.output_offsets[1] - scb.output_offsets[0]; + PCRE2_SIZE oldlength = ovector[1] - ovector[0]; + + buff_offset -= newlength; + lengthleft += newlength; + CHECKMEMCPY(subject + ovector[0], oldlength); + + /* A negative return means do not do any more. */ + + if (rc < 0) suboptions &= (~PCRE2_SUBSTITUTE_GLOBAL); + } + } + + /* Save the details of this match. See above for how this data is used. If we + matched an empty string, do the magic for global matches. Finally, update the + start offset to point to the rest of the subject string. */ ovecsave[0] = ovector[0]; ovecsave[1] = ovector[1]; diff --git a/thirdparty/pcre2/src/pcre2_tables.c b/thirdparty/pcre2/src/pcre2_tables.c index 83d6f9de55..84019361fc 100644 --- a/thirdparty/pcre2/src/pcre2_tables.c +++ b/thirdparty/pcre2/src/pcre2_tables.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016-2018 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -142,7 +142,7 @@ ucp_gbXX values defined in pcre2_ucp.h. These changed between Unicode versions code points. The left property selects a word from the table, and the right property selects a bit from that word like this: - PRIV(ucp_gbtable)[left-property] & (1 << right-property) + PRIV(ucp_gbtable)[left-property] & (1u << right-property) The value is non-zero if a grapheme break is NOT permitted between the relevant two code points. The breaking rules are as follows: @@ -183,25 +183,25 @@ are implementing). #define ESZ (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbZWJ) const uint32_t PRIV(ucp_gbtable)[] = { - (1<<ucp_gbLF), /* 0 CR */ - 0, /* 1 LF */ - 0, /* 2 Control */ - ESZ, /* 3 Extend */ - ESZ|(1<<ucp_gbPrepend)| /* 4 Prepend */ - (1<<ucp_gbL)|(1<<ucp_gbV)|(1<<ucp_gbT)| - (1<<ucp_gbLV)|(1<<ucp_gbLVT)|(1<<ucp_gbOther)| - (1<<ucp_gbRegionalIndicator), - ESZ, /* 5 SpacingMark */ - ESZ|(1<<ucp_gbL)|(1<<ucp_gbV)|(1<<ucp_gbLV)| /* 6 L */ - (1<<ucp_gbLVT), - ESZ|(1<<ucp_gbV)|(1<<ucp_gbT), /* 7 V */ - ESZ|(1<<ucp_gbT), /* 8 T */ - ESZ|(1<<ucp_gbV)|(1<<ucp_gbT), /* 9 LV */ - ESZ|(1<<ucp_gbT), /* 10 LVT */ - (1<<ucp_gbRegionalIndicator), /* 11 RegionalIndicator */ - ESZ, /* 12 Other */ - ESZ, /* 13 ZWJ */ - ESZ|(1<<ucp_gbExtended_Pictographic) /* 14 Extended Pictographic */ + (1u<<ucp_gbLF), /* 0 CR */ + 0, /* 1 LF */ + 0, /* 2 Control */ + ESZ, /* 3 Extend */ + ESZ|(1u<<ucp_gbPrepend)| /* 4 Prepend */ + (1u<<ucp_gbL)|(1u<<ucp_gbV)|(1u<<ucp_gbT)| + (1u<<ucp_gbLV)|(1u<<ucp_gbLVT)|(1u<<ucp_gbOther)| + (1u<<ucp_gbRegionalIndicator), + ESZ, /* 5 SpacingMark */ + ESZ|(1u<<ucp_gbL)|(1u<<ucp_gbV)|(1u<<ucp_gbLV)| /* 6 L */ + (1u<<ucp_gbLVT), + ESZ|(1u<<ucp_gbV)|(1u<<ucp_gbT), /* 7 V */ + ESZ|(1u<<ucp_gbT), /* 8 T */ + ESZ|(1u<<ucp_gbV)|(1u<<ucp_gbT), /* 9 LV */ + ESZ|(1u<<ucp_gbT), /* 10 LVT */ + (1u<<ucp_gbRegionalIndicator), /* 11 RegionalIndicator */ + ESZ, /* 12 Other */ + ESZ, /* 13 ZWJ */ + ESZ|(1u<<ucp_gbExtended_Pictographic) /* 14 Extended Pictographic */ }; #undef ESZ @@ -417,6 +417,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Tifinagh0 STR_T STR_i STR_f STR_i STR_n STR_a STR_g STR_h "\0" #define STRING_Tirhuta0 STR_T STR_i STR_r STR_h STR_u STR_t STR_a "\0" #define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c "\0" +#define STRING_Unknown0 STR_U STR_n STR_k STR_n STR_o STR_w STR_n "\0" #define STRING_Vai0 STR_V STR_a STR_i "\0" #define STRING_Warang_Citi0 STR_W STR_a STR_r STR_a STR_n STR_g STR_UNDERSCORE STR_C STR_i STR_t STR_i "\0" #define STRING_Xan0 STR_X STR_a STR_n "\0" @@ -611,6 +612,7 @@ const char PRIV(utt_names)[] = STRING_Tifinagh0 STRING_Tirhuta0 STRING_Ugaritic0 + STRING_Unknown0 STRING_Vai0 STRING_Warang_Citi0 STRING_Xan0 @@ -805,19 +807,20 @@ const ucp_type_table PRIV(utt)[] = { { 1424, PT_SC, ucp_Tifinagh }, { 1433, PT_SC, ucp_Tirhuta }, { 1441, PT_SC, ucp_Ugaritic }, - { 1450, PT_SC, ucp_Vai }, - { 1454, PT_SC, ucp_Warang_Citi }, - { 1466, PT_ALNUM, 0 }, - { 1470, PT_PXSPACE, 0 }, - { 1474, PT_SPACE, 0 }, - { 1478, PT_UCNC, 0 }, - { 1482, PT_WORD, 0 }, - { 1486, PT_SC, ucp_Yi }, - { 1489, PT_GC, ucp_Z }, - { 1491, PT_SC, ucp_Zanabazar_Square }, - { 1508, PT_PC, ucp_Zl }, - { 1511, PT_PC, ucp_Zp }, - { 1514, PT_PC, ucp_Zs } + { 1450, PT_SC, ucp_Unknown }, + { 1458, PT_SC, ucp_Vai }, + { 1462, PT_SC, ucp_Warang_Citi }, + { 1474, PT_ALNUM, 0 }, + { 1478, PT_PXSPACE, 0 }, + { 1482, PT_SPACE, 0 }, + { 1486, PT_UCNC, 0 }, + { 1490, PT_WORD, 0 }, + { 1494, PT_SC, ucp_Yi }, + { 1497, PT_GC, ucp_Z }, + { 1499, PT_SC, ucp_Zanabazar_Square }, + { 1516, PT_PC, ucp_Zl }, + { 1519, PT_PC, ucp_Zp }, + { 1522, PT_PC, ucp_Zs } }; const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table); diff --git a/thirdparty/pcre2/src/pcre2_ucd.c b/thirdparty/pcre2/src/pcre2_ucd.c index 275a4be2fe..cc53c24001 100644 --- a/thirdparty/pcre2/src/pcre2_ucd.c +++ b/thirdparty/pcre2/src/pcre2_ucd.c @@ -20,7 +20,7 @@ needed. */ /* Unicode character database. */ /* This file was autogenerated by the MultiStage2.py script. */ -/* Total size: 92592 bytes, block size: 128. */ +/* Total size: 97152 bytes, block size: 128. */ /* The tables herein are needed only when UCP support is built, and in PCRE2 that happens automatically with UTF support. @@ -30,10 +30,10 @@ a comment was received about space saving - maybe the guy linked all the modules rather than using a library - so we include a condition to cut out the tables when not needed. But don't leave a totally empty module because some compilers barf at that. -Instead, just supply small dummy tables. */ +Instead, just supply some small dummy tables. */ #ifndef SUPPORT_UNICODE -const ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0 }}; +const ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0,0,0 }}; const uint16_t PRIV(ucd_stage1)[] = {0}; const uint16_t PRIV(ucd_stage2)[] = {0}; const uint32_t PRIV(ucd_caseless_sets)[] = {0}; @@ -47,11 +47,13 @@ special record. */ #if PCRE2_CODE_UNIT_WIDTH == 32 const ucd_record PRIV(dummy_ucd_record)[] = {{ - ucp_Common, /* script */ - ucp_Cn, /* type unassigned */ - ucp_gbOther, /* grapheme break property */ - 0, /* case set */ - 0, /* other case */ + ucp_Unknown, /* script */ + ucp_Cn, /* type unassigned */ + ucp_gbOther, /* grapheme break property */ + 0, /* case set */ + 0, /* other case */ + ucp_Unknown, /* script extension */ + 0, /* dummy filler */ }}; #endif @@ -65,9 +67,13 @@ uint8_t property_1; uint8_t property_2; uint8_t property_3; pcre_int32 property_4; +pcre_int16 property_5; +uint16_t property_6; } ucd_record; */ +/* This table contains lists of characters that are caseless sets of +more than one character. Each list is terminated by NOTACHAR. */ const uint32_t PRIV(ucd_caseless_sets)[] = { NOTACHAR, @@ -100,865 +106,1014 @@ const uint32_t PRIV(ucd_caseless_sets)[] = { 0x1c88, 0xa64a, 0xa64b, NOTACHAR, }; -/* When #included in pcre2test, we don't need this large table. */ +/* When #included in pcre2test, we don't need the table of digit +sets, nor the the large main UCD tables. */ #ifndef PCRE2_PCRE2TEST -const ucd_record PRIV(ucd_records)[] = { /* 6832 bytes, record size 8 */ - { 9, 0, 2, 0, 0, }, /* 0 */ - { 9, 0, 1, 0, 0, }, /* 1 */ - { 9, 0, 0, 0, 0, }, /* 2 */ - { 9, 29, 12, 0, 0, }, /* 3 */ - { 9, 21, 12, 0, 0, }, /* 4 */ - { 9, 23, 12, 0, 0, }, /* 5 */ - { 9, 22, 12, 0, 0, }, /* 6 */ - { 9, 18, 12, 0, 0, }, /* 7 */ - { 9, 25, 12, 0, 0, }, /* 8 */ - { 9, 17, 12, 0, 0, }, /* 9 */ - { 9, 13, 12, 0, 0, }, /* 10 */ - { 33, 9, 12, 0, 32, }, /* 11 */ - { 33, 9, 12, 100, 32, }, /* 12 */ - { 33, 9, 12, 1, 32, }, /* 13 */ - { 9, 24, 12, 0, 0, }, /* 14 */ - { 9, 16, 12, 0, 0, }, /* 15 */ - { 33, 5, 12, 0, -32, }, /* 16 */ - { 33, 5, 12, 100, -32, }, /* 17 */ - { 33, 5, 12, 1, -32, }, /* 18 */ - { 9, 26, 12, 0, 0, }, /* 19 */ - { 9, 26, 14, 0, 0, }, /* 20 */ - { 33, 7, 12, 0, 0, }, /* 21 */ - { 9, 20, 12, 0, 0, }, /* 22 */ - { 9, 1, 2, 0, 0, }, /* 23 */ - { 9, 15, 12, 0, 0, }, /* 24 */ - { 9, 5, 12, 26, 775, }, /* 25 */ - { 9, 19, 12, 0, 0, }, /* 26 */ - { 33, 9, 12, 104, 32, }, /* 27 */ - { 33, 5, 12, 0, 7615, }, /* 28 */ - { 33, 5, 12, 104, -32, }, /* 29 */ - { 33, 5, 12, 0, 121, }, /* 30 */ - { 33, 9, 12, 0, 1, }, /* 31 */ - { 33, 5, 12, 0, -1, }, /* 32 */ - { 33, 9, 12, 0, 0, }, /* 33 */ - { 33, 5, 12, 0, 0, }, /* 34 */ - { 33, 9, 12, 0, -121, }, /* 35 */ - { 33, 5, 12, 1, -268, }, /* 36 */ - { 33, 5, 12, 0, 195, }, /* 37 */ - { 33, 9, 12, 0, 210, }, /* 38 */ - { 33, 9, 12, 0, 206, }, /* 39 */ - { 33, 9, 12, 0, 205, }, /* 40 */ - { 33, 9, 12, 0, 79, }, /* 41 */ - { 33, 9, 12, 0, 202, }, /* 42 */ - { 33, 9, 12, 0, 203, }, /* 43 */ - { 33, 9, 12, 0, 207, }, /* 44 */ - { 33, 5, 12, 0, 97, }, /* 45 */ - { 33, 9, 12, 0, 211, }, /* 46 */ - { 33, 9, 12, 0, 209, }, /* 47 */ - { 33, 5, 12, 0, 163, }, /* 48 */ - { 33, 9, 12, 0, 213, }, /* 49 */ - { 33, 5, 12, 0, 130, }, /* 50 */ - { 33, 9, 12, 0, 214, }, /* 51 */ - { 33, 9, 12, 0, 218, }, /* 52 */ - { 33, 9, 12, 0, 217, }, /* 53 */ - { 33, 9, 12, 0, 219, }, /* 54 */ - { 33, 5, 12, 0, 56, }, /* 55 */ - { 33, 9, 12, 5, 2, }, /* 56 */ - { 33, 8, 12, 5, 1, }, /* 57 */ - { 33, 5, 12, 5, -2, }, /* 58 */ - { 33, 9, 12, 9, 2, }, /* 59 */ - { 33, 8, 12, 9, 1, }, /* 60 */ - { 33, 5, 12, 9, -2, }, /* 61 */ - { 33, 9, 12, 13, 2, }, /* 62 */ - { 33, 8, 12, 13, 1, }, /* 63 */ - { 33, 5, 12, 13, -2, }, /* 64 */ - { 33, 5, 12, 0, -79, }, /* 65 */ - { 33, 9, 12, 17, 2, }, /* 66 */ - { 33, 8, 12, 17, 1, }, /* 67 */ - { 33, 5, 12, 17, -2, }, /* 68 */ - { 33, 9, 12, 0, -97, }, /* 69 */ - { 33, 9, 12, 0, -56, }, /* 70 */ - { 33, 9, 12, 0, -130, }, /* 71 */ - { 33, 9, 12, 0, 10795, }, /* 72 */ - { 33, 9, 12, 0, -163, }, /* 73 */ - { 33, 9, 12, 0, 10792, }, /* 74 */ - { 33, 5, 12, 0, 10815, }, /* 75 */ - { 33, 9, 12, 0, -195, }, /* 76 */ - { 33, 9, 12, 0, 69, }, /* 77 */ - { 33, 9, 12, 0, 71, }, /* 78 */ - { 33, 5, 12, 0, 10783, }, /* 79 */ - { 33, 5, 12, 0, 10780, }, /* 80 */ - { 33, 5, 12, 0, 10782, }, /* 81 */ - { 33, 5, 12, 0, -210, }, /* 82 */ - { 33, 5, 12, 0, -206, }, /* 83 */ - { 33, 5, 12, 0, -205, }, /* 84 */ - { 33, 5, 12, 0, -202, }, /* 85 */ - { 33, 5, 12, 0, -203, }, /* 86 */ - { 33, 5, 12, 0, 42319, }, /* 87 */ - { 33, 5, 12, 0, 42315, }, /* 88 */ - { 33, 5, 12, 0, -207, }, /* 89 */ - { 33, 5, 12, 0, 42280, }, /* 90 */ - { 33, 5, 12, 0, 42308, }, /* 91 */ - { 33, 5, 12, 0, -209, }, /* 92 */ - { 33, 5, 12, 0, -211, }, /* 93 */ - { 33, 5, 12, 0, 10743, }, /* 94 */ - { 33, 5, 12, 0, 42305, }, /* 95 */ - { 33, 5, 12, 0, 10749, }, /* 96 */ - { 33, 5, 12, 0, -213, }, /* 97 */ - { 33, 5, 12, 0, -214, }, /* 98 */ - { 33, 5, 12, 0, 10727, }, /* 99 */ - { 33, 5, 12, 0, -218, }, /* 100 */ - { 33, 5, 12, 0, 42282, }, /* 101 */ - { 33, 5, 12, 0, -69, }, /* 102 */ - { 33, 5, 12, 0, -217, }, /* 103 */ - { 33, 5, 12, 0, -71, }, /* 104 */ - { 33, 5, 12, 0, -219, }, /* 105 */ - { 33, 5, 12, 0, 42261, }, /* 106 */ - { 33, 5, 12, 0, 42258, }, /* 107 */ - { 33, 6, 12, 0, 0, }, /* 108 */ - { 9, 6, 12, 0, 0, }, /* 109 */ - { 3, 24, 12, 0, 0, }, /* 110 */ - { 27, 12, 3, 0, 0, }, /* 111 */ - { 27, 12, 3, 21, 116, }, /* 112 */ - { 19, 9, 12, 0, 1, }, /* 113 */ - { 19, 5, 12, 0, -1, }, /* 114 */ - { 19, 24, 12, 0, 0, }, /* 115 */ - { 9, 2, 12, 0, 0, }, /* 116 */ - { 19, 6, 12, 0, 0, }, /* 117 */ - { 19, 5, 12, 0, 130, }, /* 118 */ - { 19, 9, 12, 0, 116, }, /* 119 */ - { 19, 9, 12, 0, 38, }, /* 120 */ - { 19, 9, 12, 0, 37, }, /* 121 */ - { 19, 9, 12, 0, 64, }, /* 122 */ - { 19, 9, 12, 0, 63, }, /* 123 */ - { 19, 5, 12, 0, 0, }, /* 124 */ - { 19, 9, 12, 0, 32, }, /* 125 */ - { 19, 9, 12, 34, 32, }, /* 126 */ - { 19, 9, 12, 59, 32, }, /* 127 */ - { 19, 9, 12, 38, 32, }, /* 128 */ - { 19, 9, 12, 21, 32, }, /* 129 */ - { 19, 9, 12, 51, 32, }, /* 130 */ - { 19, 9, 12, 26, 32, }, /* 131 */ - { 19, 9, 12, 47, 32, }, /* 132 */ - { 19, 9, 12, 55, 32, }, /* 133 */ - { 19, 9, 12, 30, 32, }, /* 134 */ - { 19, 9, 12, 43, 32, }, /* 135 */ - { 19, 9, 12, 96, 32, }, /* 136 */ - { 19, 5, 12, 0, -38, }, /* 137 */ - { 19, 5, 12, 0, -37, }, /* 138 */ - { 19, 5, 12, 0, -32, }, /* 139 */ - { 19, 5, 12, 34, -32, }, /* 140 */ - { 19, 5, 12, 59, -32, }, /* 141 */ - { 19, 5, 12, 38, -32, }, /* 142 */ - { 19, 5, 12, 21, -116, }, /* 143 */ - { 19, 5, 12, 51, -32, }, /* 144 */ - { 19, 5, 12, 26, -775, }, /* 145 */ - { 19, 5, 12, 47, -32, }, /* 146 */ - { 19, 5, 12, 55, -32, }, /* 147 */ - { 19, 5, 12, 30, 1, }, /* 148 */ - { 19, 5, 12, 30, -32, }, /* 149 */ - { 19, 5, 12, 43, -32, }, /* 150 */ - { 19, 5, 12, 96, -32, }, /* 151 */ - { 19, 5, 12, 0, -64, }, /* 152 */ - { 19, 5, 12, 0, -63, }, /* 153 */ - { 19, 9, 12, 0, 8, }, /* 154 */ - { 19, 5, 12, 34, -30, }, /* 155 */ - { 19, 5, 12, 38, -25, }, /* 156 */ - { 19, 9, 12, 0, 0, }, /* 157 */ - { 19, 5, 12, 43, -15, }, /* 158 */ - { 19, 5, 12, 47, -22, }, /* 159 */ - { 19, 5, 12, 0, -8, }, /* 160 */ - { 10, 9, 12, 0, 1, }, /* 161 */ - { 10, 5, 12, 0, -1, }, /* 162 */ - { 19, 5, 12, 51, -54, }, /* 163 */ - { 19, 5, 12, 55, -48, }, /* 164 */ - { 19, 5, 12, 0, 7, }, /* 165 */ - { 19, 5, 12, 0, -116, }, /* 166 */ - { 19, 9, 12, 38, -60, }, /* 167 */ - { 19, 5, 12, 59, -64, }, /* 168 */ - { 19, 25, 12, 0, 0, }, /* 169 */ - { 19, 9, 12, 0, -7, }, /* 170 */ - { 19, 9, 12, 0, -130, }, /* 171 */ - { 12, 9, 12, 0, 80, }, /* 172 */ - { 12, 9, 12, 0, 32, }, /* 173 */ - { 12, 9, 12, 63, 32, }, /* 174 */ - { 12, 9, 12, 67, 32, }, /* 175 */ - { 12, 9, 12, 71, 32, }, /* 176 */ - { 12, 9, 12, 75, 32, }, /* 177 */ - { 12, 9, 12, 79, 32, }, /* 178 */ - { 12, 9, 12, 84, 32, }, /* 179 */ - { 12, 5, 12, 0, -32, }, /* 180 */ - { 12, 5, 12, 63, -32, }, /* 181 */ - { 12, 5, 12, 67, -32, }, /* 182 */ - { 12, 5, 12, 71, -32, }, /* 183 */ - { 12, 5, 12, 75, -32, }, /* 184 */ - { 12, 5, 12, 79, -32, }, /* 185 */ - { 12, 5, 12, 84, -32, }, /* 186 */ - { 12, 5, 12, 0, -80, }, /* 187 */ - { 12, 9, 12, 0, 1, }, /* 188 */ - { 12, 5, 12, 0, -1, }, /* 189 */ - { 12, 9, 12, 88, 1, }, /* 190 */ - { 12, 5, 12, 88, -1, }, /* 191 */ - { 12, 26, 12, 0, 0, }, /* 192 */ - { 12, 12, 3, 0, 0, }, /* 193 */ - { 12, 11, 3, 0, 0, }, /* 194 */ - { 12, 9, 12, 0, 15, }, /* 195 */ - { 12, 5, 12, 0, -15, }, /* 196 */ - { 1, 9, 12, 0, 48, }, /* 197 */ - { 1, 6, 12, 0, 0, }, /* 198 */ - { 1, 21, 12, 0, 0, }, /* 199 */ - { 1, 5, 12, 0, 0, }, /* 200 */ - { 1, 5, 12, 0, -48, }, /* 201 */ - { 1, 17, 12, 0, 0, }, /* 202 */ - { 1, 26, 12, 0, 0, }, /* 203 */ - { 1, 23, 12, 0, 0, }, /* 204 */ - { 25, 12, 3, 0, 0, }, /* 205 */ - { 25, 17, 12, 0, 0, }, /* 206 */ - { 25, 21, 12, 0, 0, }, /* 207 */ - { 25, 7, 12, 0, 0, }, /* 208 */ - { 0, 1, 4, 0, 0, }, /* 209 */ - { 9, 1, 4, 0, 0, }, /* 210 */ - { 0, 25, 12, 0, 0, }, /* 211 */ - { 0, 21, 12, 0, 0, }, /* 212 */ - { 0, 23, 12, 0, 0, }, /* 213 */ - { 0, 26, 12, 0, 0, }, /* 214 */ - { 0, 12, 3, 0, 0, }, /* 215 */ - { 0, 1, 2, 0, 0, }, /* 216 */ - { 0, 7, 12, 0, 0, }, /* 217 */ - { 0, 13, 12, 0, 0, }, /* 218 */ - { 0, 6, 12, 0, 0, }, /* 219 */ - { 49, 21, 12, 0, 0, }, /* 220 */ - { 49, 1, 4, 0, 0, }, /* 221 */ - { 49, 7, 12, 0, 0, }, /* 222 */ - { 49, 12, 3, 0, 0, }, /* 223 */ - { 55, 7, 12, 0, 0, }, /* 224 */ - { 55, 12, 3, 0, 0, }, /* 225 */ - { 63, 13, 12, 0, 0, }, /* 226 */ - { 63, 7, 12, 0, 0, }, /* 227 */ - { 63, 12, 3, 0, 0, }, /* 228 */ - { 63, 6, 12, 0, 0, }, /* 229 */ - { 63, 26, 12, 0, 0, }, /* 230 */ - { 63, 21, 12, 0, 0, }, /* 231 */ - { 63, 23, 12, 0, 0, }, /* 232 */ - { 89, 7, 12, 0, 0, }, /* 233 */ - { 89, 12, 3, 0, 0, }, /* 234 */ - { 89, 6, 12, 0, 0, }, /* 235 */ - { 89, 21, 12, 0, 0, }, /* 236 */ - { 94, 7, 12, 0, 0, }, /* 237 */ - { 94, 12, 3, 0, 0, }, /* 238 */ - { 94, 21, 12, 0, 0, }, /* 239 */ - { 14, 12, 3, 0, 0, }, /* 240 */ - { 14, 10, 5, 0, 0, }, /* 241 */ - { 14, 7, 12, 0, 0, }, /* 242 */ - { 14, 13, 12, 0, 0, }, /* 243 */ - { 14, 21, 12, 0, 0, }, /* 244 */ - { 14, 6, 12, 0, 0, }, /* 245 */ - { 2, 7, 12, 0, 0, }, /* 246 */ - { 2, 12, 3, 0, 0, }, /* 247 */ - { 2, 10, 5, 0, 0, }, /* 248 */ - { 2, 10, 3, 0, 0, }, /* 249 */ - { 2, 13, 12, 0, 0, }, /* 250 */ - { 2, 23, 12, 0, 0, }, /* 251 */ - { 2, 15, 12, 0, 0, }, /* 252 */ - { 2, 26, 12, 0, 0, }, /* 253 */ - { 2, 21, 12, 0, 0, }, /* 254 */ - { 21, 12, 3, 0, 0, }, /* 255 */ - { 21, 10, 5, 0, 0, }, /* 256 */ - { 21, 7, 12, 0, 0, }, /* 257 */ - { 21, 13, 12, 0, 0, }, /* 258 */ - { 21, 21, 12, 0, 0, }, /* 259 */ - { 20, 12, 3, 0, 0, }, /* 260 */ - { 20, 10, 5, 0, 0, }, /* 261 */ - { 20, 7, 12, 0, 0, }, /* 262 */ - { 20, 13, 12, 0, 0, }, /* 263 */ - { 20, 21, 12, 0, 0, }, /* 264 */ - { 20, 23, 12, 0, 0, }, /* 265 */ - { 43, 12, 3, 0, 0, }, /* 266 */ - { 43, 10, 5, 0, 0, }, /* 267 */ - { 43, 7, 12, 0, 0, }, /* 268 */ - { 43, 10, 3, 0, 0, }, /* 269 */ - { 43, 13, 12, 0, 0, }, /* 270 */ - { 43, 26, 12, 0, 0, }, /* 271 */ - { 43, 15, 12, 0, 0, }, /* 272 */ - { 53, 12, 3, 0, 0, }, /* 273 */ - { 53, 7, 12, 0, 0, }, /* 274 */ - { 53, 10, 3, 0, 0, }, /* 275 */ - { 53, 10, 5, 0, 0, }, /* 276 */ - { 53, 13, 12, 0, 0, }, /* 277 */ - { 53, 15, 12, 0, 0, }, /* 278 */ - { 53, 26, 12, 0, 0, }, /* 279 */ - { 53, 23, 12, 0, 0, }, /* 280 */ - { 54, 12, 3, 0, 0, }, /* 281 */ - { 54, 10, 5, 0, 0, }, /* 282 */ - { 54, 7, 12, 0, 0, }, /* 283 */ - { 54, 13, 12, 0, 0, }, /* 284 */ - { 54, 15, 12, 0, 0, }, /* 285 */ - { 54, 26, 12, 0, 0, }, /* 286 */ - { 28, 7, 12, 0, 0, }, /* 287 */ - { 28, 12, 3, 0, 0, }, /* 288 */ - { 28, 10, 5, 0, 0, }, /* 289 */ - { 28, 21, 12, 0, 0, }, /* 290 */ - { 28, 10, 3, 0, 0, }, /* 291 */ - { 28, 13, 12, 0, 0, }, /* 292 */ - { 36, 12, 3, 0, 0, }, /* 293 */ - { 36, 10, 5, 0, 0, }, /* 294 */ - { 36, 7, 12, 0, 0, }, /* 295 */ - { 36, 10, 3, 0, 0, }, /* 296 */ - { 36, 7, 4, 0, 0, }, /* 297 */ - { 36, 26, 12, 0, 0, }, /* 298 */ - { 36, 15, 12, 0, 0, }, /* 299 */ - { 36, 13, 12, 0, 0, }, /* 300 */ - { 47, 10, 5, 0, 0, }, /* 301 */ - { 47, 7, 12, 0, 0, }, /* 302 */ - { 47, 12, 3, 0, 0, }, /* 303 */ - { 47, 10, 3, 0, 0, }, /* 304 */ - { 47, 13, 12, 0, 0, }, /* 305 */ - { 47, 21, 12, 0, 0, }, /* 306 */ - { 56, 7, 12, 0, 0, }, /* 307 */ - { 56, 12, 3, 0, 0, }, /* 308 */ - { 56, 7, 5, 0, 0, }, /* 309 */ - { 56, 6, 12, 0, 0, }, /* 310 */ - { 56, 21, 12, 0, 0, }, /* 311 */ - { 56, 13, 12, 0, 0, }, /* 312 */ - { 32, 7, 12, 0, 0, }, /* 313 */ - { 32, 12, 3, 0, 0, }, /* 314 */ - { 32, 7, 5, 0, 0, }, /* 315 */ - { 32, 6, 12, 0, 0, }, /* 316 */ - { 32, 13, 12, 0, 0, }, /* 317 */ - { 57, 7, 12, 0, 0, }, /* 318 */ - { 57, 26, 12, 0, 0, }, /* 319 */ - { 57, 21, 12, 0, 0, }, /* 320 */ - { 57, 12, 3, 0, 0, }, /* 321 */ - { 57, 13, 12, 0, 0, }, /* 322 */ - { 57, 15, 12, 0, 0, }, /* 323 */ - { 57, 22, 12, 0, 0, }, /* 324 */ - { 57, 18, 12, 0, 0, }, /* 325 */ - { 57, 10, 5, 0, 0, }, /* 326 */ - { 38, 7, 12, 0, 0, }, /* 327 */ - { 38, 10, 12, 0, 0, }, /* 328 */ - { 38, 12, 3, 0, 0, }, /* 329 */ - { 38, 10, 5, 0, 0, }, /* 330 */ - { 38, 13, 12, 0, 0, }, /* 331 */ - { 38, 21, 12, 0, 0, }, /* 332 */ - { 38, 26, 12, 0, 0, }, /* 333 */ - { 16, 9, 12, 0, 7264, }, /* 334 */ - { 16, 5, 12, 0, 3008, }, /* 335 */ - { 16, 6, 12, 0, 0, }, /* 336 */ - { 23, 7, 6, 0, 0, }, /* 337 */ - { 23, 7, 7, 0, 0, }, /* 338 */ - { 23, 7, 8, 0, 0, }, /* 339 */ - { 15, 7, 12, 0, 0, }, /* 340 */ - { 15, 12, 3, 0, 0, }, /* 341 */ - { 15, 21, 12, 0, 0, }, /* 342 */ - { 15, 15, 12, 0, 0, }, /* 343 */ - { 15, 26, 12, 0, 0, }, /* 344 */ - { 8, 9, 12, 0, 38864, }, /* 345 */ - { 8, 9, 12, 0, 8, }, /* 346 */ - { 8, 5, 12, 0, -8, }, /* 347 */ - { 7, 17, 12, 0, 0, }, /* 348 */ - { 7, 7, 12, 0, 0, }, /* 349 */ - { 7, 21, 12, 0, 0, }, /* 350 */ - { 40, 29, 12, 0, 0, }, /* 351 */ - { 40, 7, 12, 0, 0, }, /* 352 */ - { 40, 22, 12, 0, 0, }, /* 353 */ - { 40, 18, 12, 0, 0, }, /* 354 */ - { 45, 7, 12, 0, 0, }, /* 355 */ - { 45, 14, 12, 0, 0, }, /* 356 */ - { 50, 7, 12, 0, 0, }, /* 357 */ - { 50, 12, 3, 0, 0, }, /* 358 */ - { 24, 7, 12, 0, 0, }, /* 359 */ - { 24, 12, 3, 0, 0, }, /* 360 */ - { 6, 7, 12, 0, 0, }, /* 361 */ - { 6, 12, 3, 0, 0, }, /* 362 */ - { 51, 7, 12, 0, 0, }, /* 363 */ - { 51, 12, 3, 0, 0, }, /* 364 */ - { 31, 7, 12, 0, 0, }, /* 365 */ - { 31, 12, 3, 0, 0, }, /* 366 */ - { 31, 10, 5, 0, 0, }, /* 367 */ - { 31, 21, 12, 0, 0, }, /* 368 */ - { 31, 6, 12, 0, 0, }, /* 369 */ - { 31, 23, 12, 0, 0, }, /* 370 */ - { 31, 13, 12, 0, 0, }, /* 371 */ - { 31, 15, 12, 0, 0, }, /* 372 */ - { 37, 21, 12, 0, 0, }, /* 373 */ - { 37, 17, 12, 0, 0, }, /* 374 */ - { 37, 12, 3, 0, 0, }, /* 375 */ - { 37, 1, 2, 0, 0, }, /* 376 */ - { 37, 13, 12, 0, 0, }, /* 377 */ - { 37, 7, 12, 0, 0, }, /* 378 */ - { 37, 6, 12, 0, 0, }, /* 379 */ - { 34, 7, 12, 0, 0, }, /* 380 */ - { 34, 12, 3, 0, 0, }, /* 381 */ - { 34, 10, 5, 0, 0, }, /* 382 */ - { 34, 26, 12, 0, 0, }, /* 383 */ - { 34, 21, 12, 0, 0, }, /* 384 */ - { 34, 13, 12, 0, 0, }, /* 385 */ - { 52, 7, 12, 0, 0, }, /* 386 */ - { 39, 7, 12, 0, 0, }, /* 387 */ - { 39, 13, 12, 0, 0, }, /* 388 */ - { 39, 15, 12, 0, 0, }, /* 389 */ - { 39, 26, 12, 0, 0, }, /* 390 */ - { 31, 26, 12, 0, 0, }, /* 391 */ - { 5, 7, 12, 0, 0, }, /* 392 */ - { 5, 12, 3, 0, 0, }, /* 393 */ - { 5, 10, 5, 0, 0, }, /* 394 */ - { 5, 21, 12, 0, 0, }, /* 395 */ - { 90, 7, 12, 0, 0, }, /* 396 */ - { 90, 10, 5, 0, 0, }, /* 397 */ - { 90, 12, 3, 0, 0, }, /* 398 */ - { 90, 10, 12, 0, 0, }, /* 399 */ - { 90, 13, 12, 0, 0, }, /* 400 */ - { 90, 21, 12, 0, 0, }, /* 401 */ - { 90, 6, 12, 0, 0, }, /* 402 */ - { 27, 11, 3, 0, 0, }, /* 403 */ - { 61, 12, 3, 0, 0, }, /* 404 */ - { 61, 10, 5, 0, 0, }, /* 405 */ - { 61, 7, 12, 0, 0, }, /* 406 */ - { 61, 13, 12, 0, 0, }, /* 407 */ - { 61, 21, 12, 0, 0, }, /* 408 */ - { 61, 26, 12, 0, 0, }, /* 409 */ - { 75, 12, 3, 0, 0, }, /* 410 */ - { 75, 10, 5, 0, 0, }, /* 411 */ - { 75, 7, 12, 0, 0, }, /* 412 */ - { 75, 13, 12, 0, 0, }, /* 413 */ - { 92, 7, 12, 0, 0, }, /* 414 */ - { 92, 12, 3, 0, 0, }, /* 415 */ - { 92, 10, 5, 0, 0, }, /* 416 */ - { 92, 21, 12, 0, 0, }, /* 417 */ - { 69, 7, 12, 0, 0, }, /* 418 */ - { 69, 10, 5, 0, 0, }, /* 419 */ - { 69, 12, 3, 0, 0, }, /* 420 */ - { 69, 21, 12, 0, 0, }, /* 421 */ - { 69, 13, 12, 0, 0, }, /* 422 */ - { 72, 13, 12, 0, 0, }, /* 423 */ - { 72, 7, 12, 0, 0, }, /* 424 */ - { 72, 6, 12, 0, 0, }, /* 425 */ - { 72, 21, 12, 0, 0, }, /* 426 */ - { 12, 5, 12, 63, -6222, }, /* 427 */ - { 12, 5, 12, 67, -6221, }, /* 428 */ - { 12, 5, 12, 71, -6212, }, /* 429 */ - { 12, 5, 12, 75, -6210, }, /* 430 */ - { 12, 5, 12, 79, -6210, }, /* 431 */ - { 12, 5, 12, 79, -6211, }, /* 432 */ - { 12, 5, 12, 84, -6204, }, /* 433 */ - { 12, 5, 12, 88, -6180, }, /* 434 */ - { 12, 5, 12, 108, 35267, }, /* 435 */ - { 16, 9, 12, 0, -3008, }, /* 436 */ - { 75, 21, 12, 0, 0, }, /* 437 */ - { 9, 10, 5, 0, 0, }, /* 438 */ - { 9, 7, 12, 0, 0, }, /* 439 */ - { 12, 5, 12, 0, 0, }, /* 440 */ - { 12, 6, 12, 0, 0, }, /* 441 */ - { 33, 5, 12, 0, 35332, }, /* 442 */ - { 33, 5, 12, 0, 3814, }, /* 443 */ - { 33, 9, 12, 92, 1, }, /* 444 */ - { 33, 5, 12, 92, -1, }, /* 445 */ - { 33, 5, 12, 92, -58, }, /* 446 */ - { 33, 9, 12, 0, -7615, }, /* 447 */ - { 19, 5, 12, 0, 8, }, /* 448 */ - { 19, 9, 12, 0, -8, }, /* 449 */ - { 19, 5, 12, 0, 74, }, /* 450 */ - { 19, 5, 12, 0, 86, }, /* 451 */ - { 19, 5, 12, 0, 100, }, /* 452 */ - { 19, 5, 12, 0, 128, }, /* 453 */ - { 19, 5, 12, 0, 112, }, /* 454 */ - { 19, 5, 12, 0, 126, }, /* 455 */ - { 19, 8, 12, 0, -8, }, /* 456 */ - { 19, 5, 12, 0, 9, }, /* 457 */ - { 19, 9, 12, 0, -74, }, /* 458 */ - { 19, 8, 12, 0, -9, }, /* 459 */ - { 19, 5, 12, 21, -7173, }, /* 460 */ - { 19, 9, 12, 0, -86, }, /* 461 */ - { 19, 9, 12, 0, -100, }, /* 462 */ - { 19, 9, 12, 0, -112, }, /* 463 */ - { 19, 9, 12, 0, -128, }, /* 464 */ - { 19, 9, 12, 0, -126, }, /* 465 */ - { 27, 1, 3, 0, 0, }, /* 466 */ - { 27, 1, 13, 0, 0, }, /* 467 */ - { 9, 27, 2, 0, 0, }, /* 468 */ - { 9, 28, 2, 0, 0, }, /* 469 */ - { 9, 21, 14, 0, 0, }, /* 470 */ - { 9, 2, 2, 0, 0, }, /* 471 */ - { 9, 9, 12, 0, 0, }, /* 472 */ - { 9, 5, 12, 0, 0, }, /* 473 */ - { 19, 9, 12, 96, -7517, }, /* 474 */ - { 33, 9, 12, 100, -8383, }, /* 475 */ - { 33, 9, 12, 104, -8262, }, /* 476 */ - { 33, 9, 12, 0, 28, }, /* 477 */ - { 9, 5, 14, 0, 0, }, /* 478 */ - { 33, 5, 12, 0, -28, }, /* 479 */ - { 33, 14, 12, 0, 16, }, /* 480 */ - { 33, 14, 12, 0, -16, }, /* 481 */ - { 33, 14, 12, 0, 0, }, /* 482 */ - { 9, 25, 14, 0, 0, }, /* 483 */ - { 9, 26, 12, 0, 26, }, /* 484 */ - { 9, 26, 14, 0, 26, }, /* 485 */ - { 9, 26, 12, 0, -26, }, /* 486 */ - { 4, 26, 12, 0, 0, }, /* 487 */ - { 17, 9, 12, 0, 48, }, /* 488 */ - { 17, 5, 12, 0, -48, }, /* 489 */ - { 33, 9, 12, 0, -10743, }, /* 490 */ - { 33, 9, 12, 0, -3814, }, /* 491 */ - { 33, 9, 12, 0, -10727, }, /* 492 */ - { 33, 5, 12, 0, -10795, }, /* 493 */ - { 33, 5, 12, 0, -10792, }, /* 494 */ - { 33, 9, 12, 0, -10780, }, /* 495 */ - { 33, 9, 12, 0, -10749, }, /* 496 */ - { 33, 9, 12, 0, -10783, }, /* 497 */ - { 33, 9, 12, 0, -10782, }, /* 498 */ - { 33, 9, 12, 0, -10815, }, /* 499 */ - { 10, 5, 12, 0, 0, }, /* 500 */ - { 10, 26, 12, 0, 0, }, /* 501 */ - { 10, 12, 3, 0, 0, }, /* 502 */ - { 10, 21, 12, 0, 0, }, /* 503 */ - { 10, 15, 12, 0, 0, }, /* 504 */ - { 16, 5, 12, 0, -7264, }, /* 505 */ - { 58, 7, 12, 0, 0, }, /* 506 */ - { 58, 6, 12, 0, 0, }, /* 507 */ - { 58, 21, 12, 0, 0, }, /* 508 */ - { 58, 12, 3, 0, 0, }, /* 509 */ - { 22, 26, 12, 0, 0, }, /* 510 */ - { 22, 6, 12, 0, 0, }, /* 511 */ - { 22, 14, 12, 0, 0, }, /* 512 */ - { 23, 10, 3, 0, 0, }, /* 513 */ - { 9, 17, 14, 0, 0, }, /* 514 */ - { 26, 7, 12, 0, 0, }, /* 515 */ - { 26, 6, 12, 0, 0, }, /* 516 */ - { 29, 7, 12, 0, 0, }, /* 517 */ - { 29, 6, 12, 0, 0, }, /* 518 */ - { 3, 7, 12, 0, 0, }, /* 519 */ - { 23, 7, 12, 0, 0, }, /* 520 */ - { 23, 26, 12, 0, 0, }, /* 521 */ - { 29, 26, 12, 0, 0, }, /* 522 */ - { 22, 7, 12, 0, 0, }, /* 523 */ - { 60, 7, 12, 0, 0, }, /* 524 */ - { 60, 6, 12, 0, 0, }, /* 525 */ - { 60, 26, 12, 0, 0, }, /* 526 */ - { 85, 7, 12, 0, 0, }, /* 527 */ - { 85, 6, 12, 0, 0, }, /* 528 */ - { 85, 21, 12, 0, 0, }, /* 529 */ - { 76, 7, 12, 0, 0, }, /* 530 */ - { 76, 6, 12, 0, 0, }, /* 531 */ - { 76, 21, 12, 0, 0, }, /* 532 */ - { 76, 13, 12, 0, 0, }, /* 533 */ - { 12, 9, 12, 108, 1, }, /* 534 */ - { 12, 5, 12, 108, -35267, }, /* 535 */ - { 12, 7, 12, 0, 0, }, /* 536 */ - { 12, 21, 12, 0, 0, }, /* 537 */ - { 78, 7, 12, 0, 0, }, /* 538 */ - { 78, 14, 12, 0, 0, }, /* 539 */ - { 78, 12, 3, 0, 0, }, /* 540 */ - { 78, 21, 12, 0, 0, }, /* 541 */ - { 33, 9, 12, 0, -35332, }, /* 542 */ - { 33, 9, 12, 0, -42280, }, /* 543 */ - { 33, 9, 12, 0, -42308, }, /* 544 */ - { 33, 9, 12, 0, -42319, }, /* 545 */ - { 33, 9, 12, 0, -42315, }, /* 546 */ - { 33, 9, 12, 0, -42305, }, /* 547 */ - { 33, 9, 12, 0, -42258, }, /* 548 */ - { 33, 9, 12, 0, -42282, }, /* 549 */ - { 33, 9, 12, 0, -42261, }, /* 550 */ - { 33, 9, 12, 0, 928, }, /* 551 */ - { 48, 7, 12, 0, 0, }, /* 552 */ - { 48, 12, 3, 0, 0, }, /* 553 */ - { 48, 10, 5, 0, 0, }, /* 554 */ - { 48, 26, 12, 0, 0, }, /* 555 */ - { 64, 7, 12, 0, 0, }, /* 556 */ - { 64, 21, 12, 0, 0, }, /* 557 */ - { 74, 10, 5, 0, 0, }, /* 558 */ - { 74, 7, 12, 0, 0, }, /* 559 */ - { 74, 12, 3, 0, 0, }, /* 560 */ - { 74, 21, 12, 0, 0, }, /* 561 */ - { 74, 13, 12, 0, 0, }, /* 562 */ - { 68, 13, 12, 0, 0, }, /* 563 */ - { 68, 7, 12, 0, 0, }, /* 564 */ - { 68, 12, 3, 0, 0, }, /* 565 */ - { 68, 21, 12, 0, 0, }, /* 566 */ - { 73, 7, 12, 0, 0, }, /* 567 */ - { 73, 12, 3, 0, 0, }, /* 568 */ - { 73, 10, 5, 0, 0, }, /* 569 */ - { 73, 21, 12, 0, 0, }, /* 570 */ - { 83, 12, 3, 0, 0, }, /* 571 */ - { 83, 10, 5, 0, 0, }, /* 572 */ - { 83, 7, 12, 0, 0, }, /* 573 */ - { 83, 21, 12, 0, 0, }, /* 574 */ - { 83, 13, 12, 0, 0, }, /* 575 */ - { 38, 6, 12, 0, 0, }, /* 576 */ - { 67, 7, 12, 0, 0, }, /* 577 */ - { 67, 12, 3, 0, 0, }, /* 578 */ - { 67, 10, 5, 0, 0, }, /* 579 */ - { 67, 13, 12, 0, 0, }, /* 580 */ - { 67, 21, 12, 0, 0, }, /* 581 */ - { 91, 7, 12, 0, 0, }, /* 582 */ - { 91, 12, 3, 0, 0, }, /* 583 */ - { 91, 6, 12, 0, 0, }, /* 584 */ - { 91, 21, 12, 0, 0, }, /* 585 */ - { 86, 7, 12, 0, 0, }, /* 586 */ - { 86, 10, 5, 0, 0, }, /* 587 */ - { 86, 12, 3, 0, 0, }, /* 588 */ - { 86, 21, 12, 0, 0, }, /* 589 */ - { 86, 6, 12, 0, 0, }, /* 590 */ - { 33, 5, 12, 0, -928, }, /* 591 */ - { 8, 5, 12, 0, -38864, }, /* 592 */ - { 86, 13, 12, 0, 0, }, /* 593 */ - { 23, 7, 9, 0, 0, }, /* 594 */ - { 23, 7, 10, 0, 0, }, /* 595 */ - { 9, 4, 2, 0, 0, }, /* 596 */ - { 9, 3, 12, 0, 0, }, /* 597 */ - { 25, 25, 12, 0, 0, }, /* 598 */ - { 0, 24, 12, 0, 0, }, /* 599 */ - { 9, 6, 3, 0, 0, }, /* 600 */ - { 35, 7, 12, 0, 0, }, /* 601 */ - { 19, 14, 12, 0, 0, }, /* 602 */ - { 19, 15, 12, 0, 0, }, /* 603 */ - { 19, 26, 12, 0, 0, }, /* 604 */ - { 70, 7, 12, 0, 0, }, /* 605 */ - { 66, 7, 12, 0, 0, }, /* 606 */ - { 41, 7, 12, 0, 0, }, /* 607 */ - { 41, 15, 12, 0, 0, }, /* 608 */ - { 18, 7, 12, 0, 0, }, /* 609 */ - { 18, 14, 12, 0, 0, }, /* 610 */ - { 117, 7, 12, 0, 0, }, /* 611 */ - { 117, 12, 3, 0, 0, }, /* 612 */ - { 59, 7, 12, 0, 0, }, /* 613 */ - { 59, 21, 12, 0, 0, }, /* 614 */ - { 42, 7, 12, 0, 0, }, /* 615 */ - { 42, 21, 12, 0, 0, }, /* 616 */ - { 42, 14, 12, 0, 0, }, /* 617 */ - { 13, 9, 12, 0, 40, }, /* 618 */ - { 13, 5, 12, 0, -40, }, /* 619 */ - { 46, 7, 12, 0, 0, }, /* 620 */ - { 44, 7, 12, 0, 0, }, /* 621 */ - { 44, 13, 12, 0, 0, }, /* 622 */ - { 135, 9, 12, 0, 40, }, /* 623 */ - { 135, 5, 12, 0, -40, }, /* 624 */ - { 105, 7, 12, 0, 0, }, /* 625 */ - { 103, 7, 12, 0, 0, }, /* 626 */ - { 103, 21, 12, 0, 0, }, /* 627 */ - { 109, 7, 12, 0, 0, }, /* 628 */ - { 11, 7, 12, 0, 0, }, /* 629 */ - { 80, 7, 12, 0, 0, }, /* 630 */ - { 80, 21, 12, 0, 0, }, /* 631 */ - { 80, 15, 12, 0, 0, }, /* 632 */ - { 119, 7, 12, 0, 0, }, /* 633 */ - { 119, 26, 12, 0, 0, }, /* 634 */ - { 119, 15, 12, 0, 0, }, /* 635 */ - { 115, 7, 12, 0, 0, }, /* 636 */ - { 115, 15, 12, 0, 0, }, /* 637 */ - { 127, 7, 12, 0, 0, }, /* 638 */ - { 127, 15, 12, 0, 0, }, /* 639 */ - { 65, 7, 12, 0, 0, }, /* 640 */ - { 65, 15, 12, 0, 0, }, /* 641 */ - { 65, 21, 12, 0, 0, }, /* 642 */ - { 71, 7, 12, 0, 0, }, /* 643 */ - { 71, 21, 12, 0, 0, }, /* 644 */ - { 97, 7, 12, 0, 0, }, /* 645 */ - { 96, 7, 12, 0, 0, }, /* 646 */ - { 96, 15, 12, 0, 0, }, /* 647 */ - { 30, 7, 12, 0, 0, }, /* 648 */ - { 30, 12, 3, 0, 0, }, /* 649 */ - { 30, 15, 12, 0, 0, }, /* 650 */ - { 30, 21, 12, 0, 0, }, /* 651 */ - { 87, 7, 12, 0, 0, }, /* 652 */ - { 87, 15, 12, 0, 0, }, /* 653 */ - { 87, 21, 12, 0, 0, }, /* 654 */ - { 116, 7, 12, 0, 0, }, /* 655 */ - { 116, 15, 12, 0, 0, }, /* 656 */ - { 111, 7, 12, 0, 0, }, /* 657 */ - { 111, 26, 12, 0, 0, }, /* 658 */ - { 111, 12, 3, 0, 0, }, /* 659 */ - { 111, 15, 12, 0, 0, }, /* 660 */ - { 111, 21, 12, 0, 0, }, /* 661 */ - { 77, 7, 12, 0, 0, }, /* 662 */ - { 77, 21, 12, 0, 0, }, /* 663 */ - { 82, 7, 12, 0, 0, }, /* 664 */ - { 82, 15, 12, 0, 0, }, /* 665 */ - { 81, 7, 12, 0, 0, }, /* 666 */ - { 81, 15, 12, 0, 0, }, /* 667 */ - { 120, 7, 12, 0, 0, }, /* 668 */ - { 120, 21, 12, 0, 0, }, /* 669 */ - { 120, 15, 12, 0, 0, }, /* 670 */ - { 88, 7, 12, 0, 0, }, /* 671 */ - { 129, 9, 12, 0, 64, }, /* 672 */ - { 129, 5, 12, 0, -64, }, /* 673 */ - { 129, 15, 12, 0, 0, }, /* 674 */ - { 143, 7, 12, 0, 0, }, /* 675 */ - { 143, 12, 3, 0, 0, }, /* 676 */ - { 143, 13, 12, 0, 0, }, /* 677 */ - { 0, 15, 12, 0, 0, }, /* 678 */ - { 146, 7, 12, 0, 0, }, /* 679 */ - { 146, 15, 12, 0, 0, }, /* 680 */ - { 147, 7, 12, 0, 0, }, /* 681 */ - { 147, 12, 3, 0, 0, }, /* 682 */ - { 147, 15, 12, 0, 0, }, /* 683 */ - { 147, 21, 12, 0, 0, }, /* 684 */ - { 93, 10, 5, 0, 0, }, /* 685 */ - { 93, 12, 3, 0, 0, }, /* 686 */ - { 93, 7, 12, 0, 0, }, /* 687 */ - { 93, 21, 12, 0, 0, }, /* 688 */ - { 93, 15, 12, 0, 0, }, /* 689 */ - { 93, 13, 12, 0, 0, }, /* 690 */ - { 84, 12, 3, 0, 0, }, /* 691 */ - { 84, 10, 5, 0, 0, }, /* 692 */ - { 84, 7, 12, 0, 0, }, /* 693 */ - { 84, 21, 12, 0, 0, }, /* 694 */ - { 84, 1, 4, 0, 0, }, /* 695 */ - { 100, 7, 12, 0, 0, }, /* 696 */ - { 100, 13, 12, 0, 0, }, /* 697 */ - { 95, 12, 3, 0, 0, }, /* 698 */ - { 95, 7, 12, 0, 0, }, /* 699 */ - { 95, 10, 5, 0, 0, }, /* 700 */ - { 95, 13, 12, 0, 0, }, /* 701 */ - { 95, 21, 12, 0, 0, }, /* 702 */ - { 110, 7, 12, 0, 0, }, /* 703 */ - { 110, 12, 3, 0, 0, }, /* 704 */ - { 110, 21, 12, 0, 0, }, /* 705 */ - { 99, 12, 3, 0, 0, }, /* 706 */ - { 99, 10, 5, 0, 0, }, /* 707 */ - { 99, 7, 12, 0, 0, }, /* 708 */ - { 99, 7, 4, 0, 0, }, /* 709 */ - { 99, 21, 12, 0, 0, }, /* 710 */ - { 99, 13, 12, 0, 0, }, /* 711 */ - { 47, 15, 12, 0, 0, }, /* 712 */ - { 107, 7, 12, 0, 0, }, /* 713 */ - { 107, 10, 5, 0, 0, }, /* 714 */ - { 107, 12, 3, 0, 0, }, /* 715 */ - { 107, 21, 12, 0, 0, }, /* 716 */ - { 128, 7, 12, 0, 0, }, /* 717 */ - { 128, 21, 12, 0, 0, }, /* 718 */ - { 108, 7, 12, 0, 0, }, /* 719 */ - { 108, 12, 3, 0, 0, }, /* 720 */ - { 108, 10, 5, 0, 0, }, /* 721 */ - { 108, 13, 12, 0, 0, }, /* 722 */ - { 106, 12, 3, 0, 0, }, /* 723 */ - { 106, 10, 5, 0, 0, }, /* 724 */ - { 106, 7, 12, 0, 0, }, /* 725 */ - { 106, 10, 3, 0, 0, }, /* 726 */ - { 134, 7, 12, 0, 0, }, /* 727 */ - { 134, 10, 5, 0, 0, }, /* 728 */ - { 134, 12, 3, 0, 0, }, /* 729 */ - { 134, 21, 12, 0, 0, }, /* 730 */ - { 134, 13, 12, 0, 0, }, /* 731 */ - { 123, 7, 12, 0, 0, }, /* 732 */ - { 123, 10, 3, 0, 0, }, /* 733 */ - { 123, 10, 5, 0, 0, }, /* 734 */ - { 123, 12, 3, 0, 0, }, /* 735 */ - { 123, 21, 12, 0, 0, }, /* 736 */ - { 123, 13, 12, 0, 0, }, /* 737 */ - { 122, 7, 12, 0, 0, }, /* 738 */ - { 122, 10, 3, 0, 0, }, /* 739 */ - { 122, 10, 5, 0, 0, }, /* 740 */ - { 122, 12, 3, 0, 0, }, /* 741 */ - { 122, 21, 12, 0, 0, }, /* 742 */ - { 113, 7, 12, 0, 0, }, /* 743 */ - { 113, 10, 5, 0, 0, }, /* 744 */ - { 113, 12, 3, 0, 0, }, /* 745 */ - { 113, 21, 12, 0, 0, }, /* 746 */ - { 113, 13, 12, 0, 0, }, /* 747 */ - { 101, 7, 12, 0, 0, }, /* 748 */ - { 101, 12, 3, 0, 0, }, /* 749 */ - { 101, 10, 5, 0, 0, }, /* 750 */ - { 101, 13, 12, 0, 0, }, /* 751 */ - { 125, 7, 12, 0, 0, }, /* 752 */ - { 125, 12, 3, 0, 0, }, /* 753 */ - { 125, 10, 5, 0, 0, }, /* 754 */ - { 125, 13, 12, 0, 0, }, /* 755 */ - { 125, 15, 12, 0, 0, }, /* 756 */ - { 125, 21, 12, 0, 0, }, /* 757 */ - { 125, 26, 12, 0, 0, }, /* 758 */ - { 141, 7, 12, 0, 0, }, /* 759 */ - { 141, 10, 5, 0, 0, }, /* 760 */ - { 141, 12, 3, 0, 0, }, /* 761 */ - { 141, 21, 12, 0, 0, }, /* 762 */ - { 124, 9, 12, 0, 32, }, /* 763 */ - { 124, 5, 12, 0, -32, }, /* 764 */ - { 124, 13, 12, 0, 0, }, /* 765 */ - { 124, 15, 12, 0, 0, }, /* 766 */ - { 124, 7, 12, 0, 0, }, /* 767 */ - { 140, 7, 12, 0, 0, }, /* 768 */ - { 140, 12, 3, 0, 0, }, /* 769 */ - { 140, 10, 5, 0, 0, }, /* 770 */ - { 140, 7, 4, 0, 0, }, /* 771 */ - { 140, 21, 12, 0, 0, }, /* 772 */ - { 139, 7, 12, 0, 0, }, /* 773 */ - { 139, 12, 3, 0, 0, }, /* 774 */ - { 139, 10, 5, 0, 0, }, /* 775 */ - { 139, 7, 4, 0, 0, }, /* 776 */ - { 139, 21, 12, 0, 0, }, /* 777 */ - { 121, 7, 12, 0, 0, }, /* 778 */ - { 132, 7, 12, 0, 0, }, /* 779 */ - { 132, 10, 5, 0, 0, }, /* 780 */ - { 132, 12, 3, 0, 0, }, /* 781 */ - { 132, 21, 12, 0, 0, }, /* 782 */ - { 132, 13, 12, 0, 0, }, /* 783 */ - { 132, 15, 12, 0, 0, }, /* 784 */ - { 133, 21, 12, 0, 0, }, /* 785 */ - { 133, 7, 12, 0, 0, }, /* 786 */ - { 133, 12, 3, 0, 0, }, /* 787 */ - { 133, 10, 5, 0, 0, }, /* 788 */ - { 137, 7, 12, 0, 0, }, /* 789 */ - { 137, 12, 3, 0, 0, }, /* 790 */ - { 137, 7, 4, 0, 0, }, /* 791 */ - { 137, 13, 12, 0, 0, }, /* 792 */ - { 142, 7, 12, 0, 0, }, /* 793 */ - { 142, 10, 5, 0, 0, }, /* 794 */ - { 142, 12, 3, 0, 0, }, /* 795 */ - { 142, 13, 12, 0, 0, }, /* 796 */ - { 144, 7, 12, 0, 0, }, /* 797 */ - { 144, 12, 3, 0, 0, }, /* 798 */ - { 144, 10, 5, 0, 0, }, /* 799 */ - { 144, 21, 12, 0, 0, }, /* 800 */ - { 62, 7, 12, 0, 0, }, /* 801 */ - { 62, 14, 12, 0, 0, }, /* 802 */ - { 62, 21, 12, 0, 0, }, /* 803 */ - { 79, 7, 12, 0, 0, }, /* 804 */ - { 126, 7, 12, 0, 0, }, /* 805 */ - { 114, 7, 12, 0, 0, }, /* 806 */ - { 114, 13, 12, 0, 0, }, /* 807 */ - { 114, 21, 12, 0, 0, }, /* 808 */ - { 102, 7, 12, 0, 0, }, /* 809 */ - { 102, 12, 3, 0, 0, }, /* 810 */ - { 102, 21, 12, 0, 0, }, /* 811 */ - { 118, 7, 12, 0, 0, }, /* 812 */ - { 118, 12, 3, 0, 0, }, /* 813 */ - { 118, 21, 12, 0, 0, }, /* 814 */ - { 118, 26, 12, 0, 0, }, /* 815 */ - { 118, 6, 12, 0, 0, }, /* 816 */ - { 118, 13, 12, 0, 0, }, /* 817 */ - { 118, 15, 12, 0, 0, }, /* 818 */ - { 145, 9, 12, 0, 32, }, /* 819 */ - { 145, 5, 12, 0, -32, }, /* 820 */ - { 145, 15, 12, 0, 0, }, /* 821 */ - { 145, 21, 12, 0, 0, }, /* 822 */ - { 98, 7, 12, 0, 0, }, /* 823 */ - { 98, 10, 5, 0, 0, }, /* 824 */ - { 98, 12, 3, 0, 0, }, /* 825 */ - { 98, 6, 12, 0, 0, }, /* 826 */ - { 136, 6, 12, 0, 0, }, /* 827 */ - { 138, 6, 12, 0, 0, }, /* 828 */ - { 136, 7, 12, 0, 0, }, /* 829 */ - { 138, 7, 12, 0, 0, }, /* 830 */ - { 104, 7, 12, 0, 0, }, /* 831 */ - { 104, 26, 12, 0, 0, }, /* 832 */ - { 104, 12, 3, 0, 0, }, /* 833 */ - { 104, 21, 12, 0, 0, }, /* 834 */ - { 9, 10, 3, 0, 0, }, /* 835 */ - { 19, 12, 3, 0, 0, }, /* 836 */ - { 130, 26, 12, 0, 0, }, /* 837 */ - { 130, 12, 3, 0, 0, }, /* 838 */ - { 130, 21, 12, 0, 0, }, /* 839 */ - { 17, 12, 3, 0, 0, }, /* 840 */ - { 112, 7, 12, 0, 0, }, /* 841 */ - { 112, 15, 12, 0, 0, }, /* 842 */ - { 112, 12, 3, 0, 0, }, /* 843 */ - { 131, 9, 12, 0, 34, }, /* 844 */ - { 131, 5, 12, 0, -34, }, /* 845 */ - { 131, 12, 3, 0, 0, }, /* 846 */ - { 131, 13, 12, 0, 0, }, /* 847 */ - { 131, 21, 12, 0, 0, }, /* 848 */ - { 9, 2, 14, 0, 0, }, /* 849 */ - { 9, 26, 11, 0, 0, }, /* 850 */ - { 26, 26, 12, 0, 0, }, /* 851 */ - { 9, 24, 3, 0, 0, }, /* 852 */ - { 9, 1, 3, 0, 0, }, /* 853 */ +/* This table lists the code points for the '9' characters in each +set of decimal digits. It is used to ensure that all the digits in +a script run come from the same set. */ + +const uint32_t PRIV(ucd_digit_sets)[] = { + 61, /* Number of subsequent values */ + 0x00039, 0x00669, 0x006f9, 0x007c9, 0x0096f, 0x009ef, 0x00a6f, 0x00aef, + 0x00b6f, 0x00bef, 0x00c6f, 0x00cef, 0x00d6f, 0x00def, 0x00e59, 0x00ed9, + 0x00f29, 0x01049, 0x01099, 0x017e9, 0x01819, 0x0194f, 0x019d9, 0x01a89, + 0x01a99, 0x01b59, 0x01bb9, 0x01c49, 0x01c59, 0x0a629, 0x0a8d9, 0x0a909, + 0x0a9d9, 0x0a9f9, 0x0aa59, 0x0abf9, 0x0ff19, 0x104a9, 0x10d39, 0x1106f, + 0x110f9, 0x1113f, 0x111d9, 0x112f9, 0x11459, 0x114d9, 0x11659, 0x116c9, + 0x11739, 0x118e9, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59, 0x1d7d7, + 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e959, +}; + +/* This vector is a list of lists of scripts for the Script Extension +property. Each sublist is zero-terminated. */ + +const uint8_t PRIV(ucd_script_sets)[] = { + /* 0 */ 0, + /* 1 */ 1, 11, 0, + /* 4 */ 1, 144, 0, + /* 7 */ 1, 50, 0, + /* 10 */ 1, 56, 0, + /* 13 */ 2, 17, 0, + /* 16 */ 3, 15, 0, + /* 19 */ 4, 23, 0, + /* 22 */ 6, 84, 0, + /* 25 */ 12, 36, 0, + /* 28 */ 13, 18, 0, + /* 31 */ 13, 34, 0, + /* 34 */ 13, 118, 0, + /* 37 */ 15, 107, 0, + /* 40 */ 15, 100, 0, + /* 43 */ 15, 54, 0, + /* 46 */ 17, 34, 0, + /* 49 */ 107, 54, 0, + /* 52 */ 21, 108, 0, + /* 55 */ 22, 129, 0, + /* 58 */ 27, 30, 0, + /* 61 */ 38, 65, 0, + /* 64 */ 1, 50, 56, 0, + /* 68 */ 3, 96, 49, 0, + /* 72 */ 96, 39, 53, 0, + /* 76 */ 12, 110, 36, 0, + /* 80 */ 15, 107, 29, 0, + /* 84 */ 15, 107, 34, 0, + /* 88 */ 23, 27, 30, 0, + /* 92 */ 69, 34, 39, 0, + /* 96 */ 1, 144, 50, 56, 0, + /* 101 */ 3, 15, 107, 29, 0, + /* 106 */ 7, 25, 52, 51, 0, + /* 111 */ 15, 142, 85, 111, 0, + /* 116 */ 4, 24, 23, 27, 30, 0, + /* 122 */ 4, 24, 23, 27, 30, 61, 0, + /* 129 */ 15, 29, 37, 44, 54, 55, 0, + /* 136 */ 132, 1, 95, 112, 121, 144, 148, 50, 0, + /* 145 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0, + /* 157 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0, + /* 170 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 109, 102, 124, 0, + /* 183 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0, + /* 197 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 109, 102, 124, 0, + /* 211 */ 3, 15, 142, 143, 107, 21, 22, 29, 111, 37, 44, 109, 48, 49, 102, 54, 55, 124, 0, + /* 230 */ 3, 15, 142, 143, 107, 21, 22, 29, 35, 111, 37, 44, 109, 48, 49, 102, 54, 55, 124, 0, + /* 250 */ +}; + +/* These are the main two-stage UCD tables. The fields in each record are: +script (8 bits), character type (8 bits), grapheme break property (8 bits), +offset to multichar other cases or zero (8 bits), offset to other case +or zero (32 bits, signed), script extension (16 bits, signed), and a dummy +16-bit field to make the whole thing a multiple of 4 bytes. */ + +const ucd_record PRIV(ucd_records)[] = { /* 11136 bytes, record size 12 */ + { 10, 0, 2, 0, 0, 10, 256, }, /* 0 */ + { 10, 0, 2, 0, 0, 10, 0, }, /* 1 */ + { 10, 0, 1, 0, 0, 10, 0, }, /* 2 */ + { 10, 0, 0, 0, 0, 10, 0, }, /* 3 */ + { 10, 29, 12, 0, 0, 10, 0, }, /* 4 */ + { 10, 21, 12, 0, 0, 10, 0, }, /* 5 */ + { 10, 23, 12, 0, 0, 10, 0, }, /* 6 */ + { 10, 22, 12, 0, 0, 10, 0, }, /* 7 */ + { 10, 18, 12, 0, 0, 10, 0, }, /* 8 */ + { 10, 25, 12, 0, 0, 10, 0, }, /* 9 */ + { 10, 17, 12, 0, 0, 10, 0, }, /* 10 */ + { 10, 13, 12, 0, 0, 10, 0, }, /* 11 */ + { 34, 9, 12, 0, 32, 34, 0, }, /* 12 */ + { 34, 9, 12, 100, 32, 34, 0, }, /* 13 */ + { 34, 9, 12, 1, 32, 34, 0, }, /* 14 */ + { 10, 24, 12, 0, 0, 10, 0, }, /* 15 */ + { 10, 16, 12, 0, 0, 10, 0, }, /* 16 */ + { 34, 5, 12, 0, -32, 34, 0, }, /* 17 */ + { 34, 5, 12, 100, -32, 34, 0, }, /* 18 */ + { 34, 5, 12, 1, -32, 34, 0, }, /* 19 */ + { 10, 26, 12, 0, 0, 10, 0, }, /* 20 */ + { 10, 26, 14, 0, 0, 10, 0, }, /* 21 */ + { 34, 7, 12, 0, 0, 34, 0, }, /* 22 */ + { 10, 20, 12, 0, 0, 10, 0, }, /* 23 */ + { 10, 1, 2, 0, 0, 10, 0, }, /* 24 */ + { 10, 15, 12, 0, 0, 10, 0, }, /* 25 */ + { 10, 5, 12, 26, 775, 10, 0, }, /* 26 */ + { 10, 19, 12, 0, 0, 10, 0, }, /* 27 */ + { 34, 9, 12, 104, 32, 34, 0, }, /* 28 */ + { 34, 5, 12, 0, 7615, 34, 0, }, /* 29 */ + { 34, 5, 12, 104, -32, 34, 0, }, /* 30 */ + { 34, 5, 12, 0, 121, 34, 0, }, /* 31 */ + { 34, 9, 12, 0, 1, 34, 0, }, /* 32 */ + { 34, 5, 12, 0, -1, 34, 0, }, /* 33 */ + { 34, 9, 12, 0, 0, 34, 0, }, /* 34 */ + { 34, 5, 12, 0, 0, 34, 0, }, /* 35 */ + { 34, 9, 12, 0, -121, 34, 0, }, /* 36 */ + { 34, 5, 12, 1, -268, 34, 0, }, /* 37 */ + { 34, 5, 12, 0, 195, 34, 0, }, /* 38 */ + { 34, 9, 12, 0, 210, 34, 0, }, /* 39 */ + { 34, 9, 12, 0, 206, 34, 0, }, /* 40 */ + { 34, 9, 12, 0, 205, 34, 0, }, /* 41 */ + { 34, 9, 12, 0, 79, 34, 0, }, /* 42 */ + { 34, 9, 12, 0, 202, 34, 0, }, /* 43 */ + { 34, 9, 12, 0, 203, 34, 0, }, /* 44 */ + { 34, 9, 12, 0, 207, 34, 0, }, /* 45 */ + { 34, 5, 12, 0, 97, 34, 0, }, /* 46 */ + { 34, 9, 12, 0, 211, 34, 0, }, /* 47 */ + { 34, 9, 12, 0, 209, 34, 0, }, /* 48 */ + { 34, 5, 12, 0, 163, 34, 0, }, /* 49 */ + { 34, 9, 12, 0, 213, 34, 0, }, /* 50 */ + { 34, 5, 12, 0, 130, 34, 0, }, /* 51 */ + { 34, 9, 12, 0, 214, 34, 0, }, /* 52 */ + { 34, 9, 12, 0, 218, 34, 0, }, /* 53 */ + { 34, 9, 12, 0, 217, 34, 0, }, /* 54 */ + { 34, 9, 12, 0, 219, 34, 0, }, /* 55 */ + { 34, 5, 12, 0, 56, 34, 0, }, /* 56 */ + { 34, 9, 12, 5, 2, 34, 0, }, /* 57 */ + { 34, 8, 12, 5, 1, 34, 0, }, /* 58 */ + { 34, 5, 12, 5, -2, 34, 0, }, /* 59 */ + { 34, 9, 12, 9, 2, 34, 0, }, /* 60 */ + { 34, 8, 12, 9, 1, 34, 0, }, /* 61 */ + { 34, 5, 12, 9, -2, 34, 0, }, /* 62 */ + { 34, 9, 12, 13, 2, 34, 0, }, /* 63 */ + { 34, 8, 12, 13, 1, 34, 0, }, /* 64 */ + { 34, 5, 12, 13, -2, 34, 0, }, /* 65 */ + { 34, 5, 12, 0, -79, 34, 0, }, /* 66 */ + { 34, 9, 12, 17, 2, 34, 0, }, /* 67 */ + { 34, 8, 12, 17, 1, 34, 0, }, /* 68 */ + { 34, 5, 12, 17, -2, 34, 0, }, /* 69 */ + { 34, 9, 12, 0, -97, 34, 0, }, /* 70 */ + { 34, 9, 12, 0, -56, 34, 0, }, /* 71 */ + { 34, 9, 12, 0, -130, 34, 0, }, /* 72 */ + { 34, 9, 12, 0, 10795, 34, 0, }, /* 73 */ + { 34, 9, 12, 0, -163, 34, 0, }, /* 74 */ + { 34, 9, 12, 0, 10792, 34, 0, }, /* 75 */ + { 34, 5, 12, 0, 10815, 34, 0, }, /* 76 */ + { 34, 9, 12, 0, -195, 34, 0, }, /* 77 */ + { 34, 9, 12, 0, 69, 34, 0, }, /* 78 */ + { 34, 9, 12, 0, 71, 34, 0, }, /* 79 */ + { 34, 5, 12, 0, 10783, 34, 0, }, /* 80 */ + { 34, 5, 12, 0, 10780, 34, 0, }, /* 81 */ + { 34, 5, 12, 0, 10782, 34, 0, }, /* 82 */ + { 34, 5, 12, 0, -210, 34, 0, }, /* 83 */ + { 34, 5, 12, 0, -206, 34, 0, }, /* 84 */ + { 34, 5, 12, 0, -205, 34, 0, }, /* 85 */ + { 34, 5, 12, 0, -202, 34, 0, }, /* 86 */ + { 34, 5, 12, 0, -203, 34, 0, }, /* 87 */ + { 34, 5, 12, 0, 42319, 34, 0, }, /* 88 */ + { 34, 5, 12, 0, 42315, 34, 0, }, /* 89 */ + { 34, 5, 12, 0, -207, 34, 0, }, /* 90 */ + { 34, 5, 12, 0, 42280, 34, 0, }, /* 91 */ + { 34, 5, 12, 0, 42308, 34, 0, }, /* 92 */ + { 34, 5, 12, 0, -209, 34, 0, }, /* 93 */ + { 34, 5, 12, 0, -211, 34, 0, }, /* 94 */ + { 34, 5, 12, 0, 10743, 34, 0, }, /* 95 */ + { 34, 5, 12, 0, 42305, 34, 0, }, /* 96 */ + { 34, 5, 12, 0, 10749, 34, 0, }, /* 97 */ + { 34, 5, 12, 0, -213, 34, 0, }, /* 98 */ + { 34, 5, 12, 0, -214, 34, 0, }, /* 99 */ + { 34, 5, 12, 0, 10727, 34, 0, }, /* 100 */ + { 34, 5, 12, 0, -218, 34, 0, }, /* 101 */ + { 34, 5, 12, 0, 42282, 34, 0, }, /* 102 */ + { 34, 5, 12, 0, -69, 34, 0, }, /* 103 */ + { 34, 5, 12, 0, -217, 34, 0, }, /* 104 */ + { 34, 5, 12, 0, -71, 34, 0, }, /* 105 */ + { 34, 5, 12, 0, -219, 34, 0, }, /* 106 */ + { 34, 5, 12, 0, 42261, 34, 0, }, /* 107 */ + { 34, 5, 12, 0, 42258, 34, 0, }, /* 108 */ + { 34, 6, 12, 0, 0, 34, 0, }, /* 109 */ + { 10, 6, 12, 0, 0, 10, 0, }, /* 110 */ + { 4, 24, 12, 0, 0, 4, 0, }, /* 111 */ + { 28, 12, 3, 0, 0, 28, 0, }, /* 112 */ + { 28, 12, 3, 0, 0, 20, 0, }, /* 113 */ + { 28, 12, 3, 21, 116, 20, 0, }, /* 114 */ + { 28, 12, 3, 0, 0, 34, 0, }, /* 115 */ + { 20, 9, 12, 0, 1, 20, 0, }, /* 116 */ + { 20, 5, 12, 0, -1, 20, 0, }, /* 117 */ + { 20, 24, 12, 0, 0, 20, 0, }, /* 118 */ + { 0, 2, 12, 0, 0, 0, 0, }, /* 119 */ + { 20, 6, 12, 0, 0, 20, 0, }, /* 120 */ + { 20, 5, 12, 0, 130, 20, 0, }, /* 121 */ + { 20, 9, 12, 0, 116, 20, 0, }, /* 122 */ + { 20, 9, 12, 0, 38, 20, 0, }, /* 123 */ + { 20, 9, 12, 0, 37, 20, 0, }, /* 124 */ + { 20, 9, 12, 0, 64, 20, 0, }, /* 125 */ + { 20, 9, 12, 0, 63, 20, 0, }, /* 126 */ + { 20, 5, 12, 0, 0, 20, 0, }, /* 127 */ + { 20, 9, 12, 0, 32, 20, 0, }, /* 128 */ + { 20, 9, 12, 34, 32, 20, 0, }, /* 129 */ + { 20, 9, 12, 59, 32, 20, 0, }, /* 130 */ + { 20, 9, 12, 38, 32, 20, 0, }, /* 131 */ + { 20, 9, 12, 21, 32, 20, 0, }, /* 132 */ + { 20, 9, 12, 51, 32, 20, 0, }, /* 133 */ + { 20, 9, 12, 26, 32, 20, 0, }, /* 134 */ + { 20, 9, 12, 47, 32, 20, 0, }, /* 135 */ + { 20, 9, 12, 55, 32, 20, 0, }, /* 136 */ + { 20, 9, 12, 30, 32, 20, 0, }, /* 137 */ + { 20, 9, 12, 43, 32, 20, 0, }, /* 138 */ + { 20, 9, 12, 96, 32, 20, 0, }, /* 139 */ + { 20, 5, 12, 0, -38, 20, 0, }, /* 140 */ + { 20, 5, 12, 0, -37, 20, 0, }, /* 141 */ + { 20, 5, 12, 0, -32, 20, 0, }, /* 142 */ + { 20, 5, 12, 34, -32, 20, 0, }, /* 143 */ + { 20, 5, 12, 59, -32, 20, 0, }, /* 144 */ + { 20, 5, 12, 38, -32, 20, 0, }, /* 145 */ + { 20, 5, 12, 21, -116, 20, 0, }, /* 146 */ + { 20, 5, 12, 51, -32, 20, 0, }, /* 147 */ + { 20, 5, 12, 26, -775, 20, 0, }, /* 148 */ + { 20, 5, 12, 47, -32, 20, 0, }, /* 149 */ + { 20, 5, 12, 55, -32, 20, 0, }, /* 150 */ + { 20, 5, 12, 30, 1, 20, 0, }, /* 151 */ + { 20, 5, 12, 30, -32, 20, 0, }, /* 152 */ + { 20, 5, 12, 43, -32, 20, 0, }, /* 153 */ + { 20, 5, 12, 96, -32, 20, 0, }, /* 154 */ + { 20, 5, 12, 0, -64, 20, 0, }, /* 155 */ + { 20, 5, 12, 0, -63, 20, 0, }, /* 156 */ + { 20, 9, 12, 0, 8, 20, 0, }, /* 157 */ + { 20, 5, 12, 34, -30, 20, 0, }, /* 158 */ + { 20, 5, 12, 38, -25, 20, 0, }, /* 159 */ + { 20, 9, 12, 0, 0, 20, 0, }, /* 160 */ + { 20, 5, 12, 43, -15, 20, 0, }, /* 161 */ + { 20, 5, 12, 47, -22, 20, 0, }, /* 162 */ + { 20, 5, 12, 0, -8, 20, 0, }, /* 163 */ + { 11, 9, 12, 0, 1, 11, 0, }, /* 164 */ + { 11, 5, 12, 0, -1, 11, 0, }, /* 165 */ + { 20, 5, 12, 51, -54, 20, 0, }, /* 166 */ + { 20, 5, 12, 55, -48, 20, 0, }, /* 167 */ + { 20, 5, 12, 0, 7, 20, 0, }, /* 168 */ + { 20, 5, 12, 0, -116, 20, 0, }, /* 169 */ + { 20, 9, 12, 38, -60, 20, 0, }, /* 170 */ + { 20, 5, 12, 59, -64, 20, 0, }, /* 171 */ + { 20, 25, 12, 0, 0, 20, 0, }, /* 172 */ + { 20, 9, 12, 0, -7, 20, 0, }, /* 173 */ + { 20, 9, 12, 0, -130, 20, 0, }, /* 174 */ + { 13, 9, 12, 0, 80, 13, 0, }, /* 175 */ + { 13, 9, 12, 0, 32, 13, 0, }, /* 176 */ + { 13, 9, 12, 63, 32, 13, 0, }, /* 177 */ + { 13, 9, 12, 67, 32, 13, 0, }, /* 178 */ + { 13, 9, 12, 71, 32, 13, 0, }, /* 179 */ + { 13, 9, 12, 75, 32, 13, 0, }, /* 180 */ + { 13, 9, 12, 79, 32, 13, 0, }, /* 181 */ + { 13, 9, 12, 84, 32, 13, 0, }, /* 182 */ + { 13, 5, 12, 0, -32, 13, 0, }, /* 183 */ + { 13, 5, 12, 63, -32, 13, 0, }, /* 184 */ + { 13, 5, 12, 67, -32, 13, 0, }, /* 185 */ + { 13, 5, 12, 71, -32, 13, 0, }, /* 186 */ + { 13, 5, 12, 75, -32, 13, 0, }, /* 187 */ + { 13, 5, 12, 79, -32, 13, 0, }, /* 188 */ + { 13, 5, 12, 84, -32, 13, 0, }, /* 189 */ + { 13, 5, 12, 0, -80, 13, 0, }, /* 190 */ + { 13, 9, 12, 0, 1, 13, 0, }, /* 191 */ + { 13, 5, 12, 0, -1, 13, 0, }, /* 192 */ + { 13, 9, 12, 88, 1, 13, 0, }, /* 193 */ + { 13, 5, 12, 88, -1, 13, 0, }, /* 194 */ + { 13, 26, 12, 0, 0, 13, 0, }, /* 195 */ + { 13, 12, 3, 0, 0, -34, 0, }, /* 196 */ + { 13, 12, 3, 0, 0, -28, 0, }, /* 197 */ + { 28, 12, 3, 0, 0, -31, 0, }, /* 198 */ + { 13, 11, 3, 0, 0, 13, 0, }, /* 199 */ + { 13, 9, 12, 0, 15, 13, 0, }, /* 200 */ + { 13, 5, 12, 0, -15, 13, 0, }, /* 201 */ + { 2, 9, 12, 0, 48, 2, 0, }, /* 202 */ + { 2, 6, 12, 0, 0, 2, 0, }, /* 203 */ + { 2, 21, 12, 0, 0, 2, 0, }, /* 204 */ + { 2, 5, 12, 0, 0, 2, 0, }, /* 205 */ + { 2, 5, 12, 0, -48, 2, 0, }, /* 206 */ + { 10, 21, 12, 0, 0, -13, 0, }, /* 207 */ + { 2, 17, 12, 0, 0, 2, 0, }, /* 208 */ + { 2, 26, 12, 0, 0, 2, 0, }, /* 209 */ + { 2, 23, 12, 0, 0, 2, 0, }, /* 210 */ + { 26, 12, 3, 0, 0, 26, 0, }, /* 211 */ + { 26, 17, 12, 0, 0, 26, 0, }, /* 212 */ + { 26, 21, 12, 0, 0, 26, 0, }, /* 213 */ + { 26, 7, 12, 0, 0, 26, 0, }, /* 214 */ + { 1, 1, 4, 0, 0, 1, 0, }, /* 215 */ + { 10, 1, 4, 0, 0, 10, 0, }, /* 216 */ + { 1, 25, 12, 0, 0, 1, 0, }, /* 217 */ + { 1, 21, 12, 0, 0, 1, 0, }, /* 218 */ + { 1, 23, 12, 0, 0, 1, 0, }, /* 219 */ + { 10, 21, 12, 0, 0, -96, 0, }, /* 220 */ + { 1, 26, 12, 0, 0, 1, 0, }, /* 221 */ + { 1, 12, 3, 0, 0, 1, 0, }, /* 222 */ + { 1, 1, 2, 0, 0, -64, 0, }, /* 223 */ + { 1, 7, 12, 0, 0, 1, 0, }, /* 224 */ + { 10, 6, 12, 0, 0, -136, 0, }, /* 225 */ + { 28, 12, 3, 0, 0, -7, 0, }, /* 226 */ + { 1, 13, 12, 0, 0, -10, 0, }, /* 227 */ + { 1, 21, 12, 0, 0, -4, 0, }, /* 228 */ + { 1, 6, 12, 0, 0, 1, 0, }, /* 229 */ + { 1, 13, 12, 0, 0, 1, 0, }, /* 230 */ + { 50, 21, 12, 0, 0, 50, 0, }, /* 231 */ + { 50, 1, 4, 0, 0, 50, 0, }, /* 232 */ + { 50, 7, 12, 0, 0, 50, 0, }, /* 233 */ + { 50, 12, 3, 0, 0, 50, 0, }, /* 234 */ + { 56, 7, 12, 0, 0, 56, 0, }, /* 235 */ + { 56, 12, 3, 0, 0, 56, 0, }, /* 236 */ + { 64, 13, 12, 0, 0, 64, 0, }, /* 237 */ + { 64, 7, 12, 0, 0, 64, 0, }, /* 238 */ + { 64, 12, 3, 0, 0, 64, 0, }, /* 239 */ + { 64, 6, 12, 0, 0, 64, 0, }, /* 240 */ + { 64, 26, 12, 0, 0, 64, 0, }, /* 241 */ + { 64, 21, 12, 0, 0, 64, 0, }, /* 242 */ + { 64, 23, 12, 0, 0, 64, 0, }, /* 243 */ + { 90, 7, 12, 0, 0, 90, 0, }, /* 244 */ + { 90, 12, 3, 0, 0, 90, 0, }, /* 245 */ + { 90, 6, 12, 0, 0, 90, 0, }, /* 246 */ + { 90, 21, 12, 0, 0, 90, 0, }, /* 247 */ + { 95, 7, 12, 0, 0, 95, 0, }, /* 248 */ + { 95, 12, 3, 0, 0, 95, 0, }, /* 249 */ + { 95, 21, 12, 0, 0, 95, 0, }, /* 250 */ + { 15, 12, 3, 0, 0, 15, 0, }, /* 251 */ + { 15, 10, 5, 0, 0, 15, 0, }, /* 252 */ + { 15, 7, 12, 0, 0, 15, 0, }, /* 253 */ + { 28, 12, 3, 0, 0, -183, 0, }, /* 254 */ + { 28, 12, 3, 0, 0, -157, 0, }, /* 255 */ + { 10, 21, 12, 0, 0, -211, 0, }, /* 256 */ + { 10, 21, 12, 0, 0, -230, 0, }, /* 257 */ + { 15, 13, 12, 0, 0, -111, 0, }, /* 258 */ + { 15, 21, 12, 0, 0, 15, 0, }, /* 259 */ + { 15, 6, 12, 0, 0, 15, 0, }, /* 260 */ + { 3, 7, 12, 0, 0, 3, 0, }, /* 261 */ + { 3, 12, 3, 0, 0, 3, 0, }, /* 262 */ + { 3, 10, 5, 0, 0, 3, 0, }, /* 263 */ + { 3, 10, 3, 0, 0, 3, 0, }, /* 264 */ + { 3, 13, 12, 0, 0, -68, 0, }, /* 265 */ + { 3, 23, 12, 0, 0, 3, 0, }, /* 266 */ + { 3, 15, 12, 0, 0, 3, 0, }, /* 267 */ + { 3, 26, 12, 0, 0, 3, 0, }, /* 268 */ + { 3, 21, 12, 0, 0, 3, 0, }, /* 269 */ + { 22, 12, 3, 0, 0, 22, 0, }, /* 270 */ + { 22, 10, 5, 0, 0, 22, 0, }, /* 271 */ + { 22, 7, 12, 0, 0, 22, 0, }, /* 272 */ + { 22, 13, 12, 0, 0, -55, 0, }, /* 273 */ + { 22, 21, 12, 0, 0, 22, 0, }, /* 274 */ + { 21, 12, 3, 0, 0, 21, 0, }, /* 275 */ + { 21, 10, 5, 0, 0, 21, 0, }, /* 276 */ + { 21, 7, 12, 0, 0, 21, 0, }, /* 277 */ + { 21, 13, 12, 0, 0, -52, 0, }, /* 278 */ + { 21, 21, 12, 0, 0, 21, 0, }, /* 279 */ + { 21, 23, 12, 0, 0, 21, 0, }, /* 280 */ + { 44, 12, 3, 0, 0, 44, 0, }, /* 281 */ + { 44, 10, 5, 0, 0, 44, 0, }, /* 282 */ + { 44, 7, 12, 0, 0, 44, 0, }, /* 283 */ + { 44, 10, 3, 0, 0, 44, 0, }, /* 284 */ + { 44, 13, 12, 0, 0, 44, 0, }, /* 285 */ + { 44, 26, 12, 0, 0, 44, 0, }, /* 286 */ + { 44, 15, 12, 0, 0, 44, 0, }, /* 287 */ + { 54, 12, 3, 0, 0, 54, 0, }, /* 288 */ + { 54, 7, 12, 0, 0, 54, 0, }, /* 289 */ + { 54, 10, 3, 0, 0, 54, 0, }, /* 290 */ + { 54, 10, 5, 0, 0, 54, 0, }, /* 291 */ + { 54, 13, 12, 0, 0, -49, 0, }, /* 292 */ + { 54, 15, 12, 0, 0, -49, 0, }, /* 293 */ + { 54, 26, 12, 0, 0, -49, 0, }, /* 294 */ + { 54, 26, 12, 0, 0, 54, 0, }, /* 295 */ + { 54, 23, 12, 0, 0, 54, 0, }, /* 296 */ + { 55, 12, 3, 0, 0, 55, 0, }, /* 297 */ + { 55, 10, 5, 0, 0, 55, 0, }, /* 298 */ + { 55, 7, 12, 0, 0, 55, 0, }, /* 299 */ + { 55, 13, 12, 0, 0, 55, 0, }, /* 300 */ + { 55, 15, 12, 0, 0, 55, 0, }, /* 301 */ + { 55, 26, 12, 0, 0, 55, 0, }, /* 302 */ + { 29, 7, 12, 0, 0, 29, 0, }, /* 303 */ + { 29, 12, 3, 0, 0, 29, 0, }, /* 304 */ + { 29, 10, 5, 0, 0, 29, 0, }, /* 305 */ + { 29, 21, 12, 0, 0, 29, 0, }, /* 306 */ + { 29, 10, 3, 0, 0, 29, 0, }, /* 307 */ + { 29, 13, 12, 0, 0, 29, 0, }, /* 308 */ + { 37, 12, 3, 0, 0, 37, 0, }, /* 309 */ + { 37, 10, 5, 0, 0, 37, 0, }, /* 310 */ + { 37, 7, 12, 0, 0, 37, 0, }, /* 311 */ + { 37, 10, 3, 0, 0, 37, 0, }, /* 312 */ + { 37, 7, 4, 0, 0, 37, 0, }, /* 313 */ + { 37, 26, 12, 0, 0, 37, 0, }, /* 314 */ + { 37, 15, 12, 0, 0, 37, 0, }, /* 315 */ + { 37, 13, 12, 0, 0, 37, 0, }, /* 316 */ + { 48, 10, 5, 0, 0, 48, 0, }, /* 317 */ + { 48, 7, 12, 0, 0, 48, 0, }, /* 318 */ + { 48, 12, 3, 0, 0, 48, 0, }, /* 319 */ + { 48, 10, 3, 0, 0, 48, 0, }, /* 320 */ + { 48, 13, 12, 0, 0, 48, 0, }, /* 321 */ + { 48, 21, 12, 0, 0, 48, 0, }, /* 322 */ + { 57, 7, 12, 0, 0, 57, 0, }, /* 323 */ + { 57, 12, 3, 0, 0, 57, 0, }, /* 324 */ + { 57, 7, 5, 0, 0, 57, 0, }, /* 325 */ + { 57, 6, 12, 0, 0, 57, 0, }, /* 326 */ + { 57, 21, 12, 0, 0, 57, 0, }, /* 327 */ + { 57, 13, 12, 0, 0, 57, 0, }, /* 328 */ + { 33, 7, 12, 0, 0, 33, 0, }, /* 329 */ + { 33, 12, 3, 0, 0, 33, 0, }, /* 330 */ + { 33, 7, 5, 0, 0, 33, 0, }, /* 331 */ + { 33, 6, 12, 0, 0, 33, 0, }, /* 332 */ + { 33, 13, 12, 0, 0, 33, 0, }, /* 333 */ + { 58, 7, 12, 0, 0, 58, 0, }, /* 334 */ + { 58, 26, 12, 0, 0, 58, 0, }, /* 335 */ + { 58, 21, 12, 0, 0, 58, 0, }, /* 336 */ + { 58, 12, 3, 0, 0, 58, 0, }, /* 337 */ + { 58, 13, 12, 0, 0, 58, 0, }, /* 338 */ + { 58, 15, 12, 0, 0, 58, 0, }, /* 339 */ + { 58, 22, 12, 0, 0, 58, 0, }, /* 340 */ + { 58, 18, 12, 0, 0, 58, 0, }, /* 341 */ + { 58, 10, 5, 0, 0, 58, 0, }, /* 342 */ + { 39, 7, 12, 0, 0, 39, 0, }, /* 343 */ + { 39, 10, 12, 0, 0, 39, 0, }, /* 344 */ + { 39, 12, 3, 0, 0, 39, 0, }, /* 345 */ + { 39, 10, 5, 0, 0, 39, 0, }, /* 346 */ + { 39, 13, 12, 0, 0, -72, 0, }, /* 347 */ + { 39, 21, 12, 0, 0, 39, 0, }, /* 348 */ + { 39, 13, 12, 0, 0, 39, 0, }, /* 349 */ + { 39, 26, 12, 0, 0, 39, 0, }, /* 350 */ + { 17, 9, 12, 0, 7264, 17, 0, }, /* 351 */ + { 17, 5, 12, 0, 3008, 17, 0, }, /* 352 */ + { 10, 21, 12, 0, 0, -46, 0, }, /* 353 */ + { 17, 6, 12, 0, 0, 17, 0, }, /* 354 */ + { 24, 7, 6, 0, 0, 24, 0, }, /* 355 */ + { 24, 7, 7, 0, 0, 24, 0, }, /* 356 */ + { 24, 7, 8, 0, 0, 24, 0, }, /* 357 */ + { 16, 7, 12, 0, 0, 16, 0, }, /* 358 */ + { 16, 12, 3, 0, 0, 16, 0, }, /* 359 */ + { 16, 21, 12, 0, 0, 16, 0, }, /* 360 */ + { 16, 15, 12, 0, 0, 16, 0, }, /* 361 */ + { 16, 26, 12, 0, 0, 16, 0, }, /* 362 */ + { 9, 9, 12, 0, 38864, 9, 0, }, /* 363 */ + { 9, 9, 12, 0, 8, 9, 0, }, /* 364 */ + { 9, 5, 12, 0, -8, 9, 0, }, /* 365 */ + { 8, 17, 12, 0, 0, 8, 0, }, /* 366 */ + { 8, 7, 12, 0, 0, 8, 0, }, /* 367 */ + { 8, 21, 12, 0, 0, 8, 0, }, /* 368 */ + { 41, 29, 12, 0, 0, 41, 0, }, /* 369 */ + { 41, 7, 12, 0, 0, 41, 0, }, /* 370 */ + { 41, 22, 12, 0, 0, 41, 0, }, /* 371 */ + { 41, 18, 12, 0, 0, 41, 0, }, /* 372 */ + { 46, 7, 12, 0, 0, 46, 0, }, /* 373 */ + { 46, 14, 12, 0, 0, 46, 0, }, /* 374 */ + { 51, 7, 12, 0, 0, 51, 0, }, /* 375 */ + { 51, 12, 3, 0, 0, 51, 0, }, /* 376 */ + { 25, 7, 12, 0, 0, 25, 0, }, /* 377 */ + { 25, 12, 3, 0, 0, 25, 0, }, /* 378 */ + { 10, 21, 12, 0, 0, -106, 0, }, /* 379 */ + { 7, 7, 12, 0, 0, 7, 0, }, /* 380 */ + { 7, 12, 3, 0, 0, 7, 0, }, /* 381 */ + { 52, 7, 12, 0, 0, 52, 0, }, /* 382 */ + { 52, 12, 3, 0, 0, 52, 0, }, /* 383 */ + { 32, 7, 12, 0, 0, 32, 0, }, /* 384 */ + { 32, 12, 3, 0, 0, 32, 0, }, /* 385 */ + { 32, 10, 5, 0, 0, 32, 0, }, /* 386 */ + { 32, 21, 12, 0, 0, 32, 0, }, /* 387 */ + { 32, 6, 12, 0, 0, 32, 0, }, /* 388 */ + { 32, 23, 12, 0, 0, 32, 0, }, /* 389 */ + { 32, 13, 12, 0, 0, 32, 0, }, /* 390 */ + { 32, 15, 12, 0, 0, 32, 0, }, /* 391 */ + { 38, 21, 12, 0, 0, 38, 0, }, /* 392 */ + { 10, 21, 12, 0, 0, -61, 0, }, /* 393 */ + { 38, 17, 12, 0, 0, 38, 0, }, /* 394 */ + { 38, 12, 3, 0, 0, 38, 0, }, /* 395 */ + { 38, 1, 2, 0, 0, 38, 0, }, /* 396 */ + { 38, 13, 12, 0, 0, 38, 0, }, /* 397 */ + { 38, 7, 12, 0, 0, 38, 0, }, /* 398 */ + { 38, 6, 12, 0, 0, 38, 0, }, /* 399 */ + { 35, 7, 12, 0, 0, 35, 0, }, /* 400 */ + { 35, 12, 3, 0, 0, 35, 0, }, /* 401 */ + { 35, 10, 5, 0, 0, 35, 0, }, /* 402 */ + { 35, 26, 12, 0, 0, 35, 0, }, /* 403 */ + { 35, 21, 12, 0, 0, 35, 0, }, /* 404 */ + { 35, 13, 12, 0, 0, 35, 0, }, /* 405 */ + { 53, 7, 12, 0, 0, 53, 0, }, /* 406 */ + { 40, 7, 12, 0, 0, 40, 0, }, /* 407 */ + { 40, 13, 12, 0, 0, 40, 0, }, /* 408 */ + { 40, 15, 12, 0, 0, 40, 0, }, /* 409 */ + { 40, 26, 12, 0, 0, 40, 0, }, /* 410 */ + { 32, 26, 12, 0, 0, 32, 0, }, /* 411 */ + { 6, 7, 12, 0, 0, 6, 0, }, /* 412 */ + { 6, 12, 3, 0, 0, 6, 0, }, /* 413 */ + { 6, 10, 5, 0, 0, 6, 0, }, /* 414 */ + { 6, 21, 12, 0, 0, 6, 0, }, /* 415 */ + { 91, 7, 12, 0, 0, 91, 0, }, /* 416 */ + { 91, 10, 5, 0, 0, 91, 0, }, /* 417 */ + { 91, 12, 3, 0, 0, 91, 0, }, /* 418 */ + { 91, 10, 12, 0, 0, 91, 0, }, /* 419 */ + { 91, 13, 12, 0, 0, 91, 0, }, /* 420 */ + { 91, 21, 12, 0, 0, 91, 0, }, /* 421 */ + { 91, 6, 12, 0, 0, 91, 0, }, /* 422 */ + { 28, 11, 3, 0, 0, 28, 0, }, /* 423 */ + { 62, 12, 3, 0, 0, 62, 0, }, /* 424 */ + { 62, 10, 5, 0, 0, 62, 0, }, /* 425 */ + { 62, 7, 12, 0, 0, 62, 0, }, /* 426 */ + { 62, 13, 12, 0, 0, 62, 0, }, /* 427 */ + { 62, 21, 12, 0, 0, 62, 0, }, /* 428 */ + { 62, 26, 12, 0, 0, 62, 0, }, /* 429 */ + { 76, 12, 3, 0, 0, 76, 0, }, /* 430 */ + { 76, 10, 5, 0, 0, 76, 0, }, /* 431 */ + { 76, 7, 12, 0, 0, 76, 0, }, /* 432 */ + { 76, 13, 12, 0, 0, 76, 0, }, /* 433 */ + { 93, 7, 12, 0, 0, 93, 0, }, /* 434 */ + { 93, 12, 3, 0, 0, 93, 0, }, /* 435 */ + { 93, 10, 5, 0, 0, 93, 0, }, /* 436 */ + { 93, 21, 12, 0, 0, 93, 0, }, /* 437 */ + { 70, 7, 12, 0, 0, 70, 0, }, /* 438 */ + { 70, 10, 5, 0, 0, 70, 0, }, /* 439 */ + { 70, 12, 3, 0, 0, 70, 0, }, /* 440 */ + { 70, 21, 12, 0, 0, 70, 0, }, /* 441 */ + { 70, 13, 12, 0, 0, 70, 0, }, /* 442 */ + { 73, 13, 12, 0, 0, 73, 0, }, /* 443 */ + { 73, 7, 12, 0, 0, 73, 0, }, /* 444 */ + { 73, 6, 12, 0, 0, 73, 0, }, /* 445 */ + { 73, 21, 12, 0, 0, 73, 0, }, /* 446 */ + { 13, 5, 12, 63, -6222, 13, 0, }, /* 447 */ + { 13, 5, 12, 67, -6221, 13, 0, }, /* 448 */ + { 13, 5, 12, 71, -6212, 13, 0, }, /* 449 */ + { 13, 5, 12, 75, -6210, 13, 0, }, /* 450 */ + { 13, 5, 12, 79, -6210, 13, 0, }, /* 451 */ + { 13, 5, 12, 79, -6211, 13, 0, }, /* 452 */ + { 13, 5, 12, 84, -6204, 13, 0, }, /* 453 */ + { 13, 5, 12, 88, -6180, 13, 0, }, /* 454 */ + { 13, 5, 12, 108, 35267, 13, 0, }, /* 455 */ + { 17, 9, 12, 0, -3008, 17, 0, }, /* 456 */ + { 76, 21, 12, 0, 0, 76, 0, }, /* 457 */ + { 28, 12, 3, 0, 0, -101, 0, }, /* 458 */ + { 28, 12, 3, 0, 0, 15, 0, }, /* 459 */ + { 10, 21, 12, 0, 0, -37, 0, }, /* 460 */ + { 28, 12, 3, 0, 0, -16, 0, }, /* 461 */ + { 28, 12, 3, 0, 0, -40, 0, }, /* 462 */ + { 28, 12, 3, 0, 0, -129, 0, }, /* 463 */ + { 10, 10, 5, 0, 0, -16, 0, }, /* 464 */ + { 10, 7, 12, 0, 0, 15, 0, }, /* 465 */ + { 10, 7, 12, 0, 0, -16, 0, }, /* 466 */ + { 10, 10, 5, 0, 0, -37, 0, }, /* 467 */ + { 28, 12, 3, 0, 0, -80, 0, }, /* 468 */ + { 10, 10, 5, 0, 0, 3, 0, }, /* 469 */ + { 28, 12, 3, 0, 0, -37, 0, }, /* 470 */ + { 13, 5, 12, 0, 0, 13, 0, }, /* 471 */ + { 13, 6, 12, 0, 0, 13, 0, }, /* 472 */ + { 34, 5, 12, 0, 35332, 34, 0, }, /* 473 */ + { 34, 5, 12, 0, 3814, 34, 0, }, /* 474 */ + { 34, 9, 12, 92, 1, 34, 0, }, /* 475 */ + { 34, 5, 12, 92, -1, 34, 0, }, /* 476 */ + { 34, 5, 12, 92, -58, 34, 0, }, /* 477 */ + { 34, 9, 12, 0, -7615, 34, 0, }, /* 478 */ + { 20, 5, 12, 0, 8, 20, 0, }, /* 479 */ + { 20, 9, 12, 0, -8, 20, 0, }, /* 480 */ + { 20, 5, 12, 0, 74, 20, 0, }, /* 481 */ + { 20, 5, 12, 0, 86, 20, 0, }, /* 482 */ + { 20, 5, 12, 0, 100, 20, 0, }, /* 483 */ + { 20, 5, 12, 0, 128, 20, 0, }, /* 484 */ + { 20, 5, 12, 0, 112, 20, 0, }, /* 485 */ + { 20, 5, 12, 0, 126, 20, 0, }, /* 486 */ + { 20, 8, 12, 0, -8, 20, 0, }, /* 487 */ + { 20, 5, 12, 0, 9, 20, 0, }, /* 488 */ + { 20, 9, 12, 0, -74, 20, 0, }, /* 489 */ + { 20, 8, 12, 0, -9, 20, 0, }, /* 490 */ + { 20, 5, 12, 21, -7173, 20, 0, }, /* 491 */ + { 20, 9, 12, 0, -86, 20, 0, }, /* 492 */ + { 20, 9, 12, 0, -100, 20, 0, }, /* 493 */ + { 20, 9, 12, 0, -112, 20, 0, }, /* 494 */ + { 20, 9, 12, 0, -128, 20, 0, }, /* 495 */ + { 20, 9, 12, 0, -126, 20, 0, }, /* 496 */ + { 28, 1, 3, 0, 0, 28, 0, }, /* 497 */ + { 28, 1, 13, 0, 0, 28, 0, }, /* 498 */ + { 10, 27, 2, 0, 0, 10, 0, }, /* 499 */ + { 10, 28, 2, 0, 0, 10, 0, }, /* 500 */ + { 10, 21, 14, 0, 0, 10, 0, }, /* 501 */ + { 0, 2, 2, 0, 0, 0, 0, }, /* 502 */ + { 28, 12, 3, 0, 0, -84, 0, }, /* 503 */ + { 10, 9, 12, 0, 0, 10, 0, }, /* 504 */ + { 10, 5, 12, 0, 0, 10, 0, }, /* 505 */ + { 20, 9, 12, 96, -7517, 20, 0, }, /* 506 */ + { 34, 9, 12, 100, -8383, 34, 0, }, /* 507 */ + { 34, 9, 12, 104, -8262, 34, 0, }, /* 508 */ + { 34, 9, 12, 0, 28, 34, 0, }, /* 509 */ + { 10, 7, 12, 0, 0, 10, 0, }, /* 510 */ + { 10, 5, 14, 0, 0, 10, 0, }, /* 511 */ + { 34, 5, 12, 0, -28, 34, 0, }, /* 512 */ + { 34, 14, 12, 0, 16, 34, 0, }, /* 513 */ + { 34, 14, 12, 0, -16, 34, 0, }, /* 514 */ + { 34, 14, 12, 0, 0, 34, 0, }, /* 515 */ + { 10, 25, 14, 0, 0, 10, 0, }, /* 516 */ + { 10, 26, 12, 0, 26, 10, 0, }, /* 517 */ + { 10, 26, 14, 0, 26, 10, 0, }, /* 518 */ + { 10, 26, 12, 0, -26, 10, 0, }, /* 519 */ + { 5, 26, 12, 0, 0, 5, 0, }, /* 520 */ + { 18, 9, 12, 0, 48, 18, 0, }, /* 521 */ + { 18, 5, 12, 0, -48, 18, 0, }, /* 522 */ + { 34, 9, 12, 0, -10743, 34, 0, }, /* 523 */ + { 34, 9, 12, 0, -3814, 34, 0, }, /* 524 */ + { 34, 9, 12, 0, -10727, 34, 0, }, /* 525 */ + { 34, 5, 12, 0, -10795, 34, 0, }, /* 526 */ + { 34, 5, 12, 0, -10792, 34, 0, }, /* 527 */ + { 34, 9, 12, 0, -10780, 34, 0, }, /* 528 */ + { 34, 9, 12, 0, -10749, 34, 0, }, /* 529 */ + { 34, 9, 12, 0, -10783, 34, 0, }, /* 530 */ + { 34, 9, 12, 0, -10782, 34, 0, }, /* 531 */ + { 34, 9, 12, 0, -10815, 34, 0, }, /* 532 */ + { 11, 5, 12, 0, 0, 11, 0, }, /* 533 */ + { 11, 26, 12, 0, 0, 11, 0, }, /* 534 */ + { 11, 12, 3, 0, 0, 11, 0, }, /* 535 */ + { 11, 21, 12, 0, 0, 11, 0, }, /* 536 */ + { 11, 15, 12, 0, 0, 11, 0, }, /* 537 */ + { 17, 5, 12, 0, -7264, 17, 0, }, /* 538 */ + { 59, 7, 12, 0, 0, 59, 0, }, /* 539 */ + { 59, 6, 12, 0, 0, 59, 0, }, /* 540 */ + { 59, 21, 12, 0, 0, 59, 0, }, /* 541 */ + { 59, 12, 3, 0, 0, 59, 0, }, /* 542 */ + { 13, 12, 3, 0, 0, 13, 0, }, /* 543 */ + { 10, 21, 12, 0, 0, -28, 0, }, /* 544 */ + { 23, 26, 12, 0, 0, 23, 0, }, /* 545 */ + { 10, 21, 12, 0, 0, -122, 0, }, /* 546 */ + { 10, 21, 12, 0, 0, -116, 0, }, /* 547 */ + { 23, 6, 12, 0, 0, 23, 0, }, /* 548 */ + { 10, 7, 12, 0, 0, 23, 0, }, /* 549 */ + { 23, 14, 12, 0, 0, 23, 0, }, /* 550 */ + { 10, 22, 12, 0, 0, -122, 0, }, /* 551 */ + { 10, 18, 12, 0, 0, -122, 0, }, /* 552 */ + { 10, 26, 12, 0, 0, -116, 0, }, /* 553 */ + { 10, 17, 12, 0, 0, -116, 0, }, /* 554 */ + { 10, 22, 12, 0, 0, -116, 0, }, /* 555 */ + { 10, 18, 12, 0, 0, -116, 0, }, /* 556 */ + { 28, 12, 3, 0, 0, -19, 0, }, /* 557 */ + { 24, 10, 3, 0, 0, 24, 0, }, /* 558 */ + { 10, 17, 14, 0, 0, -116, 0, }, /* 559 */ + { 10, 6, 12, 0, 0, -58, 0, }, /* 560 */ + { 10, 7, 12, 0, 0, -88, 0, }, /* 561 */ + { 10, 21, 14, 0, 0, -88, 0, }, /* 562 */ + { 10, 26, 12, 0, 0, 23, 0, }, /* 563 */ + { 27, 7, 12, 0, 0, 27, 0, }, /* 564 */ + { 28, 12, 3, 0, 0, -58, 0, }, /* 565 */ + { 10, 24, 12, 0, 0, -58, 0, }, /* 566 */ + { 27, 6, 12, 0, 0, 27, 0, }, /* 567 */ + { 10, 17, 12, 0, 0, -58, 0, }, /* 568 */ + { 30, 7, 12, 0, 0, 30, 0, }, /* 569 */ + { 30, 6, 12, 0, 0, 30, 0, }, /* 570 */ + { 4, 7, 12, 0, 0, 4, 0, }, /* 571 */ + { 24, 7, 12, 0, 0, 24, 0, }, /* 572 */ + { 10, 15, 12, 0, 0, 23, 0, }, /* 573 */ + { 24, 26, 12, 0, 0, 24, 0, }, /* 574 */ + { 10, 26, 14, 0, 0, 23, 0, }, /* 575 */ + { 30, 26, 12, 0, 0, 30, 0, }, /* 576 */ + { 23, 7, 12, 0, 0, 23, 0, }, /* 577 */ + { 61, 7, 12, 0, 0, 61, 0, }, /* 578 */ + { 61, 6, 12, 0, 0, 61, 0, }, /* 579 */ + { 61, 26, 12, 0, 0, 61, 0, }, /* 580 */ + { 86, 7, 12, 0, 0, 86, 0, }, /* 581 */ + { 86, 6, 12, 0, 0, 86, 0, }, /* 582 */ + { 86, 21, 12, 0, 0, 86, 0, }, /* 583 */ + { 77, 7, 12, 0, 0, 77, 0, }, /* 584 */ + { 77, 6, 12, 0, 0, 77, 0, }, /* 585 */ + { 77, 21, 12, 0, 0, 77, 0, }, /* 586 */ + { 77, 13, 12, 0, 0, 77, 0, }, /* 587 */ + { 13, 9, 12, 108, 1, 13, 0, }, /* 588 */ + { 13, 5, 12, 108, -35267, 13, 0, }, /* 589 */ + { 13, 7, 12, 0, 0, 13, 0, }, /* 590 */ + { 13, 21, 12, 0, 0, 13, 0, }, /* 591 */ + { 79, 7, 12, 0, 0, 79, 0, }, /* 592 */ + { 79, 14, 12, 0, 0, 79, 0, }, /* 593 */ + { 79, 12, 3, 0, 0, 79, 0, }, /* 594 */ + { 79, 21, 12, 0, 0, 79, 0, }, /* 595 */ + { 34, 9, 12, 0, -35332, 34, 0, }, /* 596 */ + { 34, 9, 12, 0, -42280, 34, 0, }, /* 597 */ + { 34, 9, 12, 0, -42308, 34, 0, }, /* 598 */ + { 34, 9, 12, 0, -42319, 34, 0, }, /* 599 */ + { 34, 9, 12, 0, -42315, 34, 0, }, /* 600 */ + { 34, 9, 12, 0, -42305, 34, 0, }, /* 601 */ + { 34, 9, 12, 0, -42258, 34, 0, }, /* 602 */ + { 34, 9, 12, 0, -42282, 34, 0, }, /* 603 */ + { 34, 9, 12, 0, -42261, 34, 0, }, /* 604 */ + { 34, 9, 12, 0, 928, 34, 0, }, /* 605 */ + { 49, 7, 12, 0, 0, 49, 0, }, /* 606 */ + { 49, 12, 3, 0, 0, 49, 0, }, /* 607 */ + { 49, 10, 5, 0, 0, 49, 0, }, /* 608 */ + { 49, 26, 12, 0, 0, 49, 0, }, /* 609 */ + { 10, 15, 12, 0, 0, -197, 0, }, /* 610 */ + { 10, 15, 12, 0, 0, -170, 0, }, /* 611 */ + { 10, 26, 12, 0, 0, -145, 0, }, /* 612 */ + { 10, 23, 12, 0, 0, -145, 0, }, /* 613 */ + { 65, 7, 12, 0, 0, 65, 0, }, /* 614 */ + { 65, 21, 12, 0, 0, 65, 0, }, /* 615 */ + { 75, 10, 5, 0, 0, 75, 0, }, /* 616 */ + { 75, 7, 12, 0, 0, 75, 0, }, /* 617 */ + { 75, 12, 3, 0, 0, 75, 0, }, /* 618 */ + { 75, 21, 12, 0, 0, 75, 0, }, /* 619 */ + { 75, 13, 12, 0, 0, 75, 0, }, /* 620 */ + { 15, 12, 3, 0, 0, -16, 0, }, /* 621 */ + { 15, 7, 12, 0, 0, -43, 0, }, /* 622 */ + { 69, 13, 12, 0, 0, 69, 0, }, /* 623 */ + { 69, 7, 12, 0, 0, 69, 0, }, /* 624 */ + { 69, 12, 3, 0, 0, 69, 0, }, /* 625 */ + { 10, 21, 12, 0, 0, -92, 0, }, /* 626 */ + { 69, 21, 12, 0, 0, 69, 0, }, /* 627 */ + { 74, 7, 12, 0, 0, 74, 0, }, /* 628 */ + { 74, 12, 3, 0, 0, 74, 0, }, /* 629 */ + { 74, 10, 5, 0, 0, 74, 0, }, /* 630 */ + { 74, 21, 12, 0, 0, 74, 0, }, /* 631 */ + { 84, 12, 3, 0, 0, 84, 0, }, /* 632 */ + { 84, 10, 5, 0, 0, 84, 0, }, /* 633 */ + { 84, 7, 12, 0, 0, 84, 0, }, /* 634 */ + { 84, 21, 12, 0, 0, 84, 0, }, /* 635 */ + { 10, 6, 12, 0, 0, -22, 0, }, /* 636 */ + { 84, 13, 12, 0, 0, 84, 0, }, /* 637 */ + { 39, 6, 12, 0, 0, 39, 0, }, /* 638 */ + { 68, 7, 12, 0, 0, 68, 0, }, /* 639 */ + { 68, 12, 3, 0, 0, 68, 0, }, /* 640 */ + { 68, 10, 5, 0, 0, 68, 0, }, /* 641 */ + { 68, 13, 12, 0, 0, 68, 0, }, /* 642 */ + { 68, 21, 12, 0, 0, 68, 0, }, /* 643 */ + { 92, 7, 12, 0, 0, 92, 0, }, /* 644 */ + { 92, 12, 3, 0, 0, 92, 0, }, /* 645 */ + { 92, 6, 12, 0, 0, 92, 0, }, /* 646 */ + { 92, 21, 12, 0, 0, 92, 0, }, /* 647 */ + { 87, 7, 12, 0, 0, 87, 0, }, /* 648 */ + { 87, 10, 5, 0, 0, 87, 0, }, /* 649 */ + { 87, 12, 3, 0, 0, 87, 0, }, /* 650 */ + { 87, 21, 12, 0, 0, 87, 0, }, /* 651 */ + { 87, 6, 12, 0, 0, 87, 0, }, /* 652 */ + { 34, 5, 12, 0, -928, 34, 0, }, /* 653 */ + { 9, 5, 12, 0, -38864, 9, 0, }, /* 654 */ + { 87, 13, 12, 0, 0, 87, 0, }, /* 655 */ + { 24, 7, 9, 0, 0, 24, 0, }, /* 656 */ + { 24, 7, 10, 0, 0, 24, 0, }, /* 657 */ + { 0, 4, 2, 0, 0, 0, 0, }, /* 658 */ + { 0, 3, 12, 0, 0, 0, 0, }, /* 659 */ + { 26, 25, 12, 0, 0, 26, 0, }, /* 660 */ + { 1, 24, 12, 0, 0, 1, 0, }, /* 661 */ + { 1, 7, 12, 0, 0, -10, 0, }, /* 662 */ + { 1, 26, 12, 0, 0, -10, 0, }, /* 663 */ + { 10, 6, 3, 0, 0, -58, 0, }, /* 664 */ + { 36, 7, 12, 0, 0, 36, 0, }, /* 665 */ + { 10, 21, 12, 0, 0, -25, 0, }, /* 666 */ + { 10, 15, 12, 0, 0, -76, 0, }, /* 667 */ + { 10, 26, 12, 0, 0, -25, 0, }, /* 668 */ + { 20, 14, 12, 0, 0, 20, 0, }, /* 669 */ + { 20, 15, 12, 0, 0, 20, 0, }, /* 670 */ + { 20, 26, 12, 0, 0, 20, 0, }, /* 671 */ + { 71, 7, 12, 0, 0, 71, 0, }, /* 672 */ + { 67, 7, 12, 0, 0, 67, 0, }, /* 673 */ + { 28, 12, 3, 0, 0, -1, 0, }, /* 674 */ + { 10, 15, 12, 0, 0, -1, 0, }, /* 675 */ + { 42, 7, 12, 0, 0, 42, 0, }, /* 676 */ + { 42, 15, 12, 0, 0, 42, 0, }, /* 677 */ + { 19, 7, 12, 0, 0, 19, 0, }, /* 678 */ + { 19, 14, 12, 0, 0, 19, 0, }, /* 679 */ + { 118, 7, 12, 0, 0, 118, 0, }, /* 680 */ + { 118, 12, 3, 0, 0, 118, 0, }, /* 681 */ + { 60, 7, 12, 0, 0, 60, 0, }, /* 682 */ + { 60, 21, 12, 0, 0, 60, 0, }, /* 683 */ + { 43, 7, 12, 0, 0, 43, 0, }, /* 684 */ + { 43, 21, 12, 0, 0, 43, 0, }, /* 685 */ + { 43, 14, 12, 0, 0, 43, 0, }, /* 686 */ + { 14, 9, 12, 0, 40, 14, 0, }, /* 687 */ + { 14, 5, 12, 0, -40, 14, 0, }, /* 688 */ + { 47, 7, 12, 0, 0, 47, 0, }, /* 689 */ + { 45, 7, 12, 0, 0, 45, 0, }, /* 690 */ + { 45, 13, 12, 0, 0, 45, 0, }, /* 691 */ + { 136, 9, 12, 0, 40, 136, 0, }, /* 692 */ + { 136, 5, 12, 0, -40, 136, 0, }, /* 693 */ + { 106, 7, 12, 0, 0, 106, 0, }, /* 694 */ + { 104, 7, 12, 0, 0, 104, 0, }, /* 695 */ + { 104, 21, 12, 0, 0, 104, 0, }, /* 696 */ + { 110, 7, 12, 0, 0, 110, 0, }, /* 697 */ + { 12, 7, 12, 0, 0, 12, 0, }, /* 698 */ + { 81, 7, 12, 0, 0, 81, 0, }, /* 699 */ + { 81, 21, 12, 0, 0, 81, 0, }, /* 700 */ + { 81, 15, 12, 0, 0, 81, 0, }, /* 701 */ + { 120, 7, 12, 0, 0, 120, 0, }, /* 702 */ + { 120, 26, 12, 0, 0, 120, 0, }, /* 703 */ + { 120, 15, 12, 0, 0, 120, 0, }, /* 704 */ + { 116, 7, 12, 0, 0, 116, 0, }, /* 705 */ + { 116, 15, 12, 0, 0, 116, 0, }, /* 706 */ + { 128, 7, 12, 0, 0, 128, 0, }, /* 707 */ + { 128, 15, 12, 0, 0, 128, 0, }, /* 708 */ + { 66, 7, 12, 0, 0, 66, 0, }, /* 709 */ + { 66, 15, 12, 0, 0, 66, 0, }, /* 710 */ + { 66, 21, 12, 0, 0, 66, 0, }, /* 711 */ + { 72, 7, 12, 0, 0, 72, 0, }, /* 712 */ + { 72, 21, 12, 0, 0, 72, 0, }, /* 713 */ + { 98, 7, 12, 0, 0, 98, 0, }, /* 714 */ + { 97, 7, 12, 0, 0, 97, 0, }, /* 715 */ + { 97, 15, 12, 0, 0, 97, 0, }, /* 716 */ + { 31, 7, 12, 0, 0, 31, 0, }, /* 717 */ + { 31, 12, 3, 0, 0, 31, 0, }, /* 718 */ + { 31, 15, 12, 0, 0, 31, 0, }, /* 719 */ + { 31, 21, 12, 0, 0, 31, 0, }, /* 720 */ + { 88, 7, 12, 0, 0, 88, 0, }, /* 721 */ + { 88, 15, 12, 0, 0, 88, 0, }, /* 722 */ + { 88, 21, 12, 0, 0, 88, 0, }, /* 723 */ + { 117, 7, 12, 0, 0, 117, 0, }, /* 724 */ + { 117, 15, 12, 0, 0, 117, 0, }, /* 725 */ + { 112, 7, 12, 0, 0, 112, 0, }, /* 726 */ + { 112, 26, 12, 0, 0, 112, 0, }, /* 727 */ + { 112, 12, 3, 0, 0, 112, 0, }, /* 728 */ + { 112, 15, 12, 0, 0, 112, 0, }, /* 729 */ + { 112, 21, 12, 0, 0, 112, 0, }, /* 730 */ + { 78, 7, 12, 0, 0, 78, 0, }, /* 731 */ + { 78, 21, 12, 0, 0, 78, 0, }, /* 732 */ + { 83, 7, 12, 0, 0, 83, 0, }, /* 733 */ + { 83, 15, 12, 0, 0, 83, 0, }, /* 734 */ + { 82, 7, 12, 0, 0, 82, 0, }, /* 735 */ + { 82, 15, 12, 0, 0, 82, 0, }, /* 736 */ + { 121, 7, 12, 0, 0, 121, 0, }, /* 737 */ + { 121, 21, 12, 0, 0, 121, 0, }, /* 738 */ + { 121, 15, 12, 0, 0, 121, 0, }, /* 739 */ + { 89, 7, 12, 0, 0, 89, 0, }, /* 740 */ + { 130, 9, 12, 0, 64, 130, 0, }, /* 741 */ + { 130, 5, 12, 0, -64, 130, 0, }, /* 742 */ + { 130, 15, 12, 0, 0, 130, 0, }, /* 743 */ + { 144, 7, 12, 0, 0, 144, 0, }, /* 744 */ + { 144, 12, 3, 0, 0, 144, 0, }, /* 745 */ + { 144, 13, 12, 0, 0, 144, 0, }, /* 746 */ + { 1, 15, 12, 0, 0, 1, 0, }, /* 747 */ + { 147, 7, 12, 0, 0, 147, 0, }, /* 748 */ + { 147, 15, 12, 0, 0, 147, 0, }, /* 749 */ + { 148, 7, 12, 0, 0, 148, 0, }, /* 750 */ + { 148, 12, 3, 0, 0, 148, 0, }, /* 751 */ + { 148, 15, 12, 0, 0, 148, 0, }, /* 752 */ + { 148, 21, 12, 0, 0, 148, 0, }, /* 753 */ + { 94, 10, 5, 0, 0, 94, 0, }, /* 754 */ + { 94, 12, 3, 0, 0, 94, 0, }, /* 755 */ + { 94, 7, 12, 0, 0, 94, 0, }, /* 756 */ + { 94, 21, 12, 0, 0, 94, 0, }, /* 757 */ + { 94, 15, 12, 0, 0, 94, 0, }, /* 758 */ + { 94, 13, 12, 0, 0, 94, 0, }, /* 759 */ + { 85, 12, 3, 0, 0, 85, 0, }, /* 760 */ + { 85, 10, 5, 0, 0, 85, 0, }, /* 761 */ + { 85, 7, 12, 0, 0, 85, 0, }, /* 762 */ + { 85, 21, 12, 0, 0, 85, 0, }, /* 763 */ + { 85, 1, 4, 0, 0, 85, 0, }, /* 764 */ + { 101, 7, 12, 0, 0, 101, 0, }, /* 765 */ + { 101, 13, 12, 0, 0, 101, 0, }, /* 766 */ + { 96, 12, 3, 0, 0, 96, 0, }, /* 767 */ + { 96, 7, 12, 0, 0, 96, 0, }, /* 768 */ + { 96, 10, 5, 0, 0, 96, 0, }, /* 769 */ + { 96, 13, 12, 0, 0, 96, 0, }, /* 770 */ + { 96, 21, 12, 0, 0, 96, 0, }, /* 771 */ + { 111, 7, 12, 0, 0, 111, 0, }, /* 772 */ + { 111, 12, 3, 0, 0, 111, 0, }, /* 773 */ + { 111, 21, 12, 0, 0, 111, 0, }, /* 774 */ + { 100, 12, 3, 0, 0, 100, 0, }, /* 775 */ + { 100, 10, 5, 0, 0, 100, 0, }, /* 776 */ + { 100, 7, 12, 0, 0, 100, 0, }, /* 777 */ + { 100, 7, 4, 0, 0, 100, 0, }, /* 778 */ + { 100, 21, 12, 0, 0, 100, 0, }, /* 779 */ + { 100, 13, 12, 0, 0, 100, 0, }, /* 780 */ + { 48, 15, 12, 0, 0, 48, 0, }, /* 781 */ + { 108, 7, 12, 0, 0, 108, 0, }, /* 782 */ + { 108, 10, 5, 0, 0, 108, 0, }, /* 783 */ + { 108, 12, 3, 0, 0, 108, 0, }, /* 784 */ + { 108, 21, 12, 0, 0, 108, 0, }, /* 785 */ + { 129, 7, 12, 0, 0, 129, 0, }, /* 786 */ + { 129, 21, 12, 0, 0, 129, 0, }, /* 787 */ + { 109, 7, 12, 0, 0, 109, 0, }, /* 788 */ + { 109, 12, 3, 0, 0, 109, 0, }, /* 789 */ + { 109, 10, 5, 0, 0, 109, 0, }, /* 790 */ + { 109, 13, 12, 0, 0, 109, 0, }, /* 791 */ + { 107, 12, 3, 0, 0, 107, 0, }, /* 792 */ + { 107, 12, 3, 0, 0, -49, 0, }, /* 793 */ + { 107, 10, 5, 0, 0, 107, 0, }, /* 794 */ + { 107, 10, 5, 0, 0, -49, 0, }, /* 795 */ + { 107, 7, 12, 0, 0, 107, 0, }, /* 796 */ + { 28, 12, 3, 0, 0, -49, 0, }, /* 797 */ + { 107, 10, 3, 0, 0, 107, 0, }, /* 798 */ + { 135, 7, 12, 0, 0, 135, 0, }, /* 799 */ + { 135, 10, 5, 0, 0, 135, 0, }, /* 800 */ + { 135, 12, 3, 0, 0, 135, 0, }, /* 801 */ + { 135, 21, 12, 0, 0, 135, 0, }, /* 802 */ + { 135, 13, 12, 0, 0, 135, 0, }, /* 803 */ + { 124, 7, 12, 0, 0, 124, 0, }, /* 804 */ + { 124, 10, 3, 0, 0, 124, 0, }, /* 805 */ + { 124, 10, 5, 0, 0, 124, 0, }, /* 806 */ + { 124, 12, 3, 0, 0, 124, 0, }, /* 807 */ + { 124, 21, 12, 0, 0, 124, 0, }, /* 808 */ + { 124, 13, 12, 0, 0, 124, 0, }, /* 809 */ + { 123, 7, 12, 0, 0, 123, 0, }, /* 810 */ + { 123, 10, 3, 0, 0, 123, 0, }, /* 811 */ + { 123, 10, 5, 0, 0, 123, 0, }, /* 812 */ + { 123, 12, 3, 0, 0, 123, 0, }, /* 813 */ + { 123, 21, 12, 0, 0, 123, 0, }, /* 814 */ + { 114, 7, 12, 0, 0, 114, 0, }, /* 815 */ + { 114, 10, 5, 0, 0, 114, 0, }, /* 816 */ + { 114, 12, 3, 0, 0, 114, 0, }, /* 817 */ + { 114, 21, 12, 0, 0, 114, 0, }, /* 818 */ + { 114, 13, 12, 0, 0, 114, 0, }, /* 819 */ + { 102, 7, 12, 0, 0, 102, 0, }, /* 820 */ + { 102, 12, 3, 0, 0, 102, 0, }, /* 821 */ + { 102, 10, 5, 0, 0, 102, 0, }, /* 822 */ + { 102, 13, 12, 0, 0, 102, 0, }, /* 823 */ + { 126, 7, 12, 0, 0, 126, 0, }, /* 824 */ + { 126, 12, 3, 0, 0, 126, 0, }, /* 825 */ + { 126, 10, 5, 0, 0, 126, 0, }, /* 826 */ + { 126, 13, 12, 0, 0, 126, 0, }, /* 827 */ + { 126, 15, 12, 0, 0, 126, 0, }, /* 828 */ + { 126, 21, 12, 0, 0, 126, 0, }, /* 829 */ + { 126, 26, 12, 0, 0, 126, 0, }, /* 830 */ + { 142, 7, 12, 0, 0, 142, 0, }, /* 831 */ + { 142, 10, 5, 0, 0, 142, 0, }, /* 832 */ + { 142, 12, 3, 0, 0, 142, 0, }, /* 833 */ + { 142, 21, 12, 0, 0, 142, 0, }, /* 834 */ + { 125, 9, 12, 0, 32, 125, 0, }, /* 835 */ + { 125, 5, 12, 0, -32, 125, 0, }, /* 836 */ + { 125, 13, 12, 0, 0, 125, 0, }, /* 837 */ + { 125, 15, 12, 0, 0, 125, 0, }, /* 838 */ + { 125, 7, 12, 0, 0, 125, 0, }, /* 839 */ + { 141, 7, 12, 0, 0, 141, 0, }, /* 840 */ + { 141, 12, 3, 0, 0, 141, 0, }, /* 841 */ + { 141, 10, 5, 0, 0, 141, 0, }, /* 842 */ + { 141, 7, 4, 0, 0, 141, 0, }, /* 843 */ + { 141, 21, 12, 0, 0, 141, 0, }, /* 844 */ + { 140, 7, 12, 0, 0, 140, 0, }, /* 845 */ + { 140, 12, 3, 0, 0, 140, 0, }, /* 846 */ + { 140, 10, 5, 0, 0, 140, 0, }, /* 847 */ + { 140, 7, 4, 0, 0, 140, 0, }, /* 848 */ + { 140, 21, 12, 0, 0, 140, 0, }, /* 849 */ + { 122, 7, 12, 0, 0, 122, 0, }, /* 850 */ + { 133, 7, 12, 0, 0, 133, 0, }, /* 851 */ + { 133, 10, 5, 0, 0, 133, 0, }, /* 852 */ + { 133, 12, 3, 0, 0, 133, 0, }, /* 853 */ + { 133, 21, 12, 0, 0, 133, 0, }, /* 854 */ + { 133, 13, 12, 0, 0, 133, 0, }, /* 855 */ + { 133, 15, 12, 0, 0, 133, 0, }, /* 856 */ + { 134, 21, 12, 0, 0, 134, 0, }, /* 857 */ + { 134, 7, 12, 0, 0, 134, 0, }, /* 858 */ + { 134, 12, 3, 0, 0, 134, 0, }, /* 859 */ + { 134, 10, 5, 0, 0, 134, 0, }, /* 860 */ + { 138, 7, 12, 0, 0, 138, 0, }, /* 861 */ + { 138, 12, 3, 0, 0, 138, 0, }, /* 862 */ + { 138, 7, 4, 0, 0, 138, 0, }, /* 863 */ + { 138, 13, 12, 0, 0, 138, 0, }, /* 864 */ + { 143, 7, 12, 0, 0, 143, 0, }, /* 865 */ + { 143, 10, 5, 0, 0, 143, 0, }, /* 866 */ + { 143, 12, 3, 0, 0, 143, 0, }, /* 867 */ + { 143, 13, 12, 0, 0, 143, 0, }, /* 868 */ + { 145, 7, 12, 0, 0, 145, 0, }, /* 869 */ + { 145, 12, 3, 0, 0, 145, 0, }, /* 870 */ + { 145, 10, 5, 0, 0, 145, 0, }, /* 871 */ + { 145, 21, 12, 0, 0, 145, 0, }, /* 872 */ + { 63, 7, 12, 0, 0, 63, 0, }, /* 873 */ + { 63, 14, 12, 0, 0, 63, 0, }, /* 874 */ + { 63, 21, 12, 0, 0, 63, 0, }, /* 875 */ + { 80, 7, 12, 0, 0, 80, 0, }, /* 876 */ + { 127, 7, 12, 0, 0, 127, 0, }, /* 877 */ + { 115, 7, 12, 0, 0, 115, 0, }, /* 878 */ + { 115, 13, 12, 0, 0, 115, 0, }, /* 879 */ + { 115, 21, 12, 0, 0, 115, 0, }, /* 880 */ + { 103, 7, 12, 0, 0, 103, 0, }, /* 881 */ + { 103, 12, 3, 0, 0, 103, 0, }, /* 882 */ + { 103, 21, 12, 0, 0, 103, 0, }, /* 883 */ + { 119, 7, 12, 0, 0, 119, 0, }, /* 884 */ + { 119, 12, 3, 0, 0, 119, 0, }, /* 885 */ + { 119, 21, 12, 0, 0, 119, 0, }, /* 886 */ + { 119, 26, 12, 0, 0, 119, 0, }, /* 887 */ + { 119, 6, 12, 0, 0, 119, 0, }, /* 888 */ + { 119, 13, 12, 0, 0, 119, 0, }, /* 889 */ + { 119, 15, 12, 0, 0, 119, 0, }, /* 890 */ + { 146, 9, 12, 0, 32, 146, 0, }, /* 891 */ + { 146, 5, 12, 0, -32, 146, 0, }, /* 892 */ + { 146, 15, 12, 0, 0, 146, 0, }, /* 893 */ + { 146, 21, 12, 0, 0, 146, 0, }, /* 894 */ + { 99, 7, 12, 0, 0, 99, 0, }, /* 895 */ + { 99, 10, 5, 0, 0, 99, 0, }, /* 896 */ + { 99, 12, 3, 0, 0, 99, 0, }, /* 897 */ + { 99, 6, 12, 0, 0, 99, 0, }, /* 898 */ + { 137, 6, 12, 0, 0, 137, 0, }, /* 899 */ + { 139, 6, 12, 0, 0, 139, 0, }, /* 900 */ + { 137, 7, 12, 0, 0, 137, 0, }, /* 901 */ + { 139, 7, 12, 0, 0, 139, 0, }, /* 902 */ + { 105, 7, 12, 0, 0, 105, 0, }, /* 903 */ + { 105, 26, 12, 0, 0, 105, 0, }, /* 904 */ + { 105, 12, 3, 0, 0, 105, 0, }, /* 905 */ + { 105, 21, 12, 0, 0, 105, 0, }, /* 906 */ + { 10, 1, 2, 0, 0, 105, 0, }, /* 907 */ + { 10, 10, 3, 0, 0, 10, 0, }, /* 908 */ + { 10, 10, 5, 0, 0, 10, 0, }, /* 909 */ + { 20, 12, 3, 0, 0, 20, 0, }, /* 910 */ + { 131, 26, 12, 0, 0, 131, 0, }, /* 911 */ + { 131, 12, 3, 0, 0, 131, 0, }, /* 912 */ + { 131, 21, 12, 0, 0, 131, 0, }, /* 913 */ + { 18, 12, 3, 0, 0, 18, 0, }, /* 914 */ + { 113, 7, 12, 0, 0, 113, 0, }, /* 915 */ + { 113, 15, 12, 0, 0, 113, 0, }, /* 916 */ + { 113, 12, 3, 0, 0, 113, 0, }, /* 917 */ + { 132, 9, 12, 0, 34, 132, 0, }, /* 918 */ + { 132, 5, 12, 0, -34, 132, 0, }, /* 919 */ + { 132, 12, 3, 0, 0, 132, 0, }, /* 920 */ + { 132, 13, 12, 0, 0, 132, 0, }, /* 921 */ + { 132, 21, 12, 0, 0, 132, 0, }, /* 922 */ + { 0, 2, 14, 0, 0, 0, 0, }, /* 923 */ + { 10, 26, 11, 0, 0, 10, 0, }, /* 924 */ + { 27, 26, 12, 0, 0, 27, 0, }, /* 925 */ + { 10, 24, 3, 0, 0, 10, 0, }, /* 926 */ + { 10, 1, 3, 0, 0, 10, 0, }, /* 927 */ }; const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ @@ -968,3216 +1123,3226 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, /* U+1800 */ 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, /* U+2000 */ 77, 77, 78, 79, 66, 66, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, /* U+2800 */ - 90, 91, 92, 93, 94, 95, 96, 71, 97, 97, 97, 97, 97, 97, 97, 97, /* U+3000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+3800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+4000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 97, 97, 97, 97, /* U+4800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+5000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+5800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+6000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+6800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+7000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+7800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+8000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+8800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+9000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 99, /* U+9800 */ -100,101,101,101,101,101,101,101,101,102,103,103,104,105,106,107, /* U+A000 */ -108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,116, /* U+A800 */ -117,118,119,120,121,122,116,117,118,119,120,121,122,116,117,118, /* U+B000 */ -119,120,121,122,116,117,118,119,120,121,122,116,117,118,119,120, /* U+B800 */ -121,122,116,117,118,119,120,121,122,116,117,118,119,120,121,122, /* U+C000 */ -116,117,118,119,120,121,122,116,117,118,119,120,121,122,116,117, /* U+C800 */ -118,119,120,121,122,116,117,118,119,120,121,122,116,117,118,123, /* U+D000 */ -124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124, /* U+D800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+E000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+E800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F000 */ -125,125, 97, 97,126,127,128,129,130,130,131,132,133,134,135,136, /* U+F800 */ -137,138,139,140,141,142,143,144,145,146,147,141,148,148,149,141, /* U+10000 */ -150,151,152,153,154,155,156,157,158,159,160,141,161,141,162,141, /* U+10800 */ -163,164,165,166,167,168,169,141,170,171,141,172,173,174,175,141, /* U+11000 */ -176,177,141,141,178,179,141,141,180,181,182,183,141,184,141,141, /* U+11800 */ -185,185,185,185,185,185,185,186,187,185,188,141,141,141,141,141, /* U+12000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+12800 */ -189,189,189,189,189,189,189,189,190,141,141,141,141,141,141,141, /* U+13000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+13800 */ -141,141,141,141,141,141,141,141,191,191,191,191,192,141,141,141, /* U+14000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+14800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+15000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+15800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+16000 */ -193,193,193,193,194,195,196,197,141,141,141,141,198,199,200,201, /* U+16800 */ -202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202, /* U+17000 */ -202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202, /* U+17800 */ -202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,203, /* U+18000 */ -202,202,202,202,202,204,141,141,141,141,141,141,141,141,141,141, /* U+18800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+19000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+19800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1A000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1A800 */ -205,206,207,208,208,209,141,141,141,141,141,141,141,141,141,141, /* U+1B000 */ -141,141,141,141,141,141,141,141,210,211,141,141,141,141,141,141, /* U+1B800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1C000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1C800 */ - 71,212,213,214,215,216,217,141,218,219,220,221,222,223,224,225, /* U+1D000 */ -226,226,226,226,227,228,141,141,141,141,141,141,141,141,141,141, /* U+1D800 */ -229,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1E000 */ -230,231,232,141,141,141,141,141,233,234,141,141,235,236,141,141, /* U+1E800 */ -237,238,239,240,241,242,243,244,243,243,245,243,246,247,248,249, /* U+1F000 */ -250,251,252,253,254,242,242,242,242,242,242,242,242,242,242,255, /* U+1F800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+20000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+20800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+21000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+21800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+22000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+22800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+23000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+23800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+24000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+24800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+25000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+25800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+26000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+26800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+27000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+27800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+28000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+28800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+29000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+29800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,256, 97, 97, /* U+2A000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+2A800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,257, 97, /* U+2B000 */ -258, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+2B800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+2C000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,259, 97, 97, /* U+2C800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+2D000 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+2D800 */ - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, /* U+2E000 */ - 97, 97, 97, 97, 97, 97, 97,260,141,141,141,141,141,141,141,141, /* U+2E800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+2F000 */ - 97, 97, 97, 97,261,141,141,141,141,141,141,141,141,141,141,141, /* U+2F800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+30000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+30800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+31000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+31800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+32000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+32800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+33000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+33800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+34000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+34800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+35000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+35800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+36000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+36800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+37000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+37800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+38000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+38800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+39000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+39800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3A000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3A800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3B000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3B800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3C000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3C800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3D000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3D800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3E000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3E800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3F000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3F800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+40000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+40800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+41000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+41800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+42000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+42800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+43000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+43800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+44000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+44800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+45000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+45800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+46000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+46800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+47000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+47800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+48000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+48800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+49000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+49800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4A000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4A800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4B000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4B800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4C000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4C800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4D000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4D800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4E000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4E800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4F000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4F800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+50000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+50800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+51000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+51800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+52000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+52800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+53000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+53800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+54000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+54800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+55000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+55800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+56000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+56800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+57000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+57800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+58000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+58800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+59000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+59800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5A000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5A800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5B000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5B800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5C000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5C800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5D000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5D800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5E000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5E800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5F000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5F800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+60000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+60800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+61000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+61800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+62000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+62800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+63000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+63800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+64000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+64800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+65000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+65800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+66000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+66800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+67000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+67800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+68000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+68800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+69000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+69800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6A000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6A800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6B000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6B800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6C000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6C800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6D000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6D800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6E000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6E800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6F000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6F800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+70000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+70800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+71000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+71800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+72000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+72800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+73000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+73800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+74000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+74800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+75000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+75800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+76000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+76800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+77000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+77800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+78000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+78800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+79000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+79800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7A000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7A800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7B000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7B800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7C000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7C800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7D000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7D800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7E000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7E800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7F000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7F800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+80000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+80800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+81000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+81800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+82000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+82800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+83000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+83800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+84000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+84800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+85000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+85800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+86000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+86800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+87000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+87800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+88000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+88800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+89000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+89800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8A000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8A800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8B000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8B800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8C000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8C800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8D000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8D800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8E000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8E800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8F000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8F800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+90000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+90800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+91000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+91800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+92000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+92800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+93000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+93800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+94000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+94800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+95000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+95800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+96000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+96800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+97000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+97800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+98000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+98800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+99000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+99800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9A000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9A800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9B000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9B800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9C000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9C800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9D000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9D800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9E000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9E800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9F000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9F800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A0000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A0800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A1000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A1800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A2000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A2800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A3000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A3800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A4000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A4800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A5000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A5800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A6000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A6800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A7000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A7800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A8000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A8800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A9000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A9800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AA000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AA800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AB000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AB800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AC000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AC800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AD000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AD800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AE000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AE800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AF000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AF800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B0000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B0800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B1000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B1800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B2000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B2800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B3000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B3800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B4000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B4800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B5000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B5800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B6000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B6800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B7000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B7800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B8000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B8800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B9000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B9800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BA000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BA800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BB000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BB800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BC000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BC800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BD000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BD800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BE000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BE800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BF000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BF800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C0000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C0800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C1000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C1800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C2000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C2800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C3000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C3800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C4000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C4800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C5000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C5800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C6000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C6800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C7000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C7800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C8000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C8800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C9000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C9800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CA000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CA800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CB000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CB800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CC000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CC800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CD000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CD800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CE000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CE800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CF000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CF800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D0000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D0800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D1000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D1800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D2000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D2800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D3000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D3800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D4000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D4800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D5000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D5800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D6000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D6800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D7000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D7800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D8000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D8800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D9000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D9800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DA000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DA800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DB000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DB800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DC000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DC800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DD000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DD800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DE000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DE800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DF000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DF800 */ -262,263,264,265,263,263,263,263,263,263,263,263,263,263,263,263, /* U+E0000 */ -263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263, /* U+E0800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E1000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E1800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E2000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E2800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E3000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E3800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E4000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E4800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E5000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E5800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E6000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E6800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E7000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E7800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E8000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E8800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E9000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E9800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EA000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EA800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EB000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EB800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EC000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EC800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+ED000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+ED800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EE000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EE800 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EF000 */ -141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EF800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F0000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F0800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F1000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F1800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F2000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F2800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F3000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F3800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F4000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F4800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F5000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F5800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F6000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F6800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F7000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F7800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F8000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F8800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F9000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F9800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FA000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FA800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FB000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FB800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FC000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FC800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FD000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FD800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FE000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FE800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FF000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,266, /* U+FF800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+100000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+100800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+101000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+101800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+102000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+102800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+103000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+103800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+104000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+104800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+105000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+105800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+106000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+106800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+107000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+107800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+108000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+108800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+109000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+109800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10A000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10A800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10B000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10B800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10C000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10C800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10D000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10D800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10E000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10E800 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10F000 */ -125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,266, /* U+10F800 */ + 90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 98, 98, 98, 98, 98, 98, /* U+3000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+3800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+4000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 98, 98, 98, 98, /* U+4800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+5000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+5800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+6000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+6800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+7000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+7800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+9000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,100, /* U+9800 */ +101,102,102,102,102,102,102,102,102,103,104,104,105,106,107,108, /* U+A000 */ +109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,117, /* U+A800 */ +118,119,120,121,122,123,117,118,119,120,121,122,123,117,118,119, /* U+B000 */ +120,121,122,123,117,118,119,120,121,122,123,117,118,119,120,121, /* U+B800 */ +122,123,117,118,119,120,121,122,123,117,118,119,120,121,122,123, /* U+C000 */ +117,118,119,120,121,122,123,117,118,119,120,121,122,123,117,118, /* U+C800 */ +119,120,121,122,123,117,118,119,120,121,122,123,117,118,119,124, /* U+D000 */ +125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+D800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+E000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+E800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F000 */ +126,126, 98, 98,127,128,129,130,131,131,132,133,134,135,136,137, /* U+F800 */ +138,139,140,141,142,143,144,145,146,147,148,142,149,149,150,142, /* U+10000 */ +151,152,153,154,155,156,157,158,159,160,161,142,162,142,163,142, /* U+10800 */ +164,165,166,167,168,169,170,142,171,172,142,173,174,175,176,142, /* U+11000 */ +177,178,142,142,179,180,142,142,181,182,183,184,142,185,142,142, /* U+11800 */ +186,186,186,186,186,186,186,187,188,186,189,142,142,142,142,142, /* U+12000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+12800 */ +190,190,190,190,190,190,190,190,191,142,142,142,142,142,142,142, /* U+13000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+13800 */ +142,142,142,142,142,142,142,142,192,192,192,192,193,142,142,142, /* U+14000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+14800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+16000 */ +194,194,194,194,195,196,197,198,142,142,142,142,199,200,201,202, /* U+16800 */ +203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203, /* U+17000 */ +203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203, /* U+17800 */ +203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,204, /* U+18000 */ +203,203,203,203,203,205,142,142,142,142,142,142,142,142,142,142, /* U+18800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A800 */ +206,207,208,209,209,210,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */ +142,142,142,142,142,142,142,142,211,212,142,142,142,142,142,142, /* U+1B800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C800 */ + 71,213,214,215,216,217,218,142,219,220,221,222,223,224,225,226, /* U+1D000 */ +227,227,227,227,228,229,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */ +230,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */ +231,232,233,142,142,142,142,142,234,235,142,142,236,237,142,142, /* U+1E800 */ +238,239,240,241,242,243,244,245,244,244,246,244,247,248,249,250, /* U+1F000 */ +251,252,253,254,255,243,243,243,243,243,243,243,243,243,243,256, /* U+1F800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+22000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+22800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+23000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+23800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+24000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+24800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+25000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+25800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+26000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+26800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+27000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+27800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,257, 98, 98, /* U+2A000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2A800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,258, 98, /* U+2B000 */ +259, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2C000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,260, 98, 98, /* U+2C800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D000 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D800 */ + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2E000 */ + 98, 98, 98, 98, 98, 98, 98,261,142,142,142,142,142,142,142,142, /* U+2E800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+2F000 */ + 98, 98, 98, 98,262,142,142,142,142,142,142,142,142,142,142,142, /* U+2F800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+30000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+30800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+31000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+31800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+33000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+33800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+34000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+34800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+35000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+35800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+36000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+36800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+37000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+37800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+38000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+38800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+39000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+39800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3A000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3A800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3B000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3B800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3C000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3C800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3D000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3D800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3E000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3E800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3F000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3F800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+40000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+40800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+41000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+41800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+42000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+42800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+43000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+43800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+44000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+44800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+45000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+45800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+46000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+46800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+47000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+47800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+48000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+48800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+49000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+49800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4A000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4A800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4B000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4B800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4C000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4C800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4D000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4D800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4E000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4E800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4F000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4F800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+50000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+50800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+51000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+51800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+52000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+52800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+53000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+53800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+54000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+54800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+55000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+55800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+56000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+56800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+57000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+57800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+58000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+58800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+59000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+59800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5A000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5A800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5B000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5B800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5C000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5C800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5D000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5D800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5E000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5E800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5F000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5F800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+60000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+60800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+61000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+61800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+62000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+62800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+63000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+63800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+64000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+64800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+65000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+65800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+66000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+66800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+67000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+67800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+68000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+68800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+69000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+69800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6A000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6A800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6B000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6B800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6C000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6C800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6D000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6D800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6E000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6E800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6F000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6F800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+70000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+70800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+71000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+71800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+72000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+72800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+73000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+73800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+74000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+74800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+75000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+75800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+76000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+76800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+77000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+77800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+78000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+78800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+79000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+79800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7A000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7A800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7B000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7B800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7C000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7C800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7D000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7D800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7E000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7E800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7F000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7F800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+80000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+80800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+81000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+81800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+82000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+82800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+83000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+83800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+84000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+84800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+85000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+85800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+86000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+86800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+87000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+87800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+88000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+88800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+89000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+89800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8A000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8A800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8B000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8B800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8C000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8C800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8D000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8D800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8E000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8E800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8F000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8F800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+90000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+90800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+91000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+91800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+92000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+92800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+93000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+93800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+94000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+94800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+95000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+95800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+96000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+96800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+97000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+97800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+98000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+98800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+99000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+99800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9A000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9A800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9B000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9B800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9C000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9C800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9D000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9D800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9E000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9E800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9F000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9F800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A0000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A0800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A1000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A1800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A2000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A2800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A3000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A3800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A4000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A4800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A5000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A5800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A6000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A6800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A7000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A7800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A8000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A8800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A9000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A9800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AA000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AA800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AB000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AB800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AC000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AC800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AD000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AD800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AE000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AE800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AF000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AF800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B0000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B0800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B1000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B1800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B2000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B2800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B3000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B3800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B4000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B4800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B5000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B5800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B6000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B6800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B7000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B7800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B8000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B8800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B9000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B9800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BA000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BA800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BB000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BB800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BC000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BC800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BD000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BD800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BE000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BE800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BF000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BF800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C0000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C0800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C1000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C1800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C2000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C2800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C3000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C3800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C4000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C4800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C5000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C5800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C6000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C6800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C7000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C7800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C8000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C8800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C9000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C9800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CA000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CA800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CB000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CB800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CC000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CC800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CD000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CD800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CE000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CE800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CF000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CF800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D0000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D0800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D1000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D1800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D2000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D2800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D3000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D3800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D4000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D4800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D5000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D5800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D6000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D6800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D7000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D7800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D8000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D8800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D9000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D9800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DA000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DA800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DB000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DB800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DC000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DC800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DD000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DD800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF800 */ +263,264,265,266,264,264,264,264,264,264,264,264,264,264,264,264, /* U+E0000 */ +264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264, /* U+E0800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E3000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E3800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E4000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E4800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E5000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E5800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E6000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E6800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E7000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E7800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E8000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E8800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E9000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E9800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EA000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EA800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EB000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EB800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EC000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EC800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+ED000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+ED800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EE000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EE800 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EF000 */ +142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EF800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F0000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F0800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F1000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F1800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F2000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F2800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F3000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F3800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F4000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F4800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F5000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F5800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F6000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F6800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F7000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F7800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F8000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F8800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F9000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F9800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FA000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FA800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FB000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FB800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FC000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FC800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FD000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FD800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FF000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,267, /* U+FF800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+102000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+102800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+103000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+103800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+104000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+104800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+105000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+105800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+106000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+106800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+107000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+107800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+108000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+108800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+109000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+109800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10A000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10A800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10B000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10B800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10C000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10C800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10D000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10D800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E800 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10F000 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,267, /* U+10F800 */ }; -const uint16_t PRIV(ucd_stage2)[] = { /* 68352 bytes, block = 128 */ +const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ /* block 0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 4, 4, 5, 4, 4, 4, 6, 7, 4, 8, 4, 9, 4, 4, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 8, 8, 8, 4, - 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11, - 11, 11, 11, 13, 11, 11, 11, 11, 11, 11, 11, 6, 4, 7, 14, 15, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 16, 16, 16, - 16, 16, 16, 18, 16, 16, 16, 16, 16, 16, 16, 6, 8, 7, 8, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5, + 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12, + 12, 12, 12, 14, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16, + 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 17, 17, 17, 17, + 17, 17, 17, 19, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 1, /* block 1 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 5, 5, 5, 5, 19, 4, 14, 20, 21, 22, 8, 23, 20, 14, - 19, 8, 24, 24, 14, 25, 4, 4, 14, 24, 21, 26, 24, 24, 24, 4, - 11, 11, 11, 11, 11, 27, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 8, 11, 11, 11, 11, 11, 11, 11, 28, - 16, 16, 16, 16, 16, 29, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 30, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 5, 6, 6, 6, 6, 20, 5, 15, 21, 22, 23, 9, 24, 21, 15, + 20, 9, 25, 25, 15, 26, 5, 5, 15, 25, 22, 27, 25, 25, 25, 5, + 12, 12, 12, 12, 12, 28, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 9, 12, 12, 12, 12, 12, 12, 12, 29, + 17, 17, 17, 17, 17, 30, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 9, 17, 17, 17, 17, 17, 17, 17, 31, /* block 2 */ - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 33, 34, 31, 32, 31, 32, 31, 32, 34, 31, 32, 31, 32, 31, 32, 31, - 32, 31, 32, 31, 32, 31, 32, 31, 32, 34, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 35, 31, 32, 31, 32, 31, 32, 36, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 34, 35, 32, 33, 32, 33, 32, 33, 35, 32, 33, 32, 33, 32, 33, 32, + 33, 32, 33, 32, 33, 32, 33, 32, 33, 35, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 36, 32, 33, 32, 33, 32, 33, 37, /* block 3 */ - 37, 38, 31, 32, 31, 32, 39, 31, 32, 40, 40, 31, 32, 34, 41, 42, - 43, 31, 32, 40, 44, 45, 46, 47, 31, 32, 48, 34, 46, 49, 50, 51, - 31, 32, 31, 32, 31, 32, 52, 31, 32, 52, 34, 34, 31, 32, 52, 31, - 32, 53, 53, 31, 32, 31, 32, 54, 31, 32, 34, 21, 31, 32, 34, 55, - 21, 21, 21, 21, 56, 57, 58, 59, 60, 61, 62, 63, 64, 31, 32, 31, - 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 65, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 34, 66, 67, 68, 31, 32, 69, 70, 31, 32, 31, 32, 31, 32, 31, 32, + 38, 39, 32, 33, 32, 33, 40, 32, 33, 41, 41, 32, 33, 35, 42, 43, + 44, 32, 33, 41, 45, 46, 47, 48, 32, 33, 49, 35, 47, 50, 51, 52, + 32, 33, 32, 33, 32, 33, 53, 32, 33, 53, 35, 35, 32, 33, 53, 32, + 33, 54, 54, 32, 33, 32, 33, 55, 32, 33, 35, 22, 32, 33, 35, 56, + 22, 22, 22, 22, 57, 58, 59, 60, 61, 62, 63, 64, 65, 32, 33, 32, + 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 66, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 35, 67, 68, 69, 32, 33, 70, 71, 32, 33, 32, 33, 32, 33, 32, 33, /* block 4 */ - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 71, 34, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 34, 34, 34, 34, 34, 34, 72, 31, 32, 73, 74, 75, - 75, 31, 32, 76, 77, 78, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 79, 80, 81, 82, 83, 34, 84, 84, 34, 85, 34, 86, 87, 34, 34, 34, - 84, 88, 34, 89, 34, 90, 91, 34, 92, 93, 91, 94, 95, 34, 34, 93, - 34, 96, 97, 34, 34, 98, 34, 34, 34, 34, 34, 34, 34, 99, 34, 34, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 72, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 35, 35, 35, 35, 35, 35, 73, 32, 33, 74, 75, 76, + 76, 32, 33, 77, 78, 79, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 80, 81, 82, 83, 84, 35, 85, 85, 35, 86, 35, 87, 88, 35, 35, 35, + 85, 89, 35, 90, 35, 91, 92, 35, 93, 94, 92, 95, 96, 35, 35, 94, + 35, 97, 98, 35, 35, 99, 35, 35, 35, 35, 35, 35, 35,100, 35, 35, /* block 5 */ -100, 34, 34,100, 34, 34, 34,101,100,102,103,103,104, 34, 34, 34, - 34, 34,105, 34, 21, 34, 34, 34, 34, 34, 34, 34, 34,106,107, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, -108,108,108,108,108,108,108,108,108,109,109,109,109,109,109,109, -109,109, 14, 14, 14, 14,109,109,109,109,109,109,109,109,109,109, -109,109, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -108,108,108,108,108, 14, 14, 14, 14, 14,110,110,109, 14,109, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +101, 35, 35,101, 35, 35, 35,102,101,103,104,104,105, 35, 35, 35, + 35, 35,106, 35, 22, 35, 35, 35, 35, 35, 35, 35, 35,107,108, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, +109,109,109,109,109,109,109,109,109,110,110,110,110,110,110,110, +110,110, 15, 15, 15, 15,110,110,110,110,110,110,110,110,110,110, +110,110, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +109,109,109,109,109, 15, 15, 15, 15, 15,111,111,110, 15,110, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, /* block 6 */ -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,112,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -113,114,113,114,109,115,113,114,116,116,117,118,118,118, 4,119, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,113,112,112,114,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,115,115,115,115,115,115,115,115,115,115,115,115,115, +116,117,116,117,110,118,116,117,119,119,120,121,121,121, 5,122, /* block 7 */ -116,116,116,116,115, 14,120, 4,121,121,121,116,122,116,123,123, -124,125,126,125,125,127,125,125,128,129,130,125,131,125,125,125, -132,133,116,134,125,125,135,125,125,136,125,125,137,138,138,138, -124,139,140,139,139,141,139,139,142,143,144,139,145,139,139,139, -146,147,148,149,139,139,150,139,139,151,139,139,152,153,153,154, -155,156,157,157,157,158,159,160,113,114,113,114,113,114,113,114, -113,114,161,162,161,162,161,162,161,162,161,162,161,162,161,162, -163,164,165,166,167,168,169,113,114,170,113,114,124,171,171,171, +119,119,119,119,118, 15,123, 5,124,124,124,119,125,119,126,126, +127,128,129,128,128,130,128,128,131,132,133,128,134,128,128,128, +135,136,119,137,128,128,138,128,128,139,128,128,140,141,141,141, +127,142,143,142,142,144,142,142,145,146,147,142,148,142,142,142, +149,150,151,152,142,142,153,142,142,154,142,142,155,156,156,157, +158,159,160,160,160,161,162,163,116,117,116,117,116,117,116,117, +116,117,164,165,164,165,164,165,164,165,164,165,164,165,164,165, +166,167,168,169,170,171,172,116,117,173,116,117,127,174,174,174, /* block 8 */ -172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, -173,173,174,173,175,173,173,173,173,173,173,173,173,173,176,173, -173,177,178,173,173,173,173,173,173,173,179,173,173,173,173,173, -180,180,181,180,182,180,180,180,180,180,180,180,180,180,183,180, -180,184,185,180,180,180,180,180,180,180,186,180,180,180,180,180, -187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187, -188,189,190,191,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, +175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, +176,176,177,176,178,176,176,176,176,176,176,176,176,176,179,176, +176,180,181,176,176,176,176,176,176,176,182,176,176,176,176,176, +183,183,184,183,185,183,183,183,183,183,183,183,183,183,186,183, +183,187,188,183,183,183,183,183,183,183,189,183,183,183,183,183, +190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190, +191,192,193,194,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, /* block 9 */ -188,189,192,193,193,111,111,193,194,194,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -195,188,189,188,189,188,189,188,189,188,189,188,189,188,189,196, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, +191,192,195,196,197,198,198,197,199,199,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +200,191,192,191,192,191,192,191,192,191,192,191,192,191,192,201, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, /* block 10 */ -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -116,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197, -197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197, -197,197,197,197,197,197,197,116,116,198,199,199,199,199,199,199, -200,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201, -201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +119,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202, +202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202, +202,202,202,202,202,202,202,119,119,203,204,204,204,204,204,204, +205,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206, +206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206, /* block 11 */ -201,201,201,201,201,201,201,200,200, 4,202,116,116,203,203,204, -116,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205, -205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205, -205,205,205,205,205,205,205,205,205,205,205,205,205,205,206,205, -207,205,205,207,205,205,207,205,116,116,116,116,116,116,116,116, -208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, -208,208,208,208,208,208,208,208,208,208,208,116,116,116,116,208, -208,208,208,207,207,116,116,116,116,116,116,116,116,116,116,116, +206,206,206,206,206,206,206,205,205,207,208,119,119,209,209,210, +119,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, +211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, +211,211,211,211,211,211,211,211,211,211,211,211,211,211,212,211, +213,211,211,213,211,211,213,211,119,119,119,119,119,119,119,119, +214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214, +214,214,214,214,214,214,214,214,214,214,214,119,119,119,119,214, +214,214,214,213,213,119,119,119,119,119,119,119,119,119,119,119, /* block 12 */ -209,209,209,209,209,210,211,211,211,212,212,213, 4,212,214,214, -215,215,215,215,215,215,215,215,215,215,215, 4,216,116,212, 4, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -109,217,217,217,217,217,217,217,217,217,217,111,111,111,111,111, -111,111,111,111,111,111,215,215,215,215,215,215,215,215,215,215, -218,218,218,218,218,218,218,218,218,218,212,212,212,212,217,217, -111,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, +215,215,215,215,215,216,217,217,217,218,218,219,220,218,221,221, +222,222,222,222,222,222,222,222,222,222,222,220,223,119,218,220, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +225,224,224,224,224,224,224,224,224,224,224,226,226,226,226,226, +226,226,226,226,226,226,222,222,222,222,222,222,222,222,222,222, +227,227,227,227,227,227,227,227,227,227,218,218,218,218,224,224, +226,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, /* block 13 */ -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,212,217,215,215,215,215,215,215,215,210,214,215, -215,215,215,215,215,219,219,215,215,214,215,215,215,215,217,217, -218,218,218,218,218,218,218,218,218,218,217,217,217,214,214,217, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,228,224,222,222,222,222,222,222,222,216,221,222, +222,222,222,222,222,229,229,222,222,221,222,222,222,222,224,224, +230,230,230,230,230,230,230,230,230,230,224,224,224,221,221,224, /* block 14 */ -220,220,220,220,220,220,220,220,220,220,220,220,220,220,116,221, -222,223,222,222,222,222,222,222,222,222,222,222,222,222,222,222, -222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222, -223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223, -223,223,223,223,223,223,223,223,223,223,223,116,116,222,222,222, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, - -/* block 15 */ +231,231,231,231,231,231,231,231,231,231,231,231,231,231,119,232, +233,234,233,233,233,233,233,233,233,233,233,233,233,233,233,233, +233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233, +234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234, +234,234,234,234,234,234,234,234,234,234,234,119,119,233,233,233, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, 224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, 224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,225,225,225,225,225,225,225,225,225,225, -225,224,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -226,226,226,226,226,226,226,226,226,226,227,227,227,227,227,227, -227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227, -227,227,227,227,227,227,227,227,227,227,227,228,228,228,228,228, -228,228,228,228,229,229,230,231,231,231,229,116,116,228,232,232, + +/* block 15 */ +235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, +235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, +235,235,235,235,235,235,236,236,236,236,236,236,236,236,236,236, +236,235,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +237,237,237,237,237,237,237,237,237,237,238,238,238,238,238,238, +238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238, +238,238,238,238,238,238,238,238,238,238,238,239,239,239,239,239, +239,239,239,239,240,240,241,242,242,242,240,119,119,239,243,243, /* block 16 */ -233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233, -233,233,233,233,233,233,234,234,234,234,235,234,234,234,234,234, -234,234,234,234,235,234,234,234,235,234,234,234,234,234,116,116, -236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,116, -237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237, -237,237,237,237,237,237,237,237,237,238,238,238,116,116,239,116, -222,222,222,222,222,222,222,222,222,222,222,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244, +244,244,244,244,244,244,245,245,245,245,246,245,245,245,245,245, +245,245,245,245,246,245,245,245,246,245,245,245,245,245,119,119, +247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,119, +248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248, +248,248,248,248,248,248,248,248,248,249,249,249,119,119,250,119, +233,233,233,233,233,233,233,233,233,233,233,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 17 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,116,217,217,217,217,217,217,217,217,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,215,215,215,215,215,215,215,215,215,215,215,215,215, -215,215,210,215,215,215,215,215,215,215,215,215,215,215,215,215, -215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,119,224,224,224,224,224,224,224,224,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,222,222,222,222,222,222,222,222,222,222,222,222,222, +222,222,216,222,222,222,222,222,222,222,222,222,222,222,222,222, +222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222, /* block 18 */ -240,240,240,241,242,242,242,242,242,242,242,242,242,242,242,242, -242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242, -242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242, -242,242,242,242,242,242,242,242,242,242,240,241,240,242,241,241, -241,240,240,240,240,240,240,240,240,241,241,241,241,240,241,241, -242,111,111,240,240,240,240,240,242,242,242,242,242,242,242,242, -242,242,240,240, 4, 4,243,243,243,243,243,243,243,243,243,243, -244,245,242,242,242,242,242,242,242,242,242,242,242,242,242,242, +251,251,251,252,253,253,253,253,253,253,253,253,253,253,253,253, +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, +253,253,253,253,253,253,253,253,253,253,251,252,251,253,252,252, +252,251,251,251,251,251,251,251,251,252,252,252,252,251,252,252, +253,254,255,251,251,251,251,251,253,253,253,253,253,253,253,253, +253,253,251,251,256,257,258,258,258,258,258,258,258,258,258,258, +259,260,253,253,253,253,253,253,253,253,253,253,253,253,253,253, /* block 19 */ -246,247,248,248,116,246,246,246,246,246,246,246,246,116,116,246, -246,116,116,246,246,246,246,246,246,246,246,246,246,246,246,246, -246,246,246,246,246,246,246,246,246,116,246,246,246,246,246,246, -246,116,246,116,116,116,246,246,246,246,116,116,247,246,249,248, -248,247,247,247,247,116,116,248,248,116,116,248,248,247,246,116, -116,116,116,116,116,116,116,249,116,116,116,116,246,246,116,246, -246,246,247,247,116,116,250,250,250,250,250,250,250,250,250,250, -246,246,251,251,252,252,252,252,252,252,253,251,246,254,247,116, +261,262,263,263,119,261,261,261,261,261,261,261,261,119,119,261, +261,119,119,261,261,261,261,261,261,261,261,261,261,261,261,261, +261,261,261,261,261,261,261,261,261,119,261,261,261,261,261,261, +261,119,261,119,119,119,261,261,261,261,119,119,262,261,264,263, +263,262,262,262,262,119,119,263,263,119,119,263,263,262,261,119, +119,119,119,119,119,119,119,264,119,119,119,119,261,261,119,261, +261,261,262,262,119,119,265,265,265,265,265,265,265,265,265,265, +261,261,266,266,267,267,267,267,267,267,268,266,261,269,262,119, /* block 20 */ -116,255,255,256,116,257,257,257,257,257,257,116,116,116,116,257, -257,116,116,257,257,257,257,257,257,257,257,257,257,257,257,257, -257,257,257,257,257,257,257,257,257,116,257,257,257,257,257,257, -257,116,257,257,116,257,257,116,257,257,116,116,255,116,256,256, -256,255,255,116,116,116,116,255,255,116,116,255,255,255,116,116, -116,255,116,116,116,116,116,116,116,257,257,257,257,116,257,116, -116,116,116,116,116,116,258,258,258,258,258,258,258,258,258,258, -255,255,257,257,257,255,259,116,116,116,116,116,116,116,116,116, +119,270,270,271,119,272,272,272,272,272,272,119,119,119,119,272, +272,119,119,272,272,272,272,272,272,272,272,272,272,272,272,272, +272,272,272,272,272,272,272,272,272,119,272,272,272,272,272,272, +272,119,272,272,119,272,272,119,272,272,119,119,270,119,271,271, +271,270,270,119,119,119,119,270,270,119,119,270,270,270,119,119, +119,270,119,119,119,119,119,119,119,272,272,272,272,119,272,119, +119,119,119,119,119,119,273,273,273,273,273,273,273,273,273,273, +270,270,272,272,272,270,274,119,119,119,119,119,119,119,119,119, /* block 21 */ -116,260,260,261,116,262,262,262,262,262,262,262,262,262,116,262, -262,262,116,262,262,262,262,262,262,262,262,262,262,262,262,262, -262,262,262,262,262,262,262,262,262,116,262,262,262,262,262,262, -262,116,262,262,116,262,262,262,262,262,116,116,260,262,261,261, -261,260,260,260,260,260,116,260,260,261,116,261,261,260,116,116, -262,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -262,262,260,260,116,116,263,263,263,263,263,263,263,263,263,263, -264,265,116,116,116,116,116,116,116,262,260,260,260,260,260,260, +119,275,275,276,119,277,277,277,277,277,277,277,277,277,119,277, +277,277,119,277,277,277,277,277,277,277,277,277,277,277,277,277, +277,277,277,277,277,277,277,277,277,119,277,277,277,277,277,277, +277,119,277,277,119,277,277,277,277,277,119,119,275,277,276,276, +276,275,275,275,275,275,119,275,275,276,119,276,276,275,119,119, +277,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +277,277,275,275,119,119,278,278,278,278,278,278,278,278,278,278, +279,280,119,119,119,119,119,119,119,277,275,275,275,275,275,275, /* block 22 */ -116,266,267,267,116,268,268,268,268,268,268,268,268,116,116,268, -268,116,116,268,268,268,268,268,268,268,268,268,268,268,268,268, -268,268,268,268,268,268,268,268,268,116,268,268,268,268,268,268, -268,116,268,268,116,268,268,268,268,268,116,116,266,268,269,266, -267,266,266,266,266,116,116,267,267,116,116,267,267,266,116,116, -116,116,116,116,116,116,266,269,116,116,116,116,268,268,116,268, -268,268,266,266,116,116,270,270,270,270,270,270,270,270,270,270, -271,268,272,272,272,272,272,272,116,116,116,116,116,116,116,116, +119,281,282,282,119,283,283,283,283,283,283,283,283,119,119,283, +283,119,119,283,283,283,283,283,283,283,283,283,283,283,283,283, +283,283,283,283,283,283,283,283,283,119,283,283,283,283,283,283, +283,119,283,283,119,283,283,283,283,283,119,119,281,283,284,281, +282,281,281,281,281,119,119,282,282,119,119,282,282,281,119,119, +119,119,119,119,119,119,281,284,119,119,119,119,283,283,119,283, +283,283,281,281,119,119,285,285,285,285,285,285,285,285,285,285, +286,283,287,287,287,287,287,287,119,119,119,119,119,119,119,119, /* block 23 */ -116,116,273,274,116,274,274,274,274,274,274,116,116,116,274,274, -274,116,274,274,274,274,116,116,116,274,274,116,274,116,274,274, -116,116,116,274,274,116,116,116,274,274,274,116,116,116,274,274, -274,274,274,274,274,274,274,274,274,274,116,116,116,116,275,276, -273,276,276,116,116,116,276,276,276,116,276,276,276,273,116,116, -274,116,116,116,116,116,116,275,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,277,277,277,277,277,277,277,277,277,277, -278,278,278,279,279,279,279,279,279,280,279,116,116,116,116,116, +119,119,288,289,119,289,289,289,289,289,289,119,119,119,289,289, +289,119,289,289,289,289,119,119,119,289,289,119,289,119,289,289, +119,119,119,289,289,119,119,119,289,289,289,119,119,119,289,289, +289,289,289,289,289,289,289,289,289,289,119,119,119,119,290,291, +288,291,291,119,119,119,291,291,291,119,291,291,291,288,119,119, +289,119,119,119,119,119,119,290,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,292,292,292,292,292,292,292,292,292,292, +293,293,293,294,295,295,295,295,295,296,295,119,119,119,119,119, /* block 24 */ -281,282,282,282,281,283,283,283,283,283,283,283,283,116,283,283, -283,116,283,283,283,283,283,283,283,283,283,283,283,283,283,283, -283,283,283,283,283,283,283,283,283,116,283,283,283,283,283,283, -283,283,283,283,283,283,283,283,283,283,116,116,116,283,281,281, -281,282,282,282,282,116,281,281,281,116,281,281,281,281,116,116, -116,116,116,116,116,281,281,116,283,283,283,116,116,116,116,116, -283,283,281,281,116,116,284,284,284,284,284,284,284,284,284,284, -116,116,116,116,116,116,116,116,285,285,285,285,285,285,285,286, +297,298,298,298,297,299,299,299,299,299,299,299,299,119,299,299, +299,119,299,299,299,299,299,299,299,299,299,299,299,299,299,299, +299,299,299,299,299,299,299,299,299,119,299,299,299,299,299,299, +299,299,299,299,299,299,299,299,299,299,119,119,119,299,297,297, +297,298,298,298,298,119,297,297,297,119,297,297,297,297,119,119, +119,119,119,119,119,297,297,119,299,299,299,119,119,119,119,119, +299,299,297,297,119,119,300,300,300,300,300,300,300,300,300,300, +119,119,119,119,119,119,119,119,301,301,301,301,301,301,301,302, /* block 25 */ -287,288,289,289,290,287,287,287,287,287,287,287,287,116,287,287, -287,116,287,287,287,287,287,287,287,287,287,287,287,287,287,287, -287,287,287,287,287,287,287,287,287,116,287,287,287,287,287,287, -287,287,287,287,116,287,287,287,287,287,116,116,288,287,289,288, -289,289,291,289,289,116,288,289,289,116,289,289,288,288,116,116, -116,116,116,116,116,291,291,116,116,116,116,116,116,116,287,116, -287,287,288,288,116,116,292,292,292,292,292,292,292,292,292,292, -116,287,287,116,116,116,116,116,116,116,116,116,116,116,116,116, +303,304,305,305,306,303,303,303,303,303,303,303,303,119,303,303, +303,119,303,303,303,303,303,303,303,303,303,303,303,303,303,303, +303,303,303,303,303,303,303,303,303,119,303,303,303,303,303,303, +303,303,303,303,119,303,303,303,303,303,119,119,304,303,305,304, +305,305,307,305,305,119,304,305,305,119,305,305,304,304,119,119, +119,119,119,119,119,307,307,119,119,119,119,119,119,119,303,119, +303,303,304,304,119,119,308,308,308,308,308,308,308,308,308,308, +119,303,303,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 26 */ -293,293,294,294,116,295,295,295,295,295,295,295,295,116,295,295, -295,116,295,295,295,295,295,295,295,295,295,295,295,295,295,295, -295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295, -295,295,295,295,295,295,295,295,295,295,295,293,293,295,296,294, -294,293,293,293,293,116,294,294,294,116,294,294,294,293,297,298, -116,116,116,116,295,295,295,296,299,299,299,299,299,299,299,295, -295,295,293,293,116,116,300,300,300,300,300,300,300,300,300,300, -299,299,299,299,299,299,299,299,299,298,295,295,295,295,295,295, +309,309,310,310,119,311,311,311,311,311,311,311,311,119,311,311, +311,119,311,311,311,311,311,311,311,311,311,311,311,311,311,311, +311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311, +311,311,311,311,311,311,311,311,311,311,311,309,309,311,312,310, +310,309,309,309,309,119,310,310,310,119,310,310,310,309,313,314, +119,119,119,119,311,311,311,312,315,315,315,315,315,315,315,311, +311,311,309,309,119,119,316,316,316,316,316,316,316,316,316,316, +315,315,315,315,315,315,315,315,315,314,311,311,311,311,311,311, /* block 27 */ -116,116,301,301,116,302,302,302,302,302,302,302,302,302,302,302, -302,302,302,302,302,302,302,116,116,116,302,302,302,302,302,302, -302,302,302,302,302,302,302,302,302,302,302,302,302,302,302,302, -302,302,116,302,302,302,302,302,302,302,302,302,116,302,116,116, -302,302,302,302,302,302,302,116,116,116,303,116,116,116,116,304, -301,301,303,303,303,116,303,116,301,301,301,301,301,301,301,304, -116,116,116,116,116,116,305,305,305,305,305,305,305,305,305,305, -116,116,301,301,306,116,116,116,116,116,116,116,116,116,116,116, +119,119,317,317,119,318,318,318,318,318,318,318,318,318,318,318, +318,318,318,318,318,318,318,119,119,119,318,318,318,318,318,318, +318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318, +318,318,119,318,318,318,318,318,318,318,318,318,119,318,119,119, +318,318,318,318,318,318,318,119,119,119,319,119,119,119,119,320, +317,317,319,319,319,119,319,119,317,317,317,317,317,317,317,320, +119,119,119,119,119,119,321,321,321,321,321,321,321,321,321,321, +119,119,317,317,322,119,119,119,119,119,119,119,119,119,119,119, /* block 28 */ -116,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307, -307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307, -307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307, -307,308,307,309,308,308,308,308,308,308,308,116,116,116,116, 5, -307,307,307,307,307,307,310,308,308,308,308,308,308,308,308,311, -312,312,312,312,312,312,312,312,312,312,311,311,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +119,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323, +323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323, +323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323, +323,324,323,325,324,324,324,324,324,324,324,119,119,119,119, 6, +323,323,323,323,323,323,326,324,324,324,324,324,324,324,324,327, +328,328,328,328,328,328,328,328,328,328,327,327,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 29 */ -116,313,313,116,313,116,116,313,313,116,313,116,116,313,116,116, -116,116,116,116,313,313,313,313,116,313,313,313,313,313,313,313, -116,313,313,313,116,313,116,313,116,116,313,313,116,313,313,313, -313,314,313,315,314,314,314,314,314,314,116,314,314,313,116,116, -313,313,313,313,313,116,316,116,314,314,314,314,314,314,116,116, -317,317,317,317,317,317,317,317,317,317,116,116,313,313,313,313, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +119,329,329,119,329,119,119,329,329,119,329,119,119,329,119,119, +119,119,119,119,329,329,329,329,119,329,329,329,329,329,329,329, +119,329,329,329,119,329,119,329,119,119,329,329,119,329,329,329, +329,330,329,331,330,330,330,330,330,330,119,330,330,329,119,119, +329,329,329,329,329,119,332,119,330,330,330,330,330,330,119,119, +333,333,333,333,333,333,333,333,333,333,119,119,329,329,329,329, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 30 */ -318,319,319,319,320,320,320,320,320,320,320,320,320,320,320,320, -320,320,320,319,320,319,319,319,321,321,319,319,319,319,319,319, -322,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323, -323,323,323,323,319,321,319,321,319,321,324,325,324,325,326,326, -318,318,318,318,318,318,318,318,116,318,318,318,318,318,318,318, -318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318, -318,318,318,318,318,318,318,318,318,318,318,318,318,116,116,116, -116,321,321,321,321,321,321,321,321,321,321,321,321,321,321,326, +334,335,335,335,336,336,336,336,336,336,336,336,336,336,336,336, +336,336,336,335,336,335,335,335,337,337,335,335,335,335,335,335, +338,338,338,338,338,338,338,338,338,338,339,339,339,339,339,339, +339,339,339,339,335,337,335,337,335,337,340,341,340,341,342,342, +334,334,334,334,334,334,334,334,119,334,334,334,334,334,334,334, +334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334, +334,334,334,334,334,334,334,334,334,334,334,334,334,119,119,119, +119,337,337,337,337,337,337,337,337,337,337,337,337,337,337,342, /* block 31 */ -321,321,321,321,321,320,321,321,318,318,318,318,318,321,321,321, -321,321,321,321,321,321,321,321,116,321,321,321,321,321,321,321, -321,321,321,321,321,321,321,321,321,321,321,321,321,321,321,321, -321,321,321,321,321,321,321,321,321,321,321,321,321,116,319,319, -319,319,319,319,319,319,321,319,319,319,319,319,319,116,319,319, -320,320,320,320,320, 19, 19, 19, 19,320,320,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +337,337,337,337,337,336,337,337,334,334,334,334,334,337,337,337, +337,337,337,337,337,337,337,337,119,337,337,337,337,337,337,337, +337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, +337,337,337,337,337,337,337,337,337,337,337,337,337,119,335,335, +335,335,335,335,335,335,337,335,335,335,335,335,335,119,335,335, +336,336,336,336,336, 20, 20, 20, 20,336,336,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 32 */ -327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327, -327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327, -327,327,327,327,327,327,327,327,327,327,327,328,328,329,329,329, -329,330,329,329,329,329,329,329,328,329,329,330,330,329,329,327, -331,331,331,331,331,331,331,331,331,331,332,332,332,332,332,332, -327,327,327,327,327,327,330,330,329,329,327,327,327,327,329,329, -329,327,328,328,328,327,327,328,328,328,328,328,328,328,327,327, -327,329,329,329,329,327,327,327,327,327,327,327,327,327,327,327, +343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343, +343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343, +343,343,343,343,343,343,343,343,343,343,343,344,344,345,345,345, +345,346,345,345,345,345,345,345,344,345,345,346,346,345,345,343, +347,347,347,347,347,347,347,347,347,347,348,348,348,348,348,348, +343,343,343,343,343,343,346,346,345,345,343,343,343,343,345,345, +345,343,344,344,344,343,343,344,344,344,344,344,344,344,343,343, +343,345,345,345,345,343,343,343,343,343,343,343,343,343,343,343, /* block 33 */ -327,327,329,328,330,329,329,328,328,328,328,328,328,329,327,328, -331,331,331,331,331,331,331,331,331,331,328,328,328,329,333,333, -334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334, -334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334, -334,334,334,334,334,334,116,334,116,116,116,116,116,334,116,116, -335,335,335,335,335,335,335,335,335,335,335,335,335,335,335,335, -335,335,335,335,335,335,335,335,335,335,335,335,335,335,335,335, -335,335,335,335,335,335,335,335,335,335,335, 4,336,335,335,335, +343,343,345,344,346,345,345,344,344,344,344,344,344,345,343,344, +349,349,349,349,349,349,349,349,349,349,344,344,344,345,350,350, +351,351,351,351,351,351,351,351,351,351,351,351,351,351,351,351, +351,351,351,351,351,351,351,351,351,351,351,351,351,351,351,351, +351,351,351,351,351,351,119,351,119,119,119,119,119,351,119,119, +352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352, +352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352, +352,352,352,352,352,352,352,352,352,352,352,353,354,352,352,352, /* block 34 */ -337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, -337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, -337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, -337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, -337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, -337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, -338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338, -338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, +356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, /* block 35 */ -338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338, -338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338, -338,338,338,338,338,338,338,338,339,339,339,339,339,339,339,339, -339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339, -339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339, -339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339, -339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339, -339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339, +356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, +356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, +356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357, +357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, +357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, +357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, +357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, +357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, /* block 36 */ -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,116,340,340,340,340,116,116, -340,340,340,340,340,340,340,116,340,116,340,340,340,340,116,116, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,119,358,358,358,358,119,119, +358,358,358,358,358,358,358,119,358,119,358,358,358,358,119,119, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, /* block 37 */ -340,340,340,340,340,340,340,340,340,116,340,340,340,340,116,116, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,116,340,340,340,340,116,116,340,340,340,340,340,340,340,116, -340,116,340,340,340,340,116,116,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,116,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, +358,358,358,358,358,358,358,358,358,119,358,358,358,358,119,119, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,119,358,358,358,358,119,119,358,358,358,358,358,358,358,119, +358,119,358,358,358,358,119,119,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, /* block 38 */ -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,116,340,340,340,340,116,116,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,340,340,340,340,116,116,341,341,341, -342,342,342,342,342,342,342,342,342,343,343,343,343,343,343,343, -343,343,343,343,343,343,343,343,343,343,343,343,343,116,116,116, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,119,358,358,358,358,119,119,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,358,358,358,358,119,119,359,359,359, +360,360,360,360,360,360,360,360,360,361,361,361,361,361,361,361, +361,361,361,361,361,361,361,361,361,361,361,361,361,119,119,119, /* block 39 */ -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -344,344,344,344,344,344,344,344,344,344,116,116,116,116,116,116, -345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345, -345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345, -345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345, -345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345, -345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345, -346,346,346,346,346,346,116,116,347,347,347,347,347,347,116,116, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +362,362,362,362,362,362,362,362,362,362,119,119,119,119,119,119, +363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363, +363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363, +363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363, +363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363, +363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363, +364,364,364,364,364,364,119,119,365,365,365,365,365,365,119,119, /* block 40 */ -348,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, +366,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, /* block 41 */ -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, /* block 42 */ -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,350,350,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,368,368,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, /* block 43 */ -351,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352, -352,352,352,352,352,352,352,352,352,352,352,353,354,116,116,116, -355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, -355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, -355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, -355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, -355,355,355,355,355,355,355,355,355,355,355, 4, 4, 4,356,356, -356,355,355,355,355,355,355,355,355,116,116,116,116,116,116,116, +369,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370, +370,370,370,370,370,370,370,370,370,370,370,371,372,119,119,119, +373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373, +373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373, +373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373, +373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373, +373,373,373,373,373,373,373,373,373,373,373, 5, 5, 5,374,374, +374,373,373,373,373,373,373,373,373,119,119,119,119,119,119,119, /* block 44 */ -357,357,357,357,357,357,357,357,357,357,357,357,357,116,357,357, -357,357,358,358,358,116,116,116,116,116,116,116,116,116,116,116, -359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, -359,359,360,360,360, 4, 4,116,116,116,116,116,116,116,116,116, -361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361, -361,361,362,362,116,116,116,116,116,116,116,116,116,116,116,116, -363,363,363,363,363,363,363,363,363,363,363,363,363,116,363,363, -363,116,364,364,116,116,116,116,116,116,116,116,116,116,116,116, +375,375,375,375,375,375,375,375,375,375,375,375,375,119,375,375, +375,375,376,376,376,119,119,119,119,119,119,119,119,119,119,119, +377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377, +377,377,378,378,378,379,379,119,119,119,119,119,119,119,119,119, +380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380, +380,380,381,381,119,119,119,119,119,119,119,119,119,119,119,119, +382,382,382,382,382,382,382,382,382,382,382,382,382,119,382,382, +382,119,383,383,119,119,119,119,119,119,119,119,119,119,119,119, /* block 45 */ -365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365, -365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365, -365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365, -365,365,365,365,366,366,367,366,366,366,366,366,366,366,367,367, -367,367,367,367,367,367,366,367,367,366,366,366,366,366,366,366, -366,366,366,366,368,368,368,369,368,368,368,370,365,366,116,116, -371,371,371,371,371,371,371,371,371,371,116,116,116,116,116,116, -372,372,372,372,372,372,372,372,372,372,116,116,116,116,116,116, +384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384, +384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384, +384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384, +384,384,384,384,385,385,386,385,385,385,385,385,385,385,386,386, +386,386,386,386,386,386,385,386,386,385,385,385,385,385,385,385, +385,385,385,385,387,387,387,388,387,387,387,389,384,385,119,119, +390,390,390,390,390,390,390,390,390,390,119,119,119,119,119,119, +391,391,391,391,391,391,391,391,391,391,119,119,119,119,119,119, /* block 46 */ -373,373, 4, 4,373, 4,374,373,373,373,373,375,375,375,376,116, -377,377,377,377,377,377,377,377,377,377,116,116,116,116,116,116, -378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378, -378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378, -378,378,378,379,378,378,378,378,378,378,378,378,378,378,378,378, -378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378, -378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378, -378,378,378,378,378,378,378,378,378,116,116,116,116,116,116,116, +392,392,393,393,392,393,394,392,392,392,392,395,395,395,396,119, +397,397,397,397,397,397,397,397,397,397,119,119,119,119,119,119, +398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398, +398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398, +398,398,398,399,398,398,398,398,398,398,398,398,398,398,398,398, +398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398, +398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398, +398,398,398,398,398,398,398,398,398,119,119,119,119,119,119,119, /* block 47 */ -378,378,378,378,378,375,375,378,378,378,378,378,378,378,378,378, -378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378, -378,378,378,378,378,378,378,378,378,375,378,116,116,116,116,116, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, -349,349,349,349,349,349,116,116,116,116,116,116,116,116,116,116, +398,398,398,398,398,395,395,398,398,398,398,398,398,398,398,398, +398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398, +398,398,398,398,398,398,398,398,398,395,398,119,119,119,119,119, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +367,367,367,367,367,367,119,119,119,119,119,119,119,119,119,119, /* block 48 */ -380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380, -380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,116, -381,381,381,382,382,382,382,381,381,382,382,382,116,116,116,116, -382,382,381,382,382,382,382,382,382,381,381,381,116,116,116,116, -383,116,116,116,384,384,385,385,385,385,385,385,385,385,385,385, -386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386, -386,386,386,386,386,386,386,386,386,386,386,386,386,386,116,116, -386,386,386,386,386,116,116,116,116,116,116,116,116,116,116,116, +400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400, +400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,119, +401,401,401,402,402,402,402,401,401,402,402,402,119,119,119,119, +402,402,401,402,402,402,402,402,402,401,401,401,119,119,119,119, +403,119,119,119,404,404,405,405,405,405,405,405,405,405,405,405, +406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,406, +406,406,406,406,406,406,406,406,406,406,406,406,406,406,119,119, +406,406,406,406,406,119,119,119,119,119,119,119,119,119,119,119, /* block 49 */ -387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387, -387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387, -387,387,387,387,387,387,387,387,387,387,387,387,116,116,116,116, -387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387, -387,387,387,387,387,387,387,387,387,387,116,116,116,116,116,116, -388,388,388,388,388,388,388,388,388,388,389,116,116,116,390,390, -391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,391, -391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,391, +407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,407, +407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,407, +407,407,407,407,407,407,407,407,407,407,407,407,119,119,119,119, +407,407,407,407,407,407,407,407,407,407,407,407,407,407,407,407, +407,407,407,407,407,407,407,407,407,407,119,119,119,119,119,119, +408,408,408,408,408,408,408,408,408,408,409,119,119,119,410,410, +411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411, +411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411, /* block 50 */ -392,392,392,392,392,392,392,392,392,392,392,392,392,392,392,392, -392,392,392,392,392,392,392,393,393,394,394,393,116,116,395,395, -396,396,396,396,396,396,396,396,396,396,396,396,396,396,396,396, -396,396,396,396,396,396,396,396,396,396,396,396,396,396,396,396, -396,396,396,396,396,396,396,396,396,396,396,396,396,396,396,396, -396,396,396,396,396,397,398,397,398,398,398,398,398,398,398,116, -398,399,398,399,399,398,398,398,398,398,398,398,398,397,397,397, -397,397,397,398,398,398,398,398,398,398,398,398,398,116,116,398, +412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412, +412,412,412,412,412,412,412,413,413,414,414,413,119,119,415,415, +416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416, +416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416, +416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416, +416,416,416,416,416,417,418,417,418,418,418,418,418,418,418,119, +418,419,418,419,419,418,418,418,418,418,418,418,418,417,417,417, +417,417,417,418,418,418,418,418,418,418,418,418,418,119,119,418, /* block 51 */ -400,400,400,400,400,400,400,400,400,400,116,116,116,116,116,116, -400,400,400,400,400,400,400,400,400,400,116,116,116,116,116,116, -401,401,401,401,401,401,401,402,401,401,401,401,401,401,116,116, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,403,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +420,420,420,420,420,420,420,420,420,420,119,119,119,119,119,119, +420,420,420,420,420,420,420,420,420,420,119,119,119,119,119,119, +421,421,421,421,421,421,421,422,421,421,421,421,421,421,119,119, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,423,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 52 */ -404,404,404,404,405,406,406,406,406,406,406,406,406,406,406,406, -406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,406, -406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,406, -406,406,406,406,404,405,404,404,404,404,404,405,404,405,405,405, -405,405,404,405,405,406,406,406,406,406,406,406,116,116,116,116, -407,407,407,407,407,407,407,407,407,407,408,408,408,408,408,408, -408,409,409,409,409,409,409,409,409,409,409,404,404,404,404,404, -404,404,404,404,409,409,409,409,409,409,409,409,409,116,116,116, +424,424,424,424,425,426,426,426,426,426,426,426,426,426,426,426, +426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,426, +426,426,426,426,426,426,426,426,426,426,426,426,426,426,426,426, +426,426,426,426,424,425,424,424,424,424,424,425,424,425,425,425, +425,425,424,425,425,426,426,426,426,426,426,426,119,119,119,119, +427,427,427,427,427,427,427,427,427,427,428,428,428,428,428,428, +428,429,429,429,429,429,429,429,429,429,429,424,424,424,424,424, +424,424,424,424,429,429,429,429,429,429,429,429,429,119,119,119, /* block 53 */ -410,410,411,412,412,412,412,412,412,412,412,412,412,412,412,412, -412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412, -412,411,410,410,410,410,411,411,410,410,411,410,410,410,412,412, -413,413,413,413,413,413,413,413,413,413,412,412,412,412,412,412, -414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414, -414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414, -414,414,414,414,414,414,415,416,415,415,416,416,416,415,416,415, -415,415,416,416,116,116,116,116,116,116,116,116,417,417,417,417, +430,430,431,432,432,432,432,432,432,432,432,432,432,432,432,432, +432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,432, +432,431,430,430,430,430,431,431,430,430,431,430,430,430,432,432, +433,433,433,433,433,433,433,433,433,433,432,432,432,432,432,432, +434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434, +434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434, +434,434,434,434,434,434,435,436,435,435,436,436,436,435,436,435, +435,435,436,436,119,119,119,119,119,119,119,119,437,437,437,437, /* block 54 */ -418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418, -418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418, -418,418,418,418,419,419,419,419,419,419,419,419,420,420,420,420, -420,420,420,420,419,419,420,420,116,116,116,421,421,421,421,421, -422,422,422,422,422,422,422,422,422,422,116,116,116,418,418,418, -423,423,423,423,423,423,423,423,423,423,424,424,424,424,424,424, -424,424,424,424,424,424,424,424,424,424,424,424,424,424,424,424, -424,424,424,424,424,424,424,424,425,425,425,425,425,425,426,426, +438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438, +438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438, +438,438,438,438,439,439,439,439,439,439,439,439,440,440,440,440, +440,440,440,440,439,439,440,440,119,119,119,441,441,441,441,441, +442,442,442,442,442,442,442,442,442,442,119,119,119,438,438,438, +443,443,443,443,443,443,443,443,443,443,444,444,444,444,444,444, +444,444,444,444,444,444,444,444,444,444,444,444,444,444,444,444, +444,444,444,444,444,444,444,444,445,445,445,445,445,445,446,446, /* block 55 */ -427,428,429,430,431,432,433,434,435,116,116,116,116,116,116,116, -436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436, -436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436, -436,436,436,436,436,436,436,436,436,436,436,116,116,436,436,436, -437,437,437,437,437,437,437,437,116,116,116,116,116,116,116,116, -111,111,111, 4,111,111,111,111,111,111,111,111,111,111,111,111, -111,438,111,111,111,111,111,111,111,439,439,439,439,111,439,439, -439,439,438,438,111,439,439,438,111,111,116,116,116,116,116,116, +447,448,449,450,451,452,453,454,455,119,119,119,119,119,119,119, +456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,456, +456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,456, +456,456,456,456,456,456,456,456,456,456,456,119,119,456,456,456, +457,457,457,457,457,457,457,457,119,119,119,119,119,119,119,119, +458,459,458,460,459,461,461,462,461,462,463,459,462,462,459,459, +462,464,459,459,459,459,459,459,459,465,466,465,465,461,465,465, +465,465,467,467,468,466,466,469,470,470,119,119,119,119,119,119, /* block 56 */ - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34,124,124,124,124,124,440,108,108,108,108, -108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, -108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, -108,108,108,108,108,108,108,108,108,108,108,108,108,117,117,117, -117,117,108,108,108,108,117,117,117,117,117, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34,441,442, 34, 34, 34,443, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35,127,127,127,127,127,471,109,109,109,109, +109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, +109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, +109,109,109,109,109,109,109,109,109,109,109,109,109,120,120,120, +120,120,109,109,109,109,120,120,120,120,120, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35,472,473, 35, 35, 35,474, 35, 35, /* block 57 */ - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,108,108,108,108,108, -108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, -108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,117, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,116,111,111,111,111,111, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,109,109,109,109,109, +109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, +109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,120, +113,113,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,119,112,112,112,112,112, /* block 58 */ - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, -444,445, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, +475,476, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, /* block 59 */ - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 34, 34, 34, 34, 34,446, 34, 34,447, 34, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,477, 35, 35,478, 35, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, /* block 60 */ -448,448,448,448,448,448,448,448,449,449,449,449,449,449,449,449, -448,448,448,448,448,448,116,116,449,449,449,449,449,449,116,116, -448,448,448,448,448,448,448,448,449,449,449,449,449,449,449,449, -448,448,448,448,448,448,448,448,449,449,449,449,449,449,449,449, -448,448,448,448,448,448,116,116,449,449,449,449,449,449,116,116, -124,448,124,448,124,448,124,448,116,449,116,449,116,449,116,449, -448,448,448,448,448,448,448,448,449,449,449,449,449,449,449,449, -450,450,451,451,451,451,452,452,453,453,454,454,455,455,116,116, +479,479,479,479,479,479,479,479,480,480,480,480,480,480,480,480, +479,479,479,479,479,479,119,119,480,480,480,480,480,480,119,119, +479,479,479,479,479,479,479,479,480,480,480,480,480,480,480,480, +479,479,479,479,479,479,479,479,480,480,480,480,480,480,480,480, +479,479,479,479,479,479,119,119,480,480,480,480,480,480,119,119, +127,479,127,479,127,479,127,479,119,480,119,480,119,480,119,480, +479,479,479,479,479,479,479,479,480,480,480,480,480,480,480,480, +481,481,482,482,482,482,483,483,484,484,485,485,486,486,119,119, /* block 61 */ -448,448,448,448,448,448,448,448,456,456,456,456,456,456,456,456, -448,448,448,448,448,448,448,448,456,456,456,456,456,456,456,456, -448,448,448,448,448,448,448,448,456,456,456,456,456,456,456,456, -448,448,124,457,124,116,124,124,449,449,458,458,459,115,460,115, -115,115,124,457,124,116,124,124,461,461,461,461,459,115,115,115, -448,448,124,124,116,116,124,124,449,449,462,462,116,115,115,115, -448,448,124,124,124,165,124,124,449,449,463,463,170,115,115,115, -116,116,124,457,124,116,124,124,464,464,465,465,459,115,115,116, +479,479,479,479,479,479,479,479,487,487,487,487,487,487,487,487, +479,479,479,479,479,479,479,479,487,487,487,487,487,487,487,487, +479,479,479,479,479,479,479,479,487,487,487,487,487,487,487,487, +479,479,127,488,127,119,127,127,480,480,489,489,490,118,491,118, +118,118,127,488,127,119,127,127,492,492,492,492,490,118,118,118, +479,479,127,127,119,119,127,127,480,480,493,493,119,118,118,118, +479,479,127,127,127,168,127,127,480,480,494,494,173,118,118,118, +119,119,127,488,127,119,127,127,495,495,496,496,490,118,118,119, /* block 62 */ - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 23,466,467, 23, 23, - 9, 9, 9, 9, 9, 9, 4, 4, 22, 26, 6, 22, 22, 26, 6, 22, - 4, 4, 4, 4, 4, 4, 4, 4,468,469, 23, 23, 23, 23, 23, 3, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 22, 26, 4,470, 4, 4, 15, - 15, 4, 4, 4, 8, 6, 7, 4, 4,470, 4, 4, 4, 4, 4, 4, - 4, 4, 8, 4, 15, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, - 23, 23, 23, 23, 23,471, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 24,108,116,116, 24, 24, 24, 24, 24, 24, 8, 8, 8, 6, 7,108, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,497,498, 24, 24, + 10, 10, 10, 10, 10, 10, 5, 5, 23, 27, 7, 23, 23, 27, 7, 23, + 5, 5, 5, 5, 5, 5, 5, 5,499,500, 24, 24, 24, 24, 24, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,501, 5, 5, 16, + 16, 5, 5, 5, 9, 7, 8, 5, 5,501, 5, 5, 5, 5, 5, 5, + 5, 5, 9, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, + 24, 24, 24, 24, 24,502, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25,109,119,119, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,109, /* block 63 */ - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 8, 8, 8, 6, 7,116, -108,108,108,108,108,108,108,108,108,108,108,108,108,116,116,116, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -111,111,111,111,111,111,111,111,111,111,111,111,111,403,403,403, -403,111,403,403,403,111,111,111,111,111,111,111,111,111,111,111, -111,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,119, +109,109,109,109,109,109,109,109,109,109,109,109,109,119,119,119, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +112,112,112,112,112,112,112,112,112,112,112,112,112,423,423,423, +423,112,423,423,423,112,112,112,112,112,112,112,112,112,112,112, +503,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 64 */ - 19, 19,472, 19, 19, 19, 19,472, 19, 19,473,472,472,472,473,473, -472,472,472,473, 19,472, 19, 19, 8,472,472,472,472,472, 19, 19, - 19, 19, 20, 19,472, 19,474, 19,472, 19,475,476,472,472, 19,473, -472,472,477,472,473,439,439,439,439,478, 19, 19,473,473,472,472, - 8, 8, 8, 8, 8,472,473,473,473,473, 19, 8, 19, 19,479, 19, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,480, -481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481, + 20, 20,504, 20, 20, 20, 20,504, 20, 20,505,504,504,504,505,505, +504,504,504,505, 20,504, 20, 20, 9,504,504,504,504,504, 20, 20, + 20, 20, 21, 20,504, 20,506, 20,504, 20,507,508,504,504, 20,505, +504,504,509,504,505,510,510,510,510,511, 20, 20,505,505,504,504, + 9, 9, 9, 9, 9,504,505,505,505,505, 20, 9, 20, 20,512, 20, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, /* block 65 */ -482,482,482, 31, 32,482,482,482,482, 24, 19, 19,116,116,116,116, - 8, 8, 8, 8,483, 20, 20, 20, 20, 20, 8, 8, 19, 19, 19, 19, - 8, 19, 19, 8, 19, 19, 8, 19, 19, 20, 20, 19, 19, 19, 8, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 8, 8, - 19, 19, 8, 19, 8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +515,515,515, 32, 33,515,515,515,515, 25, 20, 20,119,119,119,119, + 9, 9, 9, 9,516, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20, + 9, 20, 20, 9, 20, 20, 9, 20, 20, 21, 21, 20, 20, 20, 9, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, + 20, 20, 9, 20, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* block 66 */ - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* block 67 */ - 19, 19, 19, 19, 19, 19, 19, 19, 6, 7, 6, 7, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 19, 19, 19, 19, - 8, 8, 19, 19, 19, 19, 19, 19, 20, 6, 7, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 8, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 7, 8, 7, 8, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20, 20, + 9, 9, 20, 20, 20, 20, 20, 20, 21, 7, 8, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 20, 20, 20, /* block 68 */ - 19, 19, 19, 19, 19, 19, 19, 19, 20, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 8, 8, 8, 8, - 8, 8, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 19, 19, 19, 19, 20, 20, 20, 19, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9, 9, + 9, 9, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 20, 20, 20, 20, 21, 21, 21, 20, 20, 20, 20, 20, /* block 69 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, /* block 70 */ - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19,484,484,484,484,484,484,484,484,484,484, -484,484,485,484,484,484,484,484,484,484,484,484,484,484,484,484, -486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486, -486,486,486,486,486,486,486,486,486,486, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20,517,517,517,517,517,517,517,517,517,517, +517,517,518,517,517,517,517,517,517,517,517,517,517,517,517,517, +519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, +519,519,519,519,519,519,519,519,519,519, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, /* block 71 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - -/* block 72 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 20, 8, 19, 19, 19, 19, 19, 19, 19, 19, - 20, 8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 8, 8, 8,483,483,483,483, 8, - -/* block 73 */ - 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,483, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - -/* block 74 */ - 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + +/* block 72 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 21, 9, 20, 20, 20, 20, 20, 20, 20, 20, + 21, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,516,516,516,516, 9, + +/* block 73 */ + 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,516, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + +/* block 74 */ + 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* block 75 */ - 20, 20, 20, 20, 20, 20, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 19, 20, 19, 20, 19, 19, 19, 19, 19, 19, 20, 19, 19, - 19, 20, 19, 19, 19, 19, 19, 19, 20, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 20, 19, 19, 20, 19, 19, 19, 19, 20, 19, 20, 19, - 19, 19, 19, 20, 20, 20, 19, 20, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 20, 20, 20, 20, 20, 6, 7, 6, 7, 6, 7, 6, 7, - 6, 7, 6, 7, 6, 7, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 21, 21, 21, 21, 21, 21, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 20, 21, 20, 21, 20, 20, 20, 20, 20, 20, 21, 20, 20, + 20, 21, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 21, 20, 20, 21, 20, 20, 20, 20, 21, 20, 21, 20, + 20, 20, 20, 21, 21, 21, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 21, 21, 21, 21, 21, 7, 8, 7, 8, 7, 8, 7, 8, + 7, 8, 7, 8, 7, 8, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, /* block 76 */ - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 19, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, - 8, 8, 8, 8, 8, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 20, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, + 9, 9, 9, 9, 9, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* block 77 */ -487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487, -487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487, -487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487, -487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487, -487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487, -487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487, -487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487, -487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487, +520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, +520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, +520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, +520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, +520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, +520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, +520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, +520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, /* block 78 */ - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8,483,483, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,516,516, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* block 79 */ - 8, 8, 8, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, - 7, 6, 7, 6, 7, 6, 7, 6, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 6, 7, 6, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 7, 8, 8, + 9, 9, 9, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, + 8, 7, 8, 7, 8, 7, 8, 7, 8, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, 7, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, 9, 9, /* block 80 */ - 19, 19, 19, 19, 19, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 19, 19, 8, 8, 8, 8, 8, 8, 19, 19, 19, - 20, 19, 19, 19, 19, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19,116,116, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 20, 20, 9, 9, 9, 9, 9, 9, 20, 20, 20, + 21, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20,119,119, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, /* block 81 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19,116,116, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19,116, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,116, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20,119,119, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20,119, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,119, /* block 82 */ -488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488, -488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488, -488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,116, -489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,489, -489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,489, -489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,116, - 31, 32,490,491,492,493,494, 31, 32, 31, 32, 31, 32,495,496,497, -498, 34, 31, 32, 34, 31, 32, 34, 34, 34, 34, 34,108,108,499,499, +521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521, +521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521, +521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,119, +522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, +522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, +522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,119, + 32, 33,523,524,525,526,527, 32, 33, 32, 33, 32, 33,528,529,530, +531, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,109,109,532,532, /* block 83 */ -161,162,161,162,161,162,161,162,161,162,161,162,161,162,161,162, -161,162,161,162,161,162,161,162,161,162,161,162,161,162,161,162, -161,162,161,162,161,162,161,162,161,162,161,162,161,162,161,162, -161,162,161,162,161,162,161,162,161,162,161,162,161,162,161,162, -161,162,161,162,161,162,161,162,161,162,161,162,161,162,161,162, -161,162,161,162,161,162,161,162,161,162,161,162,161,162,161,162, -161,162,161,162,500,501,501,501,501,501,501,161,162,161,162,502, -502,502,161,162,116,116,116,116,116,503,503,503,503,504,503,503, +164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165, +164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165, +164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165, +164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165, +164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165, +164,165,164,165,164,165,164,165,164,165,164,165,164,165,164,165, +164,165,164,165,533,534,534,534,534,534,534,164,165,164,165,535, +535,535,164,165,119,119,119,119,119,536,536,536,536,537,536,536, /* block 84 */ -505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, -505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, -505,505,505,505,505,505,116,505,116,116,116,116,116,505,116,116, -506,506,506,506,506,506,506,506,506,506,506,506,506,506,506,506, -506,506,506,506,506,506,506,506,506,506,506,506,506,506,506,506, -506,506,506,506,506,506,506,506,506,506,506,506,506,506,506,506, -506,506,506,506,506,506,506,506,116,116,116,116,116,116,116,507, -508,116,116,116,116,116,116,116,116,116,116,116,116,116,116,509, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +538,538,538,538,538,538,119,538,119,119,119,119,119,538,119,119, +539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, +539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, +539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539, +539,539,539,539,539,539,539,539,119,119,119,119,119,119,119,540, +541,119,119,119,119,119,119,119,119,119,119,119,119,119,119,542, /* block 85 */ -340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340, -340,340,340,340,340,340,340,116,116,116,116,116,116,116,116,116, -340,340,340,340,340,340,340,116,340,340,340,340,340,340,340,116, -340,340,340,340,340,340,340,116,340,340,340,340,340,340,340,116, -340,340,340,340,340,340,340,116,340,340,340,340,340,340,340,116, -340,340,340,340,340,340,340,116,340,340,340,340,340,340,340,116, -193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193, -193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,119,119,119,119,119,119,119,119,119, +358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119, +358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119, +358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119, +358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119, +543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, +543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543, /* block 86 */ - 4, 4, 22, 26, 22, 26, 4, 4, 4, 22, 26, 4, 22, 26, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 9, 4, 4, 9, 4, 22, 26, 4, 4, - 22, 26, 6, 7, 6, 7, 6, 7, 6, 7, 4, 4, 4, 4, 4,109, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 4, 4, 4, 4, - 9, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, + 5, 5, 23, 27, 23, 27, 5, 5, 5, 23, 27, 5, 23, 27, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 23, 27, 5, 5, + 23, 27, 7, 8, 7, 8, 7, 8, 7, 8, 5, 5, 5, 5, 5,110, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 5, 5, 5, 5, + 10, 5, 7,544, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 87 */ -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,116,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,116,116,116,116,116,116,116,116,116,116,116,116, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,119,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,119,119,119,119,119,119,119,119,119,119,119,119, /* block 88 */ -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, /* block 89 */ -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,510,510,510,510,510,510,510,510,510,510, -510,510,510,510,510,510,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,116,116,116,116, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,545,545,545,545,545,545,545,545,545,545, +545,545,545,545,545,545,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,119,119,119,119, /* block 90 */ - 3, 4, 4, 4, 19,511,439,512, 6, 7, 6, 7, 6, 7, 6, 7, - 6, 7, 19, 19, 6, 7, 6, 7, 6, 7, 6, 7, 9, 6, 7, 7, - 19,512,512,512,512,512,512,512,512,512,111,111,111,111,513,513, -514,109,109,109,109,109, 19, 19,512,512,512,511,439,470, 19, 19, -116,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, + 4,546,546,547, 20,548,549,550,551,552,551,552,551,552,551,552, +551,552, 20,553,551,552,551,552,551,552,551,552,554,555,556,556, + 20,550,550,550,550,550,550,550,550,550,557,557,557,557,558,558, +559,560,560,560,560,560, 20,553,550,550,550,548,561,562,563,563, +119,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, /* block 91 */ -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,116,116,111,111, 14, 14,516,516,515, - 9,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517, -517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517, -517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517, -517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517, -517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517, -517,517,517,517,517,517,517,517,517,517,517, 4,109,518,518,517, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,119,119,565,565,566,566,567,567,564, +568,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, +569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, +569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, +569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, +569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, +569,569,569,569,569,569,569,569,569,569,569,546,560,570,570,569, /* block 92 */ -116,116,116,116,116,519,519,519,519,519,519,519,519,519,519,519, -519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, -519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, -116,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, +119,119,119,119,119,571,571,571,571,571,571,571,571,571,571,571, +571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571, +571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571, +119,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, +572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, +572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, +572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, +572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, /* block 93 */ -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,116, - 19, 19, 24, 24, 24, 24, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, -519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, -519,519,519,519,519,519,519,519,519,519,519,116,116,116,116,116, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19,116,116,116,116,116,116,116,116,116,116,116,116, -517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517, +572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,119, +563,563,573,573,573,573,563,563,563,563,563,563,563,563,563,563, +571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571, +571,571,571,571,571,571,571,571,571,571,571,119,119,119,119,119, +563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, +563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, +563,563,563,563,119,119,119,119,119,119,119,119,119,119,119,119, +569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, /* block 94 */ -521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521, -521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,116, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 24, 24, 24, 24, 24, 24, 24, 24, - 19, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521, -521,521,521,521,521,521,521,521,521,521,521,521,521,521,521, 19, +574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574, +574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,119, +573,573,573,573,573,573,573,573,573,573,563,563,563,563,563,563, +563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, +563,563,563,563,563,563,563,563, 25, 25, 25, 25, 25, 25, 25, 25, + 20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574, +574,574,574,574,574,574,574,574,574,574,574,574,574,574,574, 20, /* block 95 */ - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 20, 19, 20, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,116, +573,573,573,573,573,573,573,573,573,573,563,563,563,563,563,563, +563,563,563,563,563,563,563,575,563,575,563,563,563,563,563,563, +563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, +563, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +563,563,563,563,563,563,563,563,563,563,563,563, 20, 20, 20, 20, +576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576, +576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576, +576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,119, /* block 96 */ -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, -522,522,522,522,522,522,522,522, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, +576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576, +576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576, +576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576, +576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576, +576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576, +576,576,576,576,576,576,576,576,563,563,563,563,563,563,563,563, +563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, +563, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,563,563,563,563,563, /* block 97 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +563,563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, +563,563,563,563,563,563,563,563,563,563,563,563,563,563,563, 20, /* block 98 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,116,116,116,116,116,116,116,116,116,116, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, /* block 99 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,119,119,119,119,119,119,119,119,119,119, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, /* block 100 */ -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,525,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 101 */ -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, -524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,579,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 102 */ -524,524,524,524,524,524,524,524,524,524,524,524,524,116,116,116, -526,526,526,526,526,526,526,526,526,526,526,526,526,526,526,526, -526,526,526,526,526,526,526,526,526,526,526,526,526,526,526,526, -526,526,526,526,526,526,526,526,526,526,526,526,526,526,526,526, -526,526,526,526,526,526,526,116,116,116,116,116,116,116,116,116, -527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,527, -527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,527, -527,527,527,527,527,527,527,527,528,528,528,528,528,528,529,529, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 103 */ -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, +578,578,578,578,578,578,578,578,578,578,578,578,578,119,119,119, +580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, +580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, +580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580, +580,580,580,580,580,580,580,119,119,119,119,119,119,119,119,119, +581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, +581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581, +581,581,581,581,581,581,581,581,582,582,582,582,582,582,583,583, /* block 104 */ -530,530,530,530,530,530,530,530,530,530,530,530,531,532,532,532, -530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530, -533,533,533,533,533,533,533,533,533,533,530,530,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -188,189,188,189,188,189,188,189,188,189,534,535,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,188,189,536,193, -194,194,194,537,193,193,193,193,193,193,193,193,193,193,537,441, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, /* block 105 */ -188,189,188,189,188,189,188,189,188,189,188,189,188,189,188,189, -188,189,188,189,188,189,188,189,188,189,188,189,441,441,193,193, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,539,539,539,539,539,539,539,539,539,539, -540,540,541,541,541,541,541,541,116,116,116,116,116,116,116,116, +584,584,584,584,584,584,584,584,584,584,584,584,585,586,586,586, +584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584, +587,587,587,587,587,587,587,587,587,587,584,584,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +191,192,191,192,191,192,191,192,191,192,588,589,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,590,197, +199,199,199,591,543,543,543,543,543,543,543,543,543,543,591,472, /* block 106 */ - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14,109,109,109,109,109,109,109,109,109, - 14, 14, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 34, 34, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, -108, 34, 34, 34, 34, 34, 34, 34, 34, 31, 32, 31, 32,542, 31, 32, +191,192,191,192,191,192,191,192,191,192,191,192,191,192,191,192, +191,192,191,192,191,192,191,192,191,192,191,192,472,472,543,543, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,593,593,593,593,593,593,593,593,593,593, +594,594,595,595,595,595,595,595,119,119,119,119,119,119,119,119, /* block 107 */ - 31, 32, 31, 32, 31, 32, 31, 32,109, 14, 14, 31, 32,543, 34, 21, - 31, 32, 31, 32, 34, 34, 31, 32, 31, 32, 31, 32, 31, 32, 31, 32, - 31, 32, 31, 32, 31, 32, 31, 32, 31, 32,544,545,546,547,544, 34, -548,549,550,551, 31, 32, 31, 32, 31, 32,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116, 21,108,108, 34, 21, 21, 21, 21, 21, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15,110,110,110,110,110,110,110,110,110, + 15, 15, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, +109, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,596, 32, 33, /* block 108 */ -552,552,553,552,552,552,553,552,552,552,552,553,552,552,552,552, -552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, -552,552,552,554,554,553,553,554,555,555,555,555,116,116,116,116, - 24, 24, 24, 24, 24, 24, 19, 19, 5, 19,116,116,116,116,116,116, -556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556, -556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556, -556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556, -556,556,556,556,557,557,557,557,116,116,116,116,116,116,116,116, + 32, 33, 32, 33, 32, 33, 32, 33,110, 15, 15, 32, 33,597, 35, 22, + 32, 33, 32, 33, 35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,598,599,600,601,598, 35, +602,603,604,605, 32, 33, 32, 33, 32, 33,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119, 22,109,109, 35, 22, 22, 22, 22, 22, /* block 109 */ -558,558,559,559,559,559,559,559,559,559,559,559,559,559,559,559, -559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, -559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559, -559,559,559,559,558,558,558,558,558,558,558,558,558,558,558,558, -558,558,558,558,560,560,116,116,116,116,116,116,116,116,561,561, -562,562,562,562,562,562,562,562,562,562,116,116,116,116,116,116, -240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240, -240,240,242,242,242,242,242,242,244,244,244,242,244,242,242,240, +606,606,607,606,606,606,607,606,606,606,606,607,606,606,606,606, +606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, +606,606,606,608,608,607,607,608,609,609,609,609,119,119,119,119, +610,610,610,611,611,611,612,612,613,612,119,119,119,119,119,119, +614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,614, +614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,614, +614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,614, +614,614,614,614,615,615,615,615,119,119,119,119,119,119,119,119, /* block 110 */ -563,563,563,563,563,563,563,563,563,563,564,564,564,564,564,564, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,565,565,565,565,565,565,565,565, 4,566, -567,567,567,567,567,567,567,567,567,567,567,567,567,567,567,567, -567,567,567,567,567,567,567,568,568,568,568,568,568,568,568,568, -568,568,569,569,116,116,116,116,116,116,116,116,116,116,116,570, -337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337, -337,337,337,337,337,337,337,337,337,337,337,337,337,116,116,116, +616,616,617,617,617,617,617,617,617,617,617,617,617,617,617,617, +617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617, +617,617,617,617,617,617,617,617,617,617,617,617,617,617,617,617, +617,617,617,617,616,616,616,616,616,616,616,616,616,616,616,616, +616,616,616,616,618,618,119,119,119,119,119,119,119,119,619,619, +620,620,620,620,620,620,620,620,620,620,119,119,119,119,119,119, +251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251, +251,621,253,622,253,253,253,253,259,259,259,253,259,253,253,251, /* block 111 */ -571,571,571,572,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, -573,573,573,571,572,572,571,571,571,571,572,572,571,572,572,572, -572,574,574,574,574,574,574,574,574,574,574,574,574,574,116,109, -575,575,575,575,575,575,575,575,575,575,116,116,116,116,574,574, -327,327,327,327,327,329,576,327,327,327,327,327,327,327,327,327, -331,331,331,331,331,331,331,331,331,331,327,327,327,327,327,116, +623,623,623,623,623,623,623,623,623,623,624,624,624,624,624,624, +624,624,624,624,624,624,624,624,624,624,624,624,624,624,624,624, +624,624,624,624,624,624,625,625,625,625,625,625,625,625,626,627, +628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, +628,628,628,628,628,628,628,629,629,629,629,629,629,629,629,629, +629,629,630,630,119,119,119,119,119,119,119,119,119,119,119,631, +355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355, +355,355,355,355,355,355,355,355,355,355,355,355,355,119,119,119, /* block 112 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,578,578,578,578,578,578,579, -579,578,578,579,579,578,578,116,116,116,116,116,116,116,116,116, -577,577,577,578,577,577,577,577,577,577,577,577,578,579,116,116, -580,580,580,580,580,580,580,580,580,580,116,116,581,581,581,581, -327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327, -576,327,327,327,327,327,327,333,333,333,327,328,329,328,327,327, +632,632,632,633,634,634,634,634,634,634,634,634,634,634,634,634, +634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,634, +634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,634, +634,634,634,632,633,633,632,632,632,632,633,633,632,633,633,633, +633,635,635,635,635,635,635,635,635,635,635,635,635,635,119,636, +637,637,637,637,637,637,637,637,637,637,119,119,119,119,635,635, +343,343,343,343,343,345,638,343,343,343,343,343,343,343,343,343, +349,349,349,349,349,349,349,349,349,349,343,343,343,343,343,119, /* block 113 */ -582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582, -582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582, -582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582, -583,582,583,583,583,582,582,583,583,582,582,582,582,582,583,583, -582,583,582,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,582,582,584,585,585, -586,586,586,586,586,586,586,586,586,586,586,587,588,588,587,587, -589,589,586,590,590,587,588,116,116,116,116,116,116,116,116,116, +639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639, +639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639, +639,639,639,639,639,639,639,639,639,640,640,640,640,640,640,641, +641,640,640,641,641,640,640,119,119,119,119,119,119,119,119,119, +639,639,639,640,639,639,639,639,639,639,639,639,640,641,119,119, +642,642,642,642,642,642,642,642,642,642,119,119,643,643,643,643, +343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343, +638,343,343,343,343,343,343,350,350,350,343,344,345,344,343,343, /* block 114 */ -116,340,340,340,340,340,340,116,116,340,340,340,340,340,340,116, -116,340,340,340,340,340,340,116,116,116,116,116,116,116,116,116, -340,340,340,340,340,340,340,116,340,340,340,340,340,340,340,116, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34,591, 34, 34, 34, 34, 34, 34, 34, 14,108,108,108,108, - 34, 34, 34, 34, 34,124,116,116,116,116,116,116,116,116,116,116, -592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644, +644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644, +644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644, +645,644,645,645,645,644,644,645,645,644,644,644,644,644,645,645, +644,645,644,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,644,644,646,647,647, +648,648,648,648,648,648,648,648,648,648,648,649,650,650,649,649, +651,651,648,652,652,649,650,119,119,119,119,119,119,119,119,119, /* block 115 */ -592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, -592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, -592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, -592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, -586,586,586,587,587,588,587,587,588,587,587,589,587,588,116,116, -593,593,593,593,593,593,593,593,593,593,116,116,116,116,116,116, +119,358,358,358,358,358,358,119,119,358,358,358,358,358,358,119, +119,358,358,358,358,358,358,119,119,119,119,119,119,119,119,119, +358,358,358,358,358,358,358,119,358,358,358,358,358,358,358,119, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35,653, 35, 35, 35, 35, 35, 35, 35, 15,109,109,109,109, + 35, 35, 35, 35, 35,127,119,119,119,119,119,119,119,119,119,119, +654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654, /* block 116 */ -594,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,594,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,594,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -594,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, +654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654, +654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654, +654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654, +654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654, +648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648, +648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648, +648,648,648,649,649,650,649,649,650,649,649,651,649,650,119,119, +655,655,655,655,655,655,655,655,655,655,119,119,119,119,119,119, /* block 117 */ -595,595,595,595,595,595,595,595,595,595,595,595,594,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,594,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -594,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,594,595,595,595, +656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, /* block 118 */ -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,594,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -594,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,594,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, +657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657, /* block 119 */ -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,594,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -594,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,594,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, /* block 120 */ -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,594,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -594,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,594,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, /* block 121 */ -595,595,595,595,594,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -594,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,594,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,594,595,595,595,595,595,595,595,595,595,595,595, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, /* block 122 */ -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -594,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,594,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,594,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, +657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657, /* block 123 */ -595,595,595,595,595,595,595,595,594,595,595,595,595,595,595,595, -595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595, -595,595,595,595,116,116,116,116,116,116,116,116,116,116,116,116, -338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338, -338,338,338,338,338,338,338,116,116,116,116,339,339,339,339,339, -339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339, -339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339, -339,339,339,339,339,339,339,339,339,339,339,339,116,116,116,116, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +656,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,656,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,656,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, /* block 124 */ -596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, -596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, -596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, -596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, -596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, -596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, -596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, -596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596, +657,657,657,657,657,657,657,657,656,657,657,657,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +657,657,657,657,119,119,119,119,119,119,119,119,119,119,119,119, +356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356, +356,356,356,356,356,356,356,119,119,119,119,357,357,357,357,357, +357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, +357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, +357,357,357,357,357,357,357,357,357,357,357,357,119,119,119,119, /* block 125 */ -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, +658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658, /* block 126 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,116,116, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, /* block 127 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,119,119, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, /* block 128 */ - 34, 34, 34, 34, 34, 34, 34,116,116,116,116,116,116,116,116,116, -116,116,116,200,200,200,200,200,116,116,116,116,116,208,205,208, -208,208,208,208,208,208,208,208,208,598,208,208,208,208,208,208, -208,208,208,208,208,208,208,116,208,208,208,208,208,116,208,116, -208,208,116,208,208,116,208,208,208,208,208,208,208,208,208,208, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 129 */ -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,599,599,599,599,599,599,599,599,599,599,599,599,599,599, -599,599,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, + 35, 35, 35, 35, 35, 35, 35,119,119,119,119,119,119,119,119,119, +119,119,119,205,205,205,205,205,119,119,119,119,119,214,211,214, +214,214,214,214,214,214,214,214,214,660,214,214,214,214,214,214, +214,214,214,214,214,214,214,119,214,214,214,214,214,119,214,119, +214,214,119,214,214,119,214,214,214,214,214,214,214,214,214,214, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, /* block 130 */ -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,661,661,661,661,661,661,661,661,661,661,661,661,661,661, +661,661,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, /* block 131 */ -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217, 7, 6, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, /* block 132 */ -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -116,116,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -217,217,217,217,217,217,217,217,217,217,217,217,213,214,116,116, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224, 8, 7, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, /* block 133 */ -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, - 4, 4, 4, 4, 4, 4, 4, 6, 7, 4,116,116,116,116,116,116, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,193,193, - 4, 9, 9, 15, 15, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, - 7, 6, 7, 6, 7, 4, 4, 6, 7, 4, 4, 4, 4, 15, 15, 15, - 4, 4, 4,116, 4, 4, 4, 4, 9, 6, 7, 6, 7, 6, 7, 4, - 4, 4, 8, 9, 8, 8, 8,116, 4, 5, 4, 4,116,116,116,116, -217,217,217,217,217,116,217,217,217,217,217,217,217,217,217,217, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +119,119,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +224,224,662,224,224,224,224,224,224,224,224,224,219,663,119,119, /* block 134 */ -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,116,116, 23, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, + 5, 5, 5, 5, 5, 5, 5, 7, 8, 5,119,119,119,119,119,119, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,543,543, + 5, 10, 10, 16, 16, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, + 8, 7, 8, 7, 8,547,547, 7, 8, 5, 5, 5, 5, 16, 16, 16, + 5, 5, 5,119, 5, 5, 5, 5, 10, 7, 8, 7, 8, 7, 8, 5, + 5, 5, 9, 10, 9, 9, 9,119, 5, 6, 5, 5,119,119,119,119, +224,224,224,224,224,119,224,224,224,224,224,224,224,224,224,224, /* block 135 */ -116, 4, 4, 4, 5, 4, 4, 4, 6, 7, 4, 8, 4, 9, 4, 4, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 8, 8, 8, 4, - 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 6, 4, 7, 14, 15, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, 8, 7, 8, 6, - 7, 4, 6, 7, 4, 4,517,517,517,517,517,517,517,517,517,517, -109,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,119,119, 24, /* block 136 */ -517,517,517,517,517,517,517,517,517,517,517,517,517,517,517,517, -517,517,517,517,517,517,517,517,517,517,517,517,517,517,600,600, -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520, -520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,116, -116,116,520,520,520,520,520,520,116,116,520,520,520,520,520,520, -116,116,520,520,520,520,520,520,116,116,520,520,520,116,116,116, - 5, 5, 8, 14, 19, 5, 5,116, 19, 8, 8, 8, 8, 19, 19,116, -471,471,471,471,471,471,471,471,471, 23, 23, 23, 19, 19,116,116, +119, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5, + 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16, + 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 7, + 8,546,551,552,546,546,569,569,569,569,569,569,569,569,569,569, +560,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, /* block 137 */ -601,601,601,601,601,601,601,601,601,601,601,601,116,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,116,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,116,601,601,116,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,116,116, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569, +569,569,569,569,569,569,569,569,569,569,569,569,569,569,664,664, +572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, +572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,119, +119,119,572,572,572,572,572,572,119,119,572,572,572,572,572,572, +119,119,572,572,572,572,572,572,119,119,572,572,572,119,119,119, + 6, 6, 9, 15, 20, 6, 6,119, 20, 9, 9, 9, 9, 20, 20,119, +502,502,502,502,502,502,502,502,502, 24, 24, 24, 20, 20,119,119, /* block 138 */ -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601, -601,601,601,601,601,601,601,601,601,601,601,116,116,116,116,116, +665,665,665,665,665,665,665,665,665,665,665,665,119,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,119,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,119,665,665,119,665, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,119,119, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 139 */ - 4, 4, 4,116,116,116,116, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24,116,116,116, 19, 19, 19, 19, 19, 19, 19, 19, 19, -602,602,602,602,602,602,602,602,602,602,602,602,602,602,602,602, -602,602,602,602,602,602,602,602,602,602,602,602,602,602,602,602, -602,602,602,602,602,602,602,602,602,602,602,602,602,602,602,602, -602,602,602,602,602,603,603,603,603,604,604,604,604,604,604,604, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,665,665,665,665,665, +665,665,665,665,665,665,665,665,665,665,665,119,119,119,119,119, /* block 140 */ -604,604,604,604,604,604,604,604,604,604,603,603,604,604,604,116, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,116,116,116,116, -604,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,111,116,116, +666,666,666,119,119,119,119,667,667,667,667,667,667,667,667,667, +667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667, +667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667, +667,667,667,667,119,119,119,668,668,668,668,668,668,668,668,668, +669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669, +669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669, +669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669, +669,669,669,669,669,670,670,670,670,671,671,671,671,671,671,671, /* block 141 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +671,671,671,671,671,671,671,671,671,671,670,670,671,671,671,119, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,119,119,119,119, +671,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,112,119,119, /* block 142 */ -605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,605, -605,605,605,605,605,605,605,605,605,605,605,605,605,116,116,116, -606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, -606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, -606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606, -606,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -111, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,116,116,116,116, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 143 */ -607,607,607,607,607,607,607,607,607,607,607,607,607,607,607,607, -607,607,607,607,607,607,607,607,607,607,607,607,607,607,607,607, -608,608,608,608,116,116,116,116,116,116,116,116,116,607,607,607, -609,609,609,609,609,609,609,609,609,609,609,609,609,609,609,609, -609,610,609,609,609,609,609,609,609,609,610,116,116,116,116,116, -611,611,611,611,611,611,611,611,611,611,611,611,611,611,611,611, -611,611,611,611,611,611,611,611,611,611,611,611,611,611,611,611, -611,611,611,611,611,611,612,612,612,612,612,116,116,116,116,116, +672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, +672,672,672,672,672,672,672,672,672,672,672,672,672,119,119,119, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, +673,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +674,675,675,675,675,675,675,675,675,675,675,675,675,675,675,675, +675,675,675,675,675,675,675,675,675,675,675,675,119,119,119,119, /* block 144 */ -613,613,613,613,613,613,613,613,613,613,613,613,613,613,613,613, -613,613,613,613,613,613,613,613,613,613,613,613,613,613,116,614, -615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, -615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615, -615,615,615,615,116,116,116,116,615,615,615,615,615,615,615,615, -616,617,617,617,617,617,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676, +677,677,677,677,119,119,119,119,119,119,119,119,119,676,676,676, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, +678,679,678,678,678,678,678,678,678,678,679,119,119,119,119,119, +680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,680, +680,680,680,680,680,680,680,680,680,680,680,680,680,680,680,680, +680,680,680,680,680,680,681,681,681,681,681,119,119,119,119,119, /* block 145 */ -618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, -618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618, -618,618,618,618,618,618,618,618,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, -620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, -620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, -620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620, +682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682, +682,682,682,682,682,682,682,682,682,682,682,682,682,682,119,683, +684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684, +684,684,684,684,684,684,684,684,684,684,684,684,684,684,684,684, +684,684,684,684,119,119,119,119,684,684,684,684,684,684,684,684, +685,686,686,686,686,686,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 146 */ -621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621, -621,621,621,621,621,621,621,621,621,621,621,621,621,621,116,116, -622,622,622,622,622,622,622,622,622,622,116,116,116,116,116,116, -623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623, -623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623, -623,623,623,623,116,116,116,116,624,624,624,624,624,624,624,624, -624,624,624,624,624,624,624,624,624,624,624,624,624,624,624,624, -624,624,624,624,624,624,624,624,624,624,624,624,116,116,116,116, +687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, +687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, +687,687,687,687,687,687,687,687,688,688,688,688,688,688,688,688, +688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688, +688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688, +689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689, +689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689, +689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689, /* block 147 */ -625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625, -625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625, -625,625,625,625,625,625,625,625,116,116,116,116,116,116,116,116, -626,626,626,626,626,626,626,626,626,626,626,626,626,626,626,626, -626,626,626,626,626,626,626,626,626,626,626,626,626,626,626,626, -626,626,626,626,626,626,626,626,626,626,626,626,626,626,626,626, -626,626,626,626,116,116,116,116,116,116,116,116,116,116,116,627, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690, +690,690,690,690,690,690,690,690,690,690,690,690,690,690,119,119, +691,691,691,691,691,691,691,691,691,691,119,119,119,119,119,119, +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692, +692,692,692,692,119,119,119,119,693,693,693,693,693,693,693,693, +693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693, +693,693,693,693,693,693,693,693,693,693,693,693,119,119,119,119, /* block 148 */ -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, +694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, +694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694, +694,694,694,694,694,694,694,694,119,119,119,119,119,119,119,119, +695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695, +695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695, +695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695, +695,695,695,695,119,119,119,119,119,119,119,119,119,119,119,696, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 149 */ -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,628,116,116,116,116,116,116,116,116,116, -628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628, -628,628,628,628,628,628,116,116,116,116,116,116,116,116,116,116, -628,628,628,628,628,628,628,628,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, /* block 150 */ -629,629,629,629,629,629,116,116,629,116,629,629,629,629,629,629, -629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,629, -629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,629, -629,629,629,629,629,629,116,629,629,116,116,116,629,116,116,629, -630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630, -630,630,630,630,630,630,116,631,632,632,632,632,632,632,632,632, -633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633, -633,633,633,633,633,633,633,634,634,635,635,635,635,635,635,635, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,697,119,119,119,119,119,119,119,119,119, +697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697, +697,697,697,697,697,697,119,119,119,119,119,119,119,119,119,119, +697,697,697,697,697,697,697,697,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 151 */ -636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636, -636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,116, -116,116,116,116,116,116,116,637,637,637,637,637,637,637,637,637, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -638,638,638,638,638,638,638,638,638,638,638,638,638,638,638,638, -638,638,638,116,638,638,116,116,116,116,116,639,639,639,639,639, +698,698,698,698,698,698,119,119,698,119,698,698,698,698,698,698, +698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698, +698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698, +698,698,698,698,698,698,119,698,698,119,119,119,698,119,119,698, +699,699,699,699,699,699,699,699,699,699,699,699,699,699,699,699, +699,699,699,699,699,699,119,700,701,701,701,701,701,701,701,701, +702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702, +702,702,702,702,702,702,702,703,703,704,704,704,704,704,704,704, /* block 152 */ -640,640,640,640,640,640,640,640,640,640,640,640,640,640,640,640, -640,640,640,640,640,640,641,641,641,641,641,641,116,116,116,642, -643,643,643,643,643,643,643,643,643,643,643,643,643,643,643,643, -643,643,643,643,643,643,643,643,643,643,116,116,116,116,116,644, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705, +705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,119, +119,119,119,119,119,119,119,706,706,706,706,706,706,706,706,706, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707, +707,707,707,119,707,707,119,119,119,119,119,708,708,708,708,708, /* block 153 */ -645,645,645,645,645,645,645,645,645,645,645,645,645,645,645,645, -645,645,645,645,645,645,645,645,645,645,645,645,645,645,645,645, -646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,646, -646,646,646,646,646,646,646,646,116,116,116,116,647,647,646,646, -647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647, -116,116,647,647,647,647,647,647,647,647,647,647,647,647,647,647, -647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647, -647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647, +709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709, +709,709,709,709,709,709,710,710,710,710,710,710,119,119,119,711, +712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712, +712,712,712,712,712,712,712,712,712,712,119,119,119,119,119,713, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 154 */ -648,649,649,649,116,649,649,116,116,116,116,116,649,649,649,649, -648,648,648,648,116,648,648,648,116,648,648,648,648,648,648,648, -648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648, -648,648,648,648,648,648,116,116,649,649,649,116,116,116,116,649, -650,650,650,650,650,650,650,650,650,116,116,116,116,116,116,116, -651,651,651,651,651,651,651,651,651,116,116,116,116,116,116,116, -652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,652, -652,652,652,652,652,652,652,652,652,652,652,652,652,653,653,654, +714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714, +714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714, +715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715, +715,715,715,715,715,715,715,715,119,119,119,119,716,716,715,715, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +119,119,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, +716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716, /* block 155 */ -655,655,655,655,655,655,655,655,655,655,655,655,655,655,655,655, -655,655,655,655,655,655,655,655,655,655,655,655,655,656,656,656, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -657,657,657,657,657,657,657,657,658,657,657,657,657,657,657,657, -657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, -657,657,657,657,657,659,659,116,116,116,116,660,660,660,660,660, -661,661,661,661,661,661,661,116,116,116,116,116,116,116,116,116, +717,718,718,718,119,718,718,119,119,119,119,119,718,718,718,718, +717,717,717,717,119,717,717,717,119,717,717,717,717,717,717,717, +717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717, +717,717,717,717,717,717,119,119,718,718,718,119,119,119,119,718, +719,719,719,719,719,719,719,719,719,119,119,119,119,119,119,119, +720,720,720,720,720,720,720,720,720,119,119,119,119,119,119,119, +721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721, +721,721,721,721,721,721,721,721,721,721,721,721,721,722,722,723, /* block 156 */ -662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662, -662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662, -662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662, -662,662,662,662,662,662,116,116,116,663,663,663,663,663,663,663, -664,664,664,664,664,664,664,664,664,664,664,664,664,664,664,664, -664,664,664,664,664,664,116,116,665,665,665,665,665,665,665,665, -666,666,666,666,666,666,666,666,666,666,666,666,666,666,666,666, -666,666,666,116,116,116,116,116,667,667,667,667,667,667,667,667, +724,724,724,724,724,724,724,724,724,724,724,724,724,724,724,724, +724,724,724,724,724,724,724,724,724,724,724,724,724,725,725,725, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +726,726,726,726,726,726,726,726,727,726,726,726,726,726,726,726, +726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726, +726,726,726,726,726,728,728,119,119,119,119,729,729,729,729,729, +730,730,730,730,730,730,730,119,119,119,119,119,119,119,119,119, /* block 157 */ -668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668, -668,668,116,116,116,116,116,116,116,669,669,669,669,116,116,116, -116,116,116,116,116,116,116,116,116,670,670,670,670,670,670,670, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731, +731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731, +731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731, +731,731,731,731,731,731,119,119,119,732,732,732,732,732,732,732, +733,733,733,733,733,733,733,733,733,733,733,733,733,733,733,733, +733,733,733,733,733,733,119,119,734,734,734,734,734,734,734,734, +735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,735, +735,735,735,119,119,119,119,119,736,736,736,736,736,736,736,736, /* block 158 */ -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, -671,671,671,671,671,671,671,671,671,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737, +737,737,119,119,119,119,119,119,119,738,738,738,738,119,119,119, +119,119,119,119,119,119,119,119,119,739,739,739,739,739,739,739, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 159 */ -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672, -672,672,672,116,116,116,116,116,116,116,116,116,116,116,116,116, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673, -673,673,673,116,116,116,116,116,116,116,674,674,674,674,674,674, +740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740, +740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740, +740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740, +740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740, +740,740,740,740,740,740,740,740,740,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 160 */ -675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,675, -675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,675, -675,675,675,675,676,676,676,676,116,116,116,116,116,116,116,116, -677,677,677,677,677,677,677,677,677,677,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,741, +741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,741, +741,741,741,741,741,741,741,741,741,741,741,741,741,741,741,741, +741,741,741,119,119,119,119,119,119,119,119,119,119,119,119,119, +742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,742, +742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,742, +742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,742, +742,742,742,119,119,119,119,119,119,119,743,743,743,743,743,743, /* block 161 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678, -678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,116, +744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744, +744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744, +744,744,744,744,745,745,745,745,119,119,119,119,119,119,119,119, +746,746,746,746,746,746,746,746,746,746,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 162 */ -679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679, -679,679,679,679,679,679,679,679,679,679,679,679,679,680,680,680, -680,680,680,680,680,680,680,679,116,116,116,116,116,116,116,116, -681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681, -681,681,681,681,681,681,682,682,682,682,682,682,682,682,682,682, -682,683,683,683,683,684,684,684,684,684,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747, +747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,119, /* block 163 */ -685,686,685,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687, -687,687,687,687,687,687,687,687,686,686,686,686,686,686,686,686, -686,686,686,686,686,686,686,688,688,688,688,688,688,688,116,116, -116,116,689,689,689,689,689,689,689,689,689,689,689,689,689,689, -689,689,689,689,689,689,690,690,690,690,690,690,690,690,690,690, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,686, +748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,748, +748,748,748,748,748,748,748,748,748,748,748,748,748,749,749,749, +749,749,749,749,749,749,749,748,119,119,119,119,119,119,119,119, +750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,750, +750,750,750,750,750,750,751,751,751,751,751,751,751,751,751,751, +751,752,752,752,752,753,753,753,753,753,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 164 */ -691,691,692,693,693,693,693,693,693,693,693,693,693,693,693,693, -693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693, -693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693, -692,692,692,691,691,691,691,692,692,691,691,694,694,695,694,694, -694,694,116,116,116,116,116,116,116,116,116,116,116,695,116,116, -696,696,696,696,696,696,696,696,696,696,696,696,696,696,696,696, -696,696,696,696,696,696,696,696,696,116,116,116,116,116,116,116, -697,697,697,697,697,697,697,697,697,697,116,116,116,116,116,116, +754,755,754,756,756,756,756,756,756,756,756,756,756,756,756,756, +756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756, +756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756, +756,756,756,756,756,756,756,756,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,755,757,757,757,757,757,757,757,119,119, +119,119,758,758,758,758,758,758,758,758,758,758,758,758,758,758, +758,758,758,758,758,758,759,759,759,759,759,759,759,759,759,759, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,755, /* block 165 */ -698,698,698,699,699,699,699,699,699,699,699,699,699,699,699,699, -699,699,699,699,699,699,699,699,699,699,699,699,699,699,699,699, -699,699,699,699,699,699,699,698,698,698,698,698,700,698,698,698, -698,698,698,698,698,116,701,701,701,701,701,701,701,701,701,701, -702,702,702,702,699,700,700,116,116,116,116,116,116,116,116,116, -703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, -703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703, -703,703,703,704,705,705,703,116,116,116,116,116,116,116,116,116, +760,760,761,762,762,762,762,762,762,762,762,762,762,762,762,762, +762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762, +762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762, +761,761,761,760,760,760,760,761,761,760,760,763,763,764,763,763, +763,763,119,119,119,119,119,119,119,119,119,119,119,764,119,119, +765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765, +765,765,765,765,765,765,765,765,765,119,119,119,119,119,119,119, +766,766,766,766,766,766,766,766,766,766,119,119,119,119,119,119, /* block 166 */ -706,706,707,708,708,708,708,708,708,708,708,708,708,708,708,708, -708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708, -708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708, -708,708,708,707,707,707,706,706,706,706,706,706,706,706,706,707, -707,708,709,709,708,710,710,710,710,706,706,706,706,710,116,116, -711,711,711,711,711,711,711,711,711,711,708,710,708,710,710,710, -116,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712, -712,712,712,712,712,116,116,116,116,116,116,116,116,116,116,116, +767,767,767,768,768,768,768,768,768,768,768,768,768,768,768,768, +768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768, +768,768,768,768,768,768,768,767,767,767,767,767,769,767,767,767, +767,767,767,767,767,119,770,770,770,770,770,770,770,770,770,770, +771,771,771,771,768,769,769,119,119,119,119,119,119,119,119,119, +772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772, +772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772, +772,772,772,773,774,774,772,119,119,119,119,119,119,119,119,119, /* block 167 */ -713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713, -713,713,116,713,713,713,713,713,713,713,713,713,713,713,713,713, -713,713,713,713,713,713,713,713,713,713,713,713,714,714,714,715, -715,715,714,714,715,714,715,715,716,716,716,716,716,716,715,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +775,775,776,777,777,777,777,777,777,777,777,777,777,777,777,777, +777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,777, +777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,777, +777,777,777,776,776,776,775,775,775,775,775,775,775,775,775,776, +776,777,778,778,777,779,779,779,779,775,775,775,775,779,119,119, +780,780,780,780,780,780,780,780,780,780,777,779,777,779,779,779, +119,781,781,781,781,781,781,781,781,781,781,781,781,781,781,781, +781,781,781,781,781,119,119,119,119,119,119,119,119,119,119,119, /* block 168 */ -717,717,717,717,717,717,717,116,717,116,717,717,717,717,116,717, -717,717,717,717,717,717,717,717,717,717,717,717,717,717,116,717, -717,717,717,717,717,717,717,717,717,718,116,116,116,116,116,116, -719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719, -719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719, -719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,720, -721,721,721,720,720,720,720,720,720,720,720,116,116,116,116,116, -722,722,722,722,722,722,722,722,722,722,116,116,116,116,116,116, +782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782, +782,782,119,782,782,782,782,782,782,782,782,782,782,782,782,782, +782,782,782,782,782,782,782,782,782,782,782,782,783,783,783,784, +784,784,783,783,784,783,784,784,785,785,785,785,785,785,784,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 169 */ -723,723,724,724,116,725,725,725,725,725,725,725,725,116,116,725, -725,116,116,725,725,725,725,725,725,725,725,725,725,725,725,725, -725,725,725,725,725,725,725,725,725,116,725,725,725,725,725,725, -725,116,725,725,116,725,725,725,725,725,116,111,723,725,726,724, -723,724,724,724,724,116,116,724,724,116,116,724,724,724,116,116, -725,116,116,116,116,116,116,726,116,116,116,116,116,725,725,725, -725,725,724,724,116,116,723,723,723,723,723,723,723,116,116,116, -723,723,723,723,723,116,116,116,116,116,116,116,116,116,116,116, +786,786,786,786,786,786,786,119,786,119,786,786,786,786,119,786, +786,786,786,786,786,786,786,786,786,786,786,786,786,786,119,786, +786,786,786,786,786,786,786,786,786,787,119,119,119,119,119,119, +788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788, +788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788, +788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,789, +790,790,790,789,789,789,789,789,789,789,789,119,119,119,119,119, +791,791,791,791,791,791,791,791,791,791,119,119,119,119,119,119, /* block 170 */ -727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727, -727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727, -727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727, -727,727,727,727,727,728,728,728,729,729,729,729,729,729,729,729, -728,728,729,729,729,728,729,727,727,727,727,730,730,730,730,730, -731,731,731,731,731,731,731,731,731,731,116,730,116,730,729,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +792,793,794,795,119,796,796,796,796,796,796,796,796,119,119,796, +796,119,119,796,796,796,796,796,796,796,796,796,796,796,796,796, +796,796,796,796,796,796,796,796,796,119,796,796,796,796,796,796, +796,119,796,796,119,796,796,796,796,796,119,797,793,796,798,794, +792,794,794,794,794,119,119,794,794,119,119,794,794,794,119,119, +796,119,119,119,119,119,119,798,119,119,119,119,119,796,796,796, +796,796,794,794,119,119,792,792,792,792,792,792,792,119,119,119, +792,792,792,792,792,119,119,119,119,119,119,119,119,119,119,119, /* block 171 */ -732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732, -732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732, -732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732, -733,734,734,735,735,735,735,735,735,734,735,734,734,733,734,735, -735,734,735,735,732,732,736,732,116,116,116,116,116,116,116,116, -737,737,737,737,737,737,737,737,737,737,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799, +799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799, +799,799,799,799,799,800,800,800,801,801,801,801,801,801,801,801, +800,800,801,801,801,800,801,799,799,799,799,802,802,802,802,802, +803,803,803,803,803,803,803,803,803,803,119,802,119,802,801,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 172 */ -738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738, -738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738, -738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,739, -740,740,741,741,741,741,116,116,740,740,740,740,741,741,740,741, -741,742,742,742,742,742,742,742,742,742,742,742,742,742,742,742, -742,742,742,742,742,742,742,742,738,738,738,738,741,741,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, +804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, +804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, +805,806,806,807,807,807,807,807,807,806,807,806,806,805,806,807, +807,806,807,807,804,804,808,804,119,119,119,119,119,119,119,119, +809,809,809,809,809,809,809,809,809,809,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 173 */ -743,743,743,743,743,743,743,743,743,743,743,743,743,743,743,743, -743,743,743,743,743,743,743,743,743,743,743,743,743,743,743,743, -743,743,743,743,743,743,743,743,743,743,743,743,743,743,743,743, -744,744,744,745,745,745,745,745,745,745,745,744,744,745,744,745, -745,746,746,746,743,116,116,116,116,116,116,116,116,116,116,116, -747,747,747,747,747,747,747,747,747,747,116,116,116,116,116,116, -373,373,373,373,373,373,373,373,373,373,373,373,373,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,811, +812,812,813,813,813,813,119,119,812,812,812,812,813,813,812,813, +813,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814, +814,814,814,814,814,814,814,814,810,810,810,810,813,813,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 174 */ -748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,748, -748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,748, -748,748,748,748,748,748,748,748,748,748,748,749,750,749,750,750, -749,749,749,749,749,749,750,749,116,116,116,116,116,116,116,116, -751,751,751,751,751,751,751,751,751,751,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815, +815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815, +815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815, +816,816,816,817,817,817,817,817,817,817,817,816,816,817,816,817, +817,818,818,818,815,119,119,119,119,119,119,119,119,119,119,119, +819,819,819,819,819,819,819,819,819,819,119,119,119,119,119,119, +392,392,392,392,392,392,392,392,392,392,392,392,392,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 175 */ -752,752,752,752,752,752,752,752,752,752,752,752,752,752,752,752, -752,752,752,752,752,752,752,752,752,752,752,116,116,753,753,753, -754,754,753,753,753,753,754,753,753,753,753,753,116,116,116,116, -755,755,755,755,755,755,755,755,755,755,756,756,757,757,757,758, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820, +820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820, +820,820,820,820,820,820,820,820,820,820,820,821,822,821,822,822, +821,821,821,821,821,821,822,821,119,119,119,119,119,119,119,119, +823,823,823,823,823,823,823,823,823,823,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 176 */ -759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759, -759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759, -759,759,759,759,759,759,759,759,759,759,759,759,760,760,760,761, -761,761,761,761,761,761,761,761,760,761,761,762,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, +824,824,824,824,824,824,824,824,824,824,824,119,119,825,825,825, +826,826,825,825,825,825,826,825,825,825,825,825,119,119,119,119, +827,827,827,827,827,827,827,827,827,827,828,828,829,829,829,830, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 177 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763, -763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763, -764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, -764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764, -765,765,765,765,765,765,765,765,765,765,766,766,766,766,766,766, -766,766,766,116,116,116,116,116,116,116,116,116,116,116,116,767, +831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831, +831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831, +831,831,831,831,831,831,831,831,831,831,831,831,832,832,832,833, +833,833,833,833,833,833,833,833,832,833,833,834,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 178 */ -768,769,769,769,769,769,769,769,769,769,769,768,768,768,768,768, -768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768, -768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768, -768,768,768,769,769,769,769,769,769,770,771,769,769,769,769,772, -772,772,772,772,772,772,772,769,116,116,116,116,116,116,116,116, -773,774,774,774,774,774,774,775,775,774,774,774,773,773,773,773, -773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773, -773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835, +835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835, +836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,836, +836,836,836,836,836,836,836,836,836,836,836,836,836,836,836,836, +837,837,837,837,837,837,837,837,837,837,838,838,838,838,838,838, +838,838,838,119,119,119,119,119,119,119,119,119,119,119,119,839, /* block 179 */ -773,773,773,773,116,116,776,776,776,776,774,774,774,774,774,774, -774,774,774,774,774,774,774,775,774,774,777,777,777,773,777,777, -777,777,777,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778, -778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778, -778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778, -778,778,778,778,778,778,778,778,778,116,116,116,116,116,116,116, +840,841,841,841,841,841,841,841,841,841,841,840,840,840,840,840, +840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840, +840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840, +840,840,840,841,841,841,841,841,841,842,843,841,841,841,841,844, +844,844,844,844,844,844,844,841,119,119,119,119,119,119,119,119, +845,846,846,846,846,846,846,847,847,846,846,846,845,845,845,845, +845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,845, +845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,845, /* block 180 */ -779,779,779,779,779,779,779,779,779,116,779,779,779,779,779,779, -779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779, -779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,780, -781,781,781,781,781,781,781,116,781,781,781,781,781,781,780,781, -779,782,782,782,782,782,116,116,116,116,116,116,116,116,116,116, -783,783,783,783,783,783,783,783,783,783,784,784,784,784,784,784, -784,784,784,784,784,784,784,784,784,784,784,784,784,116,116,116, -785,785,786,786,786,786,786,786,786,786,786,786,786,786,786,786, +845,845,845,845,119,119,848,848,848,848,846,846,846,846,846,846, +846,846,846,846,846,846,846,847,846,846,849,849,849,845,849,849, +849,849,849,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850, +850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850, +850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850, +850,850,850,850,850,850,850,850,850,119,119,119,119,119,119,119, /* block 181 */ -786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786, -116,116,787,787,787,787,787,787,787,787,787,787,787,787,787,787, -787,787,787,787,787,787,787,787,116,788,787,787,787,787,787,787, -787,788,787,787,788,787,787,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +851,851,851,851,851,851,851,851,851,119,851,851,851,851,851,851, +851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851, +851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,852, +853,853,853,853,853,853,853,119,853,853,853,853,853,853,852,853, +851,854,854,854,854,854,119,119,119,119,119,119,119,119,119,119, +855,855,855,855,855,855,855,855,855,855,856,856,856,856,856,856, +856,856,856,856,856,856,856,856,856,856,856,856,856,119,119,119, +857,857,858,858,858,858,858,858,858,858,858,858,858,858,858,858, /* block 182 */ -789,789,789,789,789,789,789,116,789,789,116,789,789,789,789,789, -789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789, -789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789, -789,790,790,790,790,790,790,116,116,116,790,116,790,790,116,790, -790,790,790,790,790,790,791,790,116,116,116,116,116,116,116,116, -792,792,792,792,792,792,792,792,792,792,116,116,116,116,116,116, -793,793,793,793,793,793,116,793,793,116,793,793,793,793,793,793, -793,793,793,793,793,793,793,793,793,793,793,793,793,793,793,793, +858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858, +119,119,859,859,859,859,859,859,859,859,859,859,859,859,859,859, +859,859,859,859,859,859,859,859,119,860,859,859,859,859,859,859, +859,860,859,859,860,859,859,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 183 */ -793,793,793,793,793,793,793,793,793,793,794,794,794,794,794,116, -795,795,116,794,794,795,794,795,793,116,116,116,116,116,116,116, -796,796,796,796,796,796,796,796,796,796,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +861,861,861,861,861,861,861,119,861,861,119,861,861,861,861,861, +861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861, +861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861, +861,862,862,862,862,862,862,119,119,119,862,119,862,862,119,862, +862,862,862,862,862,862,863,862,119,119,119,119,119,119,119,119, +864,864,864,864,864,864,864,864,864,864,119,119,119,119,119,119, +865,865,865,865,865,865,119,865,865,119,865,865,865,865,865,865, +865,865,865,865,865,865,865,865,865,865,865,865,865,865,865,865, /* block 184 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797, -797,797,797,798,798,799,799,800,800,116,116,116,116,116,116,116, +865,865,865,865,865,865,865,865,865,865,866,866,866,866,866,119, +867,867,119,866,866,867,866,867,865,119,119,119,119,119,119,119, +868,868,868,868,868,868,868,868,868,868,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 185 */ -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,869, +869,869,869,870,870,871,871,872,872,119,119,119,119,119,119,119, /* block 186 */ -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, /* block 187 */ -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802, -802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,116, -803,803,803,803,803,116,116,116,116,116,116,116,116,116,116,116, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 188 */ -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801, -801,801,801,801,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874, +874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874, +874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874, +874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874, +874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874, +874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,874, +874,874,874,874,874,874,874,874,874,874,874,874,874,874,874,119, +875,875,875,875,875,119,119,119,119,119,119,119,119,119,119,119, /* block 189 */ -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,873,873,873,873,873,873,873,873,873,873,873,873, +873,873,873,873,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 190 */ -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,804, -804,804,804,804,804,804,804,804,804,804,804,804,804,804,804,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, /* block 191 */ -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 192 */ -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805, -805,805,805,805,805,805,805,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, /* block 193 */ -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 194 */ -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,538,538,538,538,538,538,538, -538,538,538,538,538,538,538,538,538,116,116,116,116,116,116,116, -806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806, -806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,116, -807,807,807,807,807,807,807,807,807,807,116,116,116,116,808,808, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, /* block 195 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -809,809,809,809,809,809,809,809,809,809,809,809,809,809,809,809, -809,809,809,809,809,809,809,809,809,809,809,809,809,809,116,116, -810,810,810,810,810,811,116,116,116,116,116,116,116,116,116,116, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592, +592,592,592,592,592,592,592,592,592,119,119,119,119,119,119,119, +878,878,878,878,878,878,878,878,878,878,878,878,878,878,878,878, +878,878,878,878,878,878,878,878,878,878,878,878,878,878,878,119, +879,879,879,879,879,879,879,879,879,879,119,119,119,119,880,880, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 196 */ -812,812,812,812,812,812,812,812,812,812,812,812,812,812,812,812, -812,812,812,812,812,812,812,812,812,812,812,812,812,812,812,812, -812,812,812,812,812,812,812,812,812,812,812,812,812,812,812,812, -813,813,813,813,813,813,813,814,814,814,814,814,815,815,815,815, -816,816,816,816,814,815,116,116,116,116,116,116,116,116,116,116, -817,817,817,817,817,817,817,817,817,817,116,818,818,818,818,818, -818,818,116,812,812,812,812,812,812,812,812,812,812,812,812,812, -812,812,812,812,812,812,812,812,116,116,116,116,116,812,812,812, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881, +881,881,881,881,881,881,881,881,881,881,881,881,881,881,119,119, +882,882,882,882,882,883,119,119,119,119,119,119,119,119,119,119, /* block 197 */ -812,812,812,812,812,812,812,812,812,812,812,812,812,812,812,812, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884, +884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884, +884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884, +885,885,885,885,885,885,885,886,886,886,886,886,887,887,887,887, +888,888,888,888,886,887,119,119,119,119,119,119,119,119,119,119, +889,889,889,889,889,889,889,889,889,889,119,890,890,890,890,890, +890,890,119,884,884,884,884,884,884,884,884,884,884,884,884,884, +884,884,884,884,884,884,884,884,119,119,119,119,119,884,884,884, /* block 198 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819, -819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819, -820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820, -820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820, +884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 199 */ -821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,821, -821,821,821,821,821,821,821,822,822,822,822,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891, +891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891, +892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892, +892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892, /* block 200 */ -823,823,823,823,823,823,823,823,823,823,823,823,823,823,823,823, -823,823,823,823,823,823,823,823,823,823,823,823,823,823,823,823, -823,823,823,823,823,823,823,823,823,823,823,823,823,823,823,823, -823,823,823,823,823,823,823,823,823,823,823,823,823,823,823,823, -823,823,823,823,823,116,116,116,116,116,116,116,116,116,116,116, -823,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, -824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824, -824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,116, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,894,894,894,894,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 201 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,825, -825,825,825,826,826,826,826,826,826,826,826,826,826,826,826,826, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -827,828,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,895, +895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,895, +895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,895, +895,895,895,895,895,895,895,895,895,895,895,895,895,895,895,895, +895,895,895,895,895,119,119,119,119,119,119,119,119,119,119,119, +895,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896, +896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,119, /* block 202 */ -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,897, +897,897,897,898,898,898,898,898,898,898,898,898,898,898,898,898, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +899,900,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 203 */ -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, /* block 204 */ -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, -829,829,829,116,116,116,116,116,116,116,116,116,116,116,116,116, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 205 */ -517,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +901,901,901,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 206 */ -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, +569,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, /* block 207 */ -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,515, -515,515,515,515,515,515,515,515,515,515,515,515,515,515,515,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, /* block 208 */ -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, /* block 209 */ -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830, -830,830,830,830,830,830,830,830,830,830,830,830,116,116,116,116, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, /* block 210 */ -831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831, -831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831, -831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831, -831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831, -831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831, -831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831, -831,831,831,831,831,831,831,831,831,831,831,116,116,116,116,116, -831,831,831,831,831,831,831,831,831,831,831,831,831,116,116,116, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,902,902,902,902, +902,902,902,902,902,902,902,902,902,902,902,902,119,119,119,119, /* block 211 */ -831,831,831,831,831,831,831,831,831,116,116,116,116,116,116,116, -831,831,831,831,831,831,831,831,831,831,116,116,832,833,833,834, - 23, 23, 23, 23,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903, +903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903, +903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903, +903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903, +903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903, +903,903,903,903,903,903,903,903,903,903,903,903,903,903,903,903, +903,903,903,903,903,903,903,903,903,903,903,119,119,119,119,119, +903,903,903,903,903,903,903,903,903,903,903,903,903,119,119,119, /* block 212 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19,116,116,116,116,116,116,116,116,116,116, +903,903,903,903,903,903,903,903,903,119,119,119,119,119,119,119, +903,903,903,903,903,903,903,903,903,903,119,119,904,905,905,906, +907,907,907,907,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 213 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19,116,116, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19,835,438,111,111,111, 19, 19, 19,438,835,835, -835,835,835, 23, 23, 23, 23, 23, 23, 23, 23,111,111,111,111,111, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20,119,119,119,119,119,119,119,119,119,119, /* block 214 */ -111,111,111, 19, 19,111,111,111,111,111,111,111, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,111,111,111,111, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20,119,119, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20,908,909,112,112,112, 20, 20, 20,909,908,908, +908,908,908, 24, 24, 24, 24, 24, 24, 24, 24,112,112,112,112,112, /* block 215 */ -604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604, -604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604, -604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604, -604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604, -604,604,836,836,836,604,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +112,112,112, 20, 20,112,112,112,112,112,112,112, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,112,112,112,112, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 216 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24,116,116,116,116,116,116,116,116,116,116,116,116, +671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671, +671,671,910,910,910,671,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 217 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19,116,116,116,116,116,116,116,116,116, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24,116,116,116,116,116,116,116, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25,119,119,119,119,119,119,119,119,119,119,119,119, /* block 218 */ -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,473,473, -473,473,473,473,473,116,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20,119,119,119,119,119,119,119,119,119, +573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, +573,573, 25, 25, 25, 25, 25, 25, 25,119,119,119,119,119,119,119, /* block 219 */ -472,472,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,472,116,472,472, -116,116,472,116,116,472,472,116,116,472,472,472,472,116,472,472, -472,472,472,472,472,472,473,473,473,473,116,473,116,473,473,473, -473,473,473,473,116,473,473,473,473,473,473,473,473,473,473,473, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,505,505, +505,505,505,505,505,119,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, /* block 220 */ -473,473,473,473,472,472,116,472,472,472,472,116,116,472,472,472, -472,472,472,472,472,116,472,472,472,472,472,472,472,116,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,472,472,116,472,472,472,472,116, -472,472,472,472,472,116,472,116,116,116,472,472,472,472,472,472, -472,116,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, +504,504,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,504,119,504,504, +119,119,504,119,119,504,504,119,119,504,504,504,504,119,504,504, +504,504,504,504,504,504,505,505,505,505,119,505,119,505,505,505, +505,505,505,505,119,505,505,505,505,505,505,505,505,505,505,505, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, /* block 221 */ -472,472,472,472,472,472,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, +505,505,505,505,504,504,119,504,504,504,504,119,119,504,504,504, +504,504,504,504,504,119,504,504,504,504,504,504,504,119,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,504,504,119,504,504,504,504,119, +504,504,504,504,504,119,504,119,119,119,504,504,504,504,504,504, +504,119,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, /* block 222 */ -473,473,473,473,473,473,473,473,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, +504,504,504,504,504,504,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, /* block 223 */ -472,472,472,472,472,472,472,472,472,472,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,116,116,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472, 8,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473, 8,473,473,473,473, -473,473,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472, 8,473,473,473,473, +505,505,505,505,505,505,505,505,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, /* block 224 */ -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473, 8,473,473,473,473,473,473,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472, 8,473,473,473,473,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, 8, -473,473,473,473,473,473,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, 8, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, +504,504,504,504,504,504,504,504,504,504,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,119,119,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504, 9,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505, 9,505,505,505,505, +505,505,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504, 9,505,505,505,505, /* block 225 */ -473,473,473,473,473,473,473,473,473, 8,473,473,473,473,473,473, -472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472, -472,472,472,472,472,472,472,472,472, 8,473,473,473,473,473,473, -473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473, -473,473,473, 8,473,473,473,473,473,473,472,473,116,116, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505, 9,505,505,505,505,505,505,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504, 9,505,505,505,505,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, 9, +505,505,505,505,505,505,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, 9, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, /* block 226 */ -837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, -837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, -837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, -837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, -837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, -837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, -837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, -837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837, +505,505,505,505,505,505,505,505,505, 9,505,505,505,505,505,505, +504,504,504,504,504,504,504,504,504,504,504,504,504,504,504,504, +504,504,504,504,504,504,504,504,504, 9,505,505,505,505,505,505, +505,505,505,505,505,505,505,505,505,505,505,505,505,505,505,505, +505,505,505, 9,505,505,505,505,505,505,504,505,119,119, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, /* block 227 */ -838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838, -838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838, -838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838, -838,838,838,838,838,838,838,837,837,837,837,838,838,838,838,838, -838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838, -838,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838, -838,838,838,838,838,838,838,838,838,838,838,838,838,837,837,837, -837,837,837,837,837,838,837,837,837,837,837,837,837,837,837,837, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, +911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911, /* block 228 */ -837,837,837,837,838,837,837,839,839,839,839,839,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,838,838,838,838,838, -116,838,838,838,838,838,838,838,838,838,838,838,838,838,838,838, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912, +912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912, +912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912, +912,912,912,912,912,912,912,911,911,911,911,912,912,912,912,912, +912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912, +912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912, +912,912,912,912,912,912,912,912,912,912,912,912,912,911,911,911, +911,911,911,911,911,912,911,911,911,911,911,911,911,911,911,911, /* block 229 */ -840,840,840,840,840,840,840,116,840,840,840,840,840,840,840,840, -840,840,840,840,840,840,840,840,840,116,116,840,840,840,840,840, -840,840,116,840,840,116,840,840,840,840,840,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +911,911,911,911,912,911,911,913,913,913,913,913,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,912,912,912,912,912, +119,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 230 */ -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, +914,914,914,914,914,914,914,119,914,914,914,914,914,914,914,914, +914,914,914,914,914,914,914,914,914,119,119,914,914,914,914,914, +914,914,119,914,914,119,914,914,914,914,914,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 231 */ -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,841,841,841,841,841,841,841,841,841,841,841, -841,841,841,841,841,116,116,842,842,842,842,842,842,842,842,842, -843,843,843,843,843,843,843,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, /* block 232 */ -844,844,844,844,844,844,844,844,844,844,844,844,844,844,844,844, -844,844,844,844,844,844,844,844,844,844,844,844,844,844,844,844, -844,844,845,845,845,845,845,845,845,845,845,845,845,845,845,845, -845,845,845,845,845,845,845,845,845,845,845,845,845,845,845,845, -845,845,845,845,846,846,846,846,846,846,846,116,116,116,116,116, -847,847,847,847,847,847,847,847,847,847,116,116,116,116,848,848, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915, +915,915,915,915,915,119,119,916,916,916,916,916,916,916,916,916, +917,917,917,917,917,917,917,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 233 */ -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, +918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918, +918,918,919,919,919,919,919,919,919,919,919,919,919,919,919,919, +919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919, +919,919,919,919,920,920,920,920,920,920,920,119,119,119,119,119, +921,921,921,921,921,921,921,921,921,921,119,119,119,119,922,922, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 234 */ - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 19, 24, 24, 24, - 5, 24, 24, 24, 24,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, /* block 235 */ -217,217,217,217,116,217,217,217,217,217,217,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217, -116,217,217,116,217,116,116,217,116,217,217,217,217,217,217,217, -217,217,217,116,217,217,217,217,116,217,116,217,116,116,116,116, -116,116,217,116,116,116,116,217,116,217,116,217,116,217,217,217, -116,217,217,116,217,116,116,217,116,217,116,217,116,217,116,217, -116,217,217,116,217,116,116,217,217,217,217,116,217,217,217,217, -217,217,217,116,217,217,217,217,116,217,217,217,217,116,217,116, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25, + 6, 25, 25, 25, 25,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 236 */ -217,217,217,217,217,217,217,217,217,217,116,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,116,116,116,116, -116,217,217,217,116,217,217,217,217,217,116,217,217,217,217,217, -217,217,217,217,217,217,217,217,217,217,217,217,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -211,211,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +224,224,224,224,119,224,224,224,224,224,224,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, +119,224,224,119,224,119,119,224,119,224,224,224,224,224,224,224, +224,224,224,119,224,224,224,224,119,224,119,224,119,119,119,119, +119,119,224,119,119,119,119,224,119,224,119,224,119,224,224,224, +119,224,224,119,224,119,119,224,119,224,119,224,119,224,119,224, +119,224,224,119,224,119,119,224,224,224,224,119,224,224,224,224, +224,224,224,119,224,224,224,224,119,224,224,224,224,119,224,119, /* block 237 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,849,849,849,849, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +224,224,224,224,224,224,224,224,224,224,119,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,119,119,119,119, +119,224,224,224,119,224,224,224,224,224,119,224,224,224,224,224, +224,224,224,224,224,224,224,224,224,224,224,224,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +217,217,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 238 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20,849,849,849,849,849,849,849,849,849,849,849,849, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,849, -849, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -849, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -849, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20,849,849,849,849,849,849,849,849,849,849, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* block 239 */ - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,849,849,849, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,849,849,849,849, - 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923, +923, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, +923, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, +923, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21,923,923,923,923,923,923,923,923,923,923, /* block 240 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 19, - 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,850,850,850,850,850,850,850,850,850,850, -850,850,850,850,850,850,850,850,850,850,850,850,850,850,850,850, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,923,923,923, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923, + 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, /* block 241 */ -851, 20, 20,849,849,849,849,849,849,849,849,849,849,849,849,849, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, - 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19,849,849,849,849, - 19, 19, 19, 19, 19, 19, 19, 19, 19,849,849,849,849,849,849,849, - 20, 20,849,849,849,849,849,849,849,849,849,849,849,849,849,849, - 20, 20, 20, 20, 20, 20,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, + 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,924,924,924,924,924,924,924,924,924,924, +924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924, /* block 242 */ -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, +925, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923,923, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, + 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,923,923,923,923, + 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923,923, +575,575,923,923,923,923,923,923,923,923,923,923,923,923,923,923, + 21, 21, 21, 21, 21, 21,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, /* block 243 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, /* block 244 */ + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + +/* block 245 */ + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,926,926,926,926,926, + +/* block 246 */ + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, + 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + +/* block 247 */ + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,852,852,852,852,852, -/* block 245 */ +/* block 248 */ + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21,923,923,923,923,923,923,923,923,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,923,923,923,923, + +/* block 249 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, - 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20,923,923,923,923,923,923,923,923,923,923,923,923, -/* block 246 */ +/* block 250 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 21, 21, 21, 21,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -/* block 247 */ +/* block 251 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923,923,923, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20,849,849,849,849,849,849,849,849,849,849,849, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,849,849,849, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,849,849,849,849,849,849, - -/* block 248 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19,849,849,849,849,849,849,849,849,849,849,849,849, - -/* block 249 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 20, 20, 20, 20,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, - -/* block 250 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,849,849,849,849, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19,849,849,849,849,849,849,849,849, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,849,849,849,849,849,849, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - -/* block 251 */ - 19, 19, 19, 19, 19, 19, 19, 19,849,849,849,849,849,849,849,849, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, /* block 252 */ - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,849,849,849,849, + 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923,923,923, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20,849, - 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20,849,849, 20, 20, 20, 20,849,849,849, 20,849, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, /* block 253 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20,849,849,849,849,849,849,849,849,849,849,849,849,849, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,849,849,849,849,849,849, - 20, 20, 20,849,849,849,849,849,849,849,849,849,849,849,849,849, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21,923, + 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21,923,923, 21, 21, 21, 21,923,923,923, 21,923, 21, 21, 21, 21, /* block 254 */ -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923,923,923,923,923, + 21, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* block 255 */ -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,849,849, -849,849,849,849,849,849,849,849,849,849,849,849,849,849,116,116, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, /* block 256 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,119,119, /* block 257 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,116,116,116,116,116,116,116,116,116,116,116, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 258 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,116,116, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,119,119,119,119,119,119,119,119,119,119,119, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, /* block 259 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,119,119, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, /* block 260 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, /* block 261 */ -523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, -523,523,523,523,523,523,523,523,523,523,523,523,523,523,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, -116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 262 */ -471, 23,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, -853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, -853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, -853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, -853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, -853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +577,577,577,577,577,577,577,577,577,577,577,577,577,577,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, /* block 263 */ -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, +502, 24,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927, +927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927, +927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927, +927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927, +927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927, +927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927, /* block 264 */ -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, /* block 265 */ -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, -471,471,471,471,471,471,471,471,471,471,471,471,471,471,471,471, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, /* block 266 */ -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597, -597,597,597,597,597,597,597,597,597,597,597,597,597,597,116,116, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502, + +/* block 267 */ +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,659,659, +659,659,659,659,659,659,659,659,659,659,659,659,659,659,119,119, }; diff --git a/thirdparty/pcre2/src/pcre2_ucp.h b/thirdparty/pcre2/src/pcre2_ucp.h index 0c330edcb2..483abd18fc 100644 --- a/thirdparty/pcre2/src/pcre2_ucp.h +++ b/thirdparty/pcre2/src/pcre2_ucp.h @@ -124,6 +124,7 @@ enum { /* These are the script identifications. */ enum { + ucp_Unknown, ucp_Arabic, ucp_Armenian, ucp_Bengali, diff --git a/thirdparty/pcre2/src/pcre2_xclass.c b/thirdparty/pcre2/src/pcre2_xclass.c index 407d3f5b87..8b052be66a 100644 --- a/thirdparty/pcre2/src/pcre2_xclass.c +++ b/thirdparty/pcre2/src/pcre2_xclass.c @@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge - New API code Copyright (c) 2016 University of Cambridge + New API code Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -85,10 +85,10 @@ if (c < 256) if ((*data & XCL_HASPROP) == 0) { if ((*data & XCL_MAP) == 0) return negated; - return (((uint8_t *)(data + 1))[c/8] & (1 << (c&7))) != 0; + return (((uint8_t *)(data + 1))[c/8] & (1u << (c&7))) != 0; } if ((*data & XCL_MAP) != 0 && - (((uint8_t *)(data + 1))[c/8] & (1 << (c&7))) != 0) + (((uint8_t *)(data + 1))[c/8] & (1u << (c&7))) != 0) return !negated; /* char found */ } diff --git a/thirdparty/pcre2/src/sljit/sljitConfigInternal.h b/thirdparty/pcre2/src/sljit/sljitConfigInternal.h index f5703e8e7f..ba60311e45 100644 --- a/thirdparty/pcre2/src/sljit/sljitConfigInternal.h +++ b/thirdparty/pcre2/src/sljit/sljitConfigInternal.h @@ -530,7 +530,7 @@ typedef double sljit_f64; #endif /* !SLJIT_FUNC */ #ifndef SLJIT_INDIRECT_CALL -#if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)) \ +#if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (!defined _CALL_ELF || _CALL_ELF == 1)) \ || ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX) /* It seems certain ppc compilers use an indirect addressing for functions which makes things complicated. */ diff --git a/thirdparty/pcre2/src/sljit/sljitExecAllocator.c b/thirdparty/pcre2/src/sljit/sljitExecAllocator.c index 7c18578618..3b37a9751f 100644 --- a/thirdparty/pcre2/src/sljit/sljitExecAllocator.c +++ b/thirdparty/pcre2/src/sljit/sljitExecAllocator.c @@ -94,6 +94,46 @@ static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size) #else +#ifdef __APPLE__ +/* Configures TARGET_OS_OSX when appropriate */ +#include <TargetConditionals.h> + +#if TARGET_OS_OSX && defined(MAP_JIT) +#include <sys/utsname.h> +#endif /* TARGET_OS_OSX && MAP_JIT */ + +#ifdef MAP_JIT + +static SLJIT_INLINE int get_map_jit_flag() +{ +#if TARGET_OS_OSX + /* On macOS systems, returns MAP_JIT if it is defined _and_ we're running on a version + of macOS where it's OK to have more than one JIT block. On non-macOS systems, returns + MAP_JIT if it is defined. */ + static int map_jit_flag = -1; + + /* The following code is thread safe because multiple initialization + sets map_jit_flag to the same value and the code has no side-effects. + Changing the kernel version witout system restart is (very) unlikely. */ + if (map_jit_flag == -1) { + struct utsname name; + + uname(&name); + + /* Kernel version for 10.14.0 (Mojave) */ + map_jit_flag = (atoi(name.release) >= 18) ? MAP_JIT : 0; + } + + return map_jit_flag; +#else /* !TARGET_OS_OSX */ + return MAP_JIT; +#endif /* TARGET_OS_OSX */ +} + +#endif /* MAP_JIT */ + +#endif /* __APPLE__ */ + static SLJIT_INLINE void* alloc_chunk(sljit_uw size) { void *retval; @@ -103,17 +143,17 @@ static SLJIT_INLINE void* alloc_chunk(sljit_uw size) int flags = MAP_PRIVATE | MAP_ANON; #ifdef MAP_JIT - flags |= MAP_JIT; + flags |= get_map_jit_flag(); #endif retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, flags, -1, 0); -#else +#else /* !MAP_ANON */ if (dev_zero < 0) { if (open_dev_zero()) return NULL; } retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, dev_zero, 0); -#endif +#endif /* MAP_ANON */ return (retval != MAP_FAILED) ? retval : NULL; } diff --git a/thirdparty/pcre2/src/sljit/sljitLir.c b/thirdparty/pcre2/src/sljit/sljitLir.c index 5bdddc10cf..ded9541b31 100644 --- a/thirdparty/pcre2/src/sljit/sljitLir.c +++ b/thirdparty/pcre2/src/sljit/sljitLir.c @@ -201,15 +201,16 @@ # define IS_CALL 0x010 # define IS_BIT26_COND 0x020 # define IS_BIT16_COND 0x040 +# define IS_BIT23_COND 0x080 -# define IS_COND (IS_BIT26_COND | IS_BIT16_COND) +# define IS_COND (IS_BIT26_COND | IS_BIT16_COND | IS_BIT23_COND) -# define PATCH_B 0x080 -# define PATCH_J 0x100 +# define PATCH_B 0x100 +# define PATCH_J 0x200 #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) -# define PATCH_ABS32 0x200 -# define PATCH_ABS48 0x400 +# define PATCH_ABS32 0x400 +# define PATCH_ABS48 0x800 #endif /* instruction types */ diff --git a/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c b/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c index 27af741487..b015695c52 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c @@ -51,7 +51,7 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { 0, 0, 1, 2, 3, 4, 5, 6, 7 }; -#define W_OP (1 << 31) +#define W_OP (1u << 31) #define RD(rd) (reg_map[rd]) #define RT(rt) (reg_map[rt]) #define RN(rn) (reg_map[rn] << 5) @@ -560,7 +560,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s /* dst must be register, TMP_REG1 arg1 must be register, TMP_REG1, imm arg2 must be register, TMP_REG2, imm */ - sljit_ins inv_bits = (flags & INT_OP) ? (1 << 31) : 0; + sljit_ins inv_bits = (flags & INT_OP) ? W_OP : 0; sljit_ins inst_bits; sljit_s32 op = (flags & 0xffff); sljit_s32 reg; @@ -710,7 +710,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(arg2)); case SLJIT_MOV_U8: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); - return push_inst(compiler, (UBFM ^ (1 << 31)) | RD(dst) | RN(arg2) | (7 << 10)); + return push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (7 << 10)); case SLJIT_MOV_S8: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); if (!(flags & INT_OP)) @@ -718,7 +718,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10)); case SLJIT_MOV_U16: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); - return push_inst(compiler, (UBFM ^ (1 << 31)) | RD(dst) | RN(arg2) | (15 << 10)); + return push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (15 << 10)); case SLJIT_MOV_S16: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); if (!(flags & INT_OP)) @@ -728,7 +728,7 @@ static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, s SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); if ((flags & INT_OP) && dst == arg2) return SLJIT_SUCCESS; - return push_inst(compiler, (ORR ^ (1 << 31)) | RD(dst) | RN(TMP_ZERO) | RM(arg2)); + return push_inst(compiler, (ORR ^ W_OP) | RD(dst) | RN(TMP_ZERO) | RM(arg2)); case SLJIT_MOV_S32: SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); if ((flags & INT_OP) && dst == arg2) @@ -1080,7 +1080,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *comp SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) { - sljit_ins inv_bits = (op & SLJIT_I32_OP) ? (1 << 31) : 0; + sljit_ins inv_bits = (op & SLJIT_I32_OP) ? W_OP : 0; CHECK_ERROR(); CHECK(check_sljit_emit_op0(compiler, op)); @@ -1360,7 +1360,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_comp sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0; if (GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) - inv_bits |= (1 << 31); + inv_bits |= W_OP; if (src & SLJIT_MEM) { emit_fop_mem(compiler, (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw); @@ -1382,7 +1382,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_comp sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0; if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) - inv_bits |= (1 << 31); + inv_bits |= W_OP; if (src & SLJIT_MEM) { emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? INT_SIZE : WORD_SIZE), TMP_REG1, src, srcw, TMP_REG1); @@ -1662,7 +1662,7 @@ static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compi sljit_s32 src, sljit_sw srcw) { struct sljit_jump *jump; - sljit_ins inv_bits = (type & SLJIT_I32_OP) ? (1 << 31) : 0; + sljit_ins inv_bits = (type & SLJIT_I32_OP) ? W_OP : 0; SLJIT_ASSERT((type & 0xff) == SLJIT_EQUAL || (type & 0xff) == SLJIT_NOT_EQUAL); ADJUST_LOCAL_OFFSET(src, srcw); @@ -1787,7 +1787,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil sljit_s32 dst_reg, sljit_s32 src, sljit_sw srcw) { - sljit_ins inv_bits = (dst_reg & SLJIT_I32_OP) ? (1 << 31) : 0; + sljit_ins inv_bits = (dst_reg & SLJIT_I32_OP) ? W_OP : 0; sljit_ins cc; CHECK_ERROR(); diff --git a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c index 094c9923bc..ad970bf25a 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c @@ -368,16 +368,21 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl SLJIT_ASSERT(!(flags & SRC2_IMM)); if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) { -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) || (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)); -#else +#else /* !SLJIT_MIPS_R1 && !SLJIT_MIPS_R6 */ FAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS)); return push_inst(compiler, MFLO | D(dst), DR(dst)); -#endif +#endif /* SLJIT_MIPS_R1 || SLJIT_MIPS_R6 */ } +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + FAIL_IF(push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst))); + FAIL_IF(push_inst(compiler, MUH | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); +#else /* !SLJIT_MIPS_R6 */ FAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS)); FAIL_IF(push_inst(compiler, MFHI | DA(EQUAL_FLAG), EQUAL_FLAG)); FAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst))); +#endif /* SLJIT_MIPS_R6 */ FAIL_IF(push_inst(compiler, SRA | T(dst) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG)); return push_inst(compiler, SUBU | SA(EQUAL_FLAG) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG); diff --git a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_64.c b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_64.c index f841aef5dd..a6a2bcc0c9 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_64.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_64.c @@ -459,19 +459,26 @@ static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sl SLJIT_ASSERT(!(flags & SRC2_IMM)); if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) { -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + return push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst)); +#elif (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) if (op & SLJIT_I32_OP) return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)); FAIL_IF(push_inst(compiler, DMULT | S(src1) | T(src2), MOVABLE_INS)); return push_inst(compiler, MFLO | D(dst), DR(dst)); -#else +#else /* !SLJIT_MIPS_R6 && !SLJIT_MIPS_R1 */ FAIL_IF(push_inst(compiler, SELECT_OP(DMULT, MULT) | S(src1) | T(src2), MOVABLE_INS)); return push_inst(compiler, MFLO | D(dst), DR(dst)); -#endif +#endif /* SLJIT_MIPS_R6 */ } +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + FAIL_IF(push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst))); + FAIL_IF(push_inst(compiler, SELECT_OP(DMUH, MUH) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); +#else /* !SLJIT_MIPS_R6 */ FAIL_IF(push_inst(compiler, SELECT_OP(DMULT, MULT) | S(src1) | T(src2), MOVABLE_INS)); FAIL_IF(push_inst(compiler, MFHI | DA(EQUAL_FLAG), EQUAL_FLAG)); FAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst))); +#endif /* SLJIT_MIPS_R6 */ FAIL_IF(push_inst(compiler, SELECT_OP(DSRA32, SRA) | T(dst) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG)); return push_inst(compiler, SELECT_OP(DSUBU, SUBU) | SA(EQUAL_FLAG) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG); diff --git a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c index 894e21304b..e0d6a3f085 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c @@ -27,17 +27,31 @@ /* Latest MIPS architecture. */ /* Automatically detect SLJIT_MIPS_R1 */ +#if (defined __mips_isa_rev) && (__mips_isa_rev >= 6) +#define SLJIT_MIPS_R6 1 +#endif + SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) { -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + return "MIPS32-R6" SLJIT_CPUINFO; +#else /* !SLJIT_CONFIG_MIPS_32 */ + return "MIPS64-R6" SLJIT_CPUINFO; +#endif /* SLJIT_CONFIG_MIPS_32 */ + +#elif (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) return "MIPS32-R1" SLJIT_CPUINFO; -#else +#else /* !SLJIT_CONFIG_MIPS_32 */ return "MIPS64-R1" SLJIT_CPUINFO; -#endif +#endif /* SLJIT_CONFIG_MIPS_32 */ + #else /* SLJIT_MIPS_R1 */ return "MIPS III" SLJIT_CPUINFO; -#endif +#endif /* SLJIT_MIPS_R6 */ } /* Length of an instruction word @@ -62,6 +76,7 @@ typedef sljit_u32 sljit_ins; #define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) #define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) +#define TMP_FREG3 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3) static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { 0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 4, 25, 31 @@ -69,14 +84,14 @@ static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) -static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { - 0, 0, 14, 2, 4, 6, 8, 12, 10 +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { + 0, 0, 14, 2, 4, 6, 8, 12, 10, 16 }; #else -static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { - 0, 0, 13, 14, 15, 16, 17, 12, 18 +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { + 0, 0, 13, 14, 15, 16, 17, 12, 18, 10 }; #endif @@ -102,6 +117,11 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define FR(dr) (freg_map[dr]) #define HI(opcode) ((opcode) << 26) #define LO(opcode) (opcode) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +/* CMP.cond.fmt */ +/* S = (20 << 21) D = (21 << 21) */ +#define CMP_FMT_S (20 << 21) +#endif /* SLJIT_MIPS_R6 */ /* S = (16 << 21) D = (17 << 21) */ #define FMT_S (16 << 21) #define FMT_D (17 << 21) @@ -114,8 +134,13 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define ANDI (HI(12)) #define B (HI(4)) #define BAL (HI(1) | (17 << 16)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define BC1EQZ (HI(17) | (9 << 21) | FT(TMP_FREG3)) +#define BC1NEZ (HI(17) | (13 << 21) | FT(TMP_FREG3)) +#else /* !SLJIT_MIPS_R6 */ #define BC1F (HI(17) | (8 << 21)) #define BC1T (HI(17) | (8 << 21) | (1 << 16)) +#endif /* SLJIT_MIPS_R6 */ #define BEQ (HI(4)) #define BGEZ (HI(1) | (1 << 16)) #define BGTZ (HI(7)) @@ -124,20 +149,42 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define BNE (HI(5)) #define BREAK (HI(0) | LO(13)) #define CFC1 (HI(17) | (2 << 21)) -#define C_UN_S (HI(17) | FMT_S | LO(49)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define C_UEQ_S (HI(17) | CMP_FMT_S | LO(3)) +#define C_ULE_S (HI(17) | CMP_FMT_S | LO(7)) +#define C_ULT_S (HI(17) | CMP_FMT_S | LO(5)) +#define C_UN_S (HI(17) | CMP_FMT_S | LO(1)) +#define C_FD (FD(TMP_FREG3)) +#else /* !SLJIT_MIPS_R6 */ #define C_UEQ_S (HI(17) | FMT_S | LO(51)) #define C_ULE_S (HI(17) | FMT_S | LO(55)) #define C_ULT_S (HI(17) | FMT_S | LO(53)) +#define C_UN_S (HI(17) | FMT_S | LO(49)) +#define C_FD (0) +#endif /* SLJIT_MIPS_R6 */ #define CVT_S_S (HI(17) | FMT_S | LO(32)) #define DADDIU (HI(25)) #define DADDU (HI(0) | LO(45)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define DDIV (HI(0) | (2 << 6) | LO(30)) +#define DDIVU (HI(0) | (2 << 6) | LO(31)) +#define DMOD (HI(0) | (3 << 6) | LO(30)) +#define DMODU (HI(0) | (3 << 6) | LO(31)) +#define DIV (HI(0) | (2 << 6) | LO(26)) +#define DIVU (HI(0) | (2 << 6) | LO(27)) +#define DMUH (HI(0) | (3 << 6) | LO(28)) +#define DMUHU (HI(0) | (3 << 6) | LO(29)) +#define DMUL (HI(0) | (2 << 6) | LO(28)) +#define DMULU (HI(0) | (2 << 6) | LO(29)) +#else /* !SLJIT_MIPS_R6 */ #define DDIV (HI(0) | LO(30)) #define DDIVU (HI(0) | LO(31)) #define DIV (HI(0) | LO(26)) #define DIVU (HI(0) | LO(27)) -#define DIV_S (HI(17) | FMT_S | LO(3)) #define DMULT (HI(0) | LO(28)) #define DMULTU (HI(0) | LO(29)) +#endif /* SLJIT_MIPS_R6 */ +#define DIV_S (HI(17) | FMT_S | LO(3)) #define DSLL (HI(0) | LO(56)) #define DSLL32 (HI(0) | LO(60)) #define DSLLV (HI(0) | LO(20)) @@ -151,18 +198,34 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define J (HI(2)) #define JAL (HI(3)) #define JALR (HI(0) | LO(9)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define JR (HI(0) | LO(9)) +#else /* !SLJIT_MIPS_R6 */ #define JR (HI(0) | LO(8)) +#endif /* SLJIT_MIPS_R6 */ #define LD (HI(55)) #define LUI (HI(15)) #define LW (HI(35)) #define MFC1 (HI(17)) +#if !(defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) #define MFHI (HI(0) | LO(16)) #define MFLO (HI(0) | LO(18)) +#else /* SLJIT_MIPS_R6 */ +#define MOD (HI(0) | (3 << 6) | LO(26)) +#define MODU (HI(0) | (3 << 6) | LO(27)) +#endif /* !SLJIT_MIPS_R6 */ #define MOV_S (HI(17) | FMT_S | LO(6)) #define MTC1 (HI(17) | (4 << 21)) -#define MUL_S (HI(17) | FMT_S | LO(2)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define MUH (HI(0) | (3 << 6) | LO(24)) +#define MUHU (HI(0) | (3 << 6) | LO(25)) +#define MUL (HI(0) | (2 << 6) | LO(24)) +#define MULU (HI(0) | (2 << 6) | LO(25)) +#else /* !SLJIT_MIPS_R6 */ #define MULT (HI(0) | LO(24)) #define MULTU (HI(0) | LO(25)) +#endif /* SLJIT_MIPS_R6 */ +#define MUL_S (HI(17) | FMT_S | LO(2)) #define NEG_S (HI(17) | FMT_S | LO(7)) #define NOP (HI(0) | LO(0)) #define NOR (HI(0) | LO(39)) @@ -188,14 +251,18 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define XOR (HI(0) | LO(38)) #define XORI (HI(14)) -#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) || (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) #define CLZ (HI(28) | LO(32)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define DCLZ (LO(18)) +#else /* !SLJIT_MIPS_R6 */ #define DCLZ (HI(28) | LO(36)) #define MOVF (HI(0) | (0 << 16) | LO(1)) #define MOVN (HI(0) | LO(11)) #define MOVT (HI(0) | (1 << 16) | LO(1)) #define MOVZ (HI(0) | LO(10)) #define MUL (HI(28) | LO(2)) +#endif /* SLJIT_MIPS_R6 */ #define PREF (HI(51)) #define PREFX (HI(19) | LO(15)) #define SEB (HI(31) | (16 << 6) | LO(32)) @@ -234,7 +301,13 @@ static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit static SLJIT_INLINE sljit_ins invert_branch(sljit_s32 flags) { - return (flags & IS_BIT26_COND) ? (1 << 26) : (1 << 16); + if (flags & IS_BIT26_COND) + return (1 << 26); +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + if (flags & IS_BIT23_COND) + return (1 << 23); +#endif /* SLJIT_MIPS_R6 */ + return (1 << 16); } static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) @@ -1075,34 +1148,62 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compile return push_inst(compiler, NOP, UNMOVABLE_INS); case SLJIT_LMUL_UW: case SLJIT_LMUL_SW: +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULU : DMUL) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMUHU : DMUH) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); +#else /* !SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? MULU : MUL) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? MUHU : MUH) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); +#endif /* SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | TA(0) | D(SLJIT_R0), DR(SLJIT_R0))); + return push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_R1), DR(SLJIT_R1)); +#else /* !SLJIT_MIPS_R6 */ #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); -#else +#else /* !SLJIT_CONFIG_MIPS_64 */ FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? MULTU : MULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); -#endif +#endif /* SLJIT_CONFIG_MIPS_64 */ FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0))); return push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1)); +#endif /* SLJIT_MIPS_R6 */ case SLJIT_DIVMOD_UW: case SLJIT_DIVMOD_SW: case SLJIT_DIV_UW: case SLJIT_DIV_SW: SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments); +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (int_op) { + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? MODU : MOD) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); + } + else { + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DMODU : DMOD) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); + } +#else /* !SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? MODU : MOD) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); +#endif /* SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | TA(0) | D(SLJIT_R0), DR(SLJIT_R0))); + return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_R1), DR(SLJIT_R1)); +#else /* !SLJIT_MIPS_R6 */ #if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); -#endif - +#endif /* !SLJIT_MIPS_R1 */ #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) if (int_op) FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); else FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); -#else +#else /* !SLJIT_CONFIG_MIPS_64 */ FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); -#endif - +#endif /* SLJIT_CONFIG_MIPS_64 */ FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0))); return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1)); +#endif /* SLJIT_MIPS_R6 */ } return SLJIT_SUCCESS; @@ -1408,8 +1509,7 @@ static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compile inst = C_UN_S; break; } - - return push_inst(compiler, inst | FMT(op) | FT(src2) | FS(src1), UNMOVABLE_INS); + return push_inst(compiler, inst | FMT(op) | FT(src2) | FS(src1) | C_FD, UNMOVABLE_INS); } SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, @@ -1608,16 +1708,30 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi flags = IS_BIT26_COND; \ delay_check = src; +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + +#define BR_T() \ + inst = BC1NEZ; \ + flags = IS_BIT23_COND; \ + delay_check = FCSR_FCC; +#define BR_F() \ + inst = BC1EQZ; \ + flags = IS_BIT23_COND; \ + delay_check = FCSR_FCC; + +#else /* !SLJIT_MIPS_R6 */ + #define BR_T() \ inst = BC1T | JUMP_LENGTH; \ flags = IS_BIT16_COND; \ delay_check = FCSR_FCC; - #define BR_F() \ inst = BC1F | JUMP_LENGTH; \ flags = IS_BIT16_COND; \ delay_check = FCSR_FCC; +#endif /* SLJIT_MIPS_R6 */ + SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) { struct sljit_jump *jump; @@ -1927,7 +2041,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co case SLJIT_GREATER_EQUAL_F64: case SLJIT_UNORDERED_F64: case SLJIT_ORDERED_F64: +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + FAIL_IF(push_inst(compiler, MFC1 | TA(dst_ar) | FS(TMP_FREG3), dst_ar)); +#else /* !SLJIT_MIPS_R6 */ FAIL_IF(push_inst(compiler, CFC1 | TA(dst_ar) | DA(FCSR_REG), dst_ar)); +#endif /* SLJIT_MIPS_R6 */ FAIL_IF(push_inst(compiler, SRL | TA(dst_ar) | DA(dst_ar) | SH_IMM(23), dst_ar)); FAIL_IF(push_inst(compiler, ANDI | SA(dst_ar) | TA(dst_ar) | IMM(1), dst_ar)); src_ar = dst_ar; diff --git a/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c b/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c index 5ef4ac96c4..b34e3965ed 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c +++ b/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c @@ -42,7 +42,7 @@ typedef sljit_u32 sljit_ins; #include <sys/cache.h> #endif -#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) +#if (defined _CALL_ELF && _CALL_ELF == 2) #define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1 #endif diff --git a/thirdparty/tinyexr/tinyexr.h b/thirdparty/tinyexr/tinyexr.h index 3c19391850..f22163738f 100644 --- a/thirdparty/tinyexr/tinyexr.h +++ b/thirdparty/tinyexr/tinyexr.h @@ -1,5 +1,5 @@ /* -Copyright (c) 2014 - 2018, Syoyo Fujita and many contributors. +Copyright (c) 2014 - 2019, Syoyo Fujita and many contributors. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -276,7 +276,8 @@ extern int LoadEXR(float **out_rgba, int *width, int *height, // @deprecated { to be removed. } // Simple wrapper API for ParseEXRHeaderFromFile. // checking given file is a EXR file(by just look up header) -// @return TINYEXR_SUCCEES for EXR image, TINYEXR_ERROR_INVALID_HEADER for others +// @return TINYEXR_SUCCEES for EXR image, TINYEXR_ERROR_INVALID_HEADER for +// others extern int IsEXR(const char *filename); // @deprecated { to be removed. } @@ -469,9 +470,10 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height, #include <cstdio> #include <cstdlib> #include <cstring> -#include <iostream> #include <sstream> +//#include <iostream> // debug + #include <limits> #include <string> #include <vector> @@ -2537,10 +2539,10 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf; - const mz_uint8 *pIn_buf_cur = pIn_buf_next, - *const pIn_buf_end = pIn_buf_next + *pIn_buf_size; - mz_uint8 *pOut_buf_cur = pOut_buf_next, - *const pOut_buf_end = pOut_buf_next + *pOut_buf_size; + const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = + pIn_buf_next + *pIn_buf_size; + mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = + pOut_buf_next + *pOut_buf_size; size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 @@ -2957,8 +2959,9 @@ void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, tinfl_status status = tinfl_decompress( &decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL, - &dst_buf_size, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | - TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + &dst_buf_size, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) { MZ_FREE(pBuf); *pOut_len = 0; @@ -3011,9 +3014,8 @@ int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, - (flags & - ~(TINFL_FLAG_HAS_MORE_INPUT | - TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); + (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); in_buf_ofs += in_buf_size; if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) @@ -3138,7 +3140,9 @@ static const mz_uint8 s_tdefl_large_dist_extra[128] = { // Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted // values. -typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq; +typedef struct { + mz_uint16 m_key, m_sym_index; +} tdefl_sym_freq; static tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq *pSyms0, tdefl_sym_freq *pSyms1) { @@ -5282,9 +5286,10 @@ mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); pStat->m_comment_size = n; - memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + - MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + - MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), + memcpy(pStat->m_comment, + p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\0'; @@ -7008,6 +7013,11 @@ static void swap2(unsigned short *val) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-function" #endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif static void cpy4(int *dst_val, const int *src_val) { unsigned char *dst = reinterpret_cast<unsigned char *>(dst_val); const unsigned char *src = reinterpret_cast<const unsigned char *>(src_val); @@ -7037,11 +7047,14 @@ static void cpy4(float *dst_val, const float *src_val) { dst[2] = src[2]; dst[3] = src[3]; } - #ifdef __clang__ #pragma clang diagnostic pop #endif +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + static void swap4(unsigned int *val) { #ifdef MINIZ_LITTLE_ENDIAN (void)val; @@ -7696,7 +7709,8 @@ static int rleUncompress(int inLength, int maxLength, const signed char in[], int count = -(static_cast<int>(*in++)); inLength -= count + 1; - if (0 > (maxLength -= count)) return 0; + // Fixes #116: Add bounds check to in buffer. + if ((0 > (maxLength -= count)) || (inLength < 0)) return 0; memcpy(out, in, count); out += count; @@ -7790,13 +7804,19 @@ static void CompressRle(unsigned char *dst, } } -static void DecompressRle(unsigned char *dst, +static bool DecompressRle(unsigned char *dst, const unsigned long uncompressed_size, const unsigned char *src, unsigned long src_size) { if (uncompressed_size == src_size) { // Data is not compressed(Issue 40). memcpy(dst, src, src_size); - return; + return true; + } + + // Workaround for issue #112. + // TODO(syoyo): Add more robust out-of-bounds check in `rleUncompress`. + if (src_size <= 2) { + return false; } std::vector<unsigned char> tmpBuf(uncompressed_size); @@ -7805,8 +7825,9 @@ static void DecompressRle(unsigned char *dst, static_cast<int>(uncompressed_size), reinterpret_cast<const signed char *>(src), reinterpret_cast<char *>(&tmpBuf.at(0))); - assert(ret == static_cast<int>(uncompressed_size)); - (void)ret; + if (ret != static_cast<int>(uncompressed_size)) { + return false; + } // // Apply EXR-specific? postprocess. Grabbed from OpenEXR's @@ -7845,6 +7866,8 @@ static void DecompressRle(unsigned char *dst, break; } } + + return true; } #if TINYEXR_USE_PIZ @@ -8556,7 +8579,7 @@ static bool hufUnpackEncTable( int lc = 0; for (; im <= iM; im++) { - if (p - *pcode > ni) { + if (p - *pcode >= ni) { return false; } @@ -8854,7 +8877,7 @@ static bool getCode(int po, int rlc, long long &c, int &lc, const char *&in, if (out + cs > oe) return false; // Bounds check for safety - // Issue 100. + // Issue 100. if ((out - 1) < ob) return false; unsigned short s = out[-1]; @@ -9348,6 +9371,10 @@ static bool DecompressPiz(unsigned char *outPtr, const unsigned char *inPtr, tinyexr::cpy4(&length, reinterpret_cast<const int *>(ptr)); ptr += sizeof(int); + if (size_t((ptr - inPtr) + length) > inLen) { + return false; + } + std::vector<unsigned short> tmpBuffer(tmpBufSize); hufUncompress(reinterpret_cast<const char *>(ptr), length, &tmpBuffer); @@ -9642,8 +9669,9 @@ static bool DecodePixelData(/* out */ unsigned char **out_images, reinterpret_cast<unsigned char *>(&outBuf.at(0)), data_ptr, tmpBufLen, data_len, static_cast<int>(num_channels), channels, width, num_lines); - assert(ret); - (void)ret; + if (!ret) { + return false; + } // For PIZ_COMPRESSION: // pixel sample data for channel 0 for scanline 0 @@ -9688,16 +9716,18 @@ static bool DecodePixelData(/* out */ unsigned char **out_images, } else { // HALF -> FLOAT FP32 f32 = half_to_float(hf); float *image = reinterpret_cast<float **>(out_images)[c]; + size_t offset = 0; if (line_order == 0) { - image += (static_cast<size_t>(line_no) + v) * + offset = (static_cast<size_t>(line_no) + v) * static_cast<size_t>(x_stride) + u; } else { - image += static_cast<size_t>( + offset = static_cast<size_t>( (height - 1 - (line_no + static_cast<int>(v)))) * static_cast<size_t>(x_stride) + u; } + image += offset; *image = f32.f; } } @@ -9824,16 +9854,19 @@ static bool DecodePixelData(/* out */ unsigned char **out_images, } else { // HALF -> FLOAT tinyexr::FP32 f32 = half_to_float(hf); float *image = reinterpret_cast<float **>(out_images)[c]; + size_t offset = 0; if (line_order == 0) { - image += (static_cast<size_t>(line_no) + v) * + offset = (static_cast<size_t>(line_no) + v) * static_cast<size_t>(x_stride) + u; } else { - image += (static_cast<size_t>(height) - 1U - + offset = (static_cast<size_t>(height) - 1U - (static_cast<size_t>(line_no) + v)) * static_cast<size_t>(x_stride) + u; } + image += offset; + *image = f32.f; } } @@ -9906,10 +9939,15 @@ static bool DecodePixelData(/* out */ unsigned char **out_images, pixel_data_size); unsigned long dstLen = static_cast<unsigned long>(outBuf.size()); - assert(dstLen > 0); - tinyexr::DecompressRle(reinterpret_cast<unsigned char *>(&outBuf.at(0)), + if (dstLen == 0) { + return false; + } + + if (!tinyexr::DecompressRle(reinterpret_cast<unsigned char *>(&outBuf.at(0)), dstLen, data_ptr, - static_cast<unsigned long>(data_len)); + static_cast<unsigned long>(data_len))) { + return false; + } // For RLE_COMPRESSION: // pixel sample data for channel 0 for scanline 0 @@ -10739,12 +10777,28 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, if ((data_width < 0) || (data_height < 0)) { if (err) { std::stringstream ss; - ss << "Invalid data width or data height: " << data_width << ", " << data_height << std::endl; + ss << "Invalid data width or data height: " << data_width << ", " + << data_height << std::endl; (*err) += ss.str(); } return TINYEXR_ERROR_INVALID_DATA; } + // Do not allow too large data_width and data_height. header invalid? + { + const int threshold = 1024 * 8192; // heuristics + if ((data_width > threshold) || (data_height > threshold)) { + if (err) { + std::stringstream ss; + ss << "data_with or data_height too large. data_width: " << data_width + << ", " + << "data_height = " << data_height << std::endl; + (*err) += ss.str(); + } + return TINYEXR_ERROR_INVALID_DATA; + } + } + size_t num_blocks = offsets.size(); std::vector<size_t> channel_offset_list; @@ -10762,6 +10816,25 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, bool invalid_data = false; // TODO(LTE): Use atomic lock for MT safety. if (exr_header->tiled) { + // value check + if (exr_header->tile_size_x < 0) { + if (err) { + std::stringstream ss; + ss << "Invalid tile size x : " << exr_header->tile_size_x << "\n"; + (*err) += ss.str(); + } + return TINYEXR_ERROR_INVALID_HEADER; + } + + if (exr_header->tile_size_y < 0) { + if (err) { + std::stringstream ss; + ss << "Invalid tile size y : " << exr_header->tile_size_y << "\n"; + (*err) += ss.str(); + } + return TINYEXR_ERROR_INVALID_HEADER; + } + size_t num_tiles = offsets.size(); // = # of blocks exr_image->tiles = static_cast<EXRTile *>( @@ -10840,12 +10913,17 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, } } else { // scanline format - // Don't allow too large image(256GB * pixel_data_size or more). Workaround for #104. - size_t data_len = size_t(data_width) * size_t(data_height) * size_t(num_channels); - if ((data_len == 0) || (data_len >= 0x4000000000)) { + // Don't allow too large image(256GB * pixel_data_size or more). Workaround + // for #104. + size_t total_data_len = + size_t(data_width) * size_t(data_height) * size_t(num_channels); + const bool total_data_len_overflown = sizeof(void*) == 8 ? (total_data_len >= 0x4000000000) : false; + if ((total_data_len == 0) || total_data_len_overflown ) { if (err) { std::stringstream ss; - ss << "Image data size is zero or too large: width = " << data_width << ", height = " << data_height << ", channels = " << num_channels << std::endl; + ss << "Image data size is zero or too large: width = " << data_width + << ", height = " << data_height << ", channels = " << num_channels + << std::endl; (*err) += ss.str(); } return TINYEXR_ERROR_INVALID_DATA; @@ -10880,12 +10958,21 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, if (size_t(data_len) > data_size) { invalid_data = true; + + } else if ((line_no > (2 << 20)) || (line_no < -(2 << 20))) { + // Too large value. Assume this is invalid + // 2**20 = 1048576 = heuristic value. + invalid_data = true; + } else if (data_len == 0) { + // TODO(syoyo): May be ok to raise the threshold for example `data_len + // < 4` + invalid_data = true; } else { + // line_no may be negative. int end_line_no = (std::min)(line_no + num_scanline_blocks, (exr_header->data_window[3] + 1)); int num_lines = end_line_no - line_no; - // assert(num_lines > 0); if (num_lines <= 0) { invalid_data = true; @@ -10894,7 +10981,16 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, data_ptr += 8; // Adjust line_no with data_window.bmin.y - line_no -= exr_header->data_window[1]; + + // overflow check + tinyexr_int64 lno = static_cast<tinyexr_int64>(line_no) - static_cast<tinyexr_int64>(exr_header->data_window[1]); + if (lno > std::numeric_limits<int>::max()) { + line_no = -1; // invalid + } else if (lno < -std::numeric_limits<int>::max()) { + line_no = -1; // invalid + } else { + line_no -= exr_header->data_window[1]; + } if (line_no < 0) { invalid_data = true; @@ -10919,6 +11015,10 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, } if (invalid_data) { + if (err) { + std::stringstream ss; + (*err) += "Invalid data found when decoding pixels.\n"; + } return TINYEXR_ERROR_INVALID_DATA; } @@ -10995,7 +11095,7 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header, int data_width = exr_header->data_window[2] - exr_header->data_window[0]; if (data_width >= std::numeric_limits<int>::max()) { // Issue 63 - tinyexr::SetErrorMessage("Invalid data window value", err); + tinyexr::SetErrorMessage("Invalid data width value", err); return TINYEXR_ERROR_INVALID_DATA; } data_width++; @@ -11008,10 +11108,23 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header, data_height++; if ((data_width < 0) || (data_height < 0)) { - tinyexr::SetErrorMessage("data window or data height is negative.", err); + tinyexr::SetErrorMessage("data width or data height is negative.", err); return TINYEXR_ERROR_INVALID_DATA; } + // Do not allow too large data_width and data_height. header invalid? + { + const int threshold = 1024 * 8192; // heuristics + if (data_width > threshold) { + tinyexr::SetErrorMessage("data width too large.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + if (data_height > threshold) { + tinyexr::SetErrorMessage("data height too large.", err); + return TINYEXR_ERROR_INVALID_DATA; + } + } + // Read offset tables. size_t num_blocks = 0; @@ -11190,7 +11303,6 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, static_cast<size_t>(exr_image.height))); if (exr_header.tiled) { - for (int it = 0; it < exr_image.num_tiles; it++) { for (int j = 0; j < exr_header.tile_size_y; j++) { for (int i = 0; i < exr_header.tile_size_x; i++) { @@ -11325,7 +11437,7 @@ int IsEXR(const char *filename) { if (ret != TINYEXR_SUCCESS) { return TINYEXR_ERROR_INVALID_HEADER; } - + return TINYEXR_SUCCESS; } @@ -11434,7 +11546,6 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height, static_cast<size_t>(exr_image.height))); if (exr_header.tiled) { - for (int it = 0; it < exr_image.num_tiles; it++) { for (int j = 0; j < exr_header.tile_size_y; j++) { for (int i = 0; i < exr_header.tile_size_x; i++) { @@ -12115,7 +12226,7 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image, sizeof(tinyexr::tinyexr_uint64) * static_cast<size_t>(num_blocks)); } - if ( memory.size() == 0 ) { + if (memory.size() == 0) { tinyexr::SetErrorMessage("Output memory size is zero", err); return 0; } @@ -12286,6 +12397,9 @@ int LoadDeepEXR(DeepImage *deep_image, const char *filename, const char **err) { size_t marker_size; if (!tinyexr::ReadAttribute(&attr_name, &attr_type, &data, &marker_size, marker, size)) { + std::stringstream ss; + ss << "Failed to parse attribute\n"; + tinyexr::SetErrorMessage(ss.str(), err); return TINYEXR_ERROR_INVALID_DATA; } marker += marker_size; diff --git a/thirdparty/xatlas/xatlas.cpp b/thirdparty/xatlas/xatlas.cpp index 2cc2905eee..1b30305cd4 100644 --- a/thirdparty/xatlas/xatlas.cpp +++ b/thirdparty/xatlas/xatlas.cpp @@ -1,128 +1,443 @@ -// This code is in the public domain -- castanyo@yahoo.es +/* +MIT License + +Copyright (c) 2018-2019 Jonathan Young + +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. +*/ +/* +thekla_atlas +https://github.com/Thekla/thekla_atlas +MIT License +Copyright (c) 2013 Thekla, Inc +Copyright NVIDIA Corporation 2006 -- Ignacio Castano <icastano@nvidia.com> + +Fast-BVH +https://github.com/brandonpelfrey/Fast-BVH +MIT License +Copyright (c) 2012 Brandon Pelfrey +*/ #include <algorithm> -#include <cmath> -#include <memory> -#include <unordered_map> -#include <vector> +#include <atomic> +#include <condition_variable> +#include <mutex> +#include <thread> #include <assert.h> -#include <float.h> +#include <float.h> // FLT_MAX +#include <limits.h> #include <math.h> -#include <stdarg.h> +#define __STDC_LIMIT_MACROS #include <stdint.h> #include <stdio.h> #include <string.h> -#include <time.h> #include "xatlas.h" -#undef min -#undef max +#ifndef XA_DEBUG +#ifdef NDEBUG +#define XA_DEBUG 0 +#else +#define XA_DEBUG 1 +#endif +#endif -#ifndef xaAssert -#define xaAssert(exp) if (!(exp)) { xaPrint("%s %s %s\n", #exp, __FILE__, __LINE__); } +#ifndef XA_PROFILE +#define XA_PROFILE 0 #endif -#ifndef xaDebugAssert -#define xaDebugAssert(exp) assert(exp) +#if XA_PROFILE +#include <time.h> #endif -#ifndef xaPrint -#define xaPrint(...) if (xatlas::internal::s_print) { xatlas::internal::s_print(__VA_ARGS__); } + +#ifndef XA_MULTITHREADED +#define XA_MULTITHREADED 1 #endif -#ifdef _MSC_VER -// Ignore gcc attributes. -#define __attribute__(X) +#define XA_STR(x) #x +#define XA_XSTR(x) XA_STR(x) + +#ifndef XA_ASSERT +#define XA_ASSERT(exp) if (!(exp)) { XA_PRINT_WARNING("\rASSERT: %s %s %d\n", XA_XSTR(exp), __FILE__, __LINE__); } #endif -#ifdef _MSC_VER -#define restrict -#define NV_FORCEINLINE __forceinline -#else -#define restrict __restrict__ -#define NV_FORCEINLINE __attribute__((always_inline)) inline +#ifndef XA_DEBUG_ASSERT +#define XA_DEBUG_ASSERT(exp) assert(exp) #endif -#define NV_UINT32_MAX 0xffffffff -#define NV_FLOAT_MAX 3.402823466e+38F +#ifndef XA_PRINT +#define XA_PRINT(...) \ + if (xatlas::internal::s_print && xatlas::internal::s_printVerbose) \ + xatlas::internal::s_print(__VA_ARGS__); +#endif -#ifndef PI -#define PI float(3.1415926535897932384626433833) +#ifndef XA_PRINT_WARNING +#define XA_PRINT_WARNING(...) \ + if (xatlas::internal::s_print) \ + xatlas::internal::s_print(__VA_ARGS__); #endif -#define NV_EPSILON (0.0001f) -#define NV_NORMAL_EPSILON (0.001f) +#define XA_ALLOC(tag, type) (type *)internal::Realloc(nullptr, sizeof(type), tag, __FILE__, __LINE__) +#define XA_ALLOC_ARRAY(tag, type, num) (type *)internal::Realloc(nullptr, sizeof(type) * num, tag, __FILE__, __LINE__) +#define XA_REALLOC(tag, ptr, type, num) (type *)internal::Realloc(ptr, sizeof(type) * num, tag, __FILE__, __LINE__) +#define XA_FREE(ptr) internal::Realloc(ptr, 0, internal::MemTag::Default, __FILE__, __LINE__) +#define XA_NEW(tag, type, ...) new (XA_ALLOC(tag, type)) type(__VA_ARGS__) + +#define XA_UNUSED(a) ((void)(a)) + +#define XA_GROW_CHARTS_COPLANAR 1 +#define XA_MERGE_CHARTS 1 +#define XA_MERGE_CHARTS_MIN_NORMAL_DEVIATION 0.5f +#define XA_RECOMPUTE_CHARTS 1 +#define XA_CLOSE_HOLES_CHECK_EDGE_INTERSECTION 0 + +#define XA_DEBUG_HEAP 0 +#define XA_DEBUG_SINGLE_CHART 0 +#define XA_DEBUG_EXPORT_ATLAS_IMAGES 0 +#define XA_DEBUG_EXPORT_OBJ_SOURCE_MESHES 0 +#define XA_DEBUG_EXPORT_OBJ_CHART_GROUPS 0 +#define XA_DEBUG_EXPORT_OBJ_CHARTS 0 +#define XA_DEBUG_EXPORT_OBJ_BEFORE_FIX_TJUNCTION 0 +#define XA_DEBUG_EXPORT_OBJ_CLOSE_HOLES_ERROR 0 +#define XA_DEBUG_EXPORT_OBJ_NOT_DISK 0 +#define XA_DEBUG_EXPORT_OBJ_CHARTS_AFTER_PARAMETERIZATION 0 +#define XA_DEBUG_EXPORT_OBJ_INVALID_PARAMETERIZATION 0 +#define XA_DEBUG_EXPORT_OBJ_RECOMPUTED_CHARTS 0 + +#define XA_DEBUG_EXPORT_OBJ (0 \ + || XA_DEBUG_EXPORT_OBJ_SOURCE_MESHES \ + || XA_DEBUG_EXPORT_OBJ_CHART_GROUPS \ + || XA_DEBUG_EXPORT_OBJ_CHARTS \ + || XA_DEBUG_EXPORT_OBJ_BEFORE_FIX_TJUNCTION \ + || XA_DEBUG_EXPORT_OBJ_CLOSE_HOLES_ERROR \ + || XA_DEBUG_EXPORT_OBJ_NOT_DISK \ + || XA_DEBUG_EXPORT_OBJ_CHARTS_AFTER_PARAMETERIZATION \ + || XA_DEBUG_EXPORT_OBJ_INVALID_PARAMETERIZATION \ + || XA_DEBUG_EXPORT_OBJ_RECOMPUTED_CHARTS) + +#ifdef _MSC_VER +#define XA_FOPEN(_file, _filename, _mode) { if (fopen_s(&_file, _filename, _mode) != 0) _file = NULL; } +#define XA_SPRINTF(_buffer, _size, _format, ...) sprintf_s(_buffer, _size, _format, __VA_ARGS__) +#else +#define XA_FOPEN(_file, _filename, _mode) _file = fopen(_filename, _mode) +#define XA_SPRINTF(_buffer, _size, _format, ...) sprintf(_buffer, _format, __VA_ARGS__) +#endif namespace xatlas { namespace internal { -static PrintFunc s_print = NULL; +static ReallocFunc s_realloc = realloc; +static PrintFunc s_print = printf; +static bool s_printVerbose = false; + +struct MemTag +{ + enum + { + Default, + Mesh, + MeshBoundaries, + MeshColocals, + MeshEdgeMap, + MeshIndices, + MeshNormals, + MeshPositions, + MeshTexcoords, + Count + }; +}; + +#if XA_DEBUG_HEAP +struct AllocHeader +{ + size_t size; + const char *file; + int line; + int tag; + AllocHeader *prev, *next; + bool free; +}; + +static std::mutex s_allocMutex; +static AllocHeader *s_allocRoot = nullptr; +static size_t s_allocTotalSize = 0, s_allocPeakSize = 0, s_allocTotalTagSize[MemTag::Count] = { 0 }, s_allocPeakTagSize[MemTag::Count] = { 0 }; +static constexpr uint32_t kAllocRedzone = 0x12345678; + +static void *Realloc(void *ptr, size_t size, int tag, const char *file, int line) +{ + std::unique_lock<std::mutex> lock(s_allocMutex); + if (!size && !ptr) + return nullptr; + uint8_t *realPtr = nullptr; + AllocHeader *header = nullptr; + if (ptr) { + realPtr = ((uint8_t *)ptr) - sizeof(AllocHeader); + header = (AllocHeader *)realPtr; + } + if (realPtr && size) { + s_allocTotalSize -= header->size; + s_allocTotalTagSize[header->tag] -= header->size; + // realloc, remove. + if (header->prev) + header->prev->next = header->next; + else + s_allocRoot = header->next; + if (header->next) + header->next->prev = header->prev; + } + if (!size) { + s_allocTotalSize -= header->size; + s_allocTotalTagSize[header->tag] -= header->size; + XA_ASSERT(!header->free); // double free + header->free = true; + return nullptr; + } + size += sizeof(AllocHeader) + sizeof(kAllocRedzone); + uint8_t *newPtr = (uint8_t *)s_realloc(realPtr, size); + if (!newPtr) + return nullptr; + header = (AllocHeader *)newPtr; + header->size = size; + header->file = file; + header->line = line; + header->tag = tag; + header->free = false; + if (!s_allocRoot) { + s_allocRoot = header; + header->prev = header->next = 0; + } else { + header->prev = nullptr; + header->next = s_allocRoot; + s_allocRoot = header; + header->next->prev = header; + } + s_allocTotalSize += size; + if (s_allocTotalSize > s_allocPeakSize) + s_allocPeakSize = s_allocTotalSize; + s_allocTotalTagSize[tag] += size; + if (s_allocTotalTagSize[tag] > s_allocPeakTagSize[tag]) + s_allocPeakTagSize[tag] = s_allocTotalTagSize[tag]; + auto redzone = (uint32_t *)(newPtr + size - sizeof(kAllocRedzone)); + *redzone = kAllocRedzone; + return newPtr + sizeof(AllocHeader); +} + +static void ReportLeaks() +{ + printf("Checking for memory leaks...\n"); + bool anyLeaks = false; + AllocHeader *header = s_allocRoot; + while (header) { + if (!header->free) { + printf(" Leak: %zu bytes %s %d\n", header->size, header->file, header->line); + anyLeaks = true; + } + auto redzone = (const uint32_t *)((const uint8_t *)header + header->size - sizeof(kAllocRedzone)); + if (*redzone != kAllocRedzone) + printf(" Redzone corrupted: %zu bytes %s %d\n", header->size, header->file, header->line); + header = header->next; + } + if (!anyLeaks) + printf(" No memory leaks\n"); + header = s_allocRoot; + while (header) { + AllocHeader *destroy = header; + header = header->next; + s_realloc(destroy, 0); + } + s_allocRoot = nullptr; + s_allocTotalSize = s_allocPeakSize = 0; + for (int i = 0; i < MemTag::Count; i++) + s_allocTotalTagSize[i] = s_allocPeakTagSize[i] = 0; +} + +static void PrintMemoryUsage() +{ + XA_PRINT("Memory usage: %0.2fMB current, %0.2fMB peak\n", internal::s_allocTotalSize / 1024.0f / 1024.0f, internal::s_allocPeakSize / 1024.0f / 1024.0f); + static const char *labels[] = { // Sync with MemTag + "Default", + "Mesh", + "MeshBoundaries", + "MeshColocals", + "MeshEdgeMap", + "MeshIndices", + "MeshNormals", + "MeshPositions", + "MeshTexcoords" + }; + for (int i = 0; i < MemTag::Count; i++) { + XA_PRINT(" %s: %0.2fMB current, %0.2fMB peak\n", labels[i], internal::s_allocTotalTagSize[i] / 1024.0f / 1024.0f, internal::s_allocPeakTagSize[i] / 1024.0f / 1024.0f); + } +} + +#define XA_PRINT_MEM_USAGE internal::PrintMemoryUsage(); +#else +static void *Realloc(void *ptr, size_t size, int /*tag*/, const char * /*file*/, int /*line*/) +{ + void *mem = s_realloc(ptr, size); + if (size > 0) { + XA_DEBUG_ASSERT(mem); + } + return mem; +} +#define XA_PRINT_MEM_USAGE +#endif + +#if XA_PROFILE +#define XA_PROFILE_START(var) const clock_t var##Start = clock(); +#define XA_PROFILE_END(var) internal::s_profile.var += clock() - var##Start; +#define XA_PROFILE_PRINT_AND_RESET(label, var) XA_PRINT("%s%.2f seconds (%g ms)\n", label, internal::clockToSeconds(internal::s_profile.var), internal::clockToMs(internal::s_profile.var)); internal::s_profile.var = 0; + +struct ProfileData +{ + clock_t addMeshReal; + std::atomic<clock_t> addMeshThread; + std::atomic<clock_t> addMeshCreateColocals; + std::atomic<clock_t> addMeshCreateFaceGroups; + std::atomic<clock_t> addMeshCreateBoundaries; + std::atomic<clock_t> addMeshCreateChartGroupsReal; + std::atomic<clock_t> addMeshCreateChartGroupsThread; + clock_t computeChartsReal; + std::atomic<clock_t> computeChartsThread; + std::atomic<clock_t> atlasBuilder; + std::atomic<clock_t> atlasBuilderInit; + std::atomic<clock_t> atlasBuilderCreateInitialCharts; + std::atomic<clock_t> atlasBuilderGrowCharts; + std::atomic<clock_t> atlasBuilderMergeCharts; + std::atomic<clock_t> createChartMeshesReal; + std::atomic<clock_t> createChartMeshesThread; + std::atomic<clock_t> fixChartMeshTJunctions; + std::atomic<clock_t> closeChartMeshHoles; + clock_t parameterizeChartsReal; + std::atomic<clock_t> parameterizeChartsThread; + std::atomic<clock_t> parameterizeChartsOrthogonal; + std::atomic<clock_t> parameterizeChartsLSCM; + std::atomic<clock_t> parameterizeChartsEvaluateQuality; + clock_t packCharts; + clock_t packChartsRasterize; + clock_t packChartsDilate; + clock_t packChartsFindLocation; + std::atomic<clock_t> packChartsFindLocationThread; + clock_t packChartsBlit; +}; + +static ProfileData s_profile; + +static double clockToMs(clock_t c) +{ + return c * 1000.0 / CLOCKS_PER_SEC; +} + +static double clockToSeconds(clock_t c) +{ + return c / (double)CLOCKS_PER_SEC; +} +#else +#define XA_PROFILE_START(var) +#define XA_PROFILE_END(var) +#define XA_PROFILE_PRINT_AND_RESET(label, var) +#endif + +static constexpr float kPi = 3.14159265358979323846f; +static constexpr float kPi2 = 6.28318530717958647692f; +static constexpr float kEpsilon = 0.0001f; +static constexpr float kAreaEpsilon = FLT_EPSILON; +static constexpr float kNormalEpsilon = 0.001f; static int align(int x, int a) { return (x + a - 1) & ~(a - 1); } -static bool isAligned(int x, int a) +template <typename T> +static T max(const T &a, const T &b) { - return (x & (a - 1)) == 0; + return a > b ? a : b; +} + +template <typename T> +static T min(const T &a, const T &b) +{ + return a < b ? a : b; } -/// Return the maximum of the three arguments. template <typename T> static T max3(const T &a, const T &b, const T &c) { - return std::max(a, std::max(b, c)); + return max(a, max(b, c)); } /// Return the maximum of the three arguments. template <typename T> static T min3(const T &a, const T &b, const T &c) { - return std::min(a, std::min(b, c)); + return min(a, min(b, c)); } /// Clamp between two values. template <typename T> static T clamp(const T &x, const T &a, const T &b) { - return std::min(std::max(x, a), b); + return min(max(x, a), b); } -static float saturate(float f) +template <typename T> +static void swap(T &a, T &b) { - return clamp(f, 0.0f, 1.0f); + T temp; + temp = a; + a = b; + b = temp; + temp = T(); } -// Robust floating point comparisons: -// http://realtimecollisiondetection.net/blog/?p=89 -static bool equal(const float f0, const float f1, const float epsilon = NV_EPSILON) +union FloatUint32 { - //return fabs(f0-f1) <= epsilon; - return fabs(f0 - f1) <= epsilon * max3(1.0f, fabsf(f0), fabsf(f1)); -} + float f; + uint32_t u; +}; -NV_FORCEINLINE static int ftoi_floor(float val) +static bool isFinite(float f) { - return (int)val; + FloatUint32 fu; + fu.f = f; + return fu.u != 0x7F800000u && fu.u != 0x7F800001u; } -NV_FORCEINLINE static int ftoi_ceil(float val) +static bool isNan(float f) { - return (int)ceilf(val); + return f != f; } -NV_FORCEINLINE static int ftoi_round(float f) +// Robust floating point comparisons: +// http://realtimecollisiondetection.net/blog/?p=89 +static bool equal(const float f0, const float f1, const float epsilon) { - return int(floorf(f + 0.5f)); + //return fabs(f0-f1) <= epsilon; + return fabs(f0 - f1) <= epsilon * max3(1.0f, fabsf(f0), fabsf(f1)); } -static bool isZero(const float f, const float epsilon = NV_EPSILON) +static int ftoi_ceil(float val) { - return fabs(f) <= epsilon; + return (int)ceilf(val); } -static float lerp(float f0, float f1, float t) +static bool isZero(const float f, const float epsilon) { - const float s = 1.0f - t; - return f0 * s + f1 * t; + return fabs(f) <= epsilon; } static float square(float f) @@ -130,11 +445,6 @@ static float square(float f) return f * f; } -static int square(int i) -{ - return i * i; -} - /** Return the next power of two. * @see http://graphics.stanford.edu/~seander/bithacks.html * @warning Behaviour for 0 is undefined. @@ -143,7 +453,7 @@ static int square(int i) */ static uint32_t nextPowerOfTwo(uint32_t x) { - xaDebugAssert( x != 0 ); + XA_DEBUG_ASSERT( x != 0 ); // On modern CPUs this is supposed to be as fast as using the bsr instruction. x--; x |= x >> 1; @@ -154,16 +464,6 @@ static uint32_t nextPowerOfTwo(uint32_t x) return x + 1; } -static uint64_t nextPowerOfTwo(uint64_t x) -{ - xaDebugAssert(x != 0); - uint32_t p = 1; - while (x > p) { - p += p; - } - return p; -} - static uint32_t sdbmHash(const void *data_in, uint32_t size, uint32_t h = 5381) { const uint8_t *data = (const uint8_t *) data_in; @@ -174,31 +474,12 @@ static uint32_t sdbmHash(const void *data_in, uint32_t size, uint32_t h = 5381) return h; } -// Note that this hash does not handle NaN properly. -static uint32_t sdbmFloatHash(const float *f, uint32_t count, uint32_t h = 5381) -{ - for (uint32_t i = 0; i < count; i++) { - union { - float f; - uint32_t i; - } x = { f[i] }; - if (x.i == 0x80000000) x.i = 0; - h = sdbmHash(&x, 4, h); - } - return h; -} - template <typename T> static uint32_t hash(const T &t, uint32_t h = 5381) { return sdbmHash(&t, sizeof(T), h); } -static uint32_t hash(const float &f, uint32_t h) -{ - return sdbmFloatHash(&f, 1, h); -} - // Functors for hash table: template <typename Key> struct Hash { @@ -213,40 +494,22 @@ template <typename Key> struct Equal class Vector2 { public: - typedef Vector2 const &Arg; - Vector2() {} explicit Vector2(float f) : x(f), y(f) {} Vector2(float x, float y): x(x), y(y) {} - Vector2(Vector2::Arg v) : x(v.x), y(v.y) {} - - const Vector2 &operator=(Vector2::Arg v) - { - x = v.x; - y = v.y; - return - *this; - } - const float *ptr() const { return &x; } - - void set(float _x, float _y) - { - x = _x; - y = _y; - } Vector2 operator-() const { return Vector2(-x, -y); } - void operator+=(Vector2::Arg v) + void operator+=(const Vector2 &v) { x += v.x; y += v.y; } - void operator-=(Vector2::Arg v) + void operator-=(const Vector2 &v) { x -= v.x; y -= v.y; @@ -258,138 +521,99 @@ public: y *= s; } - void operator*=(Vector2::Arg v) + void operator*=(const Vector2 &v) { x *= v.x; y *= v.y; } - friend bool operator==(Vector2::Arg a, Vector2::Arg b) - { - return a.x == b.x && a.y == b.y; - } - - friend bool operator!=(Vector2::Arg a, Vector2::Arg b) - { - return a.x != b.x || a.y != b.y; - } - - union - { -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4201) -#endif - struct - { - float x, y; - }; -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - float component[2]; - }; + float x, y; }; -Vector2 operator+(Vector2::Arg a, Vector2::Arg b) +static bool operator==(const Vector2 &a, const Vector2 &b) { - return Vector2(a.x + b.x, a.y + b.y); + return a.x == b.x && a.y == b.y; } -Vector2 operator-(Vector2::Arg a, Vector2::Arg b) +static bool operator!=(const Vector2 &a, const Vector2 &b) { - return Vector2(a.x - b.x, a.y - b.y); + return a.x != b.x || a.y != b.y; } -Vector2 operator*(Vector2::Arg v, float s) +static Vector2 operator+(const Vector2 &a, const Vector2 &b) { - return Vector2(v.x * s, v.y * s); -} - -Vector2 operator*(Vector2::Arg v1, Vector2::Arg v2) -{ - return Vector2(v1.x * v2.x, v1.y * v2.y); + return Vector2(a.x + b.x, a.y + b.y); } -Vector2 operator/(Vector2::Arg v, float s) +static Vector2 operator-(const Vector2 &a, const Vector2 &b) { - return Vector2(v.x / s, v.y / s); + return Vector2(a.x - b.x, a.y - b.y); } -Vector2 lerp(Vector2::Arg v1, Vector2::Arg v2, float t) +static Vector2 operator*(const Vector2 &v, float s) { - const float s = 1.0f - t; - return Vector2(v1.x * s + t * v2.x, v1.y * s + t * v2.y); + return Vector2(v.x * s, v.y * s); } -float dot(Vector2::Arg a, Vector2::Arg b) +static float dot(const Vector2 &a, const Vector2 &b) { return a.x * b.x + a.y * b.y; } -float lengthSquared(Vector2::Arg v) +static float lengthSquared(const Vector2 &v) { return v.x * v.x + v.y * v.y; } -float length(Vector2::Arg v) +static float length(const Vector2 &v) { return sqrtf(lengthSquared(v)); } -float distance(Vector2::Arg a, Vector2::Arg b) -{ - return length(a - b); -} - -bool isNormalized(Vector2::Arg v, float epsilon = NV_NORMAL_EPSILON) +#if XA_DEBUG +static bool isNormalized(const Vector2 &v, float epsilon = kNormalEpsilon) { return equal(length(v), 1, epsilon); } +#endif -Vector2 normalize(Vector2::Arg v, float epsilon = NV_EPSILON) +static Vector2 normalize(const Vector2 &v, float epsilon) { float l = length(v); - xaDebugAssert(!isZero(l, epsilon)); -#ifdef NDEBUG - epsilon = 0; // silence unused parameter warning -#endif + XA_DEBUG_ASSERT(!isZero(l, epsilon)); + XA_UNUSED(epsilon); Vector2 n = v * (1.0f / l); - xaDebugAssert(isNormalized(n)); + XA_DEBUG_ASSERT(isNormalized(n)); return n; } -Vector2 normalizeSafe(Vector2::Arg v, Vector2::Arg fallback, float epsilon = NV_EPSILON) +static bool equal(const Vector2 &v1, const Vector2 &v2, float epsilon) { - float l = length(v); - if (isZero(l, epsilon)) { - return fallback; - } - return v * (1.0f / l); + return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon); } -bool equal(Vector2::Arg v1, Vector2::Arg v2, float epsilon = NV_EPSILON) +static Vector2 min(const Vector2 &a, const Vector2 &b) { - return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon); + return Vector2(min(a.x, b.x), min(a.y, b.y)); } -Vector2 max(Vector2::Arg a, Vector2::Arg b) +static Vector2 max(const Vector2 &a, const Vector2 &b) { - return Vector2(std::max(a.x, b.x), std::max(a.y, b.y)); + return Vector2(max(a.x, b.x), max(a.y, b.y)); } -bool isFinite(Vector2::Arg v) +static bool isFinite(const Vector2 &v) { - return std::isfinite(v.x) && std::isfinite(v.y); + return isFinite(v.x) && isFinite(v.y); } // Note, this is the area scaled by 2! -float triangleArea(Vector2::Arg v0, Vector2::Arg v1) +static float triangleArea(const Vector2 &v0, const Vector2 &v1) { return (v0.x * v1.y - v0.y * v1.x); // * 0.5f; } -float triangleArea(Vector2::Arg a, Vector2::Arg b, Vector2::Arg c) + +static float triangleArea(const Vector2 &a, const Vector2 &b, const Vector2 &c) { // IC: While it may be appealing to use the following expression: //return (c.x * a.y + a.x * b.y + b.x * c.y - b.x * a.y - c.x * b.y - a.x * c.y); // * 0.5f; @@ -402,62 +626,55 @@ float triangleArea(Vector2::Arg a, Vector2::Arg b, Vector2::Arg c) return triangleArea(a - c, b - c); } -float triangleArea2(Vector2::Arg v1, Vector2::Arg v2, Vector2::Arg v3) +static bool linesIntersect(const Vector2 &a1, const Vector2 &a2, const Vector2 &b1, const Vector2 &b2, float epsilon) { - return 0.5f * (v3.x * v1.y + v1.x * v2.y + v2.x * v3.y - v2.x * v1.y - v3.x * v2.y - v1.x * v3.y); + const Vector2 v0 = a2 - a1; + const Vector2 v1 = b2 - b1; + const float denom = -v1.x * v0.y + v0.x * v1.y; + if (equal(denom, 0.0f, epsilon)) + return false; + const float s = (-v0.y * (a1.x - b1.x) + v0.x * (a1.y - b1.y)) / denom; + if (s > epsilon && s < 1.0f - epsilon) { + const float t = ( v1.x * (a1.y - b1.y) - v1.y * (a1.x - b1.x)) / denom; + return t > epsilon && t < 1.0f - epsilon; + } + return false; } -static uint32_t hash(const Vector2 &v, uint32_t h) +struct Vector2i { - return sdbmFloatHash(v.component, 2, h); -} + Vector2i() {} + Vector2i(int32_t x, int32_t y) : x(x), y(y) {} + + int32_t x, y; +}; class Vector3 { public: - typedef Vector3 const &Arg; - Vector3() {} explicit Vector3(float f) : x(f), y(f), z(f) {} Vector3(float x, float y, float z) : x(x), y(y), z(z) {} - Vector3(Vector2::Arg v, float z) : x(v.x), y(v.y), z(z) {} - Vector3(Vector3::Arg v) : x(v.x), y(v.y), z(v.z) {} - - const Vector3 &operator=(Vector3::Arg v) - { - x = v.x; - y = v.y; - z = v.z; - return *this; - } + Vector3(const Vector2 &v, float z) : x(v.x), y(v.y), z(z) {} Vector2 xy() const { return Vector2(x, y); } - const float *ptr() const { return &x; } - - void set(float _x, float _y, float _z) - { - x = _x; - y = _y; - z = _z; - } - Vector3 operator-() const { return Vector3(-x, -y, -z); } - void operator+=(Vector3::Arg v) + void operator+=(const Vector3 &v) { x += v.x; y += v.y; z += v.z; } - void operator-=(Vector3::Arg v) + void operator-=(const Vector3 &v) { x -= v.x; y -= v.y; @@ -479,159 +696,89 @@ public: z *= is; } - void operator*=(Vector3::Arg v) + void operator*=(const Vector3 &v) { x *= v.x; y *= v.y; z *= v.z; } - void operator/=(Vector3::Arg v) + void operator/=(const Vector3 &v) { x /= v.x; y /= v.y; z /= v.z; } - friend bool operator==(Vector3::Arg a, Vector3::Arg b) - { - return a.x == b.x && a.y == b.y && a.z == b.z; - } - - friend bool operator!=(Vector3::Arg a, Vector3::Arg b) - { - return a.x != b.x || a.y != b.y || a.z != b.z; - } - - union - { -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4201) -#endif - struct - { - float x, y, z; - }; -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - float component[3]; - }; + float x, y, z; }; -Vector3 add(Vector3::Arg a, Vector3::Arg b) +static bool operator!=(const Vector3 &a, const Vector3 &b) { - return Vector3(a.x + b.x, a.y + b.y, a.z + b.z); -} -Vector3 add(Vector3::Arg a, float b) -{ - return Vector3(a.x + b, a.y + b, a.z + b); -} -Vector3 operator+(Vector3::Arg a, Vector3::Arg b) -{ - return add(a, b); -} -Vector3 operator+(Vector3::Arg a, float b) -{ - return add(a, b); -} - -Vector3 sub(Vector3::Arg a, Vector3::Arg b) -{ - return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); + return a.x != b.x || a.y != b.y || a.z != b.z; } -Vector3 sub(Vector3::Arg a, float b) +static Vector3 operator+(const Vector3 &a, const Vector3 &b) { - return Vector3(a.x - b, a.y - b, a.z - b); -} - -Vector3 operator-(Vector3::Arg a, Vector3::Arg b) -{ - return sub(a, b); + return Vector3(a.x + b.x, a.y + b.y, a.z + b.z); } -Vector3 operator-(Vector3::Arg a, float b) +static Vector3 operator-(const Vector3 &a, const Vector3 &b) { - return sub(a, b); + return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); } -Vector3 cross(Vector3::Arg a, Vector3::Arg b) +static Vector3 cross(const Vector3 &a, const Vector3 &b) { return Vector3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); } -Vector3 operator*(Vector3::Arg v, float s) +static Vector3 operator*(const Vector3 &v, float s) { return Vector3(v.x * s, v.y * s, v.z * s); } -Vector3 operator*(float s, Vector3::Arg v) +static Vector3 operator*(float s, const Vector3 &v) { return Vector3(v.x * s, v.y * s, v.z * s); } -Vector3 operator*(Vector3::Arg v, Vector3::Arg s) -{ - return Vector3(v.x * s.x, v.y * s.y, v.z * s.z); -} - -Vector3 operator/(Vector3::Arg v, float s) +static Vector3 operator/(const Vector3 &v, float s) { return v * (1.0f / s); } -Vector3 lerp(Vector3::Arg v1, Vector3::Arg v2, float t) -{ - const float s = 1.0f - t; - return Vector3(v1.x * s + t * v2.x, v1.y * s + t * v2.y, v1.z * s + t * v2.z); -} - -float dot(Vector3::Arg a, Vector3::Arg b) +static float dot(const Vector3 &a, const Vector3 &b) { return a.x * b.x + a.y * b.y + a.z * b.z; } -float lengthSquared(Vector3::Arg v) +static float lengthSquared(const Vector3 &v) { return v.x * v.x + v.y * v.y + v.z * v.z; } -float length(Vector3::Arg v) +static float length(const Vector3 &v) { return sqrtf(lengthSquared(v)); } -float distance(Vector3::Arg a, Vector3::Arg b) -{ - return length(a - b); -} - -float distanceSquared(Vector3::Arg a, Vector3::Arg b) -{ - return lengthSquared(a - b); -} - -bool isNormalized(Vector3::Arg v, float epsilon = NV_NORMAL_EPSILON) +static bool isNormalized(const Vector3 &v, float epsilon = kNormalEpsilon) { return equal(length(v), 1, epsilon); } -Vector3 normalize(Vector3::Arg v, float epsilon = NV_EPSILON) +static Vector3 normalize(const Vector3 &v, float epsilon) { float l = length(v); - xaDebugAssert(!isZero(l, epsilon)); -#ifdef NDEBUG - epsilon = 0; // silence unused parameter warning -#endif + XA_DEBUG_ASSERT(!isZero(l, epsilon)); + XA_UNUSED(epsilon); Vector3 n = v * (1.0f / l); - xaDebugAssert(isNormalized(n)); + XA_DEBUG_ASSERT(isNormalized(n)); return n; } -Vector3 normalizeSafe(Vector3::Arg v, Vector3::Arg fallback, float epsilon = NV_EPSILON) +static Vector3 normalizeSafe(const Vector3 &v, const Vector3 &fallback, float epsilon) { float l = length(v); if (isZero(l, epsilon)) { @@ -640,57 +787,423 @@ Vector3 normalizeSafe(Vector3::Arg v, Vector3::Arg fallback, float epsilon = NV_ return v * (1.0f / l); } -bool equal(Vector3::Arg v1, Vector3::Arg v2, float epsilon = NV_EPSILON) +static bool equal(const Vector3 &v0, const Vector3 &v1, float epsilon) { - return equal(v1.x, v2.x, epsilon) && equal(v1.y, v2.y, epsilon) && equal(v1.z, v2.z, epsilon); + return fabs(v0.x - v1.x) <= epsilon && fabs(v0.y - v1.y) <= epsilon && fabs(v0.z - v1.z) <= epsilon; } -Vector3 min(Vector3::Arg a, Vector3::Arg b) +static Vector3 min(const Vector3 &a, const Vector3 &b) { - return Vector3(std::min(a.x, b.x), std::min(a.y, b.y), std::min(a.z, b.z)); + return Vector3(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z)); } -Vector3 max(Vector3::Arg a, Vector3::Arg b) +static Vector3 max(const Vector3 &a, const Vector3 &b) { - return Vector3(std::max(a.x, b.x), std::max(a.y, b.y), std::max(a.z, b.z)); + return Vector3(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z)); } -Vector3 clamp(Vector3::Arg v, float min, float max) +#if XA_DEBUG +bool isFinite(const Vector3 &v) { - return Vector3(clamp(v.x, min, max), clamp(v.y, min, max), clamp(v.z, min, max)); + return isFinite(v.x) && isFinite(v.y) && isFinite(v.z); } +#endif -Vector3 saturate(Vector3::Arg v) +struct Plane { - return Vector3(saturate(v.x), saturate(v.y), saturate(v.z)); + Plane() = default; + + Plane(const Vector3 &p1, const Vector3 &p2, const Vector3 &p3) + { + normal = cross(p2 - p1, p3 - p1); + dist = dot(normal, p1); + } + + float distance(const Vector3 &p) const + { + return dot(normal, p) - dist; + } + + void normalize() + { + const float len = length(normal); + if (len > 0.0f) { + const float il = 1.0f / len; + normal *= il; + dist *= il; + } + } + + Vector3 normal; + float dist; +}; + +static bool lineIntersectsPoint(const Vector3 &point, const Vector3 &lineStart, const Vector3 &lineEnd, float *t, float epsilon) +{ + float tt; + if (!t) + t = &tt; + *t = 0.0f; + if (equal(lineStart, point, epsilon) || equal(lineEnd, point, epsilon)) + return false; // Vertex lies on either line vertices. + const Vector3 v01 = point - lineStart; + const Vector3 v21 = lineEnd - lineStart; + const float l = length(v21); + const float d = length(cross(v01, v21)) / l; + if (!isZero(d, epsilon)) + return false; + *t = dot(v01, v21) / (l * l); + return *t > kEpsilon && *t < 1.0f - kEpsilon; } -Vector3 floor(Vector3::Arg v) +static bool sameSide(const Vector3 &p1, const Vector3 &p2, const Vector3 &a, const Vector3 &b) { - return Vector3(floorf(v.x), floorf(v.y), floorf(v.z)); + const Vector3 &ab = b - a; + return dot(cross(ab, p1 - a), cross(ab, p2 - a)) >= 0.0f; } -bool isFinite(Vector3::Arg v) +// http://blackpawn.com/texts/pointinpoly/default.html +static bool pointInTriangle(const Vector3 &p, const Vector3 &a, const Vector3 &b, const Vector3 &c) { - return std::isfinite(v.x) && std::isfinite(v.y) && std::isfinite(v.z); + return sameSide(p, a, b, c) && sameSide(p, b, a, c) && sameSide(p, c, a, b); } -static uint32_t hash(const Vector3 &v, uint32_t h) +#if XA_CLOSE_HOLES_CHECK_EDGE_INTERSECTION +// https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm +static bool rayIntersectsTriangle(const Vector3 &rayOrigin, const Vector3 &rayDir, const Vector3 *tri, float *t) +{ + *t = 0.0f; + const Vector3 &edge1 = tri[1] - tri[0]; + const Vector3 &edge2 = tri[2] - tri[0]; + const Vector3 h = cross(rayDir, edge2); + const float a = dot(edge1, h); + if (a > -kEpsilon && a < kEpsilon) + return false; // This ray is parallel to this triangle. + const float f = 1.0f / a; + const Vector3 s = rayOrigin - tri[0]; + const float u = f * dot(s, h); + if (u < 0.0f || u > 1.0f) + return false; + const Vector3 q = cross(s, edge1); + const float v = f * dot(rayDir, q); + if (v < 0.0f || u + v > 1.0f) + return false; + // At this stage we can compute t to find out where the intersection point is on the line. + *t = f * dot(edge2, q); + if (*t > kEpsilon && *t < 1.0f - kEpsilon) + return true; + // This means that there is a line intersection but not a ray intersection. + return false; +} +#endif + +// From Fast-BVH +struct AABB { - return sdbmFloatHash(v.component, 3, h); + AABB() : min(FLT_MAX, FLT_MAX, FLT_MAX), max(-FLT_MAX, -FLT_MAX, -FLT_MAX) {} + AABB(const Vector3 &min, const Vector3 &max) : min(min), max(max) { } + AABB(const Vector3 &p, float radius = 0.0f) : min(p), max(p) { if (radius > 0.0f) expand(radius); } + + bool intersect(const AABB &other) const + { + return min.x <= other.max.x && max.x >= other.min.x && min.y <= other.max.y && max.y >= other.min.y && min.z <= other.max.z && max.z >= other.min.z; + } + + void expandToInclude(const Vector3 &p) + { + min = internal::min(min, p); + max = internal::max(max, p); + } + + void expandToInclude(const AABB &aabb) + { + min = internal::min(min, aabb.min); + max = internal::max(max, aabb.max); + } + + void expand(float amount) + { + min -= Vector3(amount); + max += Vector3(amount); + } + + Vector3 centroid() const + { + return min + (max - min) * 0.5f; + } + + uint32_t maxDimension() const + { + const Vector3 extent = max - min; + uint32_t result = 0; + if (extent.y > extent.x) { + result = 1; + if (extent.z > extent.y) + result = 2; + } + else if(extent.z > extent.x) + result = 2; + return result; + } + + Vector3 min, max; +}; + +template <typename T> +static void construct_range(T * ptr, uint32_t new_size, uint32_t old_size) { + for (uint32_t i = old_size; i < new_size; i++) { + new(ptr+i) T; // placement new + } +} + +template <typename T> +static void construct_range(T * ptr, uint32_t new_size, uint32_t old_size, const T & elem) { + for (uint32_t i = old_size; i < new_size; i++) { + new(ptr+i) T(elem); // placement new + } } +template <typename T> +static void construct_range(T * ptr, uint32_t new_size, uint32_t old_size, const T * src) { + for (uint32_t i = old_size; i < new_size; i++) { + new(ptr+i) T(src[i]); // placement new + } +} + +template <typename T> +static void destroy_range(T * ptr, uint32_t new_size, uint32_t old_size) { + for (uint32_t i = new_size; i < old_size; i++) { + (ptr+i)->~T(); // Explicit call to the destructor + } +} + +/** +* Replacement for std::vector that is easier to debug and provides +* some nice foreach enumerators. +*/ +template<typename T> +class Array { +public: + typedef uint32_t size_type; + + Array(int memTag = MemTag::Default) : m_memTag(memTag), m_buffer(nullptr), m_capacity(0), m_size(0) {} + + Array(const Array &a) : m_memTag(a.m_memTag), m_buffer(nullptr), m_capacity(0), m_size(0) + { + copy(a.m_buffer, a.m_size); + } + + ~Array() + { + destroy(); + } + + const Array<T> &operator=(const Array<T> &other) + { + m_memTag = other.m_memTag; + m_buffer = other.m_buffer; + m_capacity = other.m_capacity; + m_size = other.m_size; + return *this; + } + + const T & operator[]( uint32_t index ) const + { + XA_DEBUG_ASSERT(index < m_size); + return m_buffer[index]; + } + + T & operator[] ( uint32_t index ) + { + XA_DEBUG_ASSERT(index < m_size); + return m_buffer[index]; + } + + uint32_t size() const { return m_size; } + const T * data() const { return m_buffer; } + T * data() { return m_buffer; } + T * begin() { return m_buffer; } + T * end() { return m_buffer + m_size; } + const T * begin() const { return m_buffer; } + const T * end() const { return m_buffer + m_size; } + bool isEmpty() const { return m_size == 0; } + + void push_back( const T & val ) + { + XA_DEBUG_ASSERT(&val < m_buffer || &val >= m_buffer+m_size); + uint32_t old_size = m_size; + uint32_t new_size = m_size + 1; + setArraySize(new_size); + construct_range(m_buffer, new_size, old_size, val); + } + + void pop_back() + { + XA_DEBUG_ASSERT( m_size > 0 ); + resize( m_size - 1 ); + } + + const T & back() const + { + XA_DEBUG_ASSERT( m_size > 0 ); + return m_buffer[m_size-1]; + } + + T & back() + { + XA_DEBUG_ASSERT( m_size > 0 ); + return m_buffer[m_size-1]; + } + + const T & front() const + { + XA_DEBUG_ASSERT( m_size > 0 ); + return m_buffer[0]; + } + + T & front() + { + XA_DEBUG_ASSERT( m_size > 0 ); + return m_buffer[0]; + } + + // Remove the element at the given index. This is an expensive operation! + void removeAt(uint32_t index) + { + XA_DEBUG_ASSERT(index >= 0 && index < m_size); + if (m_size == 1) { + clear(); + } + else { + m_buffer[index].~T(); + memmove(m_buffer+index, m_buffer+index+1, sizeof(T) * (m_size - 1 - index)); + m_size--; + } + } + + // Insert the given element at the given index shifting all the elements up. + void insertAt(uint32_t index, const T & val = T()) + { + XA_DEBUG_ASSERT( index >= 0 && index <= m_size ); + setArraySize(m_size + 1); + if (index < m_size - 1) { + memmove(m_buffer+index+1, m_buffer+index, sizeof(T) * (m_size - 1 - index)); + } + // Copy-construct into the newly opened slot. + new(m_buffer+index) T(val); + } + + void append(const Array<T> & other) + { + append(other.m_buffer, other.m_size); + } + + void resize(uint32_t new_size) + { + uint32_t old_size = m_size; + // Destruct old elements (if we're shrinking). + destroy_range(m_buffer, new_size, old_size); + setArraySize(new_size); + // Call default constructors + construct_range(m_buffer, new_size, old_size); + } + + void resize(uint32_t new_size, const T & elem) + { + XA_DEBUG_ASSERT(&elem < m_buffer || &elem > m_buffer+m_size); + uint32_t old_size = m_size; + // Destruct old elements (if we're shrinking). + destroy_range(m_buffer, new_size, old_size); + setArraySize(new_size); + // Call copy constructors + construct_range(m_buffer, new_size, old_size, elem); + } + + void clear() + { + // Destruct old elements + destroy_range(m_buffer, 0, m_size); + m_size = 0; + } + + void destroy() + { + clear(); + XA_FREE(m_buffer); + m_buffer = nullptr; + m_capacity = 0; + m_size = 0; + } + + void reserve(uint32_t desired_size) + { + if (desired_size > m_capacity) { + setArrayCapacity(desired_size); + } + } + + void copy(const T * data, uint32_t count) + { + destroy_range(m_buffer, 0, m_size); + setArraySize(count); + construct_range(m_buffer, count, 0, data); + } + + void moveTo(Array<T> &other) + { + other.destroy(); + swap(m_buffer, other.m_buffer); + swap(m_capacity, other.m_capacity); + swap(m_size, other.m_size); + } + +protected: + void setArraySize(uint32_t new_size) + { + m_size = new_size; + if (new_size > m_capacity) { + uint32_t new_buffer_size; + if (m_capacity == 0) { + // first allocation is exact + new_buffer_size = new_size; + } + else { + // following allocations grow array by 25% + new_buffer_size = new_size + (new_size >> 2); + } + setArrayCapacity( new_buffer_size ); + } + } + void setArrayCapacity(uint32_t new_capacity) + { + XA_DEBUG_ASSERT(new_capacity >= m_size); + if (new_capacity == 0) { + // free the buffer. + if (m_buffer != nullptr) { + XA_FREE(m_buffer); + m_buffer = nullptr; + } + } + else { + // realloc the buffer + m_buffer = XA_REALLOC(m_memTag, m_buffer, T, new_capacity); + } + m_capacity = new_capacity; + } + + int m_memTag; + T * m_buffer; + uint32_t m_capacity; + uint32_t m_size; +}; + /// Basis class to compute tangent space basis, ortogonalizations and to /// transform vectors from one space to another. -class Basis +struct Basis { -public: - /// Create a null basis. - Basis() : tangent(0, 0, 0), bitangent(0, 0, 0), normal(0, 0, 0) {} - - void buildFrameForDirection(Vector3::Arg d, float angle = 0) + void buildFrameForDirection(const Vector3 &d, float angle = 0) { - xaAssert(isNormalized(d)); + XA_ASSERT(isNormalized(d)); normal = d; // Choose minimum axis. if (fabsf(normal.x) < fabsf(normal.y) && fabsf(normal.x) < fabsf(normal.z)) { @@ -702,7 +1215,7 @@ public: } // Ortogonalize tangent -= normal * dot(normal, tangent); - tangent = normalize(tangent); + tangent = normalize(tangent, kEpsilon); bitangent = cross(normal, tangent); // Rotate frame around normal according to angle. if (angle != 0.0f) { @@ -714,9 +1227,9 @@ public: } } - Vector3 tangent; - Vector3 bitangent; - Vector3 normal; + Vector3 tangent = Vector3(0.0f); + Vector3 bitangent = Vector3(0.0f); + Vector3 normal = Vector3(0.0f); }; // Simple bit array. @@ -724,21 +1237,12 @@ class BitArray { public: BitArray() : m_size(0) {} + BitArray(uint32_t sz) { resize(sz); } - uint32_t size() const - { - return m_size; - } - - void clear() - { - resize(0); - } - void resize(uint32_t new_size) { m_size = new_size; @@ -748,162 +1252,311 @@ public: /// Get bit. bool bitAt(uint32_t b) const { - xaDebugAssert( b < m_size ); + XA_DEBUG_ASSERT( b < m_size ); return (m_wordArray[b >> 5] & (1 << (b & 31))) != 0; } // Set a bit. void setBitAt(uint32_t idx) { - xaDebugAssert(idx < m_size); + XA_DEBUG_ASSERT(idx < m_size); m_wordArray[idx >> 5] |= (1 << (idx & 31)); } - // Toggle a bit. - void toggleBitAt(uint32_t idx) - { - xaDebugAssert(idx < m_size); - m_wordArray[idx >> 5] ^= (1 << (idx & 31)); - } - - // Set a bit to the given value. @@ Rename modifyBitAt? - void setBitAt(uint32_t idx, bool b) - { - xaDebugAssert(idx < m_size); - m_wordArray[idx >> 5] = setBits(m_wordArray[idx >> 5], 1 << (idx & 31), b); - xaDebugAssert(bitAt(idx) == b); - } - // Clear all the bits. void clearAll() { - memset(m_wordArray.data(), 0, m_wordArray.size() * sizeof(uint32_t )); - } - - // Set all the bits. - void setAll() - { - memset(m_wordArray.data(), 0xFF, m_wordArray.size() * sizeof(uint32_t )); + memset(m_wordArray.data(), 0, m_wordArray.size() * sizeof(uint32_t)); } private: - // See "Conditionally set or clear bits without branching" at http://graphics.stanford.edu/~seander/bithacks.html - uint32_t setBits(uint32_t w, uint32_t m, bool b) - { - return (w & ~m) | (-int(b) & m); - } - // Number of bits stored. uint32_t m_size; // Array of bits. - std::vector<uint32_t> m_wordArray; + Array<uint32_t> m_wordArray; }; -/// Bit map. This should probably be called BitImage. -class BitMap +class BitImage { public: - BitMap() : m_width(0), m_height(0) {} - BitMap(uint32_t w, uint32_t h) : m_width(w), m_height(h), m_bitArray(w * h) {} + BitImage() : m_width(0), m_height(0), m_rowStride(0) {} - uint32_t width() const + BitImage(uint32_t w, uint32_t h) : m_width(w), m_height(h) { - return m_width; + m_rowStride = (m_width + 63) >> 6; + m_data.resize(m_rowStride * m_height); } - uint32_t height() const + + BitImage(const BitImage &other) { - return m_height; + m_width = other.m_width; + m_height = other.m_height; + m_rowStride = other.m_rowStride; + m_data.resize(m_rowStride * m_height); + memcpy(m_data.data(), other.m_data.data(), m_rowStride * m_height * sizeof(uint64_t)); } - void resize(uint32_t w, uint32_t h, bool initValue) + const BitImage &operator=(const BitImage &other) { - BitArray tmp(w * h); - if (initValue) tmp.setAll(); - else tmp.clearAll(); - // @@ Copying one bit at a time. This could be much faster. - for (uint32_t y = 0; y < m_height; y++) { - for (uint32_t x = 0; x < m_width; x++) { - //tmp.setBitAt(y*w + x, bitAt(x, y)); - if (bitAt(x, y) != initValue) tmp.toggleBitAt(y * w + x); - } + m_width = other.m_width; + m_height = other.m_height; + m_rowStride = other.m_rowStride; + m_data = other.m_data; + return *this; + } + + uint32_t width() const { return m_width; } + uint32_t height() const { return m_height; } + + void resize(uint32_t w, uint32_t h, bool discard) + { + const uint32_t rowStride = (w + 63) >> 6; + if (discard) { + m_data.resize(rowStride * h); + memset(m_data.data(), 0, m_data.size() * sizeof(uint64_t)); + } else { + Array<uint64_t> tmp; + tmp.resize(rowStride * h); + memset(tmp.data(), 0, tmp.size() * sizeof(uint64_t)); + // If only height has changed, can copy all rows at once. + if (rowStride == m_rowStride) { + memcpy(tmp.data(), m_data.data(), m_rowStride * min(m_height, h) * sizeof(uint64_t)); + } else if (m_width > 0 && m_height > 0) { + const uint32_t height = min(m_height, h); + for (uint32_t i = 0; i < height; i++) + memcpy(&tmp[i * rowStride], &m_data[i * m_rowStride], min(rowStride, m_rowStride) * sizeof(uint64_t)); + } + tmp.moveTo(m_data); } - std::swap(m_bitArray, tmp); m_width = w; m_height = h; + m_rowStride = rowStride; } bool bitAt(uint32_t x, uint32_t y) const { - xaDebugAssert(x < m_width && y < m_height); - return m_bitArray.bitAt(y * m_width + x); + XA_DEBUG_ASSERT(x < m_width && y < m_height); + const uint32_t index = (x >> 6) + y * m_rowStride; + return (m_data[index] & (UINT64_C(1) << (uint64_t(x) & UINT64_C(63)))) != 0; } void setBitAt(uint32_t x, uint32_t y) { - xaDebugAssert(x < m_width && y < m_height); - m_bitArray.setBitAt(y * m_width + x); + XA_DEBUG_ASSERT(x < m_width && y < m_height); + const uint32_t index = (x >> 6) + y * m_rowStride; + m_data[index] |= UINT64_C(1) << (uint64_t(x) & UINT64_C(63)); + XA_DEBUG_ASSERT(bitAt(x, y)); } void clearAll() { - m_bitArray.clearAll(); + memset(m_data.data(), 0, m_data.size() * sizeof(uint64_t)); + } + + bool canBlit(const BitImage &image, uint32_t offsetX, uint32_t offsetY) const + { + for (uint32_t y = 0; y < image.m_height; y++) { + const uint32_t thisY = y + offsetY; + if (thisY >= m_height) + continue; + uint32_t x = 0; + for (;;) { + const uint32_t thisX = x + offsetX; + if (thisX >= m_width) + break; + const uint32_t thisBlockShift = thisX % 64; + const uint64_t thisBlock = m_data[(thisX >> 6) + thisY * m_rowStride] >> thisBlockShift; + const uint32_t blockShift = x % 64; + const uint64_t block = image.m_data[(x >> 6) + y * image.m_rowStride] >> blockShift; + if ((thisBlock & block) != 0) + return false; + x += 64 - max(thisBlockShift, blockShift); + if (x >= image.m_width) + break; + } + } + return true; + } + + void dilate(uint32_t padding) + { + BitImage tmp(m_width, m_height); + for (uint32_t p = 0; p < padding; p++) { + tmp.clearAll(); + for (uint32_t y = 0; y < m_height; y++) { + for (uint32_t x = 0; x < m_width; x++) { + bool b = bitAt(x, y); + if (!b) { + if (x > 0) { + b |= bitAt(x - 1, y); + if (y > 0) b |= bitAt(x - 1, y - 1); + if (y < m_height - 1) b |= bitAt(x - 1, y + 1); + } + if (y > 0) b |= bitAt(x, y - 1); + if (y < m_height - 1) b |= bitAt(x, y + 1); + if (x < m_width - 1) { + b |= bitAt(x + 1, y); + if (y > 0) b |= bitAt(x + 1, y - 1); + if (y < m_height - 1) b |= bitAt(x + 1, y + 1); + } + } + if (b) + tmp.setBitAt(x, y); + } + } + swap(m_data, tmp.m_data); + } } private: uint32_t m_width; uint32_t m_height; - BitArray m_bitArray; + uint32_t m_rowStride; // In uint64_t's + Array<uint64_t> m_data; }; -// Axis Aligned Bounding Box. -class Box +// From Fast-BVH +class BVH { public: - Box() {} - Box(const Box &b) : minCorner(b.minCorner), maxCorner(b.maxCorner) {} - Box(const Vector3 &mins, const Vector3 &maxs) : minCorner(mins), maxCorner(maxs) {} - - operator const float *() const + BVH(const Array<AABB> &objectAabbs, uint32_t leafSize = 4) { - return reinterpret_cast<const float *>(this); - } - - // Clear the bounds. - void clearBounds() - { - minCorner.set(FLT_MAX, FLT_MAX, FLT_MAX); - maxCorner.set(-FLT_MAX, -FLT_MAX, -FLT_MAX); - } - - // Return extents of the box. - Vector3 extents() const - { - return (maxCorner - minCorner) * 0.5f; + m_objectAabbs = &objectAabbs; + if (m_objectAabbs->isEmpty()) + return; + m_objectIds.resize(objectAabbs.size()); + for (uint32_t i = 0; i < m_objectIds.size(); i++) + m_objectIds[i] = i; + BuildEntry todo[128]; + uint32_t stackptr = 0; + const uint32_t kRoot = 0xfffffffc; + const uint32_t kUntouched = 0xffffffff; + const uint32_t kTouchedTwice = 0xfffffffd; + // Push the root + todo[stackptr].start = 0; + todo[stackptr].end = objectAabbs.size(); + todo[stackptr].parent = kRoot; + stackptr++; + Node node; + m_nodes.reserve(objectAabbs.size() * 2); + uint32_t nNodes = 0; + while(stackptr > 0) { + // Pop the next item off of the stack + const BuildEntry &bnode = todo[--stackptr]; + const uint32_t start = bnode.start; + const uint32_t end = bnode.end; + const uint32_t nPrims = end - start; + nNodes++; + node.start = start; + node.nPrims = nPrims; + node.rightOffset = kUntouched; + // Calculate the bounding box for this node + AABB bb(objectAabbs[m_objectIds[start]]); + AABB bc(objectAabbs[m_objectIds[start]].centroid()); + for(uint32_t p = start + 1; p < end; ++p) { + bb.expandToInclude(objectAabbs[m_objectIds[p]]); + bc.expandToInclude(objectAabbs[m_objectIds[p]].centroid()); + } + node.aabb = bb; + // If the number of primitives at this point is less than the leaf + // size, then this will become a leaf. (Signified by rightOffset == 0) + if (nPrims <= leafSize) + node.rightOffset = 0; + m_nodes.push_back(node); + // Child touches parent... + // Special case: Don't do this for the root. + if (bnode.parent != kRoot) { + m_nodes[bnode.parent].rightOffset--; + // When this is the second touch, this is the right child. + // The right child sets up the offset for the flat tree. + if (m_nodes[bnode.parent].rightOffset == kTouchedTwice ) + m_nodes[bnode.parent].rightOffset = nNodes - 1 - bnode.parent; + } + // If this is a leaf, no need to subdivide. + if (node.rightOffset == 0) + continue; + // Set the split dimensions + const uint32_t split_dim = bc.maxDimension(); + // Split on the center of the longest axis + const float split_coord = 0.5f * ((&bc.min.x)[split_dim] + (&bc.max.x)[split_dim]); + // Partition the list of objects on this split + uint32_t mid = start; + for (uint32_t i = start; i < end; ++i) { + const Vector3 centroid(objectAabbs[m_objectIds[i]].centroid()); + if ((¢roid.x)[split_dim] < split_coord) { + swap(m_objectIds[i], m_objectIds[mid]); + ++mid; + } + } + // If we get a bad split, just choose the center... + if (mid == start || mid == end) + mid = start + (end - start) / 2; + // Push right child + todo[stackptr].start = mid; + todo[stackptr].end = end; + todo[stackptr].parent = nNodes - 1; + stackptr++; + // Push left child + todo[stackptr].start = start; + todo[stackptr].end = mid; + todo[stackptr].parent = nNodes - 1; + stackptr++; + } + } + + void query(const AABB &queryAabb, Array<uint32_t> &result) const + { + result.clear(); + // Working set + uint32_t todo[64]; + int32_t stackptr = 0; + // "Push" on the root node to the working set + todo[stackptr] = 0; + while(stackptr >= 0) { + // Pop off the next node to work on. + const int ni = todo[stackptr--]; + const Node &node = m_nodes[ni]; + // Is leaf -> Intersect + if (node.rightOffset == 0) { + for(uint32_t o = 0; o < node.nPrims; ++o) { + const uint32_t obj = node.start + o; + if (queryAabb.intersect((*m_objectAabbs)[m_objectIds[obj]])) + result.push_back(m_objectIds[obj]); + } + } else { // Not a leaf + const uint32_t left = ni + 1; + const uint32_t right = ni + node.rightOffset; + if (queryAabb.intersect(m_nodes[left].aabb)) + todo[++stackptr] = left; + if (queryAabb.intersect(m_nodes[right].aabb)) + todo[++stackptr] = right; + } + } } - // Add a point to this box. - void addPointToBounds(const Vector3 &p) +private: + struct BuildEntry { - minCorner = min(minCorner, p); - maxCorner = max(maxCorner, p); - } + uint32_t parent; // If non-zero then this is the index of the parent. (used in offsets) + uint32_t start, end; // The range of objects in the object list covered by this node. + }; - // Get the volume of the box. - float volume() const + struct Node { - Vector3 d = extents(); - return 8.0f * (d.x * d.y * d.z); - } + AABB aabb; + uint32_t start, nPrims, rightOffset; + }; - Vector3 minCorner; - Vector3 maxCorner; + const Array<AABB> *m_objectAabbs; + Array<uint32_t> m_objectIds; + Array<Node> m_nodes; }; class Fit { public: - static Vector3 computeCentroid(int n, const Vector3 *__restrict points) + static Vector3 computeCentroid(int n, const Vector3 * points) { Vector3 centroid(0.0f); for (int i = 0; i < n; i++) { @@ -913,7 +1566,7 @@ public: return centroid; } - static Vector3 computeCovariance(int n, const Vector3 *__restrict points, float *__restrict covariance) + static Vector3 computeCovariance(int n, const Vector3 * points, float * covariance) { // compute the centroid Vector3 centroid = computeCentroid(n, points); @@ -933,25 +1586,12 @@ public: return centroid; } - static bool isPlanar(int n, const Vector3 *points, float epsilon = NV_EPSILON) - { - // compute the centroid and covariance - float matrix[6]; - computeCovariance(n, points, matrix); - float eigenValues[3]; - Vector3 eigenVectors[3]; - if (!eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) { - return false; - } - return eigenValues[2] < epsilon; - } - // Tridiagonal solver from Charles Bloom. // Householder transforms followed by QL decomposition. // Seems to be based on the code from Numerical Recipes in C. static bool eigenSolveSymmetric3(const float matrix[6], float eigenValues[3], Vector3 eigenVectors[3]) { - xaDebugAssert(matrix != NULL && eigenValues != NULL && eigenVectors != NULL); + XA_DEBUG_ASSERT(matrix != nullptr && eigenValues != nullptr && eigenVectors != nullptr); float subd[3]; float diag[3]; float work[3][3]; @@ -975,24 +1615,24 @@ public: // eigenvectors are the columns; make them the rows : for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { - eigenVectors[j].component[i] = (float) work[i][j]; + (&eigenVectors[j].x)[i] = (float) work[i][j]; } } // shuffle to sort by singular value : if (eigenValues[2] > eigenValues[0] && eigenValues[2] > eigenValues[1]) { - std::swap(eigenValues[0], eigenValues[2]); - std::swap(eigenVectors[0], eigenVectors[2]); + swap(eigenValues[0], eigenValues[2]); + swap(eigenVectors[0], eigenVectors[2]); } if (eigenValues[1] > eigenValues[0]) { - std::swap(eigenValues[0], eigenValues[1]); - std::swap(eigenVectors[0], eigenVectors[1]); + swap(eigenValues[0], eigenValues[1]); + swap(eigenVectors[0], eigenVectors[1]); } if (eigenValues[2] > eigenValues[1]) { - std::swap(eigenValues[1], eigenValues[2]); - std::swap(eigenVectors[1], eigenVectors[2]); + swap(eigenValues[1], eigenValues[2]); + swap(eigenVectors[1], eigenVectors[2]); } - xaDebugAssert(eigenValues[0] >= eigenValues[1] && eigenValues[0] >= eigenValues[2]); - xaDebugAssert(eigenValues[1] >= eigenValues[2]); + XA_DEBUG_ASSERT(eigenValues[0] >= eigenValues[1] && eigenValues[0] >= eigenValues[2]); + XA_DEBUG_ASSERT(eigenValues[1] >= eigenValues[2]); return true; } @@ -1118,7 +1758,7 @@ public: const FullVector &operator=(const FullVector &v) { - xaAssert(dimension() == v.dimension()); + XA_ASSERT(dimension() == v.dimension()); m_array = v.m_array; return *this; } @@ -1135,1698 +1775,1695 @@ public: } } - void operator+=(const FullVector &v) - { - xaDebugAssert(dimension() == v.dimension()); - const uint32_t dim = dimension(); - for (uint32_t i = 0; i < dim; i++) { - m_array[i] += v.m_array[i]; - } - } - - void operator-=(const FullVector &v) - { - xaDebugAssert(dimension() == v.dimension()); - const uint32_t dim = dimension(); - for (uint32_t i = 0; i < dim; i++) { - m_array[i] -= v.m_array[i]; - } - } - - void operator*=(const FullVector &v) - { - xaDebugAssert(dimension() == v.dimension()); - const uint32_t dim = dimension(); - for (uint32_t i = 0; i < dim; i++) { - m_array[i] *= v.m_array[i]; - } - } - - void operator+=(float f) - { - const uint32_t dim = dimension(); - for (uint32_t i = 0; i < dim; i++) { - m_array[i] += f; - } - } - - void operator-=(float f) - { - const uint32_t dim = dimension(); - for (uint32_t i = 0; i < dim; i++) { - m_array[i] -= f; - } - } - - void operator*=(float f) - { - const uint32_t dim = dimension(); - for (uint32_t i = 0; i < dim; i++) { - m_array[i] *= f; - } - } - private: - std::vector<float> m_array; + Array<float> m_array; }; -namespace halfedge { -class Face; -class Vertex; - -class Edge +template<typename Key, typename Value, typename H = Hash<Key>, typename E = Equal<Key> > +class HashMap { public: - uint32_t id; - Edge *next; - Edge *prev; // This is not strictly half-edge, but makes algorithms easier and faster. - Edge *pair; - Vertex *vertex; - Face *face; - - // Default constructor. - Edge(uint32_t id) : id(id), next(NULL), prev(NULL), pair(NULL), vertex(NULL), face(NULL) {} - - // Vertex queries. - const Vertex *from() const + HashMap(int memTag, uint32_t size) : m_memTag(memTag), m_size(size), m_numSlots(0), m_slots(nullptr), m_keys(memTag), m_values(memTag), m_next(memTag) { - return vertex; } - Vertex *from() + ~HashMap() { - return vertex; + if (m_slots) + XA_FREE(m_slots); } - const Vertex *to() const - { - return pair->vertex; // This used to be 'next->vertex', but that changed often when the connectivity of the mesh changes. - } + const Value &value(uint32_t index) const { return m_values[index]; } - Vertex *to() + void add(const Key &key, const Value &value) { - return pair->vertex; + if (!m_slots) + alloc(); + const uint32_t hash = computeHash(key); + m_keys.push_back(key); + m_values.push_back(value); + m_next.push_back(m_slots[hash]); + m_slots[hash] = m_next.size() - 1; } - // Edge queries. - void setNext(Edge *e) + uint32_t get(const Key &key) const { - next = e; - if (e != NULL) e->prev = this; - } - void setPrev(Edge *e) - { - prev = e; - if (e != NULL) e->next = this; + if (!m_slots) + return UINT32_MAX; + const uint32_t hash = computeHash(key); + uint32_t i = m_slots[hash]; + E equal; + while (i != UINT32_MAX) { + if (equal(m_keys[i], key)) + return i; + i = m_next[i]; + } + return UINT32_MAX; } - // @@ It would be more simple to only check m_pair == NULL - // Face queries. - bool isBoundary() const + uint32_t getNext(uint32_t current) const { - return !(face && pair->face); + uint32_t i = m_next[current]; + E equal; + while (i != UINT32_MAX) { + if (equal(m_keys[i], m_keys[current])) + return i; + i = m_next[i]; + } + return UINT32_MAX; } - // @@ This is not exactly accurate, we should compare the texture coordinates... - bool isSeam() const +private: + void alloc() { - return vertex != pair->next->vertex || next->vertex != pair->vertex; + XA_DEBUG_ASSERT(m_size > 0); + m_numSlots = (uint32_t)(m_size * 1.3); + m_slots = XA_ALLOC_ARRAY(m_memTag, uint32_t, m_numSlots); + for (uint32_t i = 0; i < m_numSlots; i++) + m_slots[i] = UINT32_MAX; + m_keys.reserve(m_size); + m_values.reserve(m_size); + m_next.reserve(m_size); } - bool isNormalSeam() const; - bool isTextureSeam() const; - - bool isValid() const + uint32_t computeHash(const Key &key) const { - // null face is OK. - if (next == NULL || prev == NULL || pair == NULL || vertex == NULL) return false; - if (next->prev != this) return false; - if (prev->next != this) return false; - if (pair->pair != this) return false; - return true; + H hash; + return hash(key) % m_numSlots; } - float length() const; - - // Return angle between this edge and the previous one. - float angle() const; + int m_memTag; + uint32_t m_size; + uint32_t m_numSlots; + uint32_t *m_slots; + Array<Key> m_keys; + Array<Value> m_values; + Array<uint32_t> m_next; }; -class Vertex +template<typename T> +static void insertionSort(T *data, uint32_t length) { -public: - uint32_t id; - // -- GODOT start -- - uint32_t original_id; - // -- GODOT end -- - Edge *edge; - Vertex *next; - Vertex *prev; - Vector3 pos; - Vector3 nor; - Vector2 tex; - - // -- GODOT start -- - //Vertex(uint32_t id) : id(id), edge(NULL), pos(0.0f), nor(0.0f), tex(0.0f) - Vertex(uint32_t id) : id(id), original_id(id), edge(NULL), pos(0.0f), nor(0.0f), tex(0.0f) - // -- GODOT end -- - { - next = this; - prev = this; - } - - // Set first edge of all colocals. - void setEdge(Edge *e) - { - for (VertexIterator it(colocals()); !it.isDone(); it.advance()) { - it.current()->edge = e; + for (int32_t i = 1; i < (int32_t)length; i++) { + T x = data[i]; + int32_t j = i - 1; + while (j >= 0 && x < data[j]) { + data[j + 1] = data[j]; + j--; } + data[j + 1] = x; } +} - // Update position of all colocals. - void setPos(const Vector3 &p) +class KISSRng +{ +public: + uint32_t getRange(uint32_t range) { - for (VertexIterator it(colocals()); !it.isDone(); it.advance()) { - it.current()->pos = p; - } + if (range == 0) + return 0; + x = 69069 * x + 12345; + y ^= (y << 13); + y ^= (y >> 17); + y ^= (y << 5); + uint64_t t = 698769069ULL * z + c; + c = (t >> 32); + return (x + y + (z = (uint32_t)t)) % range; } - bool isFirstColocal() const - { - return firstColocal() == this; - } +private: + uint32_t x = 123456789, y = 362436000, z = 521288629, c = 7654321; +}; - const Vertex *firstColocal() const +// Based on Pierre Terdiman's and Michael Herf's source code. +// http://www.codercorner.com/RadixSortRevisited.htm +// http://www.stereopsis.com/radix.html +class RadixSort +{ +public: + RadixSort() : m_size(0), m_ranks(nullptr), m_ranks2(nullptr), m_validRanks(false) {} + + ~RadixSort() { - uint32_t firstId = id; - const Vertex *vertex = this; - for (ConstVertexIterator it(colocals()); !it.isDone(); it.advance()) { - if (it.current()->id < firstId) { - firstId = vertex->id; - vertex = it.current(); - } - } - return vertex; + // Release everything + XA_FREE(m_ranks2); + XA_FREE(m_ranks); } - Vertex *firstColocal() + RadixSort &sort(const float *input, uint32_t count) { - Vertex *vertex = this; - uint32_t firstId = id; - for (VertexIterator it(colocals()); !it.isDone(); it.advance()) { - if (it.current()->id < firstId) { - firstId = vertex->id; - vertex = it.current(); + if (input == nullptr || count == 0) return *this; + // Resize lists if needed + if (count != m_size) { + if (count > m_size) { + m_ranks2 = XA_REALLOC(MemTag::Default, m_ranks2, uint32_t, count); + m_ranks = XA_REALLOC(MemTag::Default, m_ranks, uint32_t, count); } + m_size = count; + m_validRanks = false; } - return vertex; - } - - bool isColocal(const Vertex *v) const - { - if (this == v) return true; - if (pos != v->pos) return false; - for (ConstVertexIterator it(colocals()); !it.isDone(); it.advance()) { - if (v == it.current()) { - return true; + if (count < 32) { + insertionSort(input, count); + } else { + // @@ Avoid touching the input multiple times. + for (uint32_t i = 0; i < count; i++) { + FloatFlip((uint32_t &)input[i]); + } + radixSort<uint32_t>((const uint32_t *)input, count); + for (uint32_t i = 0; i < count; i++) { + IFloatFlip((uint32_t &)input[i]); } } - return false; + return *this; } - void linkColocal(Vertex *v) + RadixSort &sort(const Array<float> &input) { - next->prev = v; - v->next = next; - next = v; - v->prev = this; - } - void unlinkColocal() - { - next->prev = prev; - prev->next = next; - next = this; - prev = this; + return sort(input.data(), input.size()); } - // @@ Note: This only works if linkBoundary has been called. - bool isBoundary() const + // Access to results. m_ranks is a list of indices in sorted order, i.e. in the order you may further process your data + const uint32_t *ranks() const { - return (edge && !edge->face); + XA_DEBUG_ASSERT(m_validRanks); + return m_ranks; } - // Iterator that visits the edges around this vertex in counterclockwise order. - class EdgeIterator //: public Iterator<Edge *> + uint32_t *ranks() { - public: - EdgeIterator(Edge *e) : m_end(NULL), m_current(e) { } - - virtual void advance() - { - if (m_end == NULL) m_end = m_current; - m_current = m_current->pair->next; - //m_current = m_current->prev->pair; - } - - virtual bool isDone() const - { - return m_end == m_current; - } - virtual Edge *current() const - { - return m_current; - } - Vertex *vertex() const - { - return m_current->vertex; - } + XA_DEBUG_ASSERT(m_validRanks); + return m_ranks; + } - private: - Edge *m_end; - Edge *m_current; - }; +private: + uint32_t m_size; + uint32_t *m_ranks; + uint32_t *m_ranks2; + bool m_validRanks; - EdgeIterator edges() + void FloatFlip(uint32_t &f) { - return EdgeIterator(edge); + int32_t mask = (int32_t(f) >> 31) | 0x80000000; // Warren Hunt, Manchor Ko. + f ^= mask; } - EdgeIterator edges(Edge *e) + + void IFloatFlip(uint32_t &f) { - return EdgeIterator(e); + uint32_t mask = ((f >> 31) - 1) | 0x80000000; // Michael Herf. + f ^= mask; } - // Iterator that visits the edges around this vertex in counterclockwise order. - class ConstEdgeIterator //: public Iterator<Edge *> + template<typename T> + void createHistograms(const T *buffer, uint32_t count, uint32_t *histogram) { - public: - ConstEdgeIterator(const Edge *e) : m_end(NULL), m_current(e) { } - ConstEdgeIterator(EdgeIterator it) : m_end(NULL), m_current(it.current()) { } - - virtual void advance() - { - if (m_end == NULL) m_end = m_current; - m_current = m_current->pair->next; - //m_current = m_current->prev->pair; - } - - virtual bool isDone() const - { - return m_end == m_current; - } - virtual const Edge *current() const - { - return m_current; + const uint32_t bucketCount = sizeof(T); // (8 * sizeof(T)) / log2(radix) + // Init bucket pointers. + uint32_t *h[bucketCount]; + for (uint32_t i = 0; i < bucketCount; i++) { + h[i] = histogram + 256 * i; } - const Vertex *vertex() const - { - return m_current->to(); + // Clear histograms. + memset(histogram, 0, 256 * bucketCount * sizeof(uint32_t )); + // @@ Add support for signed integers. + // Build histograms. + const uint8_t *p = (const uint8_t *)buffer; // @@ Does this break aliasing rules? + const uint8_t *pe = p + count * sizeof(T); + while (p != pe) { + h[0][*p++]++, h[1][*p++]++, h[2][*p++]++, h[3][*p++]++; +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4127) +#endif + if (bucketCount == 8) h[4][*p++]++, h[5][*p++]++, h[6][*p++]++, h[7][*p++]++; +#ifdef _MSC_VER +#pragma warning(pop) +#endif } - - private: - const Edge *m_end; - const Edge *m_current; - }; - - ConstEdgeIterator edges() const - { - return ConstEdgeIterator(edge); - } - ConstEdgeIterator edges(const Edge *e) const - { - return ConstEdgeIterator(e); } - // Iterator that visits all the colocal vertices. - class VertexIterator //: public Iterator<Edge *> + template <typename T> void insertionSort(const T *input, uint32_t count) { - public: - VertexIterator(Vertex *v) : m_end(NULL), m_current(v) { } - - virtual void advance() - { - if (m_end == NULL) m_end = m_current; - m_current = m_current->next; - } - - virtual bool isDone() const - { - return m_end == m_current; - } - virtual Vertex *current() const - { - return m_current; + if (!m_validRanks) { + m_ranks[0] = 0; + for (uint32_t i = 1; i != count; ++i) { + int rank = m_ranks[i] = i; + uint32_t j = i; + while (j != 0 && input[rank] < input[m_ranks[j - 1]]) { + m_ranks[j] = m_ranks[j - 1]; + --j; + } + if (i != j) { + m_ranks[j] = rank; + } + } + m_validRanks = true; + } else { + for (uint32_t i = 1; i != count; ++i) { + int rank = m_ranks[i]; + uint32_t j = i; + while (j != 0 && input[rank] < input[m_ranks[j - 1]]) { + m_ranks[j] = m_ranks[j - 1]; + --j; + } + if (i != j) { + m_ranks[j] = rank; + } + } } - - private: - Vertex *m_end; - Vertex *m_current; - }; - - VertexIterator colocals() - { - return VertexIterator(this); } - // Iterator that visits all the colocal vertices. - class ConstVertexIterator //: public Iterator<Edge *> + template <typename T> void radixSort(const T *input, uint32_t count) { - public: - ConstVertexIterator(const Vertex *v) : m_end(NULL), m_current(v) { } - - virtual void advance() - { - if (m_end == NULL) m_end = m_current; - m_current = m_current->next; - } - - virtual bool isDone() const - { - return m_end == m_current; + const uint32_t P = sizeof(T); // pass count + // Allocate histograms & offsets on the stack + uint32_t histogram[256 * P]; + uint32_t *link[256]; + createHistograms(input, count, histogram); + // Radix sort, j is the pass number (0=LSB, P=MSB) + for (uint32_t j = 0; j < P; j++) { + // Pointer to this bucket. + const uint32_t *h = &histogram[j * 256]; + const uint8_t *inputBytes = (const uint8_t *)input; // @@ Is this aliasing legal? + inputBytes += j; + if (h[inputBytes[0]] == count) { + // Skip this pass, all values are the same. + continue; + } + // Create offsets + link[0] = m_ranks2; + for (uint32_t i = 1; i < 256; i++) link[i] = link[i - 1] + h[i - 1]; + // Perform Radix Sort + if (!m_validRanks) { + for (uint32_t i = 0; i < count; i++) { + *link[inputBytes[i * P]]++ = i; + } + m_validRanks = true; + } else { + for (uint32_t i = 0; i < count; i++) { + const uint32_t idx = m_ranks[i]; + *link[inputBytes[idx * P]]++ = idx; + } + } + // Swap pointers for next pass. Valid indices - the most recent ones - are in m_ranks after the swap. + swap(m_ranks, m_ranks2); } - virtual const Vertex *current() const - { - return m_current; + // All values were equal, generate linear ranks. + if (!m_validRanks) { + for (uint32_t i = 0; i < count; i++) { + m_ranks[i] = i; + } + m_validRanks = true; } - - private: - const Vertex *m_end; - const Vertex *m_current; - }; - - ConstVertexIterator colocals() const - { - return ConstVertexIterator(this); } }; -bool Edge::isNormalSeam() const -{ - return (vertex->nor != pair->next->vertex->nor || next->vertex->nor != pair->vertex->nor); -} - -bool Edge::isTextureSeam() const -{ - return (vertex->tex != pair->next->vertex->tex || next->vertex->tex != pair->vertex->tex); -} - -float Edge::length() const -{ - return internal::length(to()->pos - from()->pos); -} - -float Edge::angle() const -{ - Vector3 p = vertex->pos; - Vector3 a = prev->vertex->pos; - Vector3 b = next->vertex->pos; - Vector3 v0 = a - p; - Vector3 v1 = b - p; - return acosf(dot(v0, v1) / (internal::length(v0) * internal::length(v1))); -} - -class Face +// Wrapping this in a class allows temporary arrays to be re-used. +class BoundingBox2D { public: - uint32_t id; - uint16_t group; - uint16_t material; - Edge *edge; - - Face(uint32_t id) : id(id), group(uint16_t(~0)), material(uint16_t(~0)), edge(NULL) {} + Vector2 majorAxis() const { return m_majorAxis; } + Vector2 minorAxis() const { return m_minorAxis; } + Vector2 minCorner() const { return m_minCorner; } + Vector2 maxCorner() const { return m_maxCorner; } - float area() const - { - float area = 0; - const Vector3 &v0 = edge->from()->pos; - for (ConstEdgeIterator it(edges(edge->next)); it.current() != edge->prev; it.advance()) { - const Edge *e = it.current(); - const Vector3 &v1 = e->vertex->pos; - const Vector3 &v2 = e->next->vertex->pos; - area += length(cross(v1 - v0, v2 - v0)); - } - return area * 0.5f; - } - - float parametricArea() const - { - float area = 0; - const Vector2 &v0 = edge->from()->tex; - for (ConstEdgeIterator it(edges(edge->next)); it.current() != edge->prev; it.advance()) { - const Edge *e = it.current(); - const Vector2 &v1 = e->vertex->tex; - const Vector2 &v2 = e->next->vertex->tex; - area += triangleArea(v0, v1, v2); - } - return area * 0.5f; - } - - Vector3 normal() const + // This should compute convex hull and use rotating calipers to find the best box. Currently it uses a brute force method. + void compute(const Vector2 *boundaryVertices, uint32_t boundaryVertexCount, const Vector2 *vertices, uint32_t vertexCount) { - Vector3 n(0); - const Vertex *vertex0 = NULL; - for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) { - const Edge *e = it.current(); - xaAssert(e != NULL); - if (vertex0 == NULL) { - vertex0 = e->vertex; - } else if (e->next->vertex != vertex0) { - const halfedge::Vertex *vertex1 = e->from(); - const halfedge::Vertex *vertex2 = e->to(); - const Vector3 &p0 = vertex0->pos; - const Vector3 &p1 = vertex1->pos; - const Vector3 &p2 = vertex2->pos; - Vector3 v10 = p1 - p0; - Vector3 v20 = p2 - p0; - n += cross(v10, v20); + convexHull(boundaryVertices, boundaryVertexCount, m_hull, 0.00001f); + // @@ Ideally I should use rotating calipers to find the best box. Using brute force for now. + float best_area = FLT_MAX; + Vector2 best_min(0); + Vector2 best_max(0); + Vector2 best_axis(0); + const uint32_t hullCount = m_hull.size(); + for (uint32_t i = 0, j = hullCount - 1; i < hullCount; j = i, i++) { + if (equal(m_hull[i], m_hull[j], kEpsilon)) + continue; + Vector2 axis = normalize(m_hull[i] - m_hull[j], 0.0f); + XA_DEBUG_ASSERT(isFinite(axis)); + // Compute bounding box. + Vector2 box_min(FLT_MAX, FLT_MAX); + Vector2 box_max(-FLT_MAX, -FLT_MAX); + // Consider all points, not only boundary points, in case the input chart is malformed. + for (uint32_t v = 0; v < vertexCount; v++) { + const Vector2 &point = vertices[v]; + const float x = dot(axis, point); + const float y = dot(Vector2(-axis.y, axis.x), point); + box_min.x = min(box_min.x, x); + box_max.x = max(box_max.x, x); + box_min.y = min(box_min.y, y); + box_max.y = max(box_max.y, y); + } + // Compute box area. + const float area = (box_max.x - box_min.x) * (box_max.y - box_min.y); + if (area < best_area) { + best_area = area; + best_min = box_min; + best_max = box_max; + best_axis = axis; } } - return normalizeSafe(n, Vector3(0, 0, 1), 0.0f); - } - - Vector3 centroid() const - { - Vector3 sum(0.0f); - uint32_t count = 0; - for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) { - const Edge *e = it.current(); - sum += e->from()->pos; - count++; - } - return sum / float(count); - } - - // Unnormalized face normal assuming it's a triangle. - Vector3 triangleNormal() const - { - Vector3 p0 = edge->vertex->pos; - Vector3 p1 = edge->next->vertex->pos; - Vector3 p2 = edge->next->next->vertex->pos; - Vector3 e0 = p2 - p0; - Vector3 e1 = p1 - p0; - return normalizeSafe(cross(e0, e1), Vector3(0), 0.0f); - } - - Vector3 triangleNormalAreaScaled() const - { - Vector3 p0 = edge->vertex->pos; - Vector3 p1 = edge->next->vertex->pos; - Vector3 p2 = edge->next->next->vertex->pos; - Vector3 e0 = p2 - p0; - Vector3 e1 = p1 - p0; - return cross(e0, e1); - } - - // Average of the edge midpoints weighted by the edge length. - // I want a point inside the triangle, but closer to the cirumcenter. - Vector3 triangleCenter() const - { - Vector3 p0 = edge->vertex->pos; - Vector3 p1 = edge->next->vertex->pos; - Vector3 p2 = edge->next->next->vertex->pos; - float l0 = length(p1 - p0); - float l1 = length(p2 - p1); - float l2 = length(p0 - p2); - Vector3 m0 = (p0 + p1) * l0 / (l0 + l1 + l2); - Vector3 m1 = (p1 + p2) * l1 / (l0 + l1 + l2); - Vector3 m2 = (p2 + p0) * l2 / (l0 + l1 + l2); - return m0 + m1 + m2; - } - - bool isValid() const - { - uint32_t count = 0; - for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) { - const Edge *e = it.current(); - if (e->face != this) return false; - if (!e->isValid()) return false; - if (!e->pair->isValid()) return false; - count++; - } - if (count < 3) return false; - return true; - } - - bool contains(const Edge *e) const - { - for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) { - if (it.current() == e) return true; - } - return false; - } - - uint32_t edgeCount() const - { - uint32_t count = 0; - for (ConstEdgeIterator it(edges()); !it.isDone(); it.advance()) { - ++count; - } - return count; + m_majorAxis = best_axis; + m_minorAxis = Vector2(-best_axis.y, best_axis.x); + m_minCorner = best_min; + m_maxCorner = best_max; + XA_ASSERT(isFinite(m_majorAxis) && isFinite(m_minorAxis) && isFinite(m_minCorner)); } - // The iterator that visits the edges of this face in clockwise order. - class EdgeIterator //: public Iterator<Edge *> +private: + // Compute the convex hull using Graham Scan. + void convexHull(const Vector2 *input, uint32_t inputCount, Array<Vector2> &output, float epsilon) { - public: - EdgeIterator(Edge *e) : m_end(NULL), m_current(e) { } - - virtual void advance() - { - if (m_end == NULL) m_end = m_current; - m_current = m_current->next; + m_coords.resize(inputCount); + for (uint32_t i = 0; i < inputCount; i++) + m_coords[i] = input[i].x; + RadixSort radix; + radix.sort(m_coords); + const uint32_t *ranks = radix.ranks(); + m_top.clear(); + m_bottom.clear(); + m_top.reserve(inputCount); + m_bottom.reserve(inputCount); + Vector2 P = input[ranks[0]]; + Vector2 Q = input[ranks[inputCount - 1]]; + float topy = max(P.y, Q.y); + float boty = min(P.y, Q.y); + for (uint32_t i = 0; i < inputCount; i++) { + Vector2 p = input[ranks[i]]; + if (p.y >= boty) + m_top.push_back(p); } - - virtual bool isDone() const - { - return m_end == m_current; + for (uint32_t i = 0; i < inputCount; i++) { + Vector2 p = input[ranks[inputCount - 1 - i]]; + if (p.y <= topy) + m_bottom.push_back(p); } - virtual Edge *current() const - { - return m_current; + // Filter top list. + output.clear(); + output.push_back(m_top[0]); + output.push_back(m_top[1]); + for (uint32_t i = 2; i < m_top.size(); ) { + Vector2 a = output[output.size() - 2]; + Vector2 b = output[output.size() - 1]; + Vector2 c = m_top[i]; + float area = triangleArea(a, b, c); + if (area >= -epsilon) + output.pop_back(); + if (area < -epsilon || output.size() == 1) { + output.push_back(c); + i++; + } } - Vertex *vertex() const - { - return m_current->vertex; + uint32_t top_count = output.size(); + output.push_back(m_bottom[1]); + // Filter bottom list. + for (uint32_t i = 2; i < m_bottom.size(); ) { + Vector2 a = output[output.size() - 2]; + Vector2 b = output[output.size() - 1]; + Vector2 c = m_bottom[i]; + float area = triangleArea(a, b, c); + if (area >= -epsilon) + output.pop_back(); + if (area < -epsilon || output.size() == top_count) { + output.push_back(c); + i++; + } } - - private: - Edge *m_end; - Edge *m_current; - }; - - EdgeIterator edges() - { - return EdgeIterator(edge); - } - EdgeIterator edges(Edge *e) - { - xaDebugAssert(contains(e)); - return EdgeIterator(e); + // Remove duplicate element. + XA_DEBUG_ASSERT(output.front() == output.back()); + output.pop_back(); } - // The iterator that visits the edges of this face in clockwise order. - class ConstEdgeIterator //: public Iterator<const Edge *> - { - public: - ConstEdgeIterator(const Edge *e) : m_end(NULL), m_current(e) { } - ConstEdgeIterator(const EdgeIterator &it) : m_end(NULL), m_current(it.current()) { } + Array<float> m_coords; + Array<Vector2> m_top, m_bottom, m_hull; + Vector2 m_majorAxis, m_minorAxis, m_minCorner, m_maxCorner; +}; - virtual void advance() - { - if (m_end == NULL) m_end = m_current; - m_current = m_current->next; - } +static uint32_t meshEdgeFace(uint32_t edge) { return edge / 3; } +static uint32_t meshEdgeIndex0(uint32_t edge) { return edge; } - virtual bool isDone() const - { - return m_end == m_current; - } - virtual const Edge *current() const - { - return m_current; - } - const Vertex *vertex() const - { - return m_current->vertex; - } - - private: - const Edge *m_end; - const Edge *m_current; - }; +static uint32_t meshEdgeIndex1(uint32_t edge) +{ + const uint32_t faceFirstEdge = edge / 3 * 3; + return faceFirstEdge + (edge - faceFirstEdge + 1) % 3; +} - ConstEdgeIterator edges() const - { - return ConstEdgeIterator(edge); - } - ConstEdgeIterator edges(const Edge *e) const +struct MeshFlags +{ + enum { - xaDebugAssert(contains(e)); - return ConstEdgeIterator(e); - } + HasFaceGroups = 1<<0, + HasIgnoredFaces = 1<<1, + HasNormals = 1<<2 + }; }; -/// Simple half edge mesh designed for dynamic mesh manipulation. +class Mesh; +static void meshGetBoundaryLoops(const Mesh &mesh, Array<uint32_t> &boundaryLoops); + class Mesh { public: - Mesh() : m_colocalVertexCount(0) {} - - Mesh(const Mesh *mesh) - { - // Copy mesh vertices. - const uint32_t vertexCount = mesh->vertexCount(); - m_vertexArray.resize(vertexCount); - for (uint32_t v = 0; v < vertexCount; v++) { - const Vertex *vertex = mesh->vertexAt(v); - xaDebugAssert(vertex->id == v); - m_vertexArray[v] = new Vertex(v); - m_vertexArray[v]->pos = vertex->pos; - m_vertexArray[v]->nor = vertex->nor; - m_vertexArray[v]->tex = vertex->tex; - } - m_colocalVertexCount = vertexCount; - // Copy mesh faces. - const uint32_t faceCount = mesh->faceCount(); - std::vector<uint32_t> indexArray; - indexArray.reserve(3); - for (uint32_t f = 0; f < faceCount; f++) { - const Face *face = mesh->faceAt(f); - for (Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const Vertex *vertex = it.current()->from(); - indexArray.push_back(vertex->id); - } - addFace(indexArray); - indexArray.clear(); - } - } - - ~Mesh() - { - clear(); - } - - void clear() - { - for (size_t i = 0; i < m_vertexArray.size(); i++) - delete m_vertexArray[i]; - m_vertexArray.clear(); - for (auto it = m_edgeMap.begin(); it != m_edgeMap.end(); it++) - delete it->second; - m_edgeArray.clear(); - m_edgeMap.clear(); - for (size_t i = 0; i < m_faceArray.size(); i++) - delete m_faceArray[i]; - m_faceArray.clear(); - } - - Vertex *addVertex(const Vector3 &pos) + Mesh(float epsilon, uint32_t approxVertexCount, uint32_t approxFaceCount, uint32_t flags = 0, uint32_t id = UINT32_MAX) : m_epsilon(epsilon), m_flags(flags), m_id(id), m_faceIgnore(MemTag::Mesh), m_faceGroups(MemTag::Mesh), m_indices(MemTag::MeshIndices), m_positions(MemTag::MeshPositions), m_normals(MemTag::MeshNormals), m_texcoords(MemTag::MeshTexcoords), m_colocalVertexCount(0), m_nextColocalVertex(MemTag::MeshColocals), m_boundaryVertices(MemTag::MeshBoundaries), m_oppositeEdges(MemTag::MeshBoundaries), m_nextBoundaryEdges(MemTag::MeshBoundaries), m_edgeMap(MemTag::MeshEdgeMap, approxFaceCount * 3) { - xaDebugAssert(isFinite(pos)); - Vertex *v = new Vertex(m_vertexArray.size()); - v->pos = pos; - m_vertexArray.push_back(v); - return v; + m_indices.reserve(approxFaceCount * 3); + m_positions.reserve(approxVertexCount); + m_texcoords.reserve(approxVertexCount); + if (m_flags & MeshFlags::HasFaceGroups) + m_faceGroups.reserve(approxFaceCount); + if (m_flags & MeshFlags::HasIgnoredFaces) + m_faceIgnore.reserve(approxFaceCount); + if (m_flags & MeshFlags::HasNormals) + m_normals.reserve(approxVertexCount); } - /// Link colocal vertices based on geometric location only. - void linkColocals() - { - xaPrint("--- Linking colocals:\n"); - const uint32_t vertexCount = this->vertexCount(); - std::unordered_map<Vector3, Vertex *, Hash<Vector3>, Equal<Vector3> > vertexMap; - vertexMap.reserve(vertexCount); - for (uint32_t v = 0; v < vertexCount; v++) { - Vertex *vertex = vertexAt(v); - Vertex *colocal = vertexMap[vertex->pos]; - if (colocal) { - colocal->linkColocal(vertex); - } else { - vertexMap[vertex->pos] = vertex; - } - } - m_colocalVertexCount = vertexMap.size(); - xaPrint("--- %d vertex positions.\n", m_colocalVertexCount); - // @@ Remove duplicated vertices? or just leave them as colocals? - } + uint32_t flags() const { return m_flags; } + uint32_t id() const { return m_id; } - void linkColocalsWithCanonicalMap(const std::vector<uint32_t> &canonicalMap) + void addVertex(const Vector3 &pos, const Vector3 &normal = Vector3(0.0f), const Vector2 &texcoord = Vector2(0.0f)) { - xaPrint("--- Linking colocals:\n"); - uint32_t vertexMapSize = 0; - for (uint32_t i = 0; i < canonicalMap.size(); i++) { - vertexMapSize = std::max(vertexMapSize, canonicalMap[i] + 1); - } - std::vector<Vertex *> vertexMap; - vertexMap.resize(vertexMapSize, NULL); - m_colocalVertexCount = 0; - const uint32_t vertexCount = this->vertexCount(); - for (uint32_t v = 0; v < vertexCount; v++) { - Vertex *vertex = vertexAt(v); - Vertex *colocal = vertexMap[canonicalMap[v]]; - if (colocal != NULL) { - xaDebugAssert(vertex->pos == colocal->pos); - colocal->linkColocal(vertex); - } else { - vertexMap[canonicalMap[v]] = vertex; - m_colocalVertexCount++; - } - } - xaPrint("--- %d vertex positions.\n", m_colocalVertexCount); + XA_DEBUG_ASSERT(isFinite(pos)); + m_positions.push_back(pos); + if (m_flags & MeshFlags::HasNormals) + m_normals.push_back(normal); + m_texcoords.push_back(texcoord); } - Face *addFace() + struct AddFaceResult { - Face *f = new Face(m_faceArray.size()); - m_faceArray.push_back(f); - return f; - } + enum Enum + { + OK, + DuplicateEdge = 1 + }; + }; - Face *addFace(uint32_t v0, uint32_t v1, uint32_t v2) + AddFaceResult::Enum addFace(uint32_t v0, uint32_t v1, uint32_t v2, bool ignore = false, bool hashEdge = true) { uint32_t indexArray[3]; indexArray[0] = v0; indexArray[1] = v1; indexArray[2] = v2; - return addFace(indexArray, 3, 0, 3); - } - - Face *addFace(uint32_t v0, uint32_t v1, uint32_t v2, uint32_t v3) - { - uint32_t indexArray[4]; - indexArray[0] = v0; - indexArray[1] = v1; - indexArray[2] = v2; - indexArray[3] = v3; - return addFace(indexArray, 4, 0, 4); + return addFace(indexArray, ignore, hashEdge); } - Face *addFace(const std::vector<uint32_t> &indexArray) + AddFaceResult::Enum addFace(const uint32_t *indices, bool ignore = false, bool hashEdge = true) { - return addFace(indexArray, 0, indexArray.size()); + AddFaceResult::Enum result = AddFaceResult::OK; + if (m_flags & MeshFlags::HasFaceGroups) + m_faceGroups.push_back(UINT32_MAX); + if (m_flags & MeshFlags::HasIgnoredFaces) + m_faceIgnore.push_back(ignore); + const uint32_t firstIndex = m_indices.size(); + for (uint32_t i = 0; i < 3; i++) + m_indices.push_back(indices[i]); + if (hashEdge) { + for (uint32_t i = 0; i < 3; i++) { + const uint32_t vertex0 = m_indices[firstIndex + i]; + const uint32_t vertex1 = m_indices[firstIndex + (i + 1) % 3]; + const EdgeKey key(vertex0, vertex1); + if (m_edgeMap.get(key) != UINT32_MAX) + result = AddFaceResult::DuplicateEdge; + m_edgeMap.add(key, firstIndex + i); + } + } + return result; } - Face *addFace(const std::vector<uint32_t> &indexArray, uint32_t first, uint32_t num) + void createColocals() { - return addFace(indexArray.data(), (uint32_t)indexArray.size(), first, num); + const uint32_t vertexCount = m_positions.size(); + Array<AABB> aabbs; + aabbs.resize(vertexCount); + for (uint32_t i = 0; i < m_positions.size(); i++) + aabbs[i] = AABB(m_positions[i], m_epsilon); + BVH bvh(aabbs); + Array<uint32_t> colocals; + Array<uint32_t> potential; + m_colocalVertexCount = 0; + m_nextColocalVertex.resize(vertexCount, UINT32_MAX); + for (uint32_t i = 0; i < vertexCount; i++) { + if (m_nextColocalVertex[i] != UINT32_MAX) + continue; // Already linked. + // Find other vertices colocal to this one. + colocals.clear(); + colocals.push_back(i); // Always add this vertex. + bvh.query(AABB(m_positions[i], m_epsilon), potential); + for (uint32_t j = 0; j < potential.size(); j++) { + const uint32_t otherVertex = potential[j]; + if (otherVertex != i && equal(m_positions[i], m_positions[otherVertex], m_epsilon) && m_nextColocalVertex[otherVertex] == UINT32_MAX) + colocals.push_back(otherVertex); + } + if (colocals.size() == 1) { + // No colocals for this vertex. + m_nextColocalVertex[i] = i; + continue; + } + m_colocalVertexCount += colocals.size(); + // Link in ascending order. + insertionSort(colocals.data(), colocals.size()); + for (uint32_t j = 0; j < colocals.size(); j++) + m_nextColocalVertex[colocals[j]] = colocals[(j + 1) % colocals.size()]; + XA_DEBUG_ASSERT(m_nextColocalVertex[i] != UINT32_MAX); + } } - Face *addFace(const uint32_t *indexArray, uint32_t indexCount, uint32_t first, uint32_t num) + // Check if the face duplicates any edges of any face already in the group. + bool faceDuplicatesGroupEdge(uint32_t group, uint32_t face) const { - xaDebugAssert(first < indexCount); - xaDebugAssert(num <= indexCount - first); - xaDebugAssert(num > 2); - if (!canAddFace(indexArray, first, num)) { - return NULL; - } - Face *f = new Face(m_faceArray.size()); - Edge *firstEdge = NULL; - Edge *last = NULL; - Edge *current = NULL; - for (uint32_t i = 0; i < num - 1; i++) { - current = addEdge(indexArray[first + i], indexArray[first + i + 1]); - xaAssert(current != NULL && current->face == NULL); - current->face = f; - if (last != NULL) last->setNext(current); - else firstEdge = current; - last = current; + for (FaceEdgeIterator edgeIt(this, face); !edgeIt.isDone(); edgeIt.advance()) { + for (ColocalEdgeIterator colocalEdgeIt(this, edgeIt.vertex0(), edgeIt.vertex1()); !colocalEdgeIt.isDone(); colocalEdgeIt.advance()) { + if (m_faceGroups[meshEdgeFace(colocalEdgeIt.edge())] == group) + return true; + } } - current = addEdge(indexArray[first + num - 1], indexArray[first]); - xaAssert(current != NULL && current->face == NULL); - current->face = f; - last->setNext(current); - current->setNext(firstEdge); - f->edge = firstEdge; - m_faceArray.push_back(f); - return f; + return false; } - // -- GODOT start -- - Face *addUniqueFace(uint32_t v0, uint32_t v1, uint32_t v2) { - - int base_vertex = m_vertexArray.size(); - - uint32_t ids[3] = { v0, v1, v2 }; - - Vector3 base[3] = { - m_vertexArray[v0]->pos, - m_vertexArray[v1]->pos, - m_vertexArray[v2]->pos, - }; - - //make sure its not a degenerate - bool degenerate = distanceSquared(base[0], base[1]) < NV_EPSILON || distanceSquared(base[0], base[2]) < NV_EPSILON || distanceSquared(base[1], base[2]) < NV_EPSILON; - xaDebugAssert(!degenerate); - - float min_x = 0; - - for (int i = 0; i < 3; i++) { - if (i == 0 || m_vertexArray[v0]->pos.x < min_x) { - min_x = m_vertexArray[v0]->pos.x; + // Check if the face mirrors any face already in the group. + // i.e. don't want two-sided faces in the same group. + // A face mirrors another face if all edges match with opposite winding. + bool faceMirrorsGroupFace(uint32_t group, uint32_t face) const + { + FaceEdgeIterator edgeIt(this, face); + for (ColocalEdgeIterator colocalEdgeIt(this, edgeIt.vertex1(), edgeIt.vertex0()); !colocalEdgeIt.isDone(); colocalEdgeIt.advance()) { + const uint32_t candidateFace = meshEdgeFace(colocalEdgeIt.edge()); + if (m_faceGroups[candidateFace] == group) { + // Found a match for mirrored first edge, try the other edges. + bool match = false; + for (; !edgeIt.isDone(); edgeIt.advance()) { + match = false; + for (ColocalEdgeIterator colocalEdgeIt2(this, edgeIt.vertex1(), edgeIt.vertex0()); !colocalEdgeIt2.isDone(); colocalEdgeIt2.advance()) { + if (meshEdgeFace(colocalEdgeIt2.edge()) == candidateFace) { + match = true; + break; + } + } + if (!match) + break; + } + if (match) + return true; // All edges are mirrored in this face. + // Try the next face. + edgeIt = FaceEdgeIterator(this, candidateFace); } } + return false; + } - float max_x = 0; - - for (int j = 0; j < m_vertexArray.size(); j++) { - if (j == 0 || m_vertexArray[j]->pos.x > max_x) { //vertex already exists - max_x = m_vertexArray[j]->pos.x; + void createFaceGroups() + { + uint32_t group = 0; + Array<uint32_t> growFaces; + for (;;) { + // Find an unassigned face. + uint32_t face = UINT32_MAX; + for (uint32_t f = 0; f < faceCount(); f++) { + if (m_faceGroups[f] == UINT32_MAX && !isFaceIgnored(f)) { + face = f; + break; + } } + if (face == UINT32_MAX) + break; // All faces assigned to a group (except ignored faces). + m_faceGroups[face] = group; + growFaces.clear(); + growFaces.push_back(face); + // Find faces connected to the face and assign them to the same group as the face, unless they are already assigned to another group. + for (;;) { + if (growFaces.isEmpty()) + break; + const uint32_t f = growFaces.back(); + growFaces.pop_back(); + for (FaceEdgeIterator edgeIt(this, f); !edgeIt.isDone(); edgeIt.advance()) { + // Iterate opposite edges. There may be more than one - non-manifold geometry can have duplicate edges. + // Prioritize the one with exact vertex match, not just colocal. + // If *any* of the opposite edges are already assigned to this group, don't do anything. + bool alreadyAssignedToThisGroup = false; + uint32_t bestConnectedFace = UINT32_MAX; + for (ColocalEdgeIterator oppositeEdgeIt(this, edgeIt.vertex1(), edgeIt.vertex0()); !oppositeEdgeIt.isDone(); oppositeEdgeIt.advance()) { + const uint32_t oppositeEdge = oppositeEdgeIt.edge(); + const uint32_t oppositeFace = meshEdgeFace(oppositeEdge); + if (isFaceIgnored(oppositeFace)) + continue; // Don't add ignored faces to group. + if (m_faceGroups[oppositeFace] == group) { + alreadyAssignedToThisGroup = true; + break; + } + if (m_faceGroups[oppositeFace] != UINT32_MAX) + continue; // Connected face is already assigned to another group. + if (faceDuplicatesGroupEdge(group, oppositeFace)) + continue; // Don't want duplicate edges in a group. + if (faceMirrorsGroupFace(group, oppositeFace)) + continue; // Don't want two-sided faces in a group. + const uint32_t oppositeVertex0 = m_indices[meshEdgeIndex0(oppositeEdge)]; + const uint32_t oppositeVertex1 = m_indices[meshEdgeIndex1(oppositeEdge)]; + if (bestConnectedFace == UINT32_MAX || (oppositeVertex0 == edgeIt.vertex1() && oppositeVertex1 == edgeIt.vertex0())) + bestConnectedFace = oppositeFace; + } + if (!alreadyAssignedToThisGroup && bestConnectedFace != UINT32_MAX) { + m_faceGroups[bestConnectedFace] = group; + growFaces.push_back(bestConnectedFace); + } + } + } + group++; } - - //separate from everything else, in x axis - for (int i = 0; i < 3; i++) { - - base[i].x -= min_x; - base[i].x += max_x + 10.0; - } - - for (int i = 0; i < 3; i++) { - Vertex *v = new Vertex(m_vertexArray.size()); - v->pos = base[i]; - v->nor = m_vertexArray[ids[i]]->nor, - v->tex = m_vertexArray[ids[i]]->tex, - - v->original_id = ids[i]; - m_vertexArray.push_back(v); - } - - uint32_t indexArray[3]; - indexArray[0] = base_vertex + 0; - indexArray[1] = base_vertex + 1; - indexArray[2] = base_vertex + 2; - return addFace(indexArray, 3, 0, 3); } - // -- GODOT end -- - // These functions disconnect the given element from the mesh and delete it. - - // @@ We must always disconnect edge pairs simultaneously. - void disconnect(Edge *edge) + void createBoundaries() { - xaDebugAssert(edge != NULL); - // Remove from edge list. - if ((edge->id & 1) == 0) { - xaDebugAssert(m_edgeArray[edge->id / 2] == edge); - m_edgeArray[edge->id / 2] = NULL; - } - // Remove edge from map. @@ Store map key inside edge? - xaDebugAssert(edge->from() != NULL && edge->to() != NULL); - size_t removed = m_edgeMap.erase(Key(edge->from()->id, edge->to()->id)); - xaDebugAssert(removed == 1); -#ifdef NDEBUG - removed = 0; // silence unused parameter warning + const uint32_t edgeCount = m_indices.size(); + const uint32_t vertexCount = m_positions.size(); + m_oppositeEdges.resize(edgeCount); + m_boundaryVertices.resize(vertexCount); + for (uint32_t i = 0; i < edgeCount; i++) + m_oppositeEdges[i] = UINT32_MAX; + for (uint32_t i = 0; i < vertexCount; i++) + m_boundaryVertices[i] = false; + const bool hasFaceGroups = m_flags & MeshFlags::HasFaceGroups; + for (uint32_t i = 0; i < faceCount(); i++) { + if (isFaceIgnored(i)) + continue; + for (uint32_t j = 0; j < 3; j++) { + const uint32_t vertex0 = m_indices[i * 3 + j]; + const uint32_t vertex1 = m_indices[i * 3 + (j + 1) % 3]; + // If there is an edge with opposite winding to this one, the edge isn't on a boundary. + const uint32_t oppositeEdge = findEdge(hasFaceGroups ? m_faceGroups[i] : UINT32_MAX, vertex1, vertex0); + if (oppositeEdge != UINT32_MAX) { +#if XA_DEBUG + if (hasFaceGroups) + XA_DEBUG_ASSERT(m_faceGroups[meshEdgeFace(oppositeEdge)] == m_faceGroups[i]); #endif - // Disconnect from vertex. - if (edge->vertex != NULL) { - if (edge->vertex->edge == edge) { - if (edge->prev && edge->prev->pair) { - edge->vertex->edge = edge->prev->pair; - } else if (edge->pair && edge->pair->next) { - edge->vertex->edge = edge->pair->next; + XA_DEBUG_ASSERT(!isFaceIgnored(meshEdgeFace(oppositeEdge))); + m_oppositeEdges[i * 3 + j] = oppositeEdge; } else { - edge->vertex->edge = NULL; - // @@ Remove disconnected vertex? + m_boundaryVertices[vertex0] = m_boundaryVertices[vertex1] = true; } } } - // Disconnect from face. - if (edge->face != NULL) { - if (edge->face->edge == edge) { - if (edge->next != NULL && edge->next != edge) { - edge->face->edge = edge->next; - } else if (edge->prev != NULL && edge->prev != edge) { - edge->face->edge = edge->prev; - } else { - edge->face->edge = NULL; - // @@ Remove disconnected face? + } + + void linkBoundaries() + { + const uint32_t edgeCount = m_indices.size(); + HashMap<uint32_t, uint32_t> vertexToEdgeMap(MemTag::Mesh, edgeCount); + for (uint32_t i = 0; i < edgeCount; i++) { + const uint32_t vertex0 = m_indices[meshEdgeIndex0(i)]; + const uint32_t vertex1 = m_indices[meshEdgeIndex1(i)]; + vertexToEdgeMap.add(vertex0, i); + vertexToEdgeMap.add(vertex1, i); + } + m_nextBoundaryEdges.resize(edgeCount); + for (uint32_t i = 0; i < edgeCount; i++) + m_nextBoundaryEdges[i] = UINT32_MAX; + uint32_t numBoundaryLoops = 0, numUnclosedBoundaries = 0; + BitArray linkedEdges(edgeCount); + linkedEdges.clearAll(); + for (;;) { + // Find the first boundary edge that hasn't been linked yet. + uint32_t firstEdge = UINT32_MAX; + for (uint32_t i = 0; i < edgeCount; i++) { + if (m_oppositeEdges[i] == UINT32_MAX && !linkedEdges.bitAt(i)) { + firstEdge = i; + break; } } - } - // Disconnect from previous. - if (edge->prev) { - if (edge->prev->next == edge) { - edge->prev->setNext(NULL); + if (firstEdge == UINT32_MAX) + break; + uint32_t currentEdge = firstEdge; + for (;;) { + // Find the next boundary edge. The first vertex will be the same as (or colocal to) the current edge second vertex. + const uint32_t startVertex = m_indices[meshEdgeIndex1(currentEdge)]; + uint32_t bestNextEdge = UINT32_MAX; + for (ColocalVertexIterator it(this, startVertex); !it.isDone(); it.advance()) { + uint32_t mapOtherEdgeIndex = vertexToEdgeMap.get(it.vertex()); + while (mapOtherEdgeIndex != UINT32_MAX) { + const uint32_t otherEdge = vertexToEdgeMap.value(mapOtherEdgeIndex); + if (m_oppositeEdges[otherEdge] != UINT32_MAX) + goto next; // Not a boundary edge. + if (linkedEdges.bitAt(otherEdge)) + goto next; // Already linked. + if (m_flags & MeshFlags::HasFaceGroups && m_faceGroups[meshEdgeFace(currentEdge)] != m_faceGroups[meshEdgeFace(otherEdge)]) + goto next; // Don't cross face groups. + if (isFaceIgnored(meshEdgeFace(otherEdge))) + goto next; // Face is ignored. + if (m_indices[meshEdgeIndex0(otherEdge)] != it.vertex()) + goto next; // Edge contains the vertex, but it's the wrong one. + // First edge (closing the boundary loop) has the highest priority. + // Non-colocal vertex has the next highest. + if (bestNextEdge != firstEdge && (bestNextEdge == UINT32_MAX || it.vertex() == startVertex)) + bestNextEdge = otherEdge; + next: + mapOtherEdgeIndex = vertexToEdgeMap.getNext(mapOtherEdgeIndex); + } + } + if (bestNextEdge == UINT32_MAX) { + numUnclosedBoundaries++; + if (currentEdge == firstEdge) + linkedEdges.setBitAt(firstEdge); // Only 1 edge in this boundary "loop". + break; // Can't find a next edge. + } + m_nextBoundaryEdges[currentEdge] = bestNextEdge; + linkedEdges.setBitAt(bestNextEdge); + currentEdge = bestNextEdge; + if (currentEdge == firstEdge) { + numBoundaryLoops++; + break; // Closed the boundary loop. + } } - //edge->setPrev(NULL); } - // Disconnect from next. - if (edge->next) { - if (edge->next->prev == edge) { - edge->next->setPrev(NULL); + // Find internal boundary loops and separate them. + // Detect by finding two edges in a boundary loop that have a colocal end vertex. + // Fix by swapping their next boundary edge. + // Need to start over after every fix since known boundary loops have changed. + Array<uint32_t> boundaryLoops; + fixInternalBoundary: + meshGetBoundaryLoops(*this, boundaryLoops); + for (uint32_t loop = 0; loop < boundaryLoops.size(); loop++) { + linkedEdges.clearAll(); + for (Mesh::BoundaryEdgeIterator it1(this, boundaryLoops[loop]); !it1.isDone(); it1.advance()) { + const uint32_t e1 = it1.edge(); + if (linkedEdges.bitAt(e1)) + continue; + for (Mesh::BoundaryEdgeIterator it2(this, boundaryLoops[loop]); !it2.isDone(); it2.advance()) { + const uint32_t e2 = it2.edge(); + if (e1 == e2 || !isBoundaryEdge(e2) || linkedEdges.bitAt(e2)) + continue; + if (!areColocal(m_indices[meshEdgeIndex1(e1)], m_indices[meshEdgeIndex1(e2)])) + continue; + swap(m_nextBoundaryEdges[e1], m_nextBoundaryEdges[e2]); + linkedEdges.setBitAt(e1); + linkedEdges.setBitAt(e2); + goto fixInternalBoundary; // start over + } } - //edge->setNext(NULL); } } - void remove(Edge *edge) - { - xaDebugAssert(edge != NULL); - disconnect(edge); - delete edge; + /// Find edge, test all colocals. + uint32_t findEdge(uint32_t faceGroup, uint32_t vertex0, uint32_t vertex1) const + { + uint32_t result = UINT32_MAX; + if (m_nextColocalVertex.isEmpty()) { + EdgeKey key(vertex0, vertex1); + uint32_t mapEdgeIndex = m_edgeMap.get(key); + while (mapEdgeIndex != UINT32_MAX) { + const uint32_t edge = m_edgeMap.value(mapEdgeIndex); + // Don't find edges of ignored faces. + if ((faceGroup == UINT32_MAX || m_faceGroups[meshEdgeFace(edge)] == faceGroup) && !isFaceIgnored(meshEdgeFace(edge))) { + //XA_DEBUG_ASSERT(m_id != UINT32_MAX || (m_id == UINT32_MAX && result == UINT32_MAX)); // duplicate edge - ignore on initial meshes + result = edge; +#if !XA_DEBUG + return result; +#endif + } + mapEdgeIndex = m_edgeMap.getNext(mapEdgeIndex); + } + } else { + for (ColocalVertexIterator it0(this, vertex0); !it0.isDone(); it0.advance()) { + for (ColocalVertexIterator it1(this, vertex1); !it1.isDone(); it1.advance()) { + EdgeKey key(it0.vertex(), it1.vertex()); + uint32_t mapEdgeIndex = m_edgeMap.get(key); + while (mapEdgeIndex != UINT32_MAX) { + const uint32_t edge = m_edgeMap.value(mapEdgeIndex); + // Don't find edges of ignored faces. + if ((faceGroup == UINT32_MAX || m_faceGroups[meshEdgeFace(edge)] == faceGroup) && !isFaceIgnored(meshEdgeFace(edge))) { + XA_DEBUG_ASSERT(m_id != UINT32_MAX || (m_id == UINT32_MAX && result == UINT32_MAX)); // duplicate edge - ignore on initial meshes + result = edge; +#if !XA_DEBUG + return result; +#endif + } + mapEdgeIndex = m_edgeMap.getNext(mapEdgeIndex); + } + } + } + } + return result; } - void remove(Vertex *vertex) +#if XA_DEBUG_EXPORT_OBJ + void writeObjVertices(FILE *file) const { - xaDebugAssert(vertex != NULL); - // Remove from vertex list. - m_vertexArray[vertex->id] = NULL; - // Disconnect from colocals. - vertex->unlinkColocal(); - // Disconnect from edges. - if (vertex->edge != NULL) { - // @@ Removing a connected vertex is asking for trouble... - if (vertex->edge->vertex == vertex) { - // @@ Connect edge to a colocal? - vertex->edge->vertex = NULL; - } - vertex->setEdge(NULL); + for (uint32_t i = 0; i < m_positions.size(); i++) + fprintf(file, "v %g %g %g\n", m_positions[i].x, m_positions[i].y, m_positions[i].z); + if (m_flags & MeshFlags::HasNormals) { + for (uint32_t i = 0; i < m_normals.size(); i++) + fprintf(file, "vn %g %g %g\n", m_normals[i].x, m_normals[i].y, m_normals[i].z); } - delete vertex; + for (uint32_t i = 0; i < m_texcoords.size(); i++) + fprintf(file, "vt %g %g\n", m_texcoords[i].x, m_texcoords[i].y); } - void remove(Face *face) + void writeObjFace(FILE *file, uint32_t face) const { - xaDebugAssert(face != NULL); - // Remove from face list. - m_faceArray[face->id] = NULL; - // Disconnect from edges. - if (face->edge != NULL) { - xaDebugAssert(face->edge->face == face); - face->edge->face = NULL; - face->edge = NULL; + fprintf(file, "f "); + for (uint32_t j = 0; j < 3; j++) { + const uint32_t index = m_indices[face * 3 + j] + 1; // 1-indexed + fprintf(file, "%d/%d/%d%c", index, index, index, j == 2 ? '\n' : ' '); } - delete face; } - // Triangulate in place. - void triangulate() + void writeObjBoundaryEges(FILE *file) const { - bool all_triangles = true; - const uint32_t faceCount = m_faceArray.size(); - for (uint32_t f = 0; f < faceCount; f++) { - Face *face = m_faceArray[f]; - if (face->edgeCount() != 3) { - all_triangles = false; - break; - } - } - if (all_triangles) { - return; - } - // Do not touch vertices, but rebuild edges and faces. - std::vector<Edge *> edgeArray; - std::vector<Face *> faceArray; - std::swap(edgeArray, m_edgeArray); - std::swap(faceArray, m_faceArray); - m_edgeMap.clear(); - for (uint32_t f = 0; f < faceCount; f++) { - Face *face = faceArray[f]; - // Trivial fan-like triangulation. - const uint32_t v0 = face->edge->vertex->id; - uint32_t v2, v1 = (uint32_t)-1; - for (Face::EdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - Edge *edge = it.current(); - v2 = edge->to()->id; - if (v2 == v0) break; - if (v1 != -1) addFace(v0, v1, v2); - v1 = v2; - } - } - xaDebugAssert(m_faceArray.size() > faceCount); // triangle count > face count - linkBoundary(); - for (size_t i = 0; i < edgeArray.size(); i++) - delete edgeArray[i]; - for (size_t i = 0; i < faceArray.size(); i++) - delete faceArray[i]; - } - - /// Link boundary edges once the mesh has been created. - void linkBoundary() - { - xaPrint("--- Linking boundaries:\n"); - int num = 0; - // Create boundary edges. - uint32_t edgeCount = this->edgeCount(); - for (uint32_t e = 0; e < edgeCount; e++) { - Edge *edge = edgeAt(e); - if (edge != NULL && edge->pair == NULL) { - Edge *pair = new Edge(edge->id + 1); - uint32_t i = edge->from()->id; - uint32_t j = edge->next->from()->id; - Key key(j, i); - xaAssert(m_edgeMap.find(key) == m_edgeMap.end()); - pair->vertex = m_vertexArray[j]; - m_edgeMap[key] = pair; - edge->pair = pair; - pair->pair = edge; - num++; - } - } - // Link boundary edges. - for (uint32_t e = 0; e < edgeCount; e++) { - Edge *edge = edgeAt(e); - if (edge != NULL && edge->pair->face == NULL) { - linkBoundaryEdge(edge->pair); + if (m_oppositeEdges.isEmpty()) + return; // Boundaries haven't been created. + fprintf(file, "o boundary_edges\n"); + for (uint32_t i = 0; i < edgeCount(); i++) { + if (m_oppositeEdges[i] != UINT32_MAX) + continue; + fprintf(file, "l %d %d\n", m_indices[meshEdgeIndex0(i)] + 1, m_indices[meshEdgeIndex1(i)] + 1); // 1-indexed + } + } + + void writeObjLinkedBoundaries(FILE *file) const + { + if (m_oppositeEdges.isEmpty() || m_nextBoundaryEdges.isEmpty()) + return; // Boundaries haven't been created and/or linked. + Array<uint32_t> boundaryLoops; + meshGetBoundaryLoops(*this, boundaryLoops); + for (uint32_t i = 0; i < boundaryLoops.size(); i++) { + uint32_t edge = boundaryLoops[i]; + fprintf(file, "o boundary_%04d\n", i); + fprintf(file, "l"); + for (;;) { + const uint32_t vertex0 = m_indices[meshEdgeIndex0(edge)]; + const uint32_t vertex1 = m_indices[meshEdgeIndex1(edge)]; + fprintf(file, " %d", vertex0 + 1); // 1-indexed + edge = m_nextBoundaryEdges[edge]; + if (edge == boundaryLoops[i] || edge == UINT32_MAX) { + fprintf(file, " %d\n", vertex1 + 1); // 1-indexed + break; + } } } - xaPrint("--- %d boundary edges.\n", num); } - /* - Fixing T-junctions. + void writeObjFile(const char *filename) const + { + FILE *file; + XA_FOPEN(file, filename, "w"); + if (!file) + return; + writeObjVertices(file); + fprintf(file, "s off\n"); + fprintf(file, "o object\n"); + for (uint32_t i = 0; i < faceCount(); i++) + writeObjFace(file, i); + writeObjBoundaryEges(file); + writeObjLinkedBoundaries(file); + fclose(file); + } +#endif - - Find T-junctions. Find vertices that are on an edge. - - This test is approximate. - - Insert edges on a spatial index to speedup queries. - - Consider only open edges, that is edges that have no pairs. - - Consider only vertices on boundaries. - - Close T-junction. - - Split edge. + float computeSurfaceArea() const + { + float area = 0; + for (uint32_t f = 0; f < faceCount(); f++) + area += faceArea(f); + XA_DEBUG_ASSERT(area >= 0); + return area; + } - */ - bool splitBoundaryEdges() // Returns true if any split was made. - { - std::vector<Vertex *> boundaryVertices; - for (uint32_t i = 0; i < m_vertexArray.size(); i++) { - Vertex *v = m_vertexArray[i]; - if (v->isBoundary()) { - boundaryVertices.push_back(v); - } - } - xaPrint("Fixing T-junctions:\n"); - int splitCount = 0; - for (uint32_t v = 0; v < boundaryVertices.size(); v++) { - Vertex *vertex = boundaryVertices[v]; - Vector3 x0 = vertex->pos; - // Find edges that this vertex overlaps with. - for (uint32_t e = 0; e < m_edgeArray.size(); e++) { - Edge *edge = m_edgeArray[e]; - if (edge != NULL && edge->isBoundary()) { - if (edge->from() == vertex || edge->to() == vertex) { - continue; - } - Vector3 x1 = edge->from()->pos; - Vector3 x2 = edge->to()->pos; - Vector3 v01 = x0 - x1; - Vector3 v21 = x2 - x1; - float l = length(v21); - float d = length(cross(v01, v21)) / l; - if (isZero(d)) { - float t = dot(v01, v21) / (l * l); - if (t > 0.0f + NV_EPSILON && t < 1.0f - NV_EPSILON) { - xaDebugAssert(equal(lerp(x1, x2, t), x0)); - Vertex *splitVertex = splitBoundaryEdge(edge, t, x0); - vertex->linkColocal(splitVertex); // @@ Should we do this here? - splitCount++; - } - } - } - } - } - xaPrint(" - %d edges split.\n", splitCount); - xaDebugAssert(isValid()); - return splitCount != 0; + float computeParametricArea() const + { + float area = 0; + for (uint32_t f = 0; f < faceCount(); f++) + area += faceParametricArea(f); + return fabsf(area); // May be negative, depends on texcoord winding. } - // Vertices - uint32_t vertexCount() const + float faceArea(uint32_t face) const { - return m_vertexArray.size(); + const Vector3 &p0 = m_positions[m_indices[face * 3 + 0]]; + const Vector3 &p1 = m_positions[m_indices[face * 3 + 1]]; + const Vector3 &p2 = m_positions[m_indices[face * 3 + 2]]; + return length(cross(p1 - p0, p2 - p0)) * 0.5f; } - const Vertex *vertexAt(int i) const + + Vector3 faceCentroid(uint32_t face) const { - return m_vertexArray[i]; + Vector3 sum(0.0f); + for (uint32_t i = 0; i < 3; i++) + sum += m_positions[m_indices[face * 3 + i]]; + return sum / 3.0f; } - Vertex *vertexAt(int i) + + Vector3 calculateFaceNormal(uint32_t face) const { - return m_vertexArray[i]; + return normalizeSafe(triangleNormalAreaScaled(face), Vector3(0, 0, 1), 0.0f); } - uint32_t colocalVertexCount() const + float faceParametricArea(uint32_t face) const { - return m_colocalVertexCount; + const Vector2 &t0 = m_texcoords[m_indices[face * 3 + 0]]; + const Vector2 &t1 = m_texcoords[m_indices[face * 3 + 1]]; + const Vector2 &t2 = m_texcoords[m_indices[face * 3 + 2]]; + return triangleArea(t0, t1, t2) * 0.5f; + } + + // Average of the edge midpoints weighted by the edge length. + // I want a point inside the triangle, but closer to the cirumcenter. + Vector3 triangleCenter(uint32_t face) const + { + const Vector3 &p0 = m_positions[m_indices[face * 3 + 0]]; + const Vector3 &p1 = m_positions[m_indices[face * 3 + 1]]; + const Vector3 &p2 = m_positions[m_indices[face * 3 + 2]]; + const float l0 = length(p1 - p0); + const float l1 = length(p2 - p1); + const float l2 = length(p0 - p2); + const Vector3 m0 = (p0 + p1) * l0 / (l0 + l1 + l2); + const Vector3 m1 = (p1 + p2) * l1 / (l0 + l1 + l2); + const Vector3 m2 = (p2 + p0) * l2 / (l0 + l1 + l2); + return m0 + m1 + m2; } - // Faces - uint32_t faceCount() const + // Unnormalized face normal assuming it's a triangle. + Vector3 triangleNormal(uint32_t face) const { - return m_faceArray.size(); + return normalizeSafe(triangleNormalAreaScaled(face), Vector3(0), 0.0f); } - const Face *faceAt(int i) const + + Vector3 triangleNormalAreaScaled(uint32_t face) const { - return m_faceArray[i]; + const Vector3 &p0 = m_positions[m_indices[face * 3 + 0]]; + const Vector3 &p1 = m_positions[m_indices[face * 3 + 1]]; + const Vector3 &p2 = m_positions[m_indices[face * 3 + 2]]; + const Vector3 e0 = p2 - p0; + const Vector3 e1 = p1 - p0; + return cross(e0, e1); } - Face *faceAt(int i) + + // @@ This is not exactly accurate, we should compare the texture coordinates... + bool isSeam(uint32_t edge) const { - return m_faceArray[i]; + const uint32_t oppositeEdge = m_oppositeEdges[edge]; + if (oppositeEdge == UINT32_MAX) + return false; // boundary edge + const uint32_t e0 = meshEdgeIndex0(edge); + const uint32_t e1 = meshEdgeIndex1(edge); + const uint32_t oe0 = meshEdgeIndex0(oppositeEdge); + const uint32_t oe1 = meshEdgeIndex1(oppositeEdge); + return m_indices[e0] != m_indices[oe1] || m_indices[e1] != m_indices[oe0]; } - // Edges - uint32_t edgeCount() const + bool isTextureSeam(uint32_t edge) const { - return m_edgeArray.size(); + const uint32_t oppositeEdge = m_oppositeEdges[edge]; + if (oppositeEdge == UINT32_MAX) + return false; // boundary edge + const uint32_t e0 = meshEdgeIndex0(edge); + const uint32_t e1 = meshEdgeIndex1(edge); + const uint32_t oe0 = meshEdgeIndex0(oppositeEdge); + const uint32_t oe1 = meshEdgeIndex1(oppositeEdge); + return m_texcoords[m_indices[e0]] != m_texcoords[m_indices[oe1]] || m_texcoords[m_indices[e1]] != m_texcoords[m_indices[oe0]]; } - const Edge *edgeAt(int i) const + + uint32_t firstColocal(uint32_t vertex) const { - return m_edgeArray[i]; + for (ColocalVertexIterator it(this, vertex); !it.isDone(); it.advance()) { + if (it.vertex() < vertex) + vertex = it.vertex(); + } + return vertex; } - Edge *edgeAt(int i) + + bool areColocal(uint32_t vertex0, uint32_t vertex1) const { - return m_edgeArray[i]; + if (vertex0 == vertex1) + return true; + if (m_nextColocalVertex.isEmpty()) + return false; + for (ColocalVertexIterator it(this, vertex0); !it.isDone(); it.advance()) { + if (it.vertex() == vertex1) + return true; + } + return false; } - class ConstVertexIterator; + float epsilon() const { return m_epsilon; } + uint32_t edgeCount() const { return m_indices.size(); } + uint32_t oppositeEdge(uint32_t edge) const { return m_oppositeEdges[edge]; } + bool isBoundaryEdge(uint32_t edge) const { return m_oppositeEdges[edge] == UINT32_MAX; } + bool isBoundaryVertex(uint32_t vertex) const { return m_boundaryVertices[vertex]; } + uint32_t colocalVertexCount() const { return m_colocalVertexCount; } + uint32_t vertexCount() const { return m_positions.size(); } + uint32_t vertexAt(uint32_t i) const { return m_indices[i]; } + const Vector3 &position(uint32_t vertex) const { return m_positions[vertex]; } + const Vector3 &normal(uint32_t vertex) const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasNormals); return m_normals[vertex]; } + const Vector2 &texcoord(uint32_t vertex) const { return m_texcoords[vertex]; } + Vector2 &texcoord(uint32_t vertex) { return m_texcoords[vertex]; } + Vector2 *texcoords() { return m_texcoords.data(); } + uint32_t faceCount() const { return m_indices.size() / 3; } + uint32_t faceGroupCount() const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasFaceGroups); return m_faceGroups.size(); } + uint32_t faceGroupAt(uint32_t face) const { XA_DEBUG_ASSERT(m_flags & MeshFlags::HasFaceGroups); return m_faceGroups[face]; } + const uint32_t *indices() const { return m_indices.data(); } + uint32_t indexCount() const { return m_indices.size(); } + +private: + bool isFaceIgnored(uint32_t face) const { return (m_flags & MeshFlags::HasIgnoredFaces) && m_faceIgnore[face]; } + + float m_epsilon; + uint32_t m_flags; + uint32_t m_id; + Array<bool> m_faceIgnore; + Array<uint32_t> m_faceGroups; + Array<uint32_t> m_indices; + Array<Vector3> m_positions; + Array<Vector3> m_normals; + Array<Vector2> m_texcoords; + + // Populated by createColocals + uint32_t m_colocalVertexCount; + Array<uint32_t> m_nextColocalVertex; // In: vertex index. Out: the vertex index of the next colocal position. + + // Populated by createBoundaries + Array<bool> m_boundaryVertices; + Array<uint32_t> m_oppositeEdges; // In: edge index. Out: the index of the opposite edge (i.e. wound the opposite direction). UINT32_MAX if the input edge is a boundary edge. + + // Populated by linkBoundaries + Array<uint32_t> m_nextBoundaryEdges; // The index of the next boundary edge. UINT32_MAX if the edge is not a boundary edge. - class VertexIterator + struct EdgeKey { - friend class ConstVertexIterator; - public: - VertexIterator(Mesh *mesh) : m_mesh(mesh), m_current(0) { } + EdgeKey() {} + EdgeKey(const EdgeKey &k) : v0(k.v0), v1(k.v1) {} + EdgeKey(uint32_t v0, uint32_t v1) : v0(v0), v1(v1) {} - virtual void advance() - { - m_current++; - } - virtual bool isDone() const + void operator=(const EdgeKey &k) { - return m_current == m_mesh->vertexCount(); + v0 = k.v0; + v1 = k.v1; } - virtual Vertex *current() const + bool operator==(const EdgeKey &k) const { - return m_mesh->vertexAt(m_current); + return v0 == k.v0 && v1 == k.v1; } - private: - halfedge::Mesh *m_mesh; - uint32_t m_current; + uint32_t v0; + uint32_t v1; }; - VertexIterator vertices() - { - return VertexIterator(this); - } - class ConstVertexIterator + HashMap<EdgeKey, uint32_t> m_edgeMap; + +public: + class BoundaryEdgeIterator { public: - ConstVertexIterator(const Mesh *mesh) : m_mesh(mesh), m_current(0) { } - ConstVertexIterator(class VertexIterator &it) : m_mesh(it.m_mesh), m_current(it.m_current) { } + BoundaryEdgeIterator(const Mesh *mesh, uint32_t edge) : m_mesh(mesh), m_first(UINT32_MAX), m_current(edge) {} - virtual void advance() + void advance() { - m_current++; + if (m_first == UINT32_MAX) + m_first = m_current; + m_current = m_mesh->m_nextBoundaryEdges[m_current]; } - virtual bool isDone() const + + bool isDone() const { - return m_current == m_mesh->vertexCount(); + return m_first == m_current || m_current == UINT32_MAX; } - virtual const Vertex *current() const + + uint32_t edge() const { - return m_mesh->vertexAt(m_current); + return m_current; + } + + uint32_t nextEdge() const + { + return m_mesh->m_nextBoundaryEdges[m_current]; } private: - const halfedge::Mesh *m_mesh; + const Mesh *m_mesh; + uint32_t m_first; uint32_t m_current; }; - ConstVertexIterator vertices() const - { - return ConstVertexIterator(this); - } - - class ConstFaceIterator; - class FaceIterator + class ColocalVertexIterator { - friend class ConstFaceIterator; public: - FaceIterator(Mesh *mesh) : m_mesh(mesh), m_current(0) { } + ColocalVertexIterator(const Mesh *mesh, uint32_t v) : m_mesh(mesh), m_first(UINT32_MAX), m_current(v) {} + + void advance() + { + if (m_first == UINT32_MAX) + m_first = m_current; + if (!m_mesh->m_nextColocalVertex.isEmpty()) + m_current = m_mesh->m_nextColocalVertex[m_current]; + } - virtual void advance() + bool isDone() const { - m_current++; + return m_first == m_current; } - virtual bool isDone() const + + uint32_t vertex() const { - return m_current == m_mesh->faceCount(); + return m_current; } - virtual Face *current() const + + const Vector3 *pos() const { - return m_mesh->faceAt(m_current); + return &m_mesh->m_positions[m_current]; } private: - halfedge::Mesh *m_mesh; + const Mesh *m_mesh; + uint32_t m_first; uint32_t m_current; }; - FaceIterator faces() - { - return FaceIterator(this); - } - class ConstFaceIterator + class ColocalEdgeIterator { public: - ConstFaceIterator(const Mesh *mesh) : m_mesh(mesh), m_current(0) { } - ConstFaceIterator(const FaceIterator &it) : m_mesh(it.m_mesh), m_current(it.m_current) { } + ColocalEdgeIterator(const Mesh *mesh, uint32_t vertex0, uint32_t vertex1) : m_mesh(mesh), m_vertex0It(mesh, vertex0), m_vertex1It(mesh, vertex1), m_vertex1(vertex1) + { + resetElement(); + } - virtual void advance() + void advance() { - m_current++; + advanceElement(); } - virtual bool isDone() const + + bool isDone() const { - return m_current == m_mesh->faceCount(); + return m_vertex0It.isDone() && m_vertex1It.isDone() && m_mapEdgeIndex == UINT32_MAX; } - virtual const Face *current() const + + uint32_t edge() const { - return m_mesh->faceAt(m_current); + return m_mesh->m_edgeMap.value(m_mapEdgeIndex); } private: - const halfedge::Mesh *m_mesh; - uint32_t m_current; - }; - ConstFaceIterator faces() const - { - return ConstFaceIterator(this); - } - - class ConstEdgeIterator; + void resetElement() + { + m_mapEdgeIndex = m_mesh->m_edgeMap.get(Mesh::EdgeKey(m_vertex0It.vertex(), m_vertex1It.vertex())); + while (m_mapEdgeIndex != UINT32_MAX) { + if (!isIgnoredFace()) + break; + m_mapEdgeIndex = m_mesh->m_edgeMap.getNext(m_mapEdgeIndex); + } + if (m_mapEdgeIndex == UINT32_MAX) + advanceVertex1(); + } - class EdgeIterator - { - friend class ConstEdgeIterator; - public: - EdgeIterator(Mesh *mesh) : m_mesh(mesh), m_current(0) { } + void advanceElement() + { + for (;;) { + m_mapEdgeIndex = m_mesh->m_edgeMap.getNext(m_mapEdgeIndex); + if (m_mapEdgeIndex == UINT32_MAX) + break; + if (!isIgnoredFace()) + break; + } + if (m_mapEdgeIndex == UINT32_MAX) + advanceVertex1(); + } - virtual void advance() + void advanceVertex0() { - m_current++; + m_vertex0It.advance(); + if (m_vertex0It.isDone()) + return; + m_vertex1It = ColocalVertexIterator(m_mesh, m_vertex1); + resetElement(); } - virtual bool isDone() const + + void advanceVertex1() { - return m_current == m_mesh->edgeCount(); + m_vertex1It.advance(); + if (m_vertex1It.isDone()) + advanceVertex0(); + else + resetElement(); } - virtual Edge *current() const + + bool isIgnoredFace() const { - return m_mesh->edgeAt(m_current); + const uint32_t edge = m_mesh->m_edgeMap.value(m_mapEdgeIndex); + return m_mesh->m_faceIgnore[meshEdgeFace(edge)]; } - private: - halfedge::Mesh *m_mesh; - uint32_t m_current; + const Mesh *m_mesh; + ColocalVertexIterator m_vertex0It, m_vertex1It; + const uint32_t m_vertex1; + uint32_t m_mapEdgeIndex; }; - EdgeIterator edges() - { - return EdgeIterator(this); - } - class ConstEdgeIterator + class FaceEdgeIterator { public: - ConstEdgeIterator(const Mesh *mesh) : m_mesh(mesh), m_current(0) { } - ConstEdgeIterator(const EdgeIterator &it) : m_mesh(it.m_mesh), m_current(it.m_current) { } + FaceEdgeIterator (const Mesh *mesh, uint32_t face) : m_mesh(mesh), m_face(face), m_relativeEdge(0) + { + m_edge = m_face * 3; + } + + void advance() + { + if (m_relativeEdge < 3) { + m_edge++; + m_relativeEdge++; + } + } - virtual void advance() + bool isDone() const + { + return m_relativeEdge == 3; + } + + bool isBoundary() const { return m_mesh->m_oppositeEdges[m_edge] == UINT32_MAX; } + bool isSeam() const { return m_mesh->isSeam(m_edge); } + bool isTextureSeam() const { return m_mesh->isTextureSeam(m_edge); } + uint32_t edge() const { return m_edge; } + uint32_t relativeEdge() const { return m_relativeEdge; } + uint32_t face() const { return m_face; } + uint32_t oppositeEdge() const { return m_mesh->m_oppositeEdges[m_edge]; } + + uint32_t oppositeFace() const { - m_current++; + const uint32_t oedge = m_mesh->m_oppositeEdges[m_edge]; + if (oedge == UINT32_MAX) + return UINT32_MAX; + return meshEdgeFace(oedge); } - virtual bool isDone() const + + uint32_t vertex0() const { - return m_current == m_mesh->edgeCount(); + return m_mesh->m_indices[m_face * 3 + m_relativeEdge]; } - virtual const Edge *current() const + + uint32_t vertex1() const { - return m_mesh->edgeAt(m_current); + return m_mesh->m_indices[m_face * 3 + (m_relativeEdge + 1) % 3]; } + const Vector3 &position0() const { return m_mesh->m_positions[vertex0()]; } + const Vector3 &position1() const { return m_mesh->m_positions[vertex1()]; } + const Vector3 &normal0() const { return m_mesh->m_normals[vertex0()]; } + const Vector3 &normal1() const { return m_mesh->m_normals[vertex1()]; } + const Vector2 &texcoord0() const { return m_mesh->m_texcoords[vertex0()]; } + const Vector2 &texcoord1() const { return m_mesh->m_texcoords[vertex1()]; } + private: - const halfedge::Mesh *m_mesh; - uint32_t m_current; + const Mesh *m_mesh; + uint32_t m_face; + uint32_t m_edge; + uint32_t m_relativeEdge; }; - ConstEdgeIterator edges() const - { - return ConstEdgeIterator(this); - } - - // @@ Add half-edge iterator. +}; - bool isValid() const - { - // Make sure all edges are valid. - const uint32_t edgeCount = m_edgeArray.size(); - for (uint32_t e = 0; e < edgeCount; e++) { - Edge *edge = m_edgeArray[e]; - if (edge != NULL) { - if (edge->id != 2 * e) { - return false; +static bool meshCloseHole(Mesh *mesh, const Array<uint32_t> &holeVertices, const Vector3 &normal) +{ +#if XA_CLOSE_HOLES_CHECK_EDGE_INTERSECTION + const uint32_t faceCount = mesh->faceCount(); +#endif + const bool compareNormal = equal(normal, Vector3(0.0f), FLT_EPSILON); + uint32_t frontCount = holeVertices.size(); + Array<uint32_t> frontVertices; + Array<Vector3> frontPoints; + Array<float> frontAngles; + frontVertices.resize(frontCount); + frontPoints.resize(frontCount); + for (uint32_t i = 0; i < frontCount; i++) { + frontVertices[i] = holeVertices[i]; + frontPoints[i] = mesh->position(frontVertices[i]); + } + while (frontCount >= 3) { + frontAngles.resize(frontCount); + float smallestAngle = kPi2, smallestAngleIgnoringNormal = kPi2; + uint32_t smallestAngleIndex = UINT32_MAX, smallestAngleIndexIgnoringNormal = UINT32_MAX; + for (uint32_t i = 0; i < frontCount; i++) { + const uint32_t i1 = i == 0 ? frontCount - 1 : i - 1; + const uint32_t i2 = i; + const uint32_t i3 = (i + 1) % frontCount; + const Vector3 edge1 = frontPoints[i1] - frontPoints[i2]; + const Vector3 edge2 = frontPoints[i3] - frontPoints[i2]; + frontAngles[i] = acosf(dot(edge1, edge2) / (length(edge1) * length(edge2))); + if (frontAngles[i] >= smallestAngle || isNan(frontAngles[i])) + continue; + // Don't duplicate edges. + if (mesh->findEdge(UINT32_MAX, frontVertices[i1], frontVertices[i2]) != UINT32_MAX) + continue; + if (mesh->findEdge(UINT32_MAX, frontVertices[i2], frontVertices[i3]) != UINT32_MAX) + continue; + if (mesh->findEdge(UINT32_MAX, frontVertices[i3], frontVertices[i1]) != UINT32_MAX) + continue; + /* + Make sure he new edge that would be formed by (i3, i1) doesn't intersect any vertices. This often happens when fixing t-junctions. + + i2 + * + / \ + / \ + i1 *--*--* i3 + \ | / + \|/ + * + */ + bool intersection = false; + for (uint32_t j = 0; j < frontCount; j++) { + if (j == i1 || j == i2 || j == i3) + continue; + if (lineIntersectsPoint(frontPoints[j], frontPoints[i3], frontPoints[i1], nullptr, mesh->epsilon())) { + intersection = true; + break; } - if (!edge->isValid()) { - return false; + } + if (intersection) + continue; + // Don't add the triangle if a boundary point lies on the same plane as the triangle, and is inside it. + intersection = false; + const Plane plane(frontPoints[i1], frontPoints[i2], frontPoints[i3]); + for (uint32_t j = 0; j < frontCount; j++) { + if (j == i1 || j == i2 || j == i3) + continue; + if (!isZero(plane.distance(frontPoints[j]), mesh->epsilon())) + continue; + if (pointInTriangle(frontPoints[j], frontPoints[i1], frontPoints[i2], frontPoints[i3])) { + intersection = true; + break; } - if (edge->pair->id != 2 * e + 1) { - return false; + } + if (intersection) + continue; +#if XA_CLOSE_HOLES_CHECK_EDGE_INTERSECTION + // Don't add the triangle if the new edge (i3, i1), intersects any other triangle that isn't part of the filled hole. + intersection = false; + const Vector3 newEdgeVector = frontPoints[i1] - frontPoints[i3]; + for (uint32_t f = 0; f < faceCount; f++) { + Vector3 tri[3]; + for (uint32_t j = 0; j < 3; j++) + tri[j] = mesh->position(mesh->vertexAt(f * 3 + j)); + float t; + if (rayIntersectsTriangle(frontPoints[i3], newEdgeVector, tri, &t)) { + intersection = true; + break; } - if (!edge->pair->isValid()) { - return false; + } + if (intersection) + continue; +#endif + // Skip backwards facing triangles. + if (compareNormal) { + if (frontAngles[i] < smallestAngleIgnoringNormal) { + smallestAngleIgnoringNormal = frontAngles[i]; + smallestAngleIndexIgnoringNormal = i; } + const Vector3 e0 = frontPoints[i3] - frontPoints[i1]; + const Vector3 e1 = frontPoints[i2] - frontPoints[i1]; + const Vector3 triNormal = normalizeSafe(cross(e0, e1), Vector3(0.0f), mesh->epsilon()); + if (dot(normal, triNormal) <= 0.0f) + continue; } + smallestAngle = smallestAngleIgnoringNormal = frontAngles[i]; + smallestAngleIndex = smallestAngleIndexIgnoringNormal = i; } - // @@ Make sure all faces are valid. - // @@ Make sure all vertices are valid. - return true; + // Closing holes failed if we don't have a smallest angle. + // Fallback to ignoring the backwards facing normal test if possible. + if (smallestAngleIndex == UINT32_MAX || smallestAngle <= 0.0f || smallestAngle >= kPi) { + if (smallestAngleIgnoringNormal == UINT32_MAX || smallestAngleIgnoringNormal <= 0.0f || smallestAngleIgnoringNormal >= kPi) + return false; + else + smallestAngleIndex = smallestAngleIndexIgnoringNormal; + } + const uint32_t i1 = smallestAngleIndex == 0 ? frontCount - 1 : smallestAngleIndex - 1; + const uint32_t i2 = smallestAngleIndex; + const uint32_t i3 = (smallestAngleIndex + 1) % frontCount; + const Mesh::AddFaceResult::Enum result = mesh->addFace(frontVertices[i1], frontVertices[i2], frontVertices[i3]); + XA_DEBUG_ASSERT(result == Mesh::AddFaceResult::OK); // Shouldn't happen due to the findEdge calls above. + XA_UNUSED(result); + frontVertices.removeAt(i2); + frontPoints.removeAt(i2); + frontCount = frontVertices.size(); } + return true; +} - // Error status: - - struct ErrorCode - { - enum Enum - { - AlreadyAddedEdge, - DegenerateColocalEdge, - DegenerateEdge, - DuplicateEdge - }; - }; - - mutable ErrorCode::Enum errorCode; - mutable uint32_t errorIndex0; - mutable uint32_t errorIndex1; +static bool meshCloseHoles(Mesh *mesh, const Array<uint32_t> &boundaryLoops, const Vector3 &normal, Array<uint32_t> &holeFaceCounts) +{ + holeFaceCounts.clear(); + // Compute lengths. + const uint32_t boundaryCount = boundaryLoops.size(); + Array<float> boundaryLengths; + Array<uint32_t> boundaryEdgeCounts; + boundaryEdgeCounts.resize(boundaryCount); + for (uint32_t i = 0; i < boundaryCount; i++) { + float boundaryLength = 0.0f; + boundaryEdgeCounts[i] = 0; + for (Mesh::BoundaryEdgeIterator it(mesh, boundaryLoops[i]); !it.isDone(); it.advance()) { + const Vector3 &t0 = mesh->position(mesh->vertexAt(meshEdgeIndex0(it.edge()))); + const Vector3 &t1 = mesh->position(mesh->vertexAt(meshEdgeIndex1(it.edge()))); + boundaryLength += length(t1 - t0); + boundaryEdgeCounts[i]++; + } + boundaryLengths.push_back(boundaryLength); + } + // Find disk boundary. + uint32_t diskBoundary = 0; + float maxLength = boundaryLengths[0]; + for (uint32_t i = 1; i < boundaryCount; i++) { + if (boundaryLengths[i] > maxLength) { + maxLength = boundaryLengths[i]; + diskBoundary = i; + } + } + // Close holes. + Array<uint32_t> holeVertices; + Array<Vector3> holePoints; + bool result = true; + for (uint32_t i = 0; i < boundaryCount; i++) { + if (diskBoundary == i) + continue; // Skip disk boundary. + holeVertices.resize(boundaryEdgeCounts[i]); + holePoints.resize(boundaryEdgeCounts[i]); + // Winding is backwards for internal boundaries. + uint32_t e = 0; + for (Mesh::BoundaryEdgeIterator it(mesh, boundaryLoops[i]); !it.isDone(); it.advance()) { + const uint32_t vertex = mesh->vertexAt(meshEdgeIndex0(it.edge())); + holeVertices[boundaryEdgeCounts[i] - 1 - e] = vertex; + holePoints[boundaryEdgeCounts[i] - 1 - e] = mesh->position(vertex); + e++; + } + const uint32_t oldFaceCount = mesh->faceCount(); + if (!meshCloseHole(mesh, holeVertices, normal)) + result = false; // Return false if any hole failed to close, but keep trying to close other holes. + holeFaceCounts.push_back(mesh->faceCount() - oldFaceCount); + } + return result; +} -private: - // Return true if the face can be added to the manifold mesh. - bool canAddFace(const std::vector<uint32_t> &indexArray, uint32_t first, uint32_t num) const - { - return canAddFace(indexArray.data(), first, num); +static bool meshIsPlanar(const Mesh &mesh) +{ + const Vector3 p1 = mesh.position(mesh.vertexAt(0)); + const Vector3 p2 = mesh.position(mesh.vertexAt(1)); + const Vector3 p3 = mesh.position(mesh.vertexAt(2)); + const Plane plane(p1, p2, p3); + const uint32_t vertexCount = mesh.vertexCount(); + for (uint32_t v = 0; v < vertexCount; v++) { + const float d = plane.distance(mesh.position(v)); + if (!isZero(d, mesh.epsilon())) + return false; } + return true; +} - bool canAddFace(const uint32_t *indexArray, uint32_t first, uint32_t num) const - { - for (uint32_t j = num - 1, i = 0; i < num; j = i++) { - if (!canAddEdge(indexArray[first + j], indexArray[first + i])) { - errorIndex0 = indexArray[first + j]; - errorIndex1 = indexArray[first + i]; - return false; - } - } - // We also have to make sure the face does not have any duplicate edge! - for (uint32_t i = 0; i < num; i++) { - int i0 = indexArray[first + i + 0]; - int i1 = indexArray[first + (i + 1) % num]; - for (uint32_t j = i + 1; j < num; j++) { - int j0 = indexArray[first + j + 0]; - int j1 = indexArray[first + (j + 1) % num]; - if (i0 == j0 && i1 == j1) { - errorCode = ErrorCode::DuplicateEdge; - errorIndex0 = i0; - errorIndex1 = i1; - return false; - } - } - } - return true; - } +/* +Fixing T-junctions. - // Return true if the edge doesn't exist or doesn't have any adjacent face. - bool canAddEdge(uint32_t i, uint32_t j) const - { - if (i == j) { - // Skip degenerate edges. - errorCode = ErrorCode::DegenerateEdge; - return false; - } - // Same check, but taking into account colocal vertices. - const Vertex *v0 = vertexAt(i); - const Vertex *v1 = vertexAt(j); - for (Vertex::ConstVertexIterator it(v0->colocals()); !it.isDone(); it.advance()) { - if (it.current() == v1) { - // Skip degenerate edges. - errorCode = ErrorCode::DegenerateColocalEdge; - return false; - } - } - // Make sure edge has not been added yet. - Edge *edge = findEdge(i, j); - // We ignore edges that don't have an adjacent face yet, since this face could become the edge's face. - if (!(edge == NULL || edge->face == NULL)) { - errorCode = ErrorCode::AlreadyAddedEdge; - return false; - } - return true; - } +- Find T-junctions. Find vertices that are on an edge. +- This test is approximate. +- Insert edges on a spatial index to speedup queries. +- Consider only open edges, that is edges that have no pairs. +- Consider only vertices on boundaries. +- Close T-junction. +- Split edge. - Edge *addEdge(uint32_t i, uint32_t j) +*/ +struct SplitEdge +{ + uint32_t edge; + float t; + uint32_t vertex; + + bool operator<(const SplitEdge &other) const { - xaAssert(i != j); - Edge *edge = findEdge(i, j); - if (edge != NULL) { - // Edge may already exist, but its face must not be set. - xaDebugAssert(edge->face == NULL); - // Nothing else to do! - } else { - // Add new edge. - // Lookup pair. - Edge *pair = findEdge(j, i); - if (pair != NULL) { - // Create edge with same id. - edge = new Edge(pair->id + 1); - // Link edge pairs. - edge->pair = pair; - pair->pair = edge; - // @@ I'm not sure this is necessary! - pair->vertex->setEdge(pair); - } else { - // Create edge. - edge = new Edge(2 * m_edgeArray.size()); - // Add only unpaired edges. - m_edgeArray.push_back(edge); - } - edge->vertex = m_vertexArray[i]; - m_edgeMap[Key(i, j)] = edge; + if (edge < other.edge) + return true; + else if (edge == other.edge) { + if (t < other.t) + return true; } - // Face and Next are set by addFace. - return edge; + return false; } +}; - /// Find edge, test all colocals. - Edge *findEdge(uint32_t i, uint32_t j) const - { - Edge *edge = NULL; - const Vertex *v0 = vertexAt(i); - const Vertex *v1 = vertexAt(j); - // Test all colocal pairs. - for (Vertex::ConstVertexIterator it0(v0->colocals()); !it0.isDone(); it0.advance()) { - for (Vertex::ConstVertexIterator it1(v1->colocals()); !it1.isDone(); it1.advance()) { - Key key(it0.current()->id, it1.current()->id); - if (edge == NULL) { - auto edgeIt = m_edgeMap.find(key); - if (edgeIt != m_edgeMap.end()) - edge = (*edgeIt).second; - #if !defined(_DEBUG) - if (edge != NULL) return edge; - #endif - } else { - // Make sure that only one edge is found. - xaDebugAssert(m_edgeMap.find(key) == m_edgeMap.end()); +// Returns nullptr if there were no t-junctions to fix. +static Mesh *meshFixTJunctions(const Mesh &inputMesh, bool *duplicatedEdge, bool *failed, uint32_t *fixedTJunctionsCount) +{ + if (duplicatedEdge) + *duplicatedEdge = false; + if (failed) + *failed = false; + Array<SplitEdge> splitEdges; + const uint32_t vertexCount = inputMesh.vertexCount(); + const uint32_t edgeCount = inputMesh.edgeCount(); + for (uint32_t v = 0; v < vertexCount; v++) { + if (!inputMesh.isBoundaryVertex(v)) + continue; + // Find edges that this vertex overlaps with. + const Vector3 &pos = inputMesh.position(v); + for (uint32_t e = 0; e < edgeCount; e++) { + if (!inputMesh.isBoundaryEdge(e)) + continue; + const Vector3 &edgePos1 = inputMesh.position(inputMesh.vertexAt(meshEdgeIndex0(e))); + const Vector3 &edgePos2 = inputMesh.position(inputMesh.vertexAt(meshEdgeIndex1(e))); + float t; + if (!lineIntersectsPoint(pos, edgePos1, edgePos2, &t, inputMesh.epsilon())) + continue; + SplitEdge splitEdge; + splitEdge.edge = e; + splitEdge.t = t; + splitEdge.vertex = v; + splitEdges.push_back(splitEdge); + } + } + if (splitEdges.isEmpty()) + return nullptr; + const uint32_t faceCount = inputMesh.faceCount(); + Mesh *mesh = XA_NEW(MemTag::Mesh, Mesh, inputMesh.epsilon(), vertexCount + splitEdges.size(), faceCount); + for (uint32_t v = 0; v < vertexCount; v++) + mesh->addVertex(inputMesh.position(v)); + Array<uint32_t> indexArray; + indexArray.reserve(4); + Array<SplitEdge> faceSplitEdges; + faceSplitEdges.reserve(4); + for (uint32_t f = 0; f < faceCount; f++) { + // Find t-junctions in this face. + faceSplitEdges.clear(); + for (uint32_t i = 0; i < splitEdges.size(); i++) { + if (meshEdgeFace(splitEdges[i].edge) == f) + faceSplitEdges.push_back(splitEdges[i]); + } + if (!faceSplitEdges.isEmpty()) { + // Need to split edges in winding order when a single edge has multiple t-junctions. + insertionSort(faceSplitEdges.data(), faceSplitEdges.size()); + indexArray.clear(); + for (Mesh::FaceEdgeIterator it(&inputMesh, f); !it.isDone(); it.advance()) { + indexArray.push_back(it.vertex0()); + for (uint32_t se = 0; se < faceSplitEdges.size(); se++) { + const SplitEdge &splitEdge = faceSplitEdges[se]; + if (splitEdge.edge == it.edge()) + indexArray.push_back(splitEdge.vertex); } } + if (!meshCloseHole(mesh, indexArray, Vector3(0.0f))) { + if (failed) + *failed = true; + } + } else { + // No t-junctions in this face. Copy from input mesh. + if (mesh->addFace(&inputMesh.indices()[f * 3]) == Mesh::AddFaceResult::DuplicateEdge) { + if (duplicatedEdge) + *duplicatedEdge = true; + } } - return edge; - } - - /// Link this boundary edge. - void linkBoundaryEdge(Edge *edge) - { - xaAssert(edge->face == NULL); - // Make sure next pointer has not been set. @@ We want to be able to relink boundary edges after mesh changes. - Edge *next = edge; - while (next->pair->face != NULL) { - // Get pair prev - Edge *e = next->pair->next; - while (e->next != next->pair) { - e = e->next; - } - next = e; - } - edge->setNext(next->pair); - // Adjust vertex edge, so that it's the boundary edge. (required for isBoundary()) - if (edge->vertex->edge != edge) { - // Multiple boundaries in the same edge. - edge->vertex->edge = edge; - } - } - - Vertex *splitBoundaryEdge(Edge *edge, float t, const Vector3 &pos) - { - /* - We want to go from this configuration: - - + + - | ^ - edge |<->| pair - v | - + + - - To this one: - - + + - | ^ - e0 |<->| p0 - v | - vertex + + - | ^ - e1 |<->| p1 - v | - + + - - */ - Edge *pair = edge->pair; - // Make sure boundaries are linked. - xaDebugAssert(pair != NULL); - // Make sure edge is a boundary edge. - xaDebugAssert(pair->face == NULL); - // Add new vertex. - Vertex *vertex = addVertex(pos); - vertex->nor = lerp(edge->from()->nor, edge->to()->nor, t); - vertex->tex = lerp(edge->from()->tex, edge->to()->tex, t); - disconnect(edge); - disconnect(pair); - // Add edges. - Edge *e0 = addEdge(edge->from()->id, vertex->id); - Edge *p0 = addEdge(vertex->id, pair->to()->id); - Edge *e1 = addEdge(vertex->id, edge->to()->id); - Edge *p1 = addEdge(pair->from()->id, vertex->id); - // Link edges. - e0->setNext(e1); - p1->setNext(p0); - e0->setPrev(edge->prev); - e1->setNext(edge->next); - p1->setPrev(pair->prev); - p0->setNext(pair->next); - xaDebugAssert(e0->next == e1); - xaDebugAssert(e1->prev == e0); - xaDebugAssert(p1->next == p0); - xaDebugAssert(p0->prev == p1); - xaDebugAssert(p0->pair == e0); - xaDebugAssert(e0->pair == p0); - xaDebugAssert(p1->pair == e1); - xaDebugAssert(e1->pair == p1); - // Link faces. - e0->face = edge->face; - e1->face = edge->face; - // Link vertices. - edge->from()->setEdge(e0); - vertex->setEdge(e1); - delete edge; - delete pair; - return vertex; } + if (fixedTJunctionsCount) + *fixedTJunctionsCount = splitEdges.size(); + return mesh; +} -private: - std::vector<Vertex *> m_vertexArray; - std::vector<Edge *> m_edgeArray; - std::vector<Face *> m_faceArray; - - struct Key - { - Key() {} - Key(const Key &k) : p0(k.p0), p1(k.p1) {} - Key(uint32_t v0, uint32_t v1) : p0(v0), p1(v1) {} - void operator=(const Key &k) - { - p0 = k.p0; - p1 = k.p1; - } - bool operator==(const Key &k) const - { - return p0 == k.p0 && p1 == k.p1; - } - - uint32_t p0; - uint32_t p1; - }; - - friend struct Hash<Mesh::Key>; - std::unordered_map<Key, Edge *, Hash<Key>, Equal<Key> > m_edgeMap; - uint32_t m_colocalVertexCount; -}; +// boundaryLoops are the first edges for each boundary loop. +static void meshGetBoundaryLoops(const Mesh &mesh, Array<uint32_t> &boundaryLoops) +{ + const uint32_t edgeCount = mesh.edgeCount(); + BitArray bitFlags(edgeCount); + bitFlags.clearAll(); + boundaryLoops.clear(); + // Search for boundary edges. Mark all the edges that belong to the same boundary. + for (uint32_t e = 0; e < edgeCount; e++) { + if (bitFlags.bitAt(e) || !mesh.isBoundaryEdge(e)) + continue; + for (Mesh::BoundaryEdgeIterator it(&mesh, e); !it.isDone(); it.advance()) + bitFlags.setBitAt(it.edge()); + boundaryLoops.push_back(e); + } +} class MeshTopology { public: MeshTopology(const Mesh *mesh) { - buildTopologyInfo(mesh); - } - - /// Determine if the mesh is connected. - bool isConnected() const - { - return m_connectedCount == 1; - } - - /// Determine if the mesh is closed. (Each edge is shared by two faces) - bool isClosed() const - { - return m_boundaryCount == 0; - } - - /// Return true if the mesh has the topology of a disk. - bool isDisk() const - { - return isConnected() && m_boundaryCount == 1/* && m_eulerNumber == 1*/; - } - -private: - void buildTopologyInfo(const Mesh *mesh) - { const uint32_t vertexCount = mesh->colocalVertexCount(); const uint32_t faceCount = mesh->faceCount(); const uint32_t edgeCount = mesh->edgeCount(); - xaPrint( "--- Building mesh topology:\n" ); - std::vector<uint32_t> stack(faceCount); + Array<uint32_t> stack(MemTag::Default); + stack.reserve(faceCount); BitArray bitFlags(faceCount); bitFlags.clearAll(); // Compute connectivity. - xaPrint( "--- Computing connectivity.\n" ); m_connectedCount = 0; for (uint32_t f = 0; f < faceCount; f++ ) { - if ( bitFlags.bitAt(f) == false ) { + if (bitFlags.bitAt(f) == false) { m_connectedCount++; - stack.push_back( f ); - while ( !stack.empty() ) { + stack.push_back(f); + while (!stack.isEmpty()) { const uint32_t top = stack.back(); - xaAssert(top != uint32_t(~0)); + XA_ASSERT(top != uint32_t(~0)); stack.pop_back(); - if ( bitFlags.bitAt(top) == false ) { + if (bitFlags.bitAt(top) == false) { bitFlags.setBitAt(top); - const Face *face = mesh->faceAt(top); - const Edge *firstEdge = face->edge; - const Edge *edge = firstEdge; - do { - const Face *neighborFace = edge->pair->face; - if (neighborFace != NULL) { - stack.push_back(neighborFace->id); - } - edge = edge->next; - } while (edge != firstEdge); + for (Mesh::FaceEdgeIterator it(mesh, top); !it.isDone(); it.advance()) { + const uint32_t oppositeFace = it.oppositeFace(); + if (oppositeFace != UINT32_MAX) + stack.push_back(oppositeFace); + } } } } } - xaAssert(stack.empty()); - xaPrint( "--- %d connected components.\n", m_connectedCount ); + XA_ASSERT(stack.isEmpty()); // Count boundary loops. - xaPrint( "--- Counting boundary loops.\n" ); m_boundaryCount = 0; bitFlags.resize(edgeCount); bitFlags.clearAll(); // Don't forget to link the boundary otherwise this won't work. for (uint32_t e = 0; e < edgeCount; e++) { - const Edge *startEdge = mesh->edgeAt(e); - if (startEdge != NULL && startEdge->isBoundary() && bitFlags.bitAt(e) == false) { - xaDebugAssert(startEdge->face != NULL); - xaDebugAssert(startEdge->pair->face == NULL); - startEdge = startEdge->pair; - m_boundaryCount++; - const Edge *edge = startEdge; - do { - bitFlags.setBitAt(edge->id / 2); - edge = edge->next; - } while (startEdge != edge); - } - } - xaPrint("--- %d boundary loops found.\n", m_boundaryCount ); + if (bitFlags.bitAt(e) || !mesh->isBoundaryEdge(e)) + continue; + m_boundaryCount++; + for (Mesh::BoundaryEdgeIterator it(mesh, e); !it.isDone(); it.advance()) + bitFlags.setBitAt(it.edge()); + } // Compute euler number. m_eulerNumber = vertexCount - edgeCount + faceCount; - xaPrint("--- Euler number: %d.\n", m_eulerNumber); // Compute genus. (only valid on closed connected surfaces) m_genus = -1; - if ( isClosed() && isConnected() ) { + if (isClosed() && isConnected()) m_genus = (2 - m_eulerNumber) / 2; - xaPrint("--- Genus: %d.\n", m_genus); - } + } + + /// Determine if the mesh is connected. + bool isConnected() const + { + return m_connectedCount == 1; + } + + /// Determine if the mesh is closed. (Each edge is shared by two faces) + bool isClosed() const + { + return m_boundaryCount == 0; + } + + /// Return true if the mesh has the topology of a disk. + bool isDisk() const + { + return isConnected() && m_boundaryCount == 1/* && m_eulerNumber == 1*/; } private: @@ -2843,702 +3480,320 @@ private: int m_genus; }; -float computeSurfaceArea(const halfedge::Mesh *mesh) -{ - float area = 0; - for (halfedge::Mesh::ConstFaceIterator it(mesh->faces()); !it.isDone(); it.advance()) { - const halfedge::Face *face = it.current(); - area += face->area(); - } - xaDebugAssert(area >= 0); - return area; -} - -float computeParametricArea(const halfedge::Mesh *mesh) -{ - float area = 0; - for (halfedge::Mesh::ConstFaceIterator it(mesh->faces()); !it.isDone(); it.advance()) { - const halfedge::Face *face = it.current(); - area += face->parametricArea(); - } - return area; -} - -uint32_t countMeshTriangles(const Mesh *mesh) +struct Progress { - const uint32_t faceCount = mesh->faceCount(); - uint32_t triangleCount = 0; - for (uint32_t f = 0; f < faceCount; f++) { - const Face *face = mesh->faceAt(f); - uint32_t edgeCount = face->edgeCount(); - xaDebugAssert(edgeCount > 2); - triangleCount += edgeCount - 2; - } - return triangleCount; -} - -Mesh *unifyVertices(const Mesh *inputMesh) -{ - Mesh *mesh = new Mesh; - // Only add the first colocal. - const uint32_t vertexCount = inputMesh->vertexCount(); - for (uint32_t v = 0; v < vertexCount; v++) { - const Vertex *vertex = inputMesh->vertexAt(v); - if (vertex->isFirstColocal()) { - mesh->addVertex(vertex->pos); - } - } - std::vector<uint32_t> indexArray; - // Add new faces pointing to first colocals. - uint32_t faceCount = inputMesh->faceCount(); - for (uint32_t f = 0; f < faceCount; f++) { - const Face *face = inputMesh->faceAt(f); - indexArray.clear(); - for (Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const Edge *edge = it.current(); - const Vertex *vertex = edge->vertex->firstColocal(); - indexArray.push_back(vertex->id); - } - mesh->addFace(indexArray); - } - mesh->linkBoundary(); - return mesh; -} - -static bool pointInTriangle(const Vector2 &p, const Vector2 &a, const Vector2 &b, const Vector2 &c) -{ - return triangleArea(a, b, p) >= 0.00001f && - triangleArea(b, c, p) >= 0.00001f && - triangleArea(c, a, p) >= 0.00001f; -} - -// This is doing a simple ear-clipping algorithm that skips invalid triangles. Ideally, we should -// also sort the ears by angle, start with the ones that have the smallest angle and proceed in order. -Mesh *triangulate(const Mesh *inputMesh) -{ - Mesh *mesh = new Mesh; - // Add all vertices. - const uint32_t vertexCount = inputMesh->vertexCount(); - for (uint32_t v = 0; v < vertexCount; v++) { - const Vertex *vertex = inputMesh->vertexAt(v); - mesh->addVertex(vertex->pos); - } - std::vector<int> polygonVertices; - std::vector<float> polygonAngles; - std::vector<Vector2> polygonPoints; - const uint32_t faceCount = inputMesh->faceCount(); - for (uint32_t f = 0; f < faceCount; f++) { - const Face *face = inputMesh->faceAt(f); - xaDebugAssert(face != NULL); - const uint32_t edgeCount = face->edgeCount(); - xaDebugAssert(edgeCount >= 3); - polygonVertices.clear(); - polygonVertices.reserve(edgeCount); - if (edgeCount == 3) { - // Simple case for triangles. - for (Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const Edge *edge = it.current(); - const Vertex *vertex = edge->vertex; - polygonVertices.push_back(vertex->id); - } - int v0 = polygonVertices[0]; - int v1 = polygonVertices[1]; - int v2 = polygonVertices[2]; - mesh->addFace(v0, v1, v2); - } else { - // Build 2D polygon projecting vertices onto normal plane. - // Faces are not necesarily planar, this is for example the case, when the face comes from filling a hole. In such cases - // it's much better to use the best fit plane. - const Vector3 fn = face->normal(); - Basis basis; - basis.buildFrameForDirection(fn); - polygonPoints.clear(); - polygonPoints.reserve(edgeCount); - polygonAngles.clear(); - polygonAngles.reserve(edgeCount); - for (Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const Edge *edge = it.current(); - const Vertex *vertex = edge->vertex; - polygonVertices.push_back(vertex->id); - Vector2 p; - p.x = dot(basis.tangent, vertex->pos); - p.y = dot(basis.bitangent, vertex->pos); - polygonPoints.push_back(p); - } - polygonAngles.resize(edgeCount); - while (polygonVertices.size() > 2) { - uint32_t size = polygonVertices.size(); - // Update polygon angles. @@ Update only those that have changed. - float minAngle = 2 * PI; - uint32_t bestEar = 0; // Use first one if none of them is valid. - bool bestIsValid = false; - for (uint32_t i = 0; i < size; i++) { - uint32_t i0 = i; - uint32_t i1 = (i + 1) % size; // Use Sean's polygon interation trick. - uint32_t i2 = (i + 2) % size; - Vector2 p0 = polygonPoints[i0]; - Vector2 p1 = polygonPoints[i1]; - Vector2 p2 = polygonPoints[i2]; - - // -- GODOT start -- - bool degenerate = distance(p0, p1) < NV_EPSILON || distance(p0, p2) < NV_EPSILON || distance(p1, p2) < NV_EPSILON; - if (degenerate) { - continue; - } - // -- GODOT end -- - - float d = clamp(dot(p0 - p1, p2 - p1) / (length(p0 - p1) * length(p2 - p1)), -1.0f, 1.0f); - float angle = acosf(d); - float area = triangleArea(p0, p1, p2); - if (area < 0.0f) angle = 2.0f * PI - angle; - polygonAngles[i1] = angle; - if (angle < minAngle || !bestIsValid) { - // Make sure this is a valid ear, if not, skip this point. - bool valid = true; - for (uint32_t j = 0; j < size; j++) { - if (j == i0 || j == i1 || j == i2) continue; - Vector2 p = polygonPoints[j]; - if (pointInTriangle(p, p0, p1, p2)) { - valid = false; - break; - } - } - if (valid || !bestIsValid) { - minAngle = angle; - bestEar = i1; - bestIsValid = valid; - } - } - } - // -- GODOT start -- - if (!bestIsValid) - break; - // -- GODOT end -- - - xaDebugAssert(minAngle <= 2 * PI); - // Clip best ear: - uint32_t i0 = (bestEar + size - 1) % size; - uint32_t i1 = (bestEar + 0) % size; - uint32_t i2 = (bestEar + 1) % size; - int v0 = polygonVertices[i0]; - int v1 = polygonVertices[i1]; - int v2 = polygonVertices[i2]; - mesh->addFace(v0, v1, v2); - polygonVertices.erase(polygonVertices.begin() + i1); - polygonPoints.erase(polygonPoints.begin() + i1); - polygonAngles.erase(polygonAngles.begin() + i1); - } - } - } - mesh->linkBoundary(); - return mesh; -} - -} // namespace halfedge - -/// Mersenne twister random number generator. -class MTRand -{ -public: - enum time_e { Time }; - enum { N = 624 }; // length of state vector - enum { M = 397 }; - - /// Constructor that uses the current time as the seed. - MTRand( time_e ) + Progress(ProgressCategory::Enum category, ProgressFunc func, void *userData, uint32_t maxValue) : value(0), cancel(false), m_category(category), m_func(func), m_userData(userData), m_maxValue(maxValue), m_progress(0) { - seed((uint32_t )time(NULL)); - } - - /// Constructor that uses the given seed. - MTRand( uint32_t s = 0 ) - { - seed(s); - } - - /// Provide a new seed. - void seed( uint32_t s ) - { - initialize(s); - reload(); + if (m_func) { + if (!m_func(category, 0, userData)) + cancel = true; + } } - /// Get a random number between 0 - 65536. - uint32_t get() + ~Progress() { - // Pull a 32-bit integer from the generator state - // Every other access function simply transforms the numbers extracted here - if ( left == 0 ) { - reload(); + if (m_func) { + if (!m_func(m_category, 100, m_userData)) + cancel = true; } - left--; - uint32_t s1; - s1 = *next++; - s1 ^= (s1 >> 11); - s1 ^= (s1 << 7) & 0x9d2c5680U; - s1 ^= (s1 << 15) & 0xefc60000U; - return ( s1 ^ (s1 >> 18) ); - }; - - /// Get a random number on [0, max] interval. - uint32_t getRange( uint32_t max ) - { - if (max == 0) return 0; - if (max == NV_UINT32_MAX) return get(); - const uint32_t np2 = nextPowerOfTwo( max + 1 ); // @@ This fails if max == NV_UINT32_MAX - const uint32_t mask = np2 - 1; - uint32_t n; - do { - n = get() & mask; - } while ( n > max ); - return n; } -private: - void initialize( uint32_t seed ) + void update() { - // Initialize generator state with seed - // See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. - // In previous versions, most significant bits (MSBs) of the seed affect - // only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. - uint32_t *s = state; - uint32_t *r = state; - int i = 1; - *s++ = seed & 0xffffffffUL; - for ( ; i < N; ++i ) { - *s++ = ( 1812433253UL * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffUL; - r++; + if (!m_func) + return; + m_mutex.lock(); + const uint32_t newProgress = uint32_t(ceilf(value.load() / (float)m_maxValue * 100.0f)); + if (newProgress != m_progress && newProgress < 100) { + m_progress = newProgress; + if (!m_func(m_category, m_progress, m_userData)) + cancel = true; } + m_mutex.unlock(); } - void reload() + void setMaxValue(uint32_t maxValue) { - // Generate N new values in state - // Made clearer and faster by Matthew Bellew (matthew.bellew@home.com) - uint32_t *p = state; - int i; - for ( i = N - M; i--; ++p ) - *p = twist( p[M], p[0], p[1] ); - for ( i = M; --i; ++p ) - *p = twist( p[M - N], p[0], p[1] ); - *p = twist( p[M - N], p[0], state[0] ); - left = N, next = state; + m_mutex.lock(); + m_maxValue = maxValue; + m_mutex.unlock(); } - uint32_t hiBit( uint32_t u ) const - { - return u & 0x80000000U; - } - uint32_t loBit( uint32_t u ) const - { - return u & 0x00000001U; - } - uint32_t loBits( uint32_t u ) const - { - return u & 0x7fffffffU; - } - uint32_t mixBits( uint32_t u, uint32_t v ) const - { - return hiBit(u) | loBits(v); - } - uint32_t twist( uint32_t m, uint32_t s0, uint32_t s1 ) const - { - return m ^ (mixBits(s0, s1) >> 1) ^ ((~loBit(s1) + 1) & 0x9908b0dfU); - } + std::atomic<uint32_t> value; + std::atomic<bool> cancel; - uint32_t state[N]; // internal state - uint32_t *next; // next value to get from state - int left; // number of values left before reload needed +private: + ProgressCategory::Enum m_category; + ProgressFunc m_func; + void *m_userData; + uint32_t m_maxValue; + uint32_t m_progress; + std::mutex m_mutex; }; -namespace morton { -// Code from ryg: -// http://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/ - -// Inverse of part1By1 - "delete" all odd-indexed bits -uint32_t compact1By1(uint32_t x) -{ - x &= 0x55555555; // x = -f-e -d-c -b-a -9-8 -7-6 -5-4 -3-2 -1-0 - x = (x ^ (x >> 1)) & 0x33333333; // x = --fe --dc --ba --98 --76 --54 --32 --10 - x = (x ^ (x >> 2)) & 0x0f0f0f0f; // x = ---- fedc ---- ba98 ---- 7654 ---- 3210 - x = (x ^ (x >> 4)) & 0x00ff00ff; // x = ---- ---- fedc ba98 ---- ---- 7654 3210 - x = (x ^ (x >> 8)) & 0x0000ffff; // x = ---- ---- ---- ---- fedc ba98 7654 3210 - return x; -} - -// Inverse of part1By2 - "delete" all bits not at positions divisible by 3 -uint32_t compact1By2(uint32_t x) +struct Spinlock { - x &= 0x09249249; // x = ---- 9--8 --7- -6-- 5--4 --3- -2-- 1--0 - x = (x ^ (x >> 2)) & 0x030c30c3; // x = ---- --98 ---- 76-- --54 ---- 32-- --10 - x = (x ^ (x >> 4)) & 0x0300f00f; // x = ---- --98 ---- ---- 7654 ---- ---- 3210 - x = (x ^ (x >> 8)) & 0xff0000ff; // x = ---- --98 ---- ---- ---- ---- 7654 3210 - x = (x ^ (x >> 16)) & 0x000003ff; // x = ---- ---- ---- ---- ---- --98 7654 3210 - return x; -} - -uint32_t decodeMorton2X(uint32_t code) -{ - return compact1By1(code >> 0); -} + void lock() { while(m_lock.test_and_set(std::memory_order_acquire)) {} } + void unlock() { m_lock.clear(std::memory_order_release); } -uint32_t decodeMorton2Y(uint32_t code) -{ - return compact1By1(code >> 1); -} +private: + std::atomic_flag m_lock = ATOMIC_FLAG_INIT; +}; -uint32_t decodeMorton3X(uint32_t code) +struct TaskGroupHandle { - return compact1By2(code >> 0); -} + uint32_t value = UINT32_MAX; +}; -uint32_t decodeMorton3Y(uint32_t code) +struct Task { - return compact1By2(code >> 1); -} + void (*func)(void *userData); + void *userData; +}; -uint32_t decodeMorton3Z(uint32_t code) +#if XA_MULTITHREADED +class TaskScheduler { - return compact1By2(code >> 2); -} -} // namespace morton - -// A simple, dynamic proximity grid based on Jon's code. -// Instead of storing pointers here I store indices. -struct ProximityGrid -{ - void init(const Box &box, uint32_t count) - { - cellArray.clear(); - // Determine grid size. - float cellWidth; - Vector3 diagonal = box.extents() * 2.f; - float volume = box.volume(); - if (equal(volume, 0)) { - // Degenerate box, treat like a quad. - Vector2 quad; - if (diagonal.x < diagonal.y && diagonal.x < diagonal.z) { - quad.x = diagonal.y; - quad.y = diagonal.z; - } else if (diagonal.y < diagonal.x && diagonal.y < diagonal.z) { - quad.x = diagonal.x; - quad.y = diagonal.z; - } else { - quad.x = diagonal.x; - quad.y = diagonal.y; - } - float cellArea = quad.x * quad.y / count; - cellWidth = sqrtf(cellArea); // pow(cellArea, 1.0f / 2.0f); - } else { - // Ideally we want one cell per point. - float cellVolume = volume / count; - cellWidth = powf(cellVolume, 1.0f / 3.0f); - } - xaDebugAssert(cellWidth != 0); - sx = std::max(1, ftoi_ceil(diagonal.x / cellWidth)); - sy = std::max(1, ftoi_ceil(diagonal.y / cellWidth)); - sz = std::max(1, ftoi_ceil(diagonal.z / cellWidth)); - invCellSize.x = float(sx) / diagonal.x; - invCellSize.y = float(sy) / diagonal.y; - invCellSize.z = float(sz) / diagonal.z; - cellArray.resize(sx * sy * sz); - corner = box.minCorner; // @@ Align grid better? - } - - int index_x(float x) const - { - return clamp(ftoi_floor((x - corner.x) * invCellSize.x), 0, sx - 1); - } - - int index_y(float y) const +public: + TaskScheduler() : m_shutdown(false) { - return clamp(ftoi_floor((y - corner.y) * invCellSize.y), 0, sy - 1); + // Max with current task scheduler usage is 1 per thread + 1 deep nesting, but allow for some slop. + m_maxGroups = std::thread::hardware_concurrency() * 4; + m_groups = XA_ALLOC_ARRAY(MemTag::Default, TaskGroup, m_maxGroups); + for (uint32_t i = 0; i < m_maxGroups; i++) { + new (&m_groups[i]) TaskGroup(); + m_groups[i].free = true; + m_groups[i].ref = 0; + } + m_workers.resize(std::thread::hardware_concurrency() <= 1 ? 1 : std::thread::hardware_concurrency() - 1); + for (uint32_t i = 0; i < m_workers.size(); i++) { + m_workers[i].wakeup = false; + m_workers[i].thread = XA_NEW(MemTag::Default, std::thread, workerThread, this, &m_workers[i]); + } } - int index_z(float z) const + ~TaskScheduler() { - return clamp(ftoi_floor((z - corner.z) * invCellSize.z), 0, sz - 1); + m_shutdown = true; + for (uint32_t i = 0; i < m_workers.size(); i++) { + Worker &worker = m_workers[i]; + XA_DEBUG_ASSERT(worker.thread); + worker.wakeup = true; + worker.cv.notify_one(); + if (worker.thread->joinable()) + worker.thread->join(); + worker.thread->~thread(); + XA_FREE(worker.thread); + } + for (uint32_t i = 0; i < m_maxGroups; i++) + m_groups[i].~TaskGroup(); + XA_FREE(m_groups); } - int index(int x, int y, int z) const + TaskGroupHandle createTaskGroup(uint32_t reserveSize = 0) { - xaDebugAssert(x >= 0 && x < sx); - xaDebugAssert(y >= 0 && y < sy); - xaDebugAssert(z >= 0 && z < sz); - int idx = (z * sy + y) * sx + x; - xaDebugAssert(idx >= 0 && uint32_t(idx) < cellArray.size()); - return idx; + // Claim the first free group. + for (uint32_t i = 0; i < m_maxGroups; i++) { + TaskGroup &group = m_groups[i]; + bool expected = true; + if (!group.free.compare_exchange_strong(expected, false)) + continue; + group.queueLock.lock(); + group.queueHead = 0; + group.queue.clear(); + group.queue.reserve(reserveSize); + group.queueLock.unlock(); + TaskGroupHandle handle; + handle.value = i; + return handle; + } + XA_DEBUG_ASSERT(false); + TaskGroupHandle handle; + handle.value = UINT32_MAX; + return handle; } - uint32_t mortonCount() const + void run(TaskGroupHandle handle, Task task) { - uint64_t s = uint64_t(max3(sx, sy, sz)); - s = nextPowerOfTwo(s); - if (s > 1024) { - return uint32_t(s * s * min3(sx, sy, sz)); + XA_DEBUG_ASSERT(handle.value != UINT32_MAX); + TaskGroup &group = m_groups[handle.value]; + group.queueLock.lock(); + group.queue.push_back(task); + group.queueLock.unlock(); + group.ref++; + // Wake up a worker to run this task. + for (uint32_t i = 0; i < m_workers.size(); i++) { + m_workers[i].wakeup = true; + m_workers[i].cv.notify_one(); } - return uint32_t(s * s * s); } - int mortonIndex(uint32_t code) const + void wait(TaskGroupHandle *handle) { - uint32_t x, y, z; - uint32_t s = uint32_t(max3(sx, sy, sz)); - if (s > 1024) { - // Use layered two-dimensional morton order. - s = nextPowerOfTwo(s); - uint32_t layer = code / (s * s); - code = code % (s * s); - uint32_t layer_count = uint32_t(min3(sx, sy, sz)); - if (sx == (int)layer_count) { - x = layer; - y = morton::decodeMorton2X(code); - z = morton::decodeMorton2Y(code); - } else if (sy == (int)layer_count) { - x = morton::decodeMorton2Y(code); - y = layer; - z = morton::decodeMorton2X(code); - } else { /*if (sz == layer_count)*/ - x = morton::decodeMorton2X(code); - y = morton::decodeMorton2Y(code); - z = layer; - } - } else { - x = morton::decodeMorton3X(code); - y = morton::decodeMorton3Y(code); - z = morton::decodeMorton3Z(code); + if (handle->value == UINT32_MAX) { + XA_DEBUG_ASSERT(false); + return; } - if (x >= uint32_t(sx) || y >= uint32_t(sy) || z >= uint32_t(sz)) { - return -1; + // Run tasks from the group queue until empty. + TaskGroup &group = m_groups[handle->value]; + for (;;) { + Task *task = nullptr; + group.queueLock.lock(); + if (group.queueHead < group.queue.size()) + task = &group.queue[group.queueHead++]; + group.queueLock.unlock(); + if (!task) + break; + task->func(task->userData); + group.ref--; } - return index(x, y, z); + // Even though the task queue is empty, workers can still be running tasks. + while (group.ref > 0) + std::this_thread::yield(); + group.free = true; + handle->value = UINT32_MAX; } - void add(const Vector3 &pos, uint32_t key) +private: + struct TaskGroup { - int x = index_x(pos.x); - int y = index_y(pos.y); - int z = index_z(pos.z); - uint32_t idx = index(x, y, z); - cellArray[idx].indexArray.push_back(key); - } + std::atomic<bool> free; + Array<Task> queue; // Items are never removed. queueHead is incremented to pop items. + uint32_t queueHead = 0; + Spinlock queueLock; + std::atomic<uint32_t> ref; // Increment when a task is enqueued, decrement when a task finishes. + }; - // Gather all points inside the given sphere. - // Radius is assumed to be small, so we don't bother culling the cells. - void gather(const Vector3 &position, float radius, std::vector<uint32_t> &indexArray) + struct Worker { - int x0 = index_x(position.x - radius); - int x1 = index_x(position.x + radius); - int y0 = index_y(position.y - radius); - int y1 = index_y(position.y + radius); - int z0 = index_z(position.z - radius); - int z1 = index_z(position.z + radius); - for (int z = z0; z <= z1; z++) { - for (int y = y0; y <= y1; y++) { - for (int x = x0; x <= x1; x++) { - int idx = index(x, y, z); - indexArray.insert(indexArray.begin(), cellArray[idx].indexArray.begin(), cellArray[idx].indexArray.end()); + std::thread *thread = nullptr; + std::mutex mutex; + std::condition_variable cv; + std::atomic<bool> wakeup; + }; + + TaskGroup *m_groups; + uint32_t m_maxGroups; + Array<Worker> m_workers; + std::atomic<bool> m_shutdown; + + static void workerThread(TaskScheduler *scheduler, Worker *worker) + { + std::unique_lock<std::mutex> lock(worker->mutex); + for (;;) { + worker->cv.wait(lock, [=]{ return worker->wakeup.load(); }); + worker->wakeup = false; + for (;;) { + if (scheduler->m_shutdown) + return; + // Look for a task in any of the groups and run it. + TaskGroup *group = nullptr; + Task *task = nullptr; + for (uint32_t i = 0; i < scheduler->m_maxGroups; i++) { + group = &scheduler->m_groups[i]; + if (group->free || group->ref == 0) + continue; + group->queueLock.lock(); + if (group->queueHead < group->queue.size()) { + task = &group->queue[group->queueHead++]; + group->queueLock.unlock(); + break; + } + group->queueLock.unlock(); } + if (!task) + break; + task->func(task->userData); + group->ref--; } } } - - struct Cell { - std::vector<uint32_t> indexArray; - }; - - std::vector<Cell> cellArray; - - Vector3 corner; - Vector3 invCellSize; - int sx, sy, sz; }; - -// Based on Pierre Terdiman's and Michael Herf's source code. -// http://www.codercorner.com/RadixSortRevisited.htm -// http://www.stereopsis.com/radix.html -class RadixSort +#else +class TaskScheduler { public: - RadixSort() : m_size(0), m_ranks(NULL), m_ranks2(NULL), m_validRanks(false) {} - ~RadixSort() + ~TaskScheduler() { - // Release everything - free(m_ranks2); - free(m_ranks); + for (uint32_t i = 0; i < m_groups.size(); i++) + destroyGroup({ i }); } - RadixSort &sort(const float *input, uint32_t count) + TaskGroupHandle createTaskGroup(uint32_t reserveSize = 0) { - if (input == NULL || count == 0) return *this; - // Resize lists if needed - if (count != m_size) { - if (count > m_size) { - m_ranks2 = (uint32_t *)realloc(m_ranks2, sizeof(uint32_t ) * count); - m_ranks = (uint32_t *)realloc(m_ranks, sizeof(uint32_t ) * count); - } - m_size = count; - m_validRanks = false; - } - if (count < 32) { - insertionSort(input, count); - } else { - // @@ Avoid touching the input multiple times. - for (uint32_t i = 0; i < count; i++) { - FloatFlip((uint32_t &)input[i]); - } - radixSort<uint32_t>((const uint32_t *)input, count); - for (uint32_t i = 0; i < count; i++) { - IFloatFlip((uint32_t &)input[i]); - } - } - return *this; + TaskGroup *group = XA_NEW(MemTag::Default, TaskGroup); + group->queue.reserve(reserveSize); + m_groups.push_back(group); + TaskGroupHandle handle; + handle.value = m_groups.size() - 1; + return handle; } - RadixSort &sort(const std::vector<float> &input) + void run(TaskGroupHandle handle, Task task) { - return sort(input.data(), input.size()); + m_groups[handle.value]->queue.push_back(task); } - // Access to results. m_ranks is a list of indices in sorted order, i.e. in the order you may further process your data - const uint32_t *ranks() const + void wait(TaskGroupHandle *handle) { - xaDebugAssert(m_validRanks); - return m_ranks; - } - uint32_t *ranks() - { - xaDebugAssert(m_validRanks); - return m_ranks; + if (handle->value == UINT32_MAX) { + XA_DEBUG_ASSERT(false); + return; + } + TaskGroup *group = m_groups[handle->value]; + for (uint32_t i = 0; i < group->queue.size(); i++) + group->queue[i].func(group->queue[i].userData); + group->queue.clear(); + destroyGroup(*handle); + handle->value = UINT32_MAX; } private: - uint32_t m_size; - uint32_t *m_ranks; - uint32_t *m_ranks2; - bool m_validRanks; - - void FloatFlip(uint32_t &f) + void destroyGroup(TaskGroupHandle handle) { - int32_t mask = (int32_t(f) >> 31) | 0x80000000; // Warren Hunt, Manchor Ko. - f ^= mask; + TaskGroup *group = m_groups[handle.value]; + if (group) { + group->~TaskGroup(); + XA_FREE(group); + m_groups[handle.value] = nullptr; + } } - void IFloatFlip(uint32_t &f) + struct TaskGroup { - uint32_t mask = ((f >> 31) - 1) | 0x80000000; // Michael Herf. - f ^= mask; - } + Array<Task> queue; + }; - template<typename T> - void createHistograms(const T *buffer, uint32_t count, uint32_t *histogram) - { - const uint32_t bucketCount = sizeof(T); // (8 * sizeof(T)) / log2(radix) - // Init bucket pointers. - uint32_t *h[bucketCount]; - for (uint32_t i = 0; i < bucketCount; i++) { - h[i] = histogram + 256 * i; - } - // Clear histograms. - memset(histogram, 0, 256 * bucketCount * sizeof(uint32_t )); - // @@ Add support for signed integers. - // Build histograms. - const uint8_t *p = (const uint8_t *)buffer; // @@ Does this break aliasing rules? - const uint8_t *pe = p + count * sizeof(T); - while (p != pe) { - h[0][*p++]++, h[1][*p++]++, h[2][*p++]++, h[3][*p++]++; -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4127) -#endif - if (bucketCount == 8) h[4][*p++]++, h[5][*p++]++, h[6][*p++]++, h[7][*p++]++; -#ifdef _MSC_VER -#pragma warning(pop) + Array<TaskGroup *> m_groups; +}; #endif - } - } - template <typename T> void insertionSort(const T *input, uint32_t count) - { - if (!m_validRanks) { - m_ranks[0] = 0; - for (uint32_t i = 1; i != count; ++i) { - int rank = m_ranks[i] = i; - uint32_t j = i; - while (j != 0 && input[rank] < input[m_ranks[j - 1]]) { - m_ranks[j] = m_ranks[j - 1]; - --j; - } - if (i != j) { - m_ranks[j] = rank; - } - } - m_validRanks = true; - } else { - for (uint32_t i = 1; i != count; ++i) { - int rank = m_ranks[i]; - uint32_t j = i; - while (j != 0 && input[rank] < input[m_ranks[j - 1]]) { - m_ranks[j] = m_ranks[j - 1]; - --j; - } - if (i != j) { - m_ranks[j] = rank; - } - } - } - } +struct UvMeshChart +{ + Array<uint32_t> indices; + uint32_t material; +}; - template <typename T> void radixSort(const T *input, uint32_t count) - { - const uint32_t P = sizeof(T); // pass count - // Allocate histograms & offsets on the stack - uint32_t histogram[256 * P]; - uint32_t *link[256]; - createHistograms(input, count, histogram); - // Radix sort, j is the pass number (0=LSB, P=MSB) - for (uint32_t j = 0; j < P; j++) { - // Pointer to this bucket. - const uint32_t *h = &histogram[j * 256]; - const uint8_t *inputBytes = (const uint8_t *)input; // @@ Is this aliasing legal? - inputBytes += j; - if (h[inputBytes[0]] == count) { - // Skip this pass, all values are the same. - continue; - } - // Create offsets - link[0] = m_ranks2; - for (uint32_t i = 1; i < 256; i++) link[i] = link[i - 1] + h[i - 1]; - // Perform Radix Sort - if (!m_validRanks) { - for (uint32_t i = 0; i < count; i++) { - *link[inputBytes[i * P]]++ = i; - } - m_validRanks = true; - } else { - for (uint32_t i = 0; i < count; i++) { - const uint32_t idx = m_ranks[i]; - *link[inputBytes[idx * P]]++ = idx; - } - } - // Swap pointers for next pass. Valid indices - the most recent ones - are in m_ranks after the swap. - std::swap(m_ranks, m_ranks2); - } - // All values were equal, generate linear ranks. - if (!m_validRanks) { - for (uint32_t i = 0; i < count; i++) { - m_ranks[i] = i; - } - m_validRanks = true; - } - } +struct UvMesh +{ + UvMeshDecl decl; + Array<uint32_t> indices; + Array<UvMeshChart *> charts; + Array<uint32_t> vertexToChartMap; +}; + +struct UvMeshInstance +{ + UvMesh *mesh; + Array<Vector2> texcoords; + bool rotateCharts; }; namespace raster { class ClippedTriangle { public: - ClippedTriangle(Vector2::Arg a, Vector2::Arg b, Vector2::Arg c) + ClippedTriangle(const Vector2 &a, const Vector2 &b, const Vector2 &c) { m_numVertices = 3; m_activeVertexBuffer = 0; @@ -3549,16 +3804,6 @@ public: m_vertexBuffers[1] = m_verticesB; } - uint32_t vertexCount() - { - return m_numVertices; - } - - const Vector2 *vertices() - { - return m_vertexBuffers[m_activeVertexBuffer]; - } - void clipHorizontalPlane(float offset, float clipdirection) { Vector2 *v = m_vertexBuffers[m_activeVertexBuffer]; @@ -3581,7 +3826,6 @@ public: dy1in = dy2in; } m_numVertices = p; - //for (uint32_t k=0; k<m_numVertices; k++) printf("(%f, %f)\n", v2[k].x, v2[k].y); printf("\n"); } void clipVerticalPlane(float offset, float clipdirection ) @@ -3608,7 +3852,7 @@ public: m_numVertices = p; } - void computeAreaCentroid() + void computeArea() { Vector2 *v = m_vertexBuffers[m_activeVertexBuffer]; v[m_numVertices] = v[0]; @@ -3622,25 +3866,15 @@ public: centroidy += f * (v[k].y + v[k + 1].y); } m_area = 0.5f * fabsf(m_area); - if (m_area == 0) { - m_centroid = Vector2(0.0f); - } else { - m_centroid = Vector2(centroidx / (6 * m_area), centroidy / (6 * m_area)); - } } void clipAABox(float x0, float y0, float x1, float y1) { - clipVerticalPlane ( x0, -1); - clipHorizontalPlane( y0, -1); - clipVerticalPlane ( x1, 1); - clipHorizontalPlane( y1, 1); - computeAreaCentroid(); - } - - Vector2 centroid() - { - return m_centroid; + clipVerticalPlane(x0, -1); + clipHorizontalPlane(y0, -1); + clipVerticalPlane(x1, 1); + clipHorizontalPlane(y1, 1); + computeArea(); } float area() @@ -3652,212 +3886,50 @@ private: Vector2 m_verticesA[7 + 1]; Vector2 m_verticesB[7 + 1]; Vector2 *m_vertexBuffers[2]; - uint32_t m_numVertices; - uint32_t m_activeVertexBuffer; - float m_area; - Vector2 m_centroid; + uint32_t m_numVertices; + uint32_t m_activeVertexBuffer; + float m_area; }; /// A callback to sample the environment. Return false to terminate rasterization. -typedef bool (* SamplingCallback)(void *param, int x, int y, Vector3::Arg bar, Vector3::Arg dx, Vector3::Arg dy, float coverage); +typedef bool (*SamplingCallback)(void *param, int x, int y); /// A triangle for rasterization. struct Triangle { - Triangle(Vector2::Arg v0, Vector2::Arg v1, Vector2::Arg v2, Vector3::Arg t0, Vector3::Arg t1, Vector3::Arg t2) + Triangle(const Vector2 &v0, const Vector2 &v1, const Vector2 &v2) { // Init vertices. this->v1 = v0; this->v2 = v2; this->v3 = v1; - // Set barycentric coordinates. - this->t1 = t0; - this->t2 = t2; - this->t3 = t1; // make sure every triangle is front facing. flipBackface(); // Compute deltas. - valid = computeDeltas(); computeUnitInwardNormals(); } - /// Compute texture space deltas. - /// This method takes two edge vectors that form a basis, determines the - /// coordinates of the canonic vectors in that basis, and computes the - /// texture gradient that corresponds to those vectors. - bool computeDeltas() + bool isValid() { - Vector2 e0 = v3 - v1; - Vector2 e1 = v2 - v1; - Vector3 de0 = t3 - t1; - Vector3 de1 = t2 - t1; - float denom = 1.0f / (e0.y * e1.x - e1.y * e0.x); - if (!std::isfinite(denom)) { - return false; - } - float lambda1 = - e1.y * denom; - float lambda2 = e0.y * denom; - float lambda3 = e1.x * denom; - float lambda4 = - e0.x * denom; - dx = de0 * lambda1 + de1 * lambda2; - dy = de0 * lambda3 + de1 * lambda4; - return true; - } - - bool draw(const Vector2 &extents, bool enableScissors, SamplingCallback cb, void *param) - { - // 28.4 fixed-point coordinates - const int Y1 = ftoi_round(16.0f * v1.y); - const int Y2 = ftoi_round(16.0f * v2.y); - const int Y3 = ftoi_round(16.0f * v3.y); - const int X1 = ftoi_round(16.0f * v1.x); - const int X2 = ftoi_round(16.0f * v2.x); - const int X3 = ftoi_round(16.0f * v3.x); - // Deltas - const int DX12 = X1 - X2; - const int DX23 = X2 - X3; - const int DX31 = X3 - X1; - const int DY12 = Y1 - Y2; - const int DY23 = Y2 - Y3; - const int DY31 = Y3 - Y1; - // Fixed-point deltas - const int FDX12 = DX12 << 4; - const int FDX23 = DX23 << 4; - const int FDX31 = DX31 << 4; - const int FDY12 = DY12 << 4; - const int FDY23 = DY23 << 4; - const int FDY31 = DY31 << 4; - int minx, miny, maxx, maxy; - if (enableScissors) { - int frustumX0 = 0 << 4; - int frustumY0 = 0 << 4; - int frustumX1 = (int)extents.x << 4; - int frustumY1 = (int)extents.y << 4; - // Bounding rectangle - minx = (std::max(min3(X1, X2, X3), frustumX0) + 0xF) >> 4; - miny = (std::max(min3(Y1, Y2, Y3), frustumY0) + 0xF) >> 4; - maxx = (std::min(max3(X1, X2, X3), frustumX1) + 0xF) >> 4; - maxy = (std::min(max3(Y1, Y2, Y3), frustumY1) + 0xF) >> 4; - } else { - // Bounding rectangle - minx = (min3(X1, X2, X3) + 0xF) >> 4; - miny = (min3(Y1, Y2, Y3) + 0xF) >> 4; - maxx = (max3(X1, X2, X3) + 0xF) >> 4; - maxy = (max3(Y1, Y2, Y3) + 0xF) >> 4; - } - // Block size, standard 8x8 (must be power of two) - const int q = 8; - // @@ This won't work when minx,miny are negative. This code path is not used. Leaving as is for now. - xaAssert(minx >= 0); - xaAssert(miny >= 0); - // Start in corner of 8x8 block - minx &= ~(q - 1); - miny &= ~(q - 1); - // Half-edge constants - int C1 = DY12 * X1 - DX12 * Y1; - int C2 = DY23 * X2 - DX23 * Y2; - int C3 = DY31 * X3 - DX31 * Y3; - // Correct for fill convention - if (DY12 < 0 || (DY12 == 0 && DX12 > 0)) C1++; - if (DY23 < 0 || (DY23 == 0 && DX23 > 0)) C2++; - if (DY31 < 0 || (DY31 == 0 && DX31 > 0)) C3++; - // Loop through blocks - for (int y = miny; y < maxy; y += q) { - for (int x = minx; x < maxx; x += q) { - // Corners of block - int x0 = x << 4; - int x1 = (x + q - 1) << 4; - int y0 = y << 4; - int y1 = (y + q - 1) << 4; - // Evaluate half-space functions - bool a00 = C1 + DX12 * y0 - DY12 * x0 > 0; - bool a10 = C1 + DX12 * y0 - DY12 * x1 > 0; - bool a01 = C1 + DX12 * y1 - DY12 * x0 > 0; - bool a11 = C1 + DX12 * y1 - DY12 * x1 > 0; - int a = (a00 << 0) | (a10 << 1) | (a01 << 2) | (a11 << 3); - bool b00 = C2 + DX23 * y0 - DY23 * x0 > 0; - bool b10 = C2 + DX23 * y0 - DY23 * x1 > 0; - bool b01 = C2 + DX23 * y1 - DY23 * x0 > 0; - bool b11 = C2 + DX23 * y1 - DY23 * x1 > 0; - int b = (b00 << 0) | (b10 << 1) | (b01 << 2) | (b11 << 3); - bool c00 = C3 + DX31 * y0 - DY31 * x0 > 0; - bool c10 = C3 + DX31 * y0 - DY31 * x1 > 0; - bool c01 = C3 + DX31 * y1 - DY31 * x0 > 0; - bool c11 = C3 + DX31 * y1 - DY31 * x1 > 0; - int c = (c00 << 0) | (c10 << 1) | (c01 << 2) | (c11 << 3); - // Skip block when outside an edge - if (a == 0x0 || b == 0x0 || c == 0x0) continue; - // Accept whole block when totally covered - if (a == 0xF && b == 0xF && c == 0xF) { - Vector3 texRow = t1 + dy * (y0 - v1.y) + dx * (x0 - v1.x); - for (int iy = y; iy < y + q; iy++) { - Vector3 tex = texRow; - for (int ix = x; ix < x + q; ix++) { - //Vector3 tex = t1 + dx * (ix - v1.x) + dy * (iy - v1.y); - if (!cb(param, ix, iy, tex, dx, dy, 1.0)) { - // early out. - return false; - } - tex += dx; - } - texRow += dy; - } - } else { // Partially covered block - int CY1 = C1 + DX12 * y0 - DY12 * x0; - int CY2 = C2 + DX23 * y0 - DY23 * x0; - int CY3 = C3 + DX31 * y0 - DY31 * x0; - Vector3 texRow = t1 + dy * (y0 - v1.y) + dx * (x0 - v1.x); - for (int iy = y; iy < y + q; iy++) { - int CX1 = CY1; - int CX2 = CY2; - int CX3 = CY3; - Vector3 tex = texRow; - for (int ix = x; ix < x + q; ix++) { - if (CX1 > 0 && CX2 > 0 && CX3 > 0) { - if (!cb(param, ix, iy, tex, dx, dy, 1.0)) { - // early out. - return false; - } - } - CX1 -= FDY12; - CX2 -= FDY23; - CX3 -= FDY31; - tex += dx; - } - CY1 += FDX12; - CY2 += FDX23; - CY3 += FDX31; - texRow += dy; - } - } - } - } - return true; + const Vector2 e0 = v3 - v1; + const Vector2 e1 = v2 - v1; + const float denom = 1.0f / (e0.y * e1.x - e1.y * e0.x); + return isFinite(denom); } // extents has to be multiple of BK_SIZE!! - bool drawAA(const Vector2 &extents, bool enableScissors, SamplingCallback cb, void *param) + bool drawAA(const Vector2 &extents, SamplingCallback cb, void *param) { - const float PX_INSIDE = 1.0f/sqrt(2.0f); - const float PX_OUTSIDE = -1.0f/sqrt(2.0f); + const float PX_INSIDE = 1.0f/sqrtf(2.0f); + const float PX_OUTSIDE = -1.0f/sqrtf(2.0f); const float BK_SIZE = 8; - const float BK_INSIDE = sqrt(BK_SIZE*BK_SIZE/2.0f); - const float BK_OUTSIDE = -sqrt(BK_SIZE*BK_SIZE/2.0f); - - float minx, miny, maxx, maxy; - if (enableScissors) { - // Bounding rectangle - minx = floorf(std::max(min3(v1.x, v2.x, v3.x), 0.0f)); - miny = floorf(std::max(min3(v1.y, v2.y, v3.y), 0.0f)); - maxx = ceilf( std::min(max3(v1.x, v2.x, v3.x), extents.x - 1.0f)); - maxy = ceilf( std::min(max3(v1.y, v2.y, v3.y), extents.y - 1.0f)); - } else { - // Bounding rectangle - minx = floorf(min3(v1.x, v2.x, v3.x)); - miny = floorf(min3(v1.y, v2.y, v3.y)); - maxx = ceilf( max3(v1.x, v2.x, v3.x)); - maxy = ceilf( max3(v1.y, v2.y, v3.y)); - } + const float BK_INSIDE = sqrtf(BK_SIZE*BK_SIZE/2.0f); + const float BK_OUTSIDE = -sqrtf(BK_SIZE*BK_SIZE/2.0f); + // Bounding rectangle + float minx = floorf(max(min3(v1.x, v2.x, v3.x), 0.0f)); + float miny = floorf(max(min3(v1.y, v2.y, v3.y), 0.0f)); + float maxx = ceilf( min(max3(v1.x, v2.x, v3.x), extents.x - 1.0f)); + float maxy = ceilf( min(max3(v1.y, v2.y, v3.y), extents.y - 1.0f)); // There's no reason to align the blocks to the viewport, instead we align them to the origin of the triangle bounds. minx = floorf(minx); miny = floorf(miny); @@ -3885,47 +3957,32 @@ struct Triangle if ( (aC <= BK_OUTSIDE) || (bC <= BK_OUTSIDE) || (cC <= BK_OUTSIDE) ) continue; // Accept whole block when totally covered if ( (aC >= BK_INSIDE) && (bC >= BK_INSIDE) && (cC >= BK_INSIDE) ) { - Vector3 texRow = t1 + dy * (y0 - v1.y) + dx * (x0 - v1.x); for (float y = y0; y < y0 + BK_SIZE; y++) { - Vector3 tex = texRow; for (float x = x0; x < x0 + BK_SIZE; x++) { - if (!cb(param, (int)x, (int)y, tex, dx, dy, 1.0f)) { + if (!cb(param, (int)x, (int)y)) { return false; } - tex += dx; } - texRow += dy; } } else { // Partially covered block float CY1 = C1 + n1.x * x0 + n1.y * y0; float CY2 = C2 + n2.x * x0 + n2.y * y0; float CY3 = C3 + n3.x * x0 + n3.y * y0; - Vector3 texRow = t1 + dy * (y0 - v1.y) + dx * (x0 - v1.x); for (float y = y0; y < y0 + BK_SIZE; y++) { // @@ This is not clipping to scissor rectangle correctly. float CX1 = CY1; float CX2 = CY2; float CX3 = CY3; - Vector3 tex = texRow; for (float x = x0; x < x0 + BK_SIZE; x++) { // @@ This is not clipping to scissor rectangle correctly. if (CX1 >= PX_INSIDE && CX2 >= PX_INSIDE && CX3 >= PX_INSIDE) { - // pixel completely covered - Vector3 tex2 = t1 + dx * (x - v1.x) + dy * (y - v1.y); - if (!cb(param, (int)x, (int)y, tex2, dx, dy, 1.0f)) { + if (!cb(param, (int)x, (int)y)) { return false; } } else if ((CX1 >= PX_OUTSIDE) && (CX2 >= PX_OUTSIDE) && (CX3 >= PX_OUTSIDE)) { // triangle partially covers pixel. do clipping. ClippedTriangle ct(v1 - Vector2(x, y), v2 - Vector2(x, y), v3 - Vector2(x, y)); ct.clipAABox(-0.5, -0.5, 0.5, 0.5); - Vector2 centroid = ct.centroid(); - float area = ct.area(); - if (area > 0.0f) { - Vector3 texCent = tex - dx * centroid.x - dy * centroid.y; - //xaAssert(texCent.x >= -0.1f && texCent.x <= 1.1f); // @@ Centroid is not very exact... - //xaAssert(texCent.y >= -0.1f && texCent.y <= 1.1f); - //xaAssert(texCent.z >= -0.1f && texCent.z <= 1.1f); - //Vector3 texCent2 = t1 + dx * (x - v1.x) + dy * (y - v1.y); - if (!cb(param, (int)x, (int)y, texCent, dx, dy, area)) { + if (ct.area() > 0.0f) { + if (!cb(param, (int)x, (int)y)) { return false; } } @@ -3933,12 +3990,10 @@ struct Triangle CX1 += n1.x; CX2 += n2.x; CX3 += n3.x; - tex += dx; } CY1 += n1.y; CY2 += n2.y; CY3 += n3.y; - texRow += dy; } } } @@ -3953,9 +4008,6 @@ struct Triangle Vector2 hv = v1; v1 = v2; v2 = hv; // swap pos - Vector3 ht = t1; - t1 = t2; - t2 = ht; // swap tex } } @@ -3976,77 +4028,24 @@ struct Triangle // Vertices. Vector2 v1, v2, v3; Vector2 n1, n2, n3; // unit inward normals - Vector3 t1, t2, t3; - - // Deltas. - Vector3 dx, dy; - - float sign; - bool valid; -}; - -enum Mode -{ - Mode_Nearest, - Mode_Antialiased }; // Process the given triangle. Returns false if rasterization was interrupted by the callback. -static bool drawTriangle(Mode mode, Vector2::Arg extents, bool enableScissors, const Vector2 v[3], SamplingCallback cb, void *param) +static bool drawTriangle(const Vector2 &extents, const Vector2 v[3], SamplingCallback cb, void *param) { - Triangle tri(v[0], v[1], v[2], Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, 1)); + Triangle tri(v[0], v[1], v[2]); // @@ It would be nice to have a conservative drawing mode that enlarges the triangle extents by one texel and is able to handle degenerate triangles. // @@ Maybe the simplest thing to do would be raster triangle edges. - if (tri.valid) { - if (mode == Mode_Antialiased) { - return tri.drawAA(extents, enableScissors, cb, param); - } - if (mode == Mode_Nearest) { - return tri.draw(extents, enableScissors, cb, param); - } - } + if (tri.isValid()) + return tri.drawAA(extents, cb, param); return true; } -// Process the given quad. Returns false if rasterization was interrupted by the callback. -static bool drawQuad(Mode mode, Vector2::Arg extents, bool enableScissors, const Vector2 v[4], SamplingCallback cb, void *param) -{ - bool sign0 = triangleArea2(v[0], v[1], v[2]) > 0.0f; - bool sign1 = triangleArea2(v[0], v[2], v[3]) > 0.0f; - // Divide the quad into two non overlapping triangles. - if (sign0 == sign1) { - Triangle tri0(v[0], v[1], v[2], Vector3(0, 0, 0), Vector3(1, 0, 0), Vector3(1, 1, 0)); - Triangle tri1(v[0], v[2], v[3], Vector3(0, 0, 0), Vector3(1, 1, 0), Vector3(0, 1, 0)); - if (tri0.valid && tri1.valid) { - if (mode == Mode_Antialiased) { - return tri0.drawAA(extents, enableScissors, cb, param) && tri1.drawAA(extents, enableScissors, cb, param); - } else { - return tri0.draw(extents, enableScissors, cb, param) && tri1.draw(extents, enableScissors, cb, param); - } - } - } else { - Triangle tri0(v[0], v[1], v[3], Vector3(0, 0, 0), Vector3(1, 0, 0), Vector3(0, 1, 0)); - Triangle tri1(v[1], v[2], v[3], Vector3(1, 0, 0), Vector3(1, 1, 0), Vector3(0, 1, 0)); - if (tri0.valid && tri1.valid) { - if (mode == Mode_Antialiased) { - return tri0.drawAA(extents, enableScissors, cb, param) && tri1.drawAA(extents, enableScissors, cb, param); - } else { - return tri0.draw(extents, enableScissors, cb, param) && tri1.draw(extents, enableScissors, cb, param); - } - } - } - return true; -} } // namespace raster // Full and sparse vector and matrix classes. BLAS subset. // Pseudo-BLAS interface. namespace sparse { -enum Transpose -{ - NoTransposed = 0, - Transposed = 1 -}; /** * Sparse matrix class. The matrix is assumed to be sparse and to have @@ -4072,8 +4071,8 @@ public: const Matrix &operator=(const Matrix &m) { - xaAssert(width() == m.width()); - xaAssert(height() == m.height()); + XA_ASSERT(width() == m.width()); + XA_ASSERT(height() == m.height()); m_array = m.m_array; return *this; } @@ -4085,8 +4084,8 @@ public: // x is column, y is row float getCoefficient(uint32_t x, uint32_t y) const { - xaDebugAssert( x < width() ); - xaDebugAssert( y < height() ); + XA_DEBUG_ASSERT( x < width() ); + XA_DEBUG_ASSERT( y < height() ); const uint32_t count = m_array[y].size(); for (uint32_t i = 0; i < count; i++) { if (m_array[y][i].x == x) return m_array[y][i].v; @@ -4096,8 +4095,8 @@ public: void setCoefficient(uint32_t x, uint32_t y, float f) { - xaDebugAssert( x < width() ); - xaDebugAssert( y < height() ); + XA_DEBUG_ASSERT( x < width() ); + XA_DEBUG_ASSERT( y < height() ); const uint32_t count = m_array[y].size(); for (uint32_t i = 0; i < count; i++) { if (m_array[y][i].x == x) { @@ -4113,7 +4112,7 @@ public: float dotRow(uint32_t y, const FullVector &v) const { - xaDebugAssert( y < height() ); + XA_DEBUG_ASSERT( y < height() ); const uint32_t count = m_array[y].size(); float sum = 0; for (uint32_t i = 0; i < count; i++) { @@ -4124,7 +4123,7 @@ public: void madRow(uint32_t y, float alpha, FullVector &v) const { - xaDebugAssert(y < height()); + XA_DEBUG_ASSERT(y < height()); const uint32_t count = m_array[y].size(); for (uint32_t i = 0; i < count; i++) { v[m_array[y][i].x] += alpha * m_array[y][i].v; @@ -4133,33 +4132,24 @@ public: void clearRow(uint32_t y) { - xaDebugAssert( y < height() ); + XA_DEBUG_ASSERT( y < height() ); m_array[y].clear(); } - void scaleRow(uint32_t y, float f) - { - xaDebugAssert( y < height() ); - const uint32_t count = m_array[y].size(); - for (uint32_t i = 0; i < count; i++) { - m_array[y][i].v *= f; - } - } - - const std::vector<Coefficient> &getRow(uint32_t y) const { return m_array[y]; } + const Array<Coefficient> &getRow(uint32_t y) const { return m_array[y]; } private: /// Number of columns. const uint32_t m_width; /// Array of matrix elements. - std::vector< std::vector<Coefficient> > m_array; + Array< Array<Coefficient> > m_array; }; // y = a * x + y static void saxpy(float a, const FullVector &x, FullVector &y) { - xaDebugAssert(x.dimension() == y.dimension()); + XA_DEBUG_ASSERT(x.dimension() == y.dimension()); const uint32_t dim = x.dimension(); for (uint32_t i = 0; i < dim; i++) { y[i] += a * x[i]; @@ -4168,7 +4158,7 @@ static void saxpy(float a, const FullVector &x, FullVector &y) static void copy(const FullVector &x, FullVector &y) { - xaDebugAssert(x.dimension() == y.dimension()); + XA_DEBUG_ASSERT(x.dimension() == y.dimension()); const uint32_t dim = x.dimension(); for (uint32_t i = 0; i < dim; i++) { y[i] = x[i]; @@ -4185,7 +4175,7 @@ static void scal(float a, FullVector &x) static float dot(const FullVector &x, const FullVector &y) { - xaDebugAssert(x.dimension() == y.dimension()); + XA_DEBUG_ASSERT(x.dimension() == y.dimension()); const uint32_t dim = x.dimension(); float sum = 0; for (uint32_t i = 0; i < dim; i++) { @@ -4194,61 +4184,35 @@ static float dot(const FullVector &x, const FullVector &y) return sum; } -static void mult(Transpose TM, const Matrix &M, const FullVector &x, FullVector &y) -{ - const uint32_t w = M.width(); - const uint32_t h = M.height(); - if (TM == Transposed) { - xaDebugAssert( h == x.dimension() ); - xaDebugAssert( w == y.dimension() ); - y.fill(0.0f); - for (uint32_t i = 0; i < h; i++) { - M.madRow(i, x[i], y); - } - } else { - xaDebugAssert( w == x.dimension() ); - xaDebugAssert( h == y.dimension() ); - for (uint32_t i = 0; i < h; i++) { - y[i] = M.dotRow(i, x); - } - } -} - // y = M * x static void mult(const Matrix &M, const FullVector &x, FullVector &y) { - mult(NoTransposed, M, x, y); -} - -static void sgemv(float alpha, Transpose TA, const Matrix &A, const FullVector &x, float beta, FullVector &y) -{ - const uint32_t w = A.width(); - const uint32_t h = A.height(); - if (TA == Transposed) { - xaDebugAssert( h == x.dimension() ); - xaDebugAssert( w == y.dimension() ); - for (uint32_t i = 0; i < h; i++) { - A.madRow(i, alpha * x[i], y); - } - } else { - xaDebugAssert( w == x.dimension() ); - xaDebugAssert( h == y.dimension() ); - for (uint32_t i = 0; i < h; i++) { - y[i] = alpha * A.dotRow(i, x) + beta * y[i]; - } - } + uint32_t w = M.width(); + uint32_t h = M.height(); + XA_DEBUG_ASSERT( w == x.dimension() ); + XA_UNUSED(w); + XA_DEBUG_ASSERT( h == y.dimension() ); + for (uint32_t i = 0; i < h; i++) + y[i] = M.dotRow(i, x); } // y = alpha*A*x + beta*y static void sgemv(float alpha, const Matrix &A, const FullVector &x, float beta, FullVector &y) { - sgemv(alpha, NoTransposed, A, x, beta, y); + const uint32_t w = A.width(); + const uint32_t h = A.height(); + XA_DEBUG_ASSERT( w == x.dimension() ); + XA_DEBUG_ASSERT( h == y.dimension() ); + XA_UNUSED(w); + XA_UNUSED(h); + for (uint32_t i = 0; i < h; i++) + y[i] = alpha * A.dotRow(i, x) + beta * y[i]; } // dot y-row of A by x-column of B static float dotRowColumn(int y, const Matrix &A, int x, const Matrix &B) { - const std::vector<Matrix::Coefficient> &row = A.getRow(y); + const Array<Matrix::Coefficient> &row = A.getRow(y); const uint32_t count = row.size(); float sum = 0.0f; for (uint32_t i = 0; i < count; i++) { @@ -4258,96 +4222,54 @@ static float dotRowColumn(int y, const Matrix &A, int x, const Matrix &B) return sum; } -// dot y-row of A by x-row of B -static float dotRowRow(int y, const Matrix &A, int x, const Matrix &B) -{ - const std::vector<Matrix::Coefficient> &row = A.getRow(y); - const uint32_t count = row.size(); - float sum = 0.0f; - for (uint32_t i = 0; i < count; i++) { - const Matrix::Coefficient &c = row[i]; - sum += c.v * B.getCoefficient(c.x, x); - } - return sum; -} - -// dot y-column of A by x-column of B -static float dotColumnColumn(int y, const Matrix &A, int x, const Matrix &B) -{ - xaDebugAssert(A.height() == B.height()); - const uint32_t h = A.height(); - float sum = 0.0f; - for (uint32_t i = 0; i < h; i++) { - sum += A.getCoefficient(y, i) * B.getCoefficient(x, i); - } - return sum; -} - static void transpose(const Matrix &A, Matrix &B) { - xaDebugAssert(A.width() == B.height()); - xaDebugAssert(B.width() == A.height()); + XA_DEBUG_ASSERT(A.width() == B.height()); + XA_DEBUG_ASSERT(B.width() == A.height()); const uint32_t w = A.width(); for (uint32_t x = 0; x < w; x++) { B.clearRow(x); } const uint32_t h = A.height(); for (uint32_t y = 0; y < h; y++) { - const std::vector<Matrix::Coefficient> &row = A.getRow(y); + const Array<Matrix::Coefficient> &row = A.getRow(y); const uint32_t count = row.size(); for (uint32_t i = 0; i < count; i++) { const Matrix::Coefficient &c = row[i]; - xaDebugAssert(c.x < w); + XA_DEBUG_ASSERT(c.x < w); B.setCoefficient(y, c.x, c.v); } } } -static void sgemm(float alpha, Transpose TA, const Matrix &A, Transpose TB, const Matrix &B, float beta, Matrix &C) +static void sgemm(float alpha, const Matrix &A, const Matrix &B, float beta, Matrix &C) { const uint32_t w = C.width(); const uint32_t h = C.height(); - uint32_t aw = (TA == NoTransposed) ? A.width() : A.height(); - uint32_t ah = (TA == NoTransposed) ? A.height() : A.width(); - uint32_t bw = (TB == NoTransposed) ? B.width() : B.height(); - uint32_t bh = (TB == NoTransposed) ? B.height() : B.width(); - xaDebugAssert(aw == bh); - xaDebugAssert(bw == ah); - xaDebugAssert(w == bw); - xaDebugAssert(h == ah); -#ifdef NDEBUG - aw = ah = bw = bh = 0; // silence unused parameter warning +#if XA_DEBUG + const uint32_t aw = A.width(); + const uint32_t ah = A.height(); + const uint32_t bw = B.width(); + const uint32_t bh = B.height(); + XA_DEBUG_ASSERT(aw == bh); + XA_DEBUG_ASSERT(bw == ah); + XA_DEBUG_ASSERT(w == bw); + XA_DEBUG_ASSERT(h == ah); #endif for (uint32_t y = 0; y < h; y++) { for (uint32_t x = 0; x < w; x++) { float c = beta * C.getCoefficient(x, y); - if (TA == NoTransposed && TB == NoTransposed) { - // dot y-row of A by x-column of B. - c += alpha * dotRowColumn(y, A, x, B); - } else if (TA == Transposed && TB == Transposed) { - // dot y-column of A by x-row of B. - c += alpha * dotRowColumn(x, B, y, A); - } else if (TA == Transposed && TB == NoTransposed) { - // dot y-column of A by x-column of B. - c += alpha * dotColumnColumn(y, A, x, B); - } else if (TA == NoTransposed && TB == Transposed) { - // dot y-row of A by x-row of B. - c += alpha * dotRowRow(y, A, x, B); - } + // dot y-row of A by x-column of B. + c += alpha * dotRowColumn(y, A, x, B); C.setCoefficient(x, y, c); } } } -static void mult(Transpose TA, const Matrix &A, Transpose TB, const Matrix &B, Matrix &C) -{ - sgemm(1.0f, TA, A, TB, B, 0.0f, C); -} - // C = A * B static void mult(const Matrix &A, const Matrix &B, Matrix &C) { - mult(NoTransposed, A, NoTransposed, B, C); + sgemm(1.0f, A, B, 0.0f, C); } } // namespace sparse @@ -4357,10 +4279,10 @@ class JacobiPreconditioner public: JacobiPreconditioner(const sparse::Matrix &M, bool symmetric) : m_inverseDiagonal(M.width()) { - xaAssert(M.isSquare()); + XA_ASSERT(M.isSquare()); for (uint32_t x = 0; x < M.width(); x++) { float elem = M.getCoefficient(x, x); - //xaDebugAssert( elem != 0.0f ); // This can be zero in the presence of zero area triangles. + //XA_DEBUG_ASSERT( elem != 0.0f ); // This can be zero in the presence of zero area triangles. if (symmetric) { m_inverseDiagonal[x] = (elem != 0) ? 1.0f / sqrtf(fabsf(elem)) : 1.0f; } else { @@ -4371,8 +4293,8 @@ public: void apply(const FullVector &x, FullVector &y) const { - xaDebugAssert(x.dimension() == m_inverseDiagonal.dimension()); - xaDebugAssert(y.dimension() == m_inverseDiagonal.dimension()); + XA_DEBUG_ASSERT(x.dimension() == m_inverseDiagonal.dimension()); + XA_DEBUG_ASSERT(y.dimension() == m_inverseDiagonal.dimension()); // @@ Wrap vector component-wise product into a separate function. const uint32_t D = x.dimension(); for (uint32_t i = 0; i < D; i++) { @@ -4391,9 +4313,9 @@ public: // Solve the symmetric system: At·A·x = At·b static bool LeastSquaresSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon = 1e-5f) { - xaDebugAssert(A.width() == x.dimension()); - xaDebugAssert(A.height() == b.dimension()); - xaDebugAssert(A.height() >= A.width()); // @@ If height == width we could solve it directly... + XA_DEBUG_ASSERT(A.width() == x.dimension()); + XA_DEBUG_ASSERT(A.height() == b.dimension()); + XA_DEBUG_ASSERT(A.height() >= A.width()); // @@ If height == width we could solve it directly... const uint32_t D = A.width(); sparse::Matrix At(A.height(), A.width()); sparse::transpose(A, At); @@ -4407,12 +4329,12 @@ public: // See section 10.4.3 in: Mesh Parameterization: Theory and Practice, Siggraph Course Notes, August 2007 static bool LeastSquaresSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, const uint32_t *lockedParameters, uint32_t lockedCount, float epsilon = 1e-5f) { - xaDebugAssert(A.width() == x.dimension()); - xaDebugAssert(A.height() == b.dimension()); - xaDebugAssert(A.height() >= A.width() - lockedCount); + XA_DEBUG_ASSERT(A.width() == x.dimension()); + XA_DEBUG_ASSERT(A.height() == b.dimension()); + XA_DEBUG_ASSERT(A.height() >= A.width() - lockedCount); // @@ This is not the most efficient way of building a system with reduced degrees of freedom. It would be faster to do it on the fly. const uint32_t D = A.width() - lockedCount; - xaDebugAssert(D > 0); + XA_DEBUG_ASSERT(D > 0); // Compute: b - Al * xl FullVector b_Alxl(b); for (uint32_t y = 0; y < A.height(); y++) { @@ -4504,62 +4426,12 @@ private: * Jonhathan Richard Shewchuk. * **/ - static bool ConjugateGradientSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon) - { - xaDebugAssert( A.isSquare() ); - xaDebugAssert( A.width() == b.dimension() ); - xaDebugAssert( A.width() == x.dimension() ); - int i = 0; - const int D = A.width(); - const int i_max = 4 * D; // Convergence should be linear, but in some cases, it's not. - FullVector r(D); // residual - FullVector p(D); // search direction - FullVector q(D); // - float delta_0; - float delta_old; - float delta_new; - float alpha; - float beta; - // r = b - A·x; - sparse::copy(b, r); - sparse::sgemv(-1, A, x, 1, r); - // p = r; - sparse::copy(r, p); - delta_new = sparse::dot( r, r ); - delta_0 = delta_new; - while (i < i_max && delta_new > epsilon * epsilon * delta_0) { - i++; - // q = A·p - mult(A, p, q); - // alpha = delta_new / p·q - alpha = delta_new / sparse::dot( p, q ); - // x = alfa·p + x - sparse::saxpy(alpha, p, x); - if ((i & 31) == 0) { // recompute r after 32 steps - // r = b - A·x - sparse::copy(b, r); - sparse::sgemv(-1, A, x, 1, r); - } else { - // r = r - alpha·q - sparse::saxpy(-alpha, q, r); - } - delta_old = delta_new; - delta_new = sparse::dot( r, r ); - beta = delta_new / delta_old; - // p = beta·p + r - sparse::scal(beta, p); - sparse::saxpy(1, r, p); - } - return delta_new <= epsilon * epsilon * delta_0; - } - - // Conjugate gradient with preconditioner. static bool ConjugateGradientSolver(const JacobiPreconditioner &preconditioner, const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon) { - xaDebugAssert( A.isSquare() ); - xaDebugAssert( A.width() == b.dimension() ); - xaDebugAssert( A.width() == x.dimension() ); + XA_DEBUG_ASSERT( A.isSquare() ); + XA_DEBUG_ASSERT( A.width() == b.dimension() ); + XA_DEBUG_ASSERT( A.width() == x.dimension() ); int i = 0; const int D = A.width(); const int i_max = 4 * D; // Convergence should be linear, but in some cases, it's not. @@ -4582,7 +4454,7 @@ private: while (i < i_max && delta_new > epsilon * epsilon * delta_0) { i++; // q = A·p - mult(A, p, q); + sparse::mult(A, p, q); // alpha = delta_new / p·q alpha = delta_new / sparse::dot(p, q); // x = alfa·p + x @@ -4609,59 +4481,59 @@ private: static bool SymmetricSolver(const sparse::Matrix &A, const FullVector &b, FullVector &x, float epsilon = 1e-5f) { - xaDebugAssert(A.height() == A.width()); - xaDebugAssert(A.height() == b.dimension()); - xaDebugAssert(b.dimension() == x.dimension()); + XA_DEBUG_ASSERT(A.height() == A.width()); + XA_DEBUG_ASSERT(A.height() == b.dimension()); + XA_DEBUG_ASSERT(b.dimension() == x.dimension()); JacobiPreconditioner jacobi(A, true); return ConjugateGradientSolver(jacobi, A, b, x, epsilon); } }; namespace param { -class Atlas; -class Chart; // Fast sweep in 3 directions -static bool findApproximateDiameterVertices(halfedge::Mesh *mesh, halfedge::Vertex **a, halfedge::Vertex **b) +static bool findApproximateDiameterVertices(Mesh *mesh, uint32_t *a, uint32_t *b) { - xaDebugAssert(mesh != NULL); - xaDebugAssert(a != NULL); - xaDebugAssert(b != NULL); + XA_DEBUG_ASSERT(a != nullptr); + XA_DEBUG_ASSERT(b != nullptr); const uint32_t vertexCount = mesh->vertexCount(); - halfedge::Vertex *minVertex[3]; - halfedge::Vertex *maxVertex[3]; - minVertex[0] = minVertex[1] = minVertex[2] = NULL; - maxVertex[0] = maxVertex[1] = maxVertex[2] = NULL; + uint32_t minVertex[3]; + uint32_t maxVertex[3]; + minVertex[0] = minVertex[1] = minVertex[2] = UINT32_MAX; + maxVertex[0] = maxVertex[1] = maxVertex[2] = UINT32_MAX; for (uint32_t v = 1; v < vertexCount; v++) { - halfedge::Vertex *vertex = mesh->vertexAt(v); - xaDebugAssert(vertex != NULL); - if (vertex->isBoundary()) { - minVertex[0] = minVertex[1] = minVertex[2] = vertex; - maxVertex[0] = maxVertex[1] = maxVertex[2] = vertex; + if (mesh->isBoundaryVertex(v)) { + minVertex[0] = minVertex[1] = minVertex[2] = v; + maxVertex[0] = maxVertex[1] = maxVertex[2] = v; break; } } - if (minVertex[0] == NULL) { + if (minVertex[0] == UINT32_MAX) { // Input mesh has not boundaries. return false; } for (uint32_t v = 1; v < vertexCount; v++) { - halfedge::Vertex *vertex = mesh->vertexAt(v); - xaDebugAssert(vertex != NULL); - if (!vertex->isBoundary()) { + if (!mesh->isBoundaryVertex(v)) { // Skip interior vertices. continue; } - if (vertex->pos.x < minVertex[0]->pos.x) minVertex[0] = vertex; - else if (vertex->pos.x > maxVertex[0]->pos.x) maxVertex[0] = vertex; - if (vertex->pos.y < minVertex[1]->pos.y) minVertex[1] = vertex; - else if (vertex->pos.y > maxVertex[1]->pos.y) maxVertex[1] = vertex; - if (vertex->pos.z < minVertex[2]->pos.z) minVertex[2] = vertex; - else if (vertex->pos.z > maxVertex[2]->pos.z) maxVertex[2] = vertex; + const Vector3 &pos = mesh->position(v); + if (pos.x < mesh->position(minVertex[0]).x) + minVertex[0] = v; + else if (pos.x > mesh->position(maxVertex[0]).x) + maxVertex[0] = v; + if (pos.y < mesh->position(minVertex[1]).y) + minVertex[1] = v; + else if (pos.y > mesh->position(maxVertex[1]).y) + maxVertex[1] = v; + if (pos.z < mesh->position(minVertex[2]).z) + minVertex[2] = v; + else if (pos.z > mesh->position(maxVertex[2]).z) + maxVertex[2] = v; } float lengths[3]; for (int i = 0; i < 3; i++) { - lengths[i] = length(minVertex[i]->pos - maxVertex[i]->pos); + lengths[i] = length(mesh->position(minVertex[i]) - mesh->position(maxVertex[i])); } if (lengths[0] > lengths[1] && lengths[0] > lengths[2]) { *a = minVertex[0]; @@ -4678,34 +4550,28 @@ static bool findApproximateDiameterVertices(halfedge::Mesh *mesh, halfedge::Vert // Conformal relations from Brecht Van Lommel (based on ABF): -static float vec_angle_cos(Vector3::Arg v1, Vector3::Arg v2, Vector3::Arg v3) +static float vec_angle_cos(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3) { Vector3 d1 = v1 - v2; Vector3 d2 = v3 - v2; return clamp(dot(d1, d2) / (length(d1) * length(d2)), -1.0f, 1.0f); } -static float vec_angle(Vector3::Arg v1, Vector3::Arg v2, Vector3::Arg v3) +static float vec_angle(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3) { float dot = vec_angle_cos(v1, v2, v3); return acosf(dot); } -static void triangle_angles(Vector3::Arg v1, Vector3::Arg v2, Vector3::Arg v3, float *a1, float *a2, float *a3) +static void triangle_angles(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3, float *a1, float *a2, float *a3) { *a1 = vec_angle(v3, v1, v2); *a2 = vec_angle(v1, v2, v3); - *a3 = PI - *a2 - *a1; + *a3 = kPi - *a2 - *a1; } -static void setup_abf_relations(sparse::Matrix &A, int row, const halfedge::Vertex *v0, const halfedge::Vertex *v1, const halfedge::Vertex *v2) +static void setup_abf_relations(sparse::Matrix &A, int row, int id0, int id1, int id2, const Vector3 &p0, const Vector3 &p1, const Vector3 &p2) { - int id0 = v0->id; - int id1 = v1->id; - int id2 = v2->id; - Vector3 p0 = v0->pos; - Vector3 p1 = v1->pos; - Vector3 p2 = v2->pos; // @@ IC: Wouldn't it be more accurate to return cos and compute 1-cos^2? // It does indeed seem to be a little bit more robust. // @@ Need to revisit this more carefully! @@ -4715,19 +4581,19 @@ static void setup_abf_relations(sparse::Matrix &A, int row, const halfedge::Vert float s1 = sinf(a1); float s2 = sinf(a2); if (s1 > s0 && s1 > s2) { - std::swap(s1, s2); - std::swap(s0, s1); - std::swap(a1, a2); - std::swap(a0, a1); - std::swap(id1, id2); - std::swap(id0, id1); + swap(s1, s2); + swap(s0, s1); + swap(a1, a2); + swap(a0, a1); + swap(id1, id2); + swap(id0, id1); } else if (s0 > s1 && s0 > s2) { - std::swap(s0, s2); - std::swap(s0, s1); - std::swap(a0, a2); - std::swap(a0, a1); - std::swap(id0, id2); - std::swap(id0, id1); + swap(s0, s2); + swap(s0, s1); + swap(a0, a2); + swap(a0, a1); + swap(id0, id2); + swap(id0, id1); } float c0 = cosf(a0); float ratio = (s2 == 0.0f) ? 1.0f : s1 / s2; @@ -4755,14 +4621,13 @@ static void setup_abf_relations(sparse::Matrix &A, int row, const halfedge::Vert A.setCoefficient(v2_id, 2 * row + 1, 1); } -bool computeLeastSquaresConformalMap(halfedge::Mesh *mesh) +static bool computeLeastSquaresConformalMap(Mesh *mesh) { - xaDebugAssert(mesh != NULL); // For this to work properly, mesh should not have colocals that have the same // attributes, unless you want the vertices to actually have different texcoords. const uint32_t vertexCount = mesh->vertexCount(); const uint32_t D = 2 * vertexCount; - const uint32_t N = 2 * halfedge::countMeshTriangles(mesh); + const uint32_t N = 2 * mesh->faceCount(); // N is the number of equations (one per triangle) // D is the number of variables (one per vertex; there are 2 pinned vertices). if (N < D - 4) { @@ -4774,118 +4639,64 @@ bool computeLeastSquaresConformalMap(halfedge::Mesh *mesh) // Fill b: b.fill(0.0f); // Fill x: - halfedge::Vertex *v0; - halfedge::Vertex *v1; + uint32_t v0, v1; if (!findApproximateDiameterVertices(mesh, &v0, &v1)) { // Mesh has no boundaries. return false; } - if (v0->tex == v1->tex) { + if (mesh->texcoord(v0) == mesh->texcoord(v1)) { // LSCM expects an existing parameterization. return false; } for (uint32_t v = 0; v < vertexCount; v++) { - halfedge::Vertex *vertex = mesh->vertexAt(v); - xaDebugAssert(vertex != NULL); // Initial solution. - x[2 * v + 0] = vertex->tex.x; - x[2 * v + 1] = vertex->tex.y; + x[2 * v + 0] = mesh->texcoord(v).x; + x[2 * v + 1] = mesh->texcoord(v).y; } // Fill A: const uint32_t faceCount = mesh->faceCount(); for (uint32_t f = 0, t = 0; f < faceCount; f++) { - const halfedge::Face *face = mesh->faceAt(f); - xaDebugAssert(face != NULL); - xaDebugAssert(face->edgeCount() == 3); - const halfedge::Vertex *vertex0 = NULL; - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - xaAssert(edge != NULL); - if (vertex0 == NULL) { - vertex0 = edge->vertex; - } else if (edge->next->vertex != vertex0) { - const halfedge::Vertex *vertex1 = edge->from(); - const halfedge::Vertex *vertex2 = edge->to(); - setup_abf_relations(A, t, vertex0, vertex1, vertex2); - //setup_conformal_map_relations(A, t, vertex0, vertex1, vertex2); - t++; - } - } + const uint32_t vertex0 = mesh->vertexAt(f * 3 + 0); + const uint32_t vertex1 = mesh->vertexAt(f * 3 + 1); + const uint32_t vertex2 = mesh->vertexAt(f * 3 + 2); + setup_abf_relations(A, t, vertex0, vertex1, vertex2, mesh->position(vertex0), mesh->position(vertex1), mesh->position(vertex2)); + t++; } const uint32_t lockedParameters[] = { - 2 * v0->id + 0, - 2 * v0->id + 1, - 2 * v1->id + 0, - 2 * v1->id + 1 + 2 * v0 + 0, + 2 * v0 + 1, + 2 * v1 + 0, + 2 * v1 + 1 }; // Solve Solver::LeastSquaresSolver(A, b, x, lockedParameters, 4, 0.000001f); // Map x back to texcoords: - for (uint32_t v = 0; v < vertexCount; v++) { - halfedge::Vertex *vertex = mesh->vertexAt(v); - xaDebugAssert(vertex != NULL); - vertex->tex = Vector2(x[2 * v + 0], x[2 * v + 1]); - } + for (uint32_t v = 0; v < vertexCount; v++) + mesh->texcoord(v) = Vector2(x[2 * v + 0], x[2 * v + 1]); return true; } -bool computeOrthogonalProjectionMap(halfedge::Mesh *mesh) +static bool computeOrthogonalProjectionMap(Mesh *mesh) { - Vector3 axis[2]; uint32_t vertexCount = mesh->vertexCount(); - std::vector<Vector3> points(vertexCount); - points.resize(vertexCount); - for (uint32_t i = 0; i < vertexCount; i++) { - points[i] = mesh->vertexAt(i)->pos; - } // Avoid redundant computations. float matrix[6]; - Fit::computeCovariance(vertexCount, points.data(), matrix); - if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0) { + Fit::computeCovariance(vertexCount, &mesh->position(0), matrix); + if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0) return false; - } float eigenValues[3]; Vector3 eigenVectors[3]; - if (!Fit::eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) { + if (!Fit::eigenSolveSymmetric3(matrix, eigenValues, eigenVectors)) return false; - } - axis[0] = normalize(eigenVectors[0]); - axis[1] = normalize(eigenVectors[1]); + Vector3 axis[2]; + axis[0] = normalize(eigenVectors[0], kEpsilon); + axis[1] = normalize(eigenVectors[1], kEpsilon); // Project vertices to plane. - for (halfedge::Mesh::VertexIterator it(mesh->vertices()); !it.isDone(); it.advance()) { - halfedge::Vertex *vertex = it.current(); - vertex->tex.x = dot(axis[0], vertex->pos); - vertex->tex.y = dot(axis[1], vertex->pos); - } + for (uint32_t i = 0; i < vertexCount; i++) + mesh->texcoord(i) = Vector2(dot(axis[0], mesh->position(i)), dot(axis[1], mesh->position(i))); return true; } -void computeSingleFaceMap(halfedge::Mesh *mesh) -{ - xaDebugAssert(mesh != NULL); - xaDebugAssert(mesh->faceCount() == 1); - halfedge::Face *face = mesh->faceAt(0); - xaAssert(face != NULL); - Vector3 p0 = face->edge->from()->pos; - Vector3 p1 = face->edge->to()->pos; - Vector3 X = normalizeSafe(p1 - p0, Vector3(0.0f), 0.0f); - Vector3 Z = face->normal(); - Vector3 Y = normalizeSafe(cross(Z, X), Vector3(0.0f), 0.0f); - uint32_t i = 0; - for (halfedge::Face::EdgeIterator it(face->edges()); !it.isDone(); it.advance(), i++) { - halfedge::Vertex *vertex = it.vertex(); - xaAssert(vertex != NULL); - if (i == 0) { - vertex->tex = Vector2(0); - } else { - Vector3 pn = vertex->pos; - float xn = dot((pn - p0), X); - float yn = dot((pn - p0), Y); - vertex->tex = Vector2(xn, yn); - } - } -} - // Dummy implementation of a priority queue using sort at insertion. // - Insertion is o(n) // - Smallest element goes at the end, so that popping it is o(1). @@ -4894,7 +4705,7 @@ void computeSingleFaceMap(halfedge::Mesh *mesh) // @@ Searcing at removal would remove the need for sorting when priorities change. struct PriorityQueue { - PriorityQueue(uint32_t size = UINT_MAX) : maxSize(size) {} + PriorityQueue(uint32_t size = UINT32_MAX) : maxSize(size) {} void push(float priority, uint32_t face) { @@ -4904,10 +4715,9 @@ struct PriorityQueue if (pairs[i].priority > priority) break; } Pair p = { priority, face }; - pairs.insert(pairs.begin() + i, p); - if (pairs.size() > maxSize) { - pairs.erase(pairs.begin()); - } + pairs.insertAt(i, p); + if (pairs.size() > maxSize) + pairs.removeAt(0); } // push face out of order, to be sorted later. @@ -4949,7 +4759,7 @@ struct PriorityQueue struct Pair { - bool operator <(const Pair &p) const + bool operator<(const Pair &p) const { return priority > p.priority; // !! Sort in inverse priority order! } @@ -4958,164 +4768,411 @@ struct PriorityQueue uint32_t face; }; - std::vector<Pair> pairs; + Array<Pair> pairs; }; struct ChartBuildData { - ChartBuildData(int id) : id(id) - { - planeNormal = Vector3(0); - centroid = Vector3(0); - coneAxis = Vector3(0); - coneAngle = 0; - area = 0; - boundaryLength = 0; - normalSum = Vector3(0); - centroidSum = Vector3(0); - } - - int id; - - // Proxy info: - Vector3 planeNormal; - Vector3 centroid; - Vector3 coneAxis; - float coneAngle; - - float area; - float boundaryLength; - Vector3 normalSum; - Vector3 centroidSum; - - std::vector<uint32_t> seeds; // @@ These could be a pointers to the halfedge faces directly. - std::vector<uint32_t> faces; + int id = -1; + Vector3 averageNormal = Vector3(0.0f); + float area = 0.0f; + float boundaryLength = 0.0f; + Vector3 normalSum = Vector3(0.0f); + Vector3 centroidSum = Vector3(0.0f); // Sum of chart face centroids. + Vector3 centroid = Vector3(0.0f); // Average centroid of chart faces. + Array<uint32_t> seeds; + Array<uint32_t> faces; PriorityQueue candidates; + Basis basis; // Of first face. }; struct AtlasBuilder { - AtlasBuilder(const halfedge::Mesh *m) : mesh(m), facesLeft(m->faceCount()) + // @@ Hardcoded to 10? + AtlasBuilder(const Mesh *mesh, Array<uint32_t> *meshFaces, const ChartOptions &options) : m_mesh(mesh), m_meshFaces(meshFaces), m_facesLeft(mesh->faceCount()), m_bestTriangles(10), m_options(options) { - const uint32_t faceCount = m->faceCount(); - faceChartArray.resize(faceCount, -1); - faceCandidateArray.resize(faceCount, (uint32_t)-1); + XA_PROFILE_START(atlasBuilderInit) + const uint32_t faceCount = m_mesh->faceCount(); + if (meshFaces) { + m_ignoreFaces.resize(faceCount, true); + for (uint32_t f = 0; f < meshFaces->size(); f++) + m_ignoreFaces[(*meshFaces)[f]] = false; + m_facesLeft = meshFaces->size(); + } else { + m_ignoreFaces.resize(faceCount, false); + } + m_faceChartArray.resize(faceCount, -1); + m_faceCandidateArray.resize(faceCount, (uint32_t)-1); + m_texcoords.resize(faceCount * 3); // @@ Floyd for the whole mesh is too slow. We could compute floyd progressively per patch as the patch grows. We need a better solution to compute most central faces. //computeShortestPaths(); // Precompute edge lengths and face areas. - uint32_t edgeCount = m->edgeCount(); - edgeLengths.resize(edgeCount); - for (uint32_t i = 0; i < edgeCount; i++) { - uint32_t id = m->edgeAt(i)->id; - xaDebugAssert(id / 2 == i); -#ifdef NDEBUG - id = 0; // silence unused parameter warning -#endif - edgeLengths[i] = m->edgeAt(i)->length(); - } - faceAreas.resize(faceCount); - for (uint32_t i = 0; i < faceCount; i++) { - faceAreas[i] = m->faceAt(i)->area(); + const uint32_t edgeCount = m_mesh->edgeCount(); + m_edgeLengths.resize(edgeCount, 0.0f); + m_faceAreas.resize(m_mesh->faceCount(), 0.0f); + m_faceNormals.resize(m_mesh->faceCount()); + for (uint32_t f = 0; f < faceCount; f++) { + if (m_ignoreFaces[f]) + continue; + for (Mesh::FaceEdgeIterator it(m_mesh, f); !it.isDone(); it.advance()) { + m_edgeLengths[it.edge()] = internal::length(it.position1() - it.position0()); + XA_DEBUG_ASSERT(m_edgeLengths[it.edge()] > 0.0f); + } + m_faceAreas[f] = mesh->faceArea(f); + XA_DEBUG_ASSERT(m_faceAreas[f] > 0.0f); + m_faceNormals[f] = m_mesh->triangleNormal(f); } + XA_PROFILE_END(atlasBuilderInit) } ~AtlasBuilder() { - const uint32_t chartCount = chartArray.size(); + const uint32_t chartCount = m_chartArray.size(); for (uint32_t i = 0; i < chartCount; i++) { - delete chartArray[i]; + m_chartArray[i]->~ChartBuildData(); + XA_FREE(m_chartArray[i]); } } - void markUnchartedFaces(const std::vector<uint32_t> &unchartedFaces) + uint32_t facesLeft() const { return m_facesLeft; } + uint32_t chartCount() const { return m_chartArray.size(); } + const Array<uint32_t> &chartFaces(uint32_t i) const { return m_chartArray[i]->faces; } + const Basis &chartBasis(uint32_t chartIndex) const { return m_chartArray[chartIndex]->basis; } + + void placeSeeds(float threshold) { - const uint32_t unchartedFaceCount = unchartedFaces.size(); - for (uint32_t i = 0; i < unchartedFaceCount; i++) { - uint32_t f = unchartedFaces[i]; - faceChartArray[f] = -2; - //faceCandidateArray[f] = -2; // @@ ? - removeCandidate(f); - } - xaDebugAssert(facesLeft >= unchartedFaceCount); - facesLeft -= unchartedFaceCount; + // Instead of using a predefiened number of seeds: + // - Add seeds one by one, growing chart until a certain treshold. + // - Undo charts and restart growing process. + // @@ How can we give preference to faces far from sharp features as in the LSCM paper? + // - those points can be found using a simple flood filling algorithm. + // - how do we weight the probabilities? + while (m_facesLeft > 0) + createRandomChart(threshold); } - void computeShortestPaths() + // Returns true if any of the charts can grow more. + bool growCharts(float threshold, uint32_t faceCount) { - const uint32_t faceCount = mesh->faceCount(); - shortestPaths.resize(faceCount * faceCount, FLT_MAX); - // Fill edges: + XA_PROFILE_START(atlasBuilderGrowCharts) + // Using one global list. + faceCount = min(faceCount, m_facesLeft); + bool canAddAny = false; for (uint32_t i = 0; i < faceCount; i++) { - shortestPaths[i * faceCount + i] = 0.0f; - const halfedge::Face *face_i = mesh->faceAt(i); - Vector3 centroid_i = face_i->centroid(); - for (halfedge::Face::ConstEdgeIterator it(face_i->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - if (!edge->isBoundary()) { - const halfedge::Face *face_j = edge->pair->face; - uint32_t j = face_j->id; - Vector3 centroid_j = face_j->centroid(); - shortestPaths[i * faceCount + j] = shortestPaths[j * faceCount + i] = length(centroid_i - centroid_j); - } + const Candidate &candidate = getBestCandidate(); + if (candidate.metric > threshold) { + XA_PROFILE_END(atlasBuilderGrowCharts) + return false; // Can't grow more. } + createFaceTexcoords(candidate.chart, candidate.face); + if (!canAddFaceToChart(candidate.chart, candidate.face)) + continue; + addFaceToChart(candidate.chart, candidate.face); + canAddAny = true; } - // Use Floyd-Warshall algorithm to compute all paths: - for (uint32_t k = 0; k < faceCount; k++) { - for (uint32_t i = 0; i < faceCount; i++) { - for (uint32_t j = 0; j < faceCount; j++) { - shortestPaths[i * faceCount + j] = std::min(shortestPaths[i * faceCount + j], shortestPaths[i * faceCount + k] + shortestPaths[k * faceCount + j]); - } + XA_PROFILE_END(atlasBuilderGrowCharts) + return canAddAny && m_facesLeft != 0; // Can continue growing. + } + + void resetCharts() + { + const uint32_t faceCount = m_mesh->faceCount(); + for (uint32_t i = 0; i < faceCount; i++) { + m_faceChartArray[i] = -1; + m_faceCandidateArray[i] = (uint32_t)-1; + } + m_facesLeft = m_meshFaces ? m_meshFaces->size() : faceCount; + m_candidateArray.clear(); + const uint32_t chartCount = m_chartArray.size(); + for (uint32_t i = 0; i < chartCount; i++) { + ChartBuildData *chart = m_chartArray[i]; + const uint32_t seed = chart->seeds.back(); + chart->area = 0.0f; + chart->boundaryLength = 0.0f; + chart->normalSum = Vector3(0.0f); + chart->centroidSum = Vector3(0.0f); + chart->centroid = Vector3(0.0f); + chart->faces.clear(); + chart->candidates.clear(); + addFaceToChart(chart, seed); + } +#if XA_GROW_CHARTS_COPLANAR + for (uint32_t i = 0; i < chartCount; i++) { + ChartBuildData *chart = m_chartArray[i]; + growChartCoplanar(chart); + } +#endif + } + + void updateCandidates(ChartBuildData *chart, uint32_t f) + { + // Traverse neighboring faces, add the ones that do not belong to any chart yet. + for (Mesh::FaceEdgeIterator it(m_mesh, f); !it.isDone(); it.advance()) { + if (!it.isBoundary() && !m_ignoreFaces[it.oppositeFace()] && m_faceChartArray[it.oppositeFace()] == -1) + chart->candidates.push(it.oppositeFace()); + } + } + + void updateProxies() + { + const uint32_t chartCount = m_chartArray.size(); + for (uint32_t i = 0; i < chartCount; i++) + updateProxy(m_chartArray[i]); + } + + bool relocateSeeds() + { + bool anySeedChanged = false; + const uint32_t chartCount = m_chartArray.size(); + for (uint32_t i = 0; i < chartCount; i++) { + if (relocateSeed(m_chartArray[i])) { + anySeedChanged = true; } } + return anySeedChanged; } - void placeSeeds(float threshold, uint32_t maxSeedCount) + void fillHoles(float threshold) { - // Instead of using a predefiened number of seeds: - // - Add seeds one by one, growing chart until a certain treshold. - // - Undo charts and restart growing process. - // @@ How can we give preference to faces far from sharp features as in the LSCM paper? - // - those points can be found using a simple flood filling algorithm. - // - how do we weight the probabilities? - for (uint32_t i = 0; i < maxSeedCount; i++) { - if (facesLeft == 0) { - // No faces left, stop creating seeds. + while (m_facesLeft > 0) + createRandomChart(threshold); + } + +#if XA_MERGE_CHARTS + void mergeCharts() + { + XA_PROFILE_START(atlasBuilderMergeCharts) + Array<float> sharedBoundaryLengths; + Array<float> sharedBoundaryLengthsNoSeams; + Array<uint32_t> sharedBoundaryEdgeCountNoSeams; + Array<Vector2> tempTexcoords; + const uint32_t chartCount = m_chartArray.size(); + // Merge charts progressively until there's none left to merge. + for (;;) { + bool merged = false; + for (int c = chartCount - 1; c >= 0; c--) { + ChartBuildData *chart = m_chartArray[c]; + if (chart == nullptr) + continue; + float externalBoundaryLength = 0.0f; + sharedBoundaryLengths.clear(); + sharedBoundaryLengths.resize(chartCount, 0.0f); + sharedBoundaryLengthsNoSeams.clear(); + sharedBoundaryLengthsNoSeams.resize(chartCount, 0.0f); + sharedBoundaryEdgeCountNoSeams.clear(); + sharedBoundaryEdgeCountNoSeams.resize(chartCount, 0u); + const uint32_t faceCount = chart->faces.size(); + for (uint32_t i = 0; i < faceCount; i++) { + const uint32_t f = chart->faces[i]; + for (Mesh::FaceEdgeIterator it(m_mesh, f); !it.isDone(); it.advance()) { + const float l = m_edgeLengths[it.edge()]; + if (it.isBoundary() || m_ignoreFaces[it.oppositeFace()]) { + externalBoundaryLength += l; + } else { + const int neighborChart = m_faceChartArray[it.oppositeFace()]; + if (m_chartArray[neighborChart] != chart) { + if ((it.isSeam() && (isNormalSeam(it.edge()) || it.isTextureSeam()))) { + externalBoundaryLength += l; + } else { + sharedBoundaryLengths[neighborChart] += l; + } + sharedBoundaryLengthsNoSeams[neighborChart] += l; + sharedBoundaryEdgeCountNoSeams[neighborChart]++; + } + } + } + } + for (int cc = chartCount - 1; cc >= 0; cc--) { + if (cc == c) + continue; + ChartBuildData *chart2 = m_chartArray[cc]; + if (chart2 == nullptr) + continue; + // Compare proxies. + if (dot(chart2->averageNormal, chart->averageNormal) < XA_MERGE_CHARTS_MIN_NORMAL_DEVIATION) + continue; + // Obey max chart area and boundary length. + if (m_options.maxChartArea > 0.0f && chart->area + chart2->area > m_options.maxChartArea) + continue; + if (m_options.maxBoundaryLength > 0.0f && chart->boundaryLength + chart2->boundaryLength - sharedBoundaryLengthsNoSeams[cc] > m_options.maxBoundaryLength) + continue; + // Merge if chart2 has a single face. + // chart1 must have more than 1 face. + // chart2 area must be <= 10% of chart1 area. + if (sharedBoundaryLengthsNoSeams[cc] > 0.0f && chart->faces.size() > 1 && chart2->faces.size() == 1 && chart2->area <= chart->area * 0.1f) + goto merge; + // Merge if chart2 has two faces (probably a quad), and chart1 bounds at least 2 of its edges. + if (chart2->faces.size() == 2 && sharedBoundaryEdgeCountNoSeams[cc] >= 2) + goto merge; + // Merge if chart2 is wholely inside chart1, ignoring seams. + if (sharedBoundaryLengthsNoSeams[cc] > 0.0f && equal(sharedBoundaryLengthsNoSeams[cc], chart2->boundaryLength, kEpsilon)) + goto merge; + if (sharedBoundaryLengths[cc] > 0.2f * max(0.0f, chart->boundaryLength - externalBoundaryLength) || + sharedBoundaryLengths[cc] > 0.75f * chart2->boundaryLength) + goto merge; + continue; + merge: + // Create texcoords for chart 2 using chart 1 basis. Backup chart 2 texcoords for restoration if charts cannot be merged. + tempTexcoords.resize(chart2->faces.size()); + for (uint32_t i = 0; i < chart2->faces.size(); i++) { + const uint32_t face = chart2->faces[i]; + tempTexcoords[i] = m_texcoords[face]; + createFaceTexcoords(chart, face); + } + if (!canMergeCharts(chart, chart2)) { + // Restore chart 2 texcoords. + for (uint32_t i = 0; i < chart2->faces.size(); i++) + m_texcoords[chart2->faces[i]] = tempTexcoords[i]; + continue; + } + mergeChart(chart, chart2, sharedBoundaryLengthsNoSeams[cc]); + merged = true; + break; + } + if (merged) + break; + } + if (!merged) break; + } + // Remove deleted charts. + for (int c = 0; c < int32_t(m_chartArray.size()); /*do not increment if removed*/) { + if (m_chartArray[c] == nullptr) { + m_chartArray.removeAt(c); + // Update m_faceChartArray. + const uint32_t faceCount = m_faceChartArray.size(); + for (uint32_t i = 0; i < faceCount; i++) { + XA_DEBUG_ASSERT(m_faceChartArray[i] != c); + XA_DEBUG_ASSERT(m_faceChartArray[i] <= int32_t(m_chartArray.size())); + if (m_faceChartArray[i] > c) { + m_faceChartArray[i]--; + } + } + } else { + m_chartArray[c]->id = c; + c++; } - createRandomChart(threshold); } + XA_PROFILE_END(atlasBuilderMergeCharts) } +#endif +private: void createRandomChart(float threshold) { - ChartBuildData *chart = new ChartBuildData(chartArray.size()); - chartArray.push_back(chart); + ChartBuildData *chart = XA_NEW(MemTag::Default, ChartBuildData); + chart->id = (int)m_chartArray.size(); + m_chartArray.push_back(chart); // Pick random face that is not used by any chart yet. - uint32_t randomFaceIdx = rand.getRange(facesLeft - 1); - uint32_t i = 0; - for (uint32_t f = 0; f != randomFaceIdx; f++, i++) { - while (faceChartArray[i] != -1) i++; - } - while (faceChartArray[i] != -1) i++; - chart->seeds.push_back(i); - addFaceToChart(chart, i, true); + uint32_t face = m_rand.getRange(m_mesh->faceCount() - 1); + while (m_ignoreFaces[face] || m_faceChartArray[face] != -1) { + if (++face >= m_mesh->faceCount()) + face = 0; + } + chart->seeds.push_back(face); + addFaceToChart(chart, face, true); +#if XA_GROW_CHARTS_COPLANAR + growChartCoplanar(chart); +#endif // Grow the chart as much as possible within the given threshold. - growChart(chart, threshold * 0.5f, facesLeft); - //growCharts(threshold - threshold * 0.75f / chartCount(), facesLeft); + growChart(chart, threshold, m_facesLeft); + } + + void createFaceTexcoords(ChartBuildData *chart, uint32_t face) + { + for (uint32_t i = 0; i < 3; i++) { + const Vector3 &pos = m_mesh->position(m_mesh->vertexAt(face * 3 + i)); + m_texcoords[face * 3 + i] = Vector2(dot(chart->basis.tangent, pos), dot(chart->basis.bitangent, pos)); + } + } + + bool isChartBoundaryEdge(ChartBuildData *chart, uint32_t edge) const + { + const uint32_t oppositeEdge = m_mesh->oppositeEdge(edge); + const uint32_t oppositeFace = meshEdgeFace(oppositeEdge); + return oppositeEdge == UINT32_MAX || m_ignoreFaces[oppositeFace] || m_faceChartArray[oppositeFace] != chart->id; + } + + bool canAddFaceToChart(ChartBuildData *chart, uint32_t face) + { + // Find face edges that are on a mesh boundary or form a boundary with another chart. + uint32_t edgesToCompare[3]; + for (uint32_t i = 0; i < 3; i++) { + const uint32_t edge = face * 3 + i; + const uint32_t oppositeEdge = m_mesh->oppositeEdge(edge); + const uint32_t oppositeFace = meshEdgeFace(oppositeEdge); + if (oppositeEdge == UINT32_MAX || m_ignoreFaces[oppositeFace] || m_faceChartArray[oppositeFace] != chart->id) + edgesToCompare[i] = edge; + else + edgesToCompare[i] = UINT32_MAX; + } + // All edges on boundary? This can happen if the face is surrounded by the chart. + if (edgesToCompare[0] == UINT32_MAX && edgesToCompare[1] == UINT32_MAX && edgesToCompare[2] == UINT32_MAX) + return true; + // Check if any valid face edge intersects the chart boundary. + for (uint32_t i = 0; i < chart->faces.size(); i++) { + const uint32_t chartFace = chart->faces[i]; + for (uint32_t j = 0; j < 3; j++) { + const uint32_t chartEdge = chartFace * 3 + j; + if (!isChartBoundaryEdge(chart, chartEdge)) + continue; + // Don't check chart boundary edges that border the face. + const uint32_t oppositeChartEdge = m_mesh->oppositeEdge(chartEdge); + if (meshEdgeFace(oppositeChartEdge) == face) + continue; + for (uint32_t k = 0; k < 3; k++) { + if (edgesToCompare[k] == UINT32_MAX) + continue; + const uint32_t e1 = chartEdge; + const uint32_t e2 = edgesToCompare[k]; + if (linesIntersect(m_texcoords[meshEdgeIndex0(e1)], m_texcoords[meshEdgeIndex1(e1)], m_texcoords[meshEdgeIndex0(e2)], m_texcoords[meshEdgeIndex1(e2)], m_mesh->epsilon())) + return false; + } + } + } + return true; + } + + bool canMergeCharts(ChartBuildData *chart1, ChartBuildData *chart2) + { + for (uint32_t f1 = 0; f1 < chart1->faces.size(); f1++) { + const uint32_t face1 = chart1->faces[f1]; + for (uint32_t i = 0; i < 3; i++) { + const uint32_t edge1 = face1 * 3 + i; + if (!isChartBoundaryEdge(chart1, edge1)) + continue; + for (uint32_t f2 = 0; f2 < chart2->faces.size(); f2++) { + const uint32_t face2 = chart2->faces[f2]; + for (uint32_t j = 0; j < 3; j++) { + const uint32_t edge2 = face2 * 3 + j; + if (!isChartBoundaryEdge(chart2, edge2)) + continue; + if (linesIntersect(m_texcoords[meshEdgeIndex0(edge1)], m_texcoords[meshEdgeIndex1(edge1)], m_texcoords[meshEdgeIndex0(edge2)], m_texcoords[meshEdgeIndex1(edge2)], m_mesh->epsilon())) + return false; + } + } + } + } + return true; } void addFaceToChart(ChartBuildData *chart, uint32_t f, bool recomputeProxy = false) { + // Use the first face normal as the chart basis. + if (chart->faces.isEmpty()) { + chart->basis.buildFrameForDirection(m_faceNormals[f]); + createFaceTexcoords(chart, f); + } // Add face to chart. chart->faces.push_back(f); - xaDebugAssert(faceChartArray[f] == -1); - faceChartArray[f] = chart->id; - facesLeft--; + XA_DEBUG_ASSERT(m_faceChartArray[f] == -1); + m_faceChartArray[f] = chart->id; + m_facesLeft--; // Update area and boundary length. chart->area = evaluateChartArea(chart, f); chart->boundaryLength = evaluateBoundaryLength(chart, f); chart->normalSum = evaluateChartNormalSum(chart, f); - chart->centroidSum = evaluateChartCentroidSum(chart, f); + chart->centroidSum += m_mesh->triangleCenter(f); if (recomputeProxy) { // Update proxy and candidate's priorities. updateProxy(chart); @@ -5126,142 +5183,93 @@ struct AtlasBuilder updatePriorities(chart); } - // Returns true if any of the charts can grow more. - bool growCharts(float threshold, uint32_t faceCount) - { - // Using one global list. - faceCount = std::min(faceCount, facesLeft); - for (uint32_t i = 0; i < faceCount; i++) { - const Candidate &candidate = getBestCandidate(); - if (candidate.metric > threshold) { - return false; // Can't grow more. - } - addFaceToChart(candidate.chart, candidate.face); - } - return facesLeft != 0; // Can continue growing. - } - bool growChart(ChartBuildData *chart, float threshold, uint32_t faceCount) { // Try to add faceCount faces within threshold to chart. for (uint32_t i = 0; i < faceCount; ) { - if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold) { + if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold) return false; - } - uint32_t f = chart->candidates.pop(); - if (faceChartArray[f] == -1) { - addFaceToChart(chart, f); - i++; - } + const uint32_t f = chart->candidates.pop(); + if (m_faceChartArray[f] != -1) + continue; + createFaceTexcoords(chart, f); + if (!canAddFaceToChart(chart, f)) + continue; + addFaceToChart(chart, f); + i++; } - if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold) { + if (chart->candidates.count() == 0 || chart->candidates.firstPriority() > threshold) return false; - } return true; } - void resetCharts() - { - const uint32_t faceCount = mesh->faceCount(); - for (uint32_t i = 0; i < faceCount; i++) { - faceChartArray[i] = -1; - faceCandidateArray[i] = (uint32_t)-1; - } - facesLeft = faceCount; - candidateArray.clear(); - const uint32_t chartCount = chartArray.size(); - for (uint32_t i = 0; i < chartCount; i++) { - ChartBuildData *chart = chartArray[i]; - const uint32_t seed = chart->seeds.back(); - chart->area = 0.0f; - chart->boundaryLength = 0.0f; - chart->normalSum = Vector3(0); - chart->centroidSum = Vector3(0); - chart->faces.clear(); - chart->candidates.clear(); - addFaceToChart(chart, seed); - } - } - - void updateCandidates(ChartBuildData *chart, uint32_t f) +#if XA_GROW_CHARTS_COPLANAR + void growChartCoplanar(ChartBuildData *chart) { - const halfedge::Face *face = mesh->faceAt(f); - // Traverse neighboring faces, add the ones that do not belong to any chart yet. - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current()->pair; - if (!edge->isBoundary()) { - uint32_t faceId = edge->face->id; - if (faceChartArray[faceId] == -1) { - chart->candidates.push(faceId); + XA_DEBUG_ASSERT(!chart->faces.isEmpty()); + const Vector3 chartNormal = m_faceNormals[chart->faces[0]]; + m_growFaces.clear(); + for (uint32_t f = 0; f < chart->faces.size(); f++) + m_growFaces.push_back(chart->faces[f]); + for (;;) { + if (m_growFaces.isEmpty()) + break; + const uint32_t face = m_growFaces.back(); + m_growFaces.pop_back(); + for (Mesh::FaceEdgeIterator it(m_mesh, face); !it.isDone(); it.advance()) { + if (it.isBoundary() || m_ignoreFaces[it.oppositeFace()] || m_faceChartArray[it.oppositeFace()] != -1) + continue; + if (equal(dot(chartNormal, m_faceNormals[it.oppositeFace()]), 1.0f, kEpsilon)) { + createFaceTexcoords(chart, it.oppositeFace()); + addFaceToChart(chart, it.oppositeFace()); + m_growFaces.push_back(it.oppositeFace()); } } } } +#endif - void updateProxies() - { - const uint32_t chartCount = chartArray.size(); - for (uint32_t i = 0; i < chartCount; i++) { - updateProxy(chartArray[i]); - } - } - - void updateProxy(ChartBuildData *chart) + void updateProxy(ChartBuildData *chart) const { //#pragma message(NV_FILE_LINE "TODO: Use best fit plane instead of average normal.") - chart->planeNormal = normalizeSafe(chart->normalSum, Vector3(0), 0.0f); + chart->averageNormal = normalizeSafe(chart->normalSum, Vector3(0), 0.0f); chart->centroid = chart->centroidSum / float(chart->faces.size()); } - bool relocateSeeds() - { - bool anySeedChanged = false; - const uint32_t chartCount = chartArray.size(); - for (uint32_t i = 0; i < chartCount; i++) { - if (relocateSeed(chartArray[i])) { - anySeedChanged = true; - } - } - return anySeedChanged; - } - bool relocateSeed(ChartBuildData *chart) { - Vector3 centroid = computeChartCentroid(chart); - const uint32_t N = 10; // @@ Hardcoded to 10? - PriorityQueue bestTriangles(N); // Find the first N triangles that fit the proxy best. const uint32_t faceCount = chart->faces.size(); + m_bestTriangles.clear(); for (uint32_t i = 0; i < faceCount; i++) { float priority = evaluateProxyFitMetric(chart, chart->faces[i]); - bestTriangles.push(priority, chart->faces[i]); + m_bestTriangles.push(priority, chart->faces[i]); } - // Of those, choose the most central triangle. - uint32_t mostCentral; + // Of those, choose the least central triangle. + uint32_t leastCentral = 0; float maxDistance = -1; - const uint32_t bestCount = bestTriangles.count(); + const uint32_t bestCount = m_bestTriangles.count(); for (uint32_t i = 0; i < bestCount; i++) { - const halfedge::Face *face = mesh->faceAt(bestTriangles.pairs[i].face); - Vector3 faceCentroid = face->triangleCenter(); - float distance = length(centroid - faceCentroid); + Vector3 faceCentroid = m_mesh->triangleCenter(m_bestTriangles.pairs[i].face); + float distance = length(chart->centroid - faceCentroid); if (distance > maxDistance) { maxDistance = distance; - mostCentral = bestTriangles.pairs[i].face; + leastCentral = m_bestTriangles.pairs[i].face; } } - xaDebugAssert(maxDistance >= 0); + XA_DEBUG_ASSERT(maxDistance >= 0); // In order to prevent k-means cyles we record all the previously chosen seeds. - uint32_t index = std::find(chart->seeds.begin(), chart->seeds.end(), mostCentral) - chart->seeds.begin(); - if (index < chart->seeds.size()) { - // Move new seed to the end of the seed array. - uint32_t last = chart->seeds.size() - 1; - std::swap(chart->seeds[index], chart->seeds[last]); - return false; - } else { - // Append new seed. - chart->seeds.push_back(mostCentral); - return true; + for (uint32_t i = 0; i < chart->seeds.size(); i++) { + if (chart->seeds[i] == leastCentral) { + // Move new seed to the end of the seed array. + uint32_t last = chart->seeds.size() - 1; + swap(chart->seeds[i], chart->seeds[last]); + return false; + } } + // Append new seed. + chart->seeds.push_back(leastCentral); + return true; } void updatePriorities(ChartBuildData *chart) @@ -5269,299 +5277,197 @@ struct AtlasBuilder // Re-evaluate candidate priorities. uint32_t candidateCount = chart->candidates.count(); for (uint32_t i = 0; i < candidateCount; i++) { - chart->candidates.pairs[i].priority = evaluatePriority(chart, chart->candidates.pairs[i].face); - if (faceChartArray[chart->candidates.pairs[i].face] == -1) { - updateCandidate(chart, chart->candidates.pairs[i].face, chart->candidates.pairs[i].priority); - } + PriorityQueue::Pair &pair = chart->candidates.pairs[i]; + pair.priority = evaluatePriority(chart, pair.face); + if (m_faceChartArray[pair.face] == -1) + updateCandidate(chart, pair.face, pair.priority); } // Sort candidates. chart->candidates.sort(); } // Evaluate combined metric. - float evaluatePriority(ChartBuildData *chart, uint32_t face) + float evaluatePriority(ChartBuildData *chart, uint32_t face) const { // Estimate boundary length and area: - float newBoundaryLength = evaluateBoundaryLength(chart, face); - float newChartArea = evaluateChartArea(chart, face); - float F = evaluateProxyFitMetric(chart, face); - float C = evaluateRoundnessMetric(chart, face, newBoundaryLength, newChartArea); - float P = evaluateStraightnessMetric(chart, face); + const float newChartArea = evaluateChartArea(chart, face); + const float newBoundaryLength = evaluateBoundaryLength(chart, face); + // Enforce limits strictly: + if (m_options.maxChartArea > 0.0f && newChartArea > m_options.maxChartArea) + return FLT_MAX; + if (m_options.maxBoundaryLength > 0.0f && newBoundaryLength > m_options.maxBoundaryLength) + return FLT_MAX; + if (dot(m_faceNormals[face], chart->averageNormal) < 0.5f) + return FLT_MAX; // Penalize faces that cross seams, reward faces that close seams or reach boundaries. - float N = evaluateNormalSeamMetric(chart, face); - float T = evaluateTextureSeamMetric(chart, face); + // Make sure normal seams are fully respected: + const float N = evaluateNormalSeamMetric(chart, face); + if (m_options.normalSeamMetricWeight >= 1000.0f && N > 0.0f) + return FLT_MAX; + float cost = m_options.normalSeamMetricWeight * N; + if (m_options.proxyFitMetricWeight > 0.0f) + cost += m_options.proxyFitMetricWeight * evaluateProxyFitMetric(chart, face); + if (m_options.roundnessMetricWeight > 0.0f) + cost += m_options.roundnessMetricWeight * evaluateRoundnessMetric(chart, face, newBoundaryLength, newChartArea); + if (m_options.straightnessMetricWeight > 0.0f) + cost += m_options.straightnessMetricWeight * evaluateStraightnessMetric(chart, face); + if (m_options.textureSeamMetricWeight > 0.0f) + cost += m_options.textureSeamMetricWeight * evaluateTextureSeamMetric(chart, face); //float R = evaluateCompletenessMetric(chart, face); //float D = evaluateDihedralAngleMetric(chart, face); // @@ Add a metric based on local dihedral angle. // @@ Tweaking the normal and texture seam metrics. // - Cause more impedance. Never cross 90 degree edges. - // - - float cost = float( - options.proxyFitMetricWeight * F + - options.roundnessMetricWeight * C + - options.straightnessMetricWeight * P + - options.normalSeamMetricWeight * N + - options.textureSeamMetricWeight * T); - // Enforce limits strictly: - if (newChartArea > options.maxChartArea) cost = FLT_MAX; - if (newBoundaryLength > options.maxBoundaryLength) cost = FLT_MAX; - // Make sure normal seams are fully respected: - if (options.normalSeamMetricWeight >= 1000 && N != 0) cost = FLT_MAX; - xaAssert(std::isfinite(cost)); + XA_DEBUG_ASSERT(isFinite(cost)); return cost; } // Returns a value in [0-1]. - float evaluateProxyFitMetric(ChartBuildData *chart, uint32_t f) + float evaluateProxyFitMetric(ChartBuildData *chart, uint32_t f) const { - const halfedge::Face *face = mesh->faceAt(f); - Vector3 faceNormal = face->triangleNormal(); + const Vector3 faceNormal = m_faceNormals[f]; // Use plane fitting metric for now: - return 1 - dot(faceNormal, chart->planeNormal); // @@ normal deviations should be weighted by face area + return 1 - dot(faceNormal, chart->averageNormal); // @@ normal deviations should be weighted by face area } - float evaluateRoundnessMetric(ChartBuildData *chart, uint32_t /*face*/, float newBoundaryLength, float newChartArea) + float evaluateRoundnessMetric(ChartBuildData *chart, uint32_t /*face*/, float newBoundaryLength, float newChartArea) const { float roundness = square(chart->boundaryLength) / chart->area; float newRoundness = square(newBoundaryLength) / newChartArea; if (newRoundness > roundness) { - return square(newBoundaryLength) / (newChartArea * 4 * PI); + return square(newBoundaryLength) / (newChartArea * 4.0f * kPi); } else { // Offer no impedance to faces that improve roundness. return 0; } } - float evaluateStraightnessMetric(ChartBuildData *chart, uint32_t f) + float evaluateStraightnessMetric(ChartBuildData *chart, uint32_t f) const { float l_out = 0.0f; float l_in = 0.0f; - const halfedge::Face *face = mesh->faceAt(f); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - float l = edgeLengths[edge->id / 2]; - if (edge->isBoundary()) { + for (Mesh::FaceEdgeIterator it(m_mesh, f); !it.isDone(); it.advance()) { + float l = m_edgeLengths[it.edge()]; + if (it.isBoundary() || m_ignoreFaces[it.oppositeFace()]) { l_out += l; } else { - uint32_t neighborFaceId = edge->pair->face->id; - if (faceChartArray[neighborFaceId] != chart->id) { + if (m_faceChartArray[it.oppositeFace()] != chart->id) { l_out += l; } else { l_in += l; } } } - xaDebugAssert(l_in != 0.0f); // Candidate face must be adjacent to chart. @@ This is not true if the input mesh has zero-length edges. + XA_DEBUG_ASSERT(l_in != 0.0f); // Candidate face must be adjacent to chart. @@ This is not true if the input mesh has zero-length edges. float ratio = (l_out - l_in) / (l_out + l_in); - return std::min(ratio, 0.0f); // Only use the straightness metric to close gaps. + return min(ratio, 0.0f); // Only use the straightness metric to close gaps. + } + + bool isNormalSeam(uint32_t edge) const + { + const uint32_t oppositeEdge = m_mesh->oppositeEdge(edge); + if (oppositeEdge == UINT32_MAX) + return false; // boundary edge + if (m_mesh->flags() & MeshFlags::HasNormals) { + const uint32_t v0 = m_mesh->vertexAt(meshEdgeIndex0(edge)); + const uint32_t v1 = m_mesh->vertexAt(meshEdgeIndex1(edge)); + const uint32_t ov0 = m_mesh->vertexAt(meshEdgeIndex0(oppositeEdge)); + const uint32_t ov1 = m_mesh->vertexAt(meshEdgeIndex1(oppositeEdge)); + return m_mesh->normal(v0) != m_mesh->normal(ov1) || m_mesh->normal(v1) != m_mesh->normal(ov0); + } + return m_faceNormals[meshEdgeFace(edge)] != m_faceNormals[meshEdgeFace(oppositeEdge)]; } - float evaluateNormalSeamMetric(ChartBuildData *chart, uint32_t f) + float evaluateNormalSeamMetric(ChartBuildData *chart, uint32_t f) const { float seamFactor = 0.0f; float totalLength = 0.0f; - const halfedge::Face *face = mesh->faceAt(f); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - if (edge->isBoundary()) { + for (Mesh::FaceEdgeIterator it(m_mesh, f); !it.isDone(); it.advance()) { + if (it.isBoundary() || m_ignoreFaces[it.oppositeFace()]) continue; - } - const uint32_t neighborFaceId = edge->pair->face->id; - if (faceChartArray[neighborFaceId] != chart->id) { + if (m_faceChartArray[it.oppositeFace()] != chart->id) continue; - } - //float l = edge->length(); - float l = edgeLengths[edge->id / 2]; + float l = m_edgeLengths[it.edge()]; totalLength += l; - if (!edge->isSeam()) { + if (!it.isSeam()) continue; - } // Make sure it's a normal seam. - if (edge->isNormalSeam()) { - float d0 = clamp(dot(edge->vertex->nor, edge->pair->next->vertex->nor), 0.0f, 1.0f); - float d1 = clamp(dot(edge->next->vertex->nor, edge->pair->vertex->nor), 0.0f, 1.0f); - l *= 1 - (d0 + d1) * 0.5f; + if (isNormalSeam(it.edge())) { + float d; + if (m_mesh->flags() & MeshFlags::HasNormals) { + const Vector3 &n0 = m_mesh->normal(it.vertex0()); + const Vector3 &n1 = m_mesh->normal(it.vertex1()); + const Vector3 &on0 = m_mesh->normal(m_mesh->vertexAt(meshEdgeIndex0(it.oppositeEdge()))); + const Vector3 &on1 = m_mesh->normal(m_mesh->vertexAt(meshEdgeIndex1(it.oppositeEdge()))); + const float d0 = clamp(dot(n0, on1), 0.0f, 1.0f); + const float d1 = clamp(dot(n1, on0), 0.0f, 1.0f); + d = (d0 + d1) * 0.5f; + } else { + d = clamp(dot(m_faceNormals[f], m_faceNormals[meshEdgeFace(it.oppositeEdge())]), 0.0f, 1.0f); + } + l *= 1 - d; seamFactor += l; } } - if (seamFactor == 0) return 0.0f; + if (seamFactor <= 0.0f) + return 0.0f; return seamFactor / totalLength; } - float evaluateTextureSeamMetric(ChartBuildData *chart, uint32_t f) + float evaluateTextureSeamMetric(ChartBuildData *chart, uint32_t f) const { float seamLength = 0.0f; float totalLength = 0.0f; - const halfedge::Face *face = mesh->faceAt(f); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - if (edge->isBoundary()) { + for (Mesh::FaceEdgeIterator it(m_mesh, f); !it.isDone(); it.advance()) { + if (it.isBoundary() || m_ignoreFaces[it.oppositeFace()]) continue; - } - const uint32_t neighborFaceId = edge->pair->face->id; - if (faceChartArray[neighborFaceId] != chart->id) { + if (m_faceChartArray[it.oppositeFace()] != chart->id) continue; - } - //float l = edge->length(); - float l = edgeLengths[edge->id / 2]; + float l = m_edgeLengths[it.edge()]; totalLength += l; - if (!edge->isSeam()) { + if (!it.isSeam()) continue; - } // Make sure it's a texture seam. - if (edge->isTextureSeam()) { + if (it.isTextureSeam()) seamLength += l; - } } - if (seamLength == 0.0f) { + if (seamLength == 0.0f) return 0.0f; // Avoid division by zero. - } return seamLength / totalLength; } - float evaluateChartArea(ChartBuildData *chart, uint32_t f) + float evaluateChartArea(ChartBuildData *chart, uint32_t f) const { - const halfedge::Face *face = mesh->faceAt(f); - return chart->area + faceAreas[face->id]; + return chart->area + m_faceAreas[f]; } - float evaluateBoundaryLength(ChartBuildData *chart, uint32_t f) + float evaluateBoundaryLength(ChartBuildData *chart, uint32_t f) const { float boundaryLength = chart->boundaryLength; // Add new edges, subtract edges shared with the chart. - const halfedge::Face *face = mesh->faceAt(f); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - //float edgeLength = edge->length(); - float edgeLength = edgeLengths[edge->id / 2]; - if (edge->isBoundary()) { + for (Mesh::FaceEdgeIterator it(m_mesh, f); !it.isDone(); it.advance()) { + const float edgeLength = m_edgeLengths[it.edge()]; + if (it.isBoundary() || m_ignoreFaces[it.oppositeFace()]) { boundaryLength += edgeLength; } else { - uint32_t neighborFaceId = edge->pair->face->id; - if (faceChartArray[neighborFaceId] != chart->id) { + if (m_faceChartArray[it.oppositeFace()] != chart->id) boundaryLength += edgeLength; - } else { + else boundaryLength -= edgeLength; - } } } - return std::max(0.0f, boundaryLength); // @@ Hack! - } - - Vector3 evaluateChartNormalSum(ChartBuildData *chart, uint32_t f) - { - const halfedge::Face *face = mesh->faceAt(f); - return chart->normalSum + face->triangleNormalAreaScaled(); + return max(0.0f, boundaryLength); // @@ Hack! } - Vector3 evaluateChartCentroidSum(ChartBuildData *chart, uint32_t f) + Vector3 evaluateChartNormalSum(ChartBuildData *chart, uint32_t f) const { - const halfedge::Face *face = mesh->faceAt(f); - return chart->centroidSum + face->centroid(); - } - - Vector3 computeChartCentroid(const ChartBuildData *chart) - { - Vector3 centroid(0); - const uint32_t faceCount = chart->faces.size(); - for (uint32_t i = 0; i < faceCount; i++) { - const halfedge::Face *face = mesh->faceAt(chart->faces[i]); - centroid += face->triangleCenter(); - } - return centroid / float(faceCount); - } - - void fillHoles(float threshold) - { - while (facesLeft > 0) - createRandomChart(threshold); - } - - void mergeCharts() - { - std::vector<float> sharedBoundaryLengths; - const uint32_t chartCount = chartArray.size(); - for (int c = chartCount - 1; c >= 0; c--) { - sharedBoundaryLengths.clear(); - sharedBoundaryLengths.resize(chartCount, 0.0f); - ChartBuildData *chart = chartArray[c]; - float externalBoundary = 0.0f; - const uint32_t faceCount = chart->faces.size(); - for (uint32_t i = 0; i < faceCount; i++) { - uint32_t f = chart->faces[i]; - const halfedge::Face *face = mesh->faceAt(f); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - //float l = edge->length(); - float l = edgeLengths[edge->id / 2]; - if (edge->isBoundary()) { - externalBoundary += l; - } else { - uint32_t neighborFace = edge->pair->face->id; - uint32_t neighborChart = faceChartArray[neighborFace]; - if (neighborChart != (uint32_t)c) { - if ((edge->isSeam() && (edge->isNormalSeam() || edge->isTextureSeam())) || neighborChart == -2) { - externalBoundary += l; - } else { - sharedBoundaryLengths[neighborChart] += l; - } - } - } - } - } - for (int cc = chartCount - 1; cc >= 0; cc--) { - if (cc == c) - continue; - ChartBuildData *chart2 = chartArray[cc]; - if (chart2 == NULL) - continue; - if (sharedBoundaryLengths[cc] > 0.8 * std::max(0.0f, chart->boundaryLength - externalBoundary)) { - // Try to avoid degenerate configurations. - if (chart2->boundaryLength > sharedBoundaryLengths[cc]) { - if (dot(chart2->planeNormal, chart->planeNormal) > -0.25) { - mergeChart(chart2, chart, sharedBoundaryLengths[cc]); - delete chart; - chartArray[c] = NULL; - break; - } - } - } - if (sharedBoundaryLengths[cc] > 0.20 * std::max(0.0f, chart->boundaryLength - externalBoundary)) { - // Compare proxies. - if (dot(chart2->planeNormal, chart->planeNormal) > 0) { - mergeChart(chart2, chart, sharedBoundaryLengths[cc]); - delete chart; - chartArray[c] = NULL; - break; - } - } - } - } - // Remove deleted charts. - for (int c = 0; c < int32_t(chartArray.size()); /*do not increment if removed*/) { - if (chartArray[c] == NULL) { - chartArray.erase(chartArray.begin() + c); - // Update faceChartArray. - const uint32_t faceCount = faceChartArray.size(); - for (uint32_t i = 0; i < faceCount; i++) { - xaDebugAssert (faceChartArray[i] != -1); - xaDebugAssert (faceChartArray[i] != c); - xaDebugAssert (faceChartArray[i] <= int32_t(chartArray.size())); - if (faceChartArray[i] > c) { - faceChartArray[i]--; - } - } - } else { - chartArray[c]->id = c; - c++; - } - } + return chart->normalSum + m_mesh->triangleNormalAreaScaled(f); } // @@ Cleanup. struct Candidate { - uint32_t face; ChartBuildData *chart; + uint32_t face; float metric; }; @@ -5570,48 +5476,48 @@ struct AtlasBuilder { uint32_t best = 0; float bestCandidateMetric = FLT_MAX; - const uint32_t candidateCount = candidateArray.size(); - xaAssert(candidateCount > 0); + const uint32_t candidateCount = m_candidateArray.size(); + XA_ASSERT(candidateCount > 0); for (uint32_t i = 0; i < candidateCount; i++) { - const Candidate &candidate = candidateArray[i]; + const Candidate &candidate = m_candidateArray[i]; if (candidate.metric < bestCandidateMetric) { bestCandidateMetric = candidate.metric; best = i; } } - return candidateArray[best]; + return m_candidateArray[best]; } void removeCandidate(uint32_t f) { - int c = faceCandidateArray[f]; + int c = m_faceCandidateArray[f]; if (c != -1) { - faceCandidateArray[f] = (uint32_t)-1; - if (c == int(candidateArray.size() - 1)) { - candidateArray.pop_back(); + m_faceCandidateArray[f] = (uint32_t)-1; + if (c == int(m_candidateArray.size() - 1)) { + m_candidateArray.pop_back(); } else { // Replace with last. - candidateArray[c] = candidateArray[candidateArray.size() - 1]; - candidateArray.pop_back(); - faceCandidateArray[candidateArray[c].face] = c; + m_candidateArray[c] = m_candidateArray[m_candidateArray.size() - 1]; + m_candidateArray.pop_back(); + m_faceCandidateArray[m_candidateArray[c].face] = c; } } } void updateCandidate(ChartBuildData *chart, uint32_t f, float metric) { - if (faceCandidateArray[f] == -1) { - const uint32_t index = candidateArray.size(); - faceCandidateArray[f] = index; - candidateArray.resize(index + 1); - candidateArray[index].face = f; - candidateArray[index].chart = chart; - candidateArray[index].metric = metric; + if (m_faceCandidateArray[f] == (uint32_t)-1) { + const uint32_t index = m_candidateArray.size(); + m_faceCandidateArray[f] = index; + m_candidateArray.resize(index + 1); + m_candidateArray[index].face = f; + m_candidateArray[index].chart = chart; + m_candidateArray[index].metric = metric; } else { - int c = faceCandidateArray[f]; - xaDebugAssert(c != -1); - Candidate &candidate = candidateArray[c]; - xaDebugAssert(candidate.face == f); + const uint32_t c = m_faceCandidateArray[f]; + XA_DEBUG_ASSERT(c != (uint32_t)-1); + Candidate &candidate = m_candidateArray[c]; + XA_DEBUG_ASSERT(candidate.face == f); if (metric < candidate.metric || chart == candidate.chart) { candidate.metric = metric; candidate.chart = chart; @@ -5624,803 +5530,585 @@ struct AtlasBuilder const uint32_t faceCount = chart->faces.size(); for (uint32_t i = 0; i < faceCount; i++) { uint32_t f = chart->faces[i]; - xaDebugAssert(faceChartArray[f] == chart->id); - faceChartArray[f] = owner->id; + XA_DEBUG_ASSERT(m_faceChartArray[f] == chart->id); + m_faceChartArray[f] = owner->id; owner->faces.push_back(f); } // Update adjacencies? owner->area += chart->area; owner->boundaryLength += chart->boundaryLength - sharedBoundaryLength; owner->normalSum += chart->normalSum; - owner->centroidSum += chart->centroidSum; updateProxy(owner); - } + // Delete chart. + m_chartArray[chart->id] = nullptr; + chart->~ChartBuildData(); + XA_FREE(chart); + } + + const Mesh *m_mesh; + const Array<uint32_t> *m_meshFaces; + Array<bool> m_ignoreFaces; + Array<float> m_edgeLengths; + Array<float> m_faceAreas; + Array<Vector3> m_faceNormals; + Array<Vector2> m_texcoords; + Array<uint32_t> m_growFaces; + uint32_t m_facesLeft; + Array<int> m_faceChartArray; + Array<ChartBuildData *> m_chartArray; + Array<Candidate> m_candidateArray; + Array<uint32_t> m_faceCandidateArray; // Map face index to candidate index. + PriorityQueue m_bestTriangles; + KISSRng m_rand; + ChartOptions m_options; +}; +// Estimate quality of existing parameterization. +struct ParameterizationQuality +{ + uint32_t totalTriangleCount = 0; + uint32_t flippedTriangleCount = 0; + uint32_t zeroAreaTriangleCount = 0; + float parametricArea = 0.0f; + float geometricArea = 0.0f; + float stretchMetric = 0.0f; + float maxStretchMetric = 0.0f; + float conformalMetric = 0.0f; + float authalicMetric = 0.0f; + bool boundaryIntersection = false; +}; - uint32_t chartCount() const { return chartArray.size(); } - const std::vector<uint32_t> &chartFaces(uint32_t i) const { return chartArray[i]->faces; } +static ParameterizationQuality calculateParameterizationQuality(const Mesh *mesh, Array<uint32_t> *flippedFaces) +{ + XA_DEBUG_ASSERT(mesh != nullptr); + ParameterizationQuality quality; + const uint32_t faceCount = mesh->faceCount(); + uint32_t firstBoundaryEdge = UINT32_MAX; + for (uint32_t e = 0; e < mesh->edgeCount(); e++) { + if (mesh->isBoundaryEdge(e)) { + firstBoundaryEdge = e; + } + } + XA_DEBUG_ASSERT(firstBoundaryEdge != UINT32_MAX); + for (Mesh::BoundaryEdgeIterator it1(mesh, firstBoundaryEdge); !it1.isDone(); it1.advance()) { + const uint32_t edge1 = it1.edge(); + for (Mesh::BoundaryEdgeIterator it2(mesh, firstBoundaryEdge); !it2.isDone(); it2.advance()) { + const uint32_t edge2 = it2.edge(); + // Skip self and edges directly connected to edge1. + if (edge1 == edge2 || it1.nextEdge() == edge2 || it2.nextEdge() == edge1) + continue; + const Vector2 &a1 = mesh->texcoord(mesh->vertexAt(meshEdgeIndex0(edge1))); + const Vector2 &a2 = mesh->texcoord(mesh->vertexAt(meshEdgeIndex1(edge1))); + const Vector2 &b1 = mesh->texcoord(mesh->vertexAt(meshEdgeIndex0(edge2))); + const Vector2 &b2 = mesh->texcoord(mesh->vertexAt(meshEdgeIndex1(edge2))); + if (linesIntersect(a1, a2, b1, b2, mesh->epsilon())) { + quality.boundaryIntersection = true; + break; + } + } + if (quality.boundaryIntersection) + break; + } + if (flippedFaces) + flippedFaces->clear(); + for (uint32_t f = 0; f < faceCount; f++) { + Vector3 pos[3]; + Vector2 texcoord[3]; + for (int i = 0; i < 3; i++) { + const uint32_t v = mesh->vertexAt(f * 3 + i); + pos[i] = mesh->position(v); + texcoord[i] = mesh->texcoord(v); + } + quality.totalTriangleCount++; + // Evaluate texture stretch metric. See: + // - "Texture Mapping Progressive Meshes", Sander, Snyder, Gortler & Hoppe + // - "Mesh Parameterization: Theory and Practice", Siggraph'07 Course Notes, Hormann, Levy & Sheffer. + const float t1 = texcoord[0].x; + const float s1 = texcoord[0].y; + const float t2 = texcoord[1].x; + const float s2 = texcoord[1].y; + const float t3 = texcoord[2].x; + const float s3 = texcoord[2].y; + float parametricArea = ((s2 - s1) * (t3 - t1) - (s3 - s1) * (t2 - t1)) / 2; + if (isZero(parametricArea, kAreaEpsilon)) { + quality.zeroAreaTriangleCount++; + continue; + } + if (parametricArea < 0.0f) { + // Count flipped triangles. + quality.flippedTriangleCount++; + if (flippedFaces) + flippedFaces->push_back(f); + parametricArea = fabsf(parametricArea); + } + const float geometricArea = length(cross(pos[1] - pos[0], pos[2] - pos[0])) / 2; + const Vector3 Ss = (pos[0] * (t2 - t3) + pos[1] * (t3 - t1) + pos[2] * (t1 - t2)) / (2 * parametricArea); + const Vector3 St = (pos[0] * (s3 - s2) + pos[1] * (s1 - s3) + pos[2] * (s2 - s1)) / (2 * parametricArea); + const float a = dot(Ss, Ss); // E + const float b = dot(Ss, St); // F + const float c = dot(St, St); // G + // Compute eigen-values of the first fundamental form: + const float sigma1 = sqrtf(0.5f * max(0.0f, a + c - sqrtf(square(a - c) + 4 * square(b)))); // gamma uppercase, min eigenvalue. + const float sigma2 = sqrtf(0.5f * max(0.0f, a + c + sqrtf(square(a - c) + 4 * square(b)))); // gamma lowercase, max eigenvalue. + XA_ASSERT(sigma2 > sigma1 || equal(sigma1, sigma2, kEpsilon)); + // isometric: sigma1 = sigma2 = 1 + // conformal: sigma1 / sigma2 = 1 + // authalic: sigma1 * sigma2 = 1 + const float rmsStretch = sqrtf((a + c) * 0.5f); + const float rmsStretch2 = sqrtf((square(sigma1) + square(sigma2)) * 0.5f); + XA_DEBUG_ASSERT(equal(rmsStretch, rmsStretch2, 0.01f)); + XA_UNUSED(rmsStretch2); + quality.stretchMetric += square(rmsStretch) * geometricArea; + quality.maxStretchMetric = max(quality.maxStretchMetric, sigma2); + if (!isZero(sigma1, 0.000001f)) { + // sigma1 is zero when geometricArea is zero. + quality.conformalMetric += (sigma2 / sigma1) * geometricArea; + } + quality.authalicMetric += (sigma1 * sigma2) * geometricArea; + // Accumulate total areas. + quality.geometricArea += geometricArea; + quality.parametricArea += parametricArea; + //triangleConformalEnergy(q, p); + } + if (quality.flippedTriangleCount + quality.zeroAreaTriangleCount == quality.totalTriangleCount) { + // If all triangles are flipped, then none are. + if (flippedFaces) + flippedFaces->clear(); + quality.flippedTriangleCount = 0; + } + if (quality.flippedTriangleCount > quality.totalTriangleCount / 2) + { + // If more than half the triangles are flipped, reverse the flipped / not flipped classification. + quality.flippedTriangleCount = quality.totalTriangleCount - quality.flippedTriangleCount; + if (flippedFaces) { + Array<uint32_t> temp(*flippedFaces); + flippedFaces->clear(); + for (uint32_t f = 0; f < faceCount; f++) { + bool match = false; + for (uint32_t ff = 0; ff < temp.size(); ff++) { + if (temp[ff] == f) { + match = true; + break; + } + } + if (!match) + flippedFaces->push_back(f); + } + } + } + XA_DEBUG_ASSERT(isFinite(quality.parametricArea) && quality.parametricArea >= 0); + XA_DEBUG_ASSERT(isFinite(quality.geometricArea) && quality.geometricArea >= 0); + XA_DEBUG_ASSERT(isFinite(quality.stretchMetric)); + XA_DEBUG_ASSERT(isFinite(quality.maxStretchMetric)); + XA_DEBUG_ASSERT(isFinite(quality.conformalMetric)); + XA_DEBUG_ASSERT(isFinite(quality.authalicMetric)); + if (quality.geometricArea <= 0.0f) { + quality.stretchMetric = 0.0f; + quality.maxStretchMetric = 0.0f; + quality.conformalMetric = 0.0f; + quality.authalicMetric = 0.0f; + } else { + const float normFactor = sqrtf(quality.parametricArea / quality.geometricArea); + quality.stretchMetric = sqrtf(quality.stretchMetric / quality.geometricArea) * normFactor; + quality.maxStretchMetric *= normFactor; + quality.conformalMetric = sqrtf(quality.conformalMetric / quality.geometricArea); + quality.authalicMetric = sqrtf(quality.authalicMetric / quality.geometricArea); + } + return quality; +} - const halfedge::Mesh *mesh; - uint32_t facesLeft; - std::vector<int> faceChartArray; - std::vector<ChartBuildData *> chartArray; - std::vector<float> shortestPaths; - std::vector<float> edgeLengths; - std::vector<float> faceAreas; - std::vector<Candidate> candidateArray; // - std::vector<uint32_t> faceCandidateArray; // Map face index to candidate index. - MTRand rand; - CharterOptions options; +struct ChartWarningFlags +{ + enum Enum + { + CloseHolesFailed = 1<<1, + FixTJunctionsDuplicatedEdge = 1<<2, + FixTJunctionsFailed = 1<<3, + TriangulateDuplicatedEdge = 1<<4, + }; }; /// A chart is a connected set of faces with a certain topology (usually a disk). class Chart { public: - Chart() : m_isDisk(false), m_isVertexMapped(false) {} - - void build(const halfedge::Mesh *originalMesh, const std::vector<uint32_t> &faceArray) + Chart(const Mesh *originalMesh, const Array<uint32_t> &faceArray, const Basis &basis, uint32_t meshId, uint32_t chartGroupId, uint32_t chartId) : m_basis(basis), m_mesh(nullptr), m_unifiedMesh(nullptr), m_isDisk(false), m_isOrtho(false), m_isPlanar(false), m_warningFlags(0), m_closedHolesCount(0), m_fixedTJunctionsCount(0), m_faceArray(faceArray) { + XA_UNUSED(meshId); + XA_UNUSED(chartGroupId); + XA_UNUSED(chartId); // Copy face indices. - m_faceArray = faceArray; - const uint32_t meshVertexCount = originalMesh->vertexCount(); - m_chartMesh.reset(new halfedge::Mesh()); - m_unifiedMesh.reset(new halfedge::Mesh()); - std::vector<uint32_t> chartMeshIndices(meshVertexCount, (uint32_t)~0); - std::vector<uint32_t> unifiedMeshIndices(meshVertexCount, (uint32_t)~0); + m_mesh = XA_NEW(MemTag::Mesh, Mesh, originalMesh->epsilon(), faceArray.size() * 3, faceArray.size()); + m_unifiedMesh = XA_NEW(MemTag::Mesh, Mesh, originalMesh->epsilon(), faceArray.size() * 3, faceArray.size()); + Array<uint32_t> chartMeshIndices; + chartMeshIndices.resize(originalMesh->vertexCount(), (uint32_t)~0); + Array<uint32_t> unifiedMeshIndices; + unifiedMeshIndices.resize(originalMesh->vertexCount(), (uint32_t)~0); // Add vertices. const uint32_t faceCount = faceArray.size(); for (uint32_t f = 0; f < faceCount; f++) { - const halfedge::Face *face = originalMesh->faceAt(faceArray[f]); - xaDebugAssert(face != NULL); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Vertex *vertex = it.current()->vertex; - const halfedge::Vertex *unifiedVertex = vertex->firstColocal(); - if (unifiedMeshIndices[unifiedVertex->id] == ~0) { - unifiedMeshIndices[unifiedVertex->id] = m_unifiedMesh->vertexCount(); - xaDebugAssert(vertex->pos == unifiedVertex->pos); - m_unifiedMesh->addVertex(vertex->pos); + for (uint32_t i = 0; i < 3; i++) { + const uint32_t vertex = originalMesh->vertexAt(faceArray[f] * 3 + i); + const uint32_t unifiedVertex = originalMesh->firstColocal(vertex); + if (unifiedMeshIndices[unifiedVertex] == (uint32_t)~0) { + unifiedMeshIndices[unifiedVertex] = m_unifiedMesh->vertexCount(); + XA_DEBUG_ASSERT(equal(originalMesh->position(vertex), originalMesh->position(unifiedVertex), originalMesh->epsilon())); + m_unifiedMesh->addVertex(originalMesh->position(vertex)); } - if (chartMeshIndices[vertex->id] == ~0) { - chartMeshIndices[vertex->id] = m_chartMesh->vertexCount(); - // -- GODOT start -- - //m_chartToOriginalMap.push_back(vertex->id); - m_chartToOriginalMap.push_back(vertex->original_id); - // -- GODOT end -- - m_chartToUnifiedMap.push_back(unifiedMeshIndices[unifiedVertex->id]); - halfedge::Vertex *v = m_chartMesh->addVertex(vertex->pos); - v->nor = vertex->nor; - v->tex = vertex->tex; + if (chartMeshIndices[vertex] == (uint32_t)~0) { + chartMeshIndices[vertex] = m_mesh->vertexCount(); + m_chartToOriginalMap.push_back(vertex); + m_chartToUnifiedMap.push_back(unifiedMeshIndices[unifiedVertex]); + m_mesh->addVertex(originalMesh->position(vertex), Vector3(0.0f), originalMesh->texcoord(vertex)); } } } - // This is ignoring the canonical map: - // - Is it really necessary to link colocals? - m_chartMesh->linkColocals(); - //m_unifiedMesh->linkColocals(); // Not strictly necessary, no colocals in the unified mesh. # Wrong. - // This check is not valid anymore, if the original mesh vertices were linked with a canonical map, then it might have - // some colocal vertices that were unlinked. So, the unified mesh might have some duplicate vertices, because firstColocal() - // is not guaranteed to return the same vertex for two colocal vertices. - //xaAssert(m_chartMesh->colocalVertexCount() == m_unifiedMesh->vertexCount()); - // Is that OK? What happens in meshes were that happens? Does anything break? Apparently not... - std::vector<uint32_t> faceIndices; - faceIndices.reserve(7); // Add faces. for (uint32_t f = 0; f < faceCount; f++) { - const halfedge::Face *face = originalMesh->faceAt(faceArray[f]); - xaDebugAssert(face != NULL); - faceIndices.clear(); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Vertex *vertex = it.current()->vertex; - xaDebugAssert(vertex != NULL); - faceIndices.push_back(chartMeshIndices[vertex->id]); - } - m_chartMesh->addFace(faceIndices); - faceIndices.clear(); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Vertex *vertex = it.current()->vertex; - xaDebugAssert(vertex != NULL); - vertex = vertex->firstColocal(); - faceIndices.push_back(unifiedMeshIndices[vertex->id]); - } - m_unifiedMesh->addFace(faceIndices); - } - m_chartMesh->linkBoundary(); - m_unifiedMesh->linkBoundary(); - //exportMesh(m_unifiedMesh.ptr(), "debug_input.obj"); - if (m_unifiedMesh->splitBoundaryEdges()) { - m_unifiedMesh.reset(halfedge::unifyVertices(m_unifiedMesh.get())); - } - //exportMesh(m_unifiedMesh.ptr(), "debug_split.obj"); - // Closing the holes is not always the best solution and does not fix all the problems. - // We need to do some analysis of the holes and the genus to: - // - Find cuts that reduce genus. - // - Find cuts to connect holes. - // - Use minimal spanning trees or seamster. - if (!closeHoles()) { - /*static int pieceCount = 0; - StringBuilder fileName; - fileName.format("debug_hole_%d.obj", pieceCount++); - exportMesh(m_unifiedMesh.ptr(), fileName.str());*/ - } - m_unifiedMesh.reset(halfedge::triangulate(m_unifiedMesh.get())); - //exportMesh(m_unifiedMesh.ptr(), "debug_triangulated.obj"); - // Analyze chart topology. - halfedge::MeshTopology topology(m_unifiedMesh.get()); - m_isDisk = topology.isDisk(); - } - - void buildVertexMap(const halfedge::Mesh *originalMesh, const std::vector<uint32_t> &unchartedMaterialArray) - { - xaAssert(m_chartMesh.get() == NULL && m_unifiedMesh.get() == NULL); - m_isVertexMapped = true; - // Build face indices. - m_faceArray.clear(); - const uint32_t meshFaceCount = originalMesh->faceCount(); - for (uint32_t f = 0; f < meshFaceCount; f++) { - const halfedge::Face *face = originalMesh->faceAt(f); - if (std::find(unchartedMaterialArray.begin(), unchartedMaterialArray.end(), face->material) != unchartedMaterialArray.end()) { - m_faceArray.push_back(f); - } - } - const uint32_t faceCount = m_faceArray.size(); - if (faceCount == 0) { - return; - } - // @@ The chartMesh construction is basically the same as with regular charts, don't duplicate! - const uint32_t meshVertexCount = originalMesh->vertexCount(); - m_chartMesh.reset(new halfedge::Mesh()); - std::vector<uint32_t> chartMeshIndices(meshVertexCount, (uint32_t)~0); - // Vertex map mesh only has disconnected vertices. - for (uint32_t f = 0; f < faceCount; f++) { - const halfedge::Face *face = originalMesh->faceAt(m_faceArray[f]); - xaDebugAssert(face != NULL); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Vertex *vertex = it.current()->vertex; - if (chartMeshIndices[vertex->id] == ~0) { - chartMeshIndices[vertex->id] = m_chartMesh->vertexCount(); - // -- GODOT start -- - //m_chartToOriginalMap.push_back(vertex->id); - m_chartToOriginalMap.push_back(vertex->original_id); - // -- GODOT end -- - halfedge::Vertex *v = m_chartMesh->addVertex(vertex->pos); - v->nor = vertex->nor; - v->tex = vertex->tex; // @@ Not necessary. - } + uint32_t indices[3], unifiedIndices[3]; + for (uint32_t i = 0; i < 3; i++) { + const uint32_t vertex = originalMesh->vertexAt(faceArray[f] * 3 + i); + indices[i] = chartMeshIndices[vertex]; + unifiedIndices[i] = unifiedMeshIndices[originalMesh->firstColocal(vertex)]; + } + Mesh::AddFaceResult::Enum result = m_mesh->addFace(indices); + XA_UNUSED(result); + XA_DEBUG_ASSERT(result == Mesh::AddFaceResult::OK); +#if XA_DEBUG + // Unifying colocals may create degenerate edges. e.g. if two triangle vertices are colocal. + for (int i = 0; i < 3; i++) { + const uint32_t index1 = unifiedIndices[i]; + const uint32_t index2 = unifiedIndices[(i + 1) % 3]; + XA_DEBUG_ASSERT(index1 != index2); } - } - // @@ Link colocals using the original mesh canonical map? Build canonical map on the fly? Do we need to link colocals at all for this? - //m_chartMesh->linkColocals(); - std::vector<uint32_t> faceIndices; - faceIndices.reserve(7); - // Add faces. - for (uint32_t f = 0; f < faceCount; f++) { - const halfedge::Face *face = originalMesh->faceAt(m_faceArray[f]); - xaDebugAssert(face != NULL); - faceIndices.clear(); - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Vertex *vertex = it.current()->vertex; - xaDebugAssert(vertex != NULL); - xaDebugAssert(chartMeshIndices[vertex->id] != ~0); - faceIndices.push_back(chartMeshIndices[vertex->id]); - } - halfedge::Face *new_face = m_chartMesh->addFace(faceIndices); - xaDebugAssert(new_face != NULL); -#ifdef NDEBUG - new_face = NULL; // silence unused parameter warning #endif - } - m_chartMesh->linkBoundary(); - const uint32_t chartVertexCount = m_chartMesh->vertexCount(); - Box bounds; - bounds.clearBounds(); - for (uint32_t i = 0; i < chartVertexCount; i++) { - halfedge::Vertex *vertex = m_chartMesh->vertexAt(i); - bounds.addPointToBounds(vertex->pos); - } - ProximityGrid grid; - grid.init(bounds, chartVertexCount); - for (uint32_t i = 0; i < chartVertexCount; i++) { - halfedge::Vertex *vertex = m_chartMesh->vertexAt(i); - grid.add(vertex->pos, i); - } - uint32_t texelCount = 0; - const float positionThreshold = 0.01f; - const float normalThreshold = 0.01f; - uint32_t verticesVisited = 0; - uint32_t cellsVisited = 0; - std::vector<int> vertexIndexArray(chartVertexCount, -1); // Init all indices to -1. - // Traverse vertices in morton order. @@ It may be more interesting to sort them based on orientation. - const uint32_t cellCodeCount = grid.mortonCount(); - for (uint32_t cellCode = 0; cellCode < cellCodeCount; cellCode++) { - int cell = grid.mortonIndex(cellCode); - if (cell < 0) continue; - cellsVisited++; - const std::vector<uint32_t> &indexArray = grid.cellArray[cell].indexArray; - for (uint32_t i = 0; i < indexArray.size(); i++) { - uint32_t idx = indexArray[i]; - halfedge::Vertex *vertex = m_chartMesh->vertexAt(idx); - xaDebugAssert(vertexIndexArray[idx] == -1); - std::vector<uint32_t> neighbors; - grid.gather(vertex->pos, positionThreshold, /*ref*/neighbors); - // Compare against all nearby vertices, cluster greedily. - for (uint32_t j = 0; j < neighbors.size(); j++) { - uint32_t otherIdx = neighbors[j]; - if (vertexIndexArray[otherIdx] != -1) { - halfedge::Vertex *otherVertex = m_chartMesh->vertexAt(otherIdx); - if (distance(vertex->pos, otherVertex->pos) < positionThreshold && - distance(vertex->nor, otherVertex->nor) < normalThreshold) { - vertexIndexArray[idx] = vertexIndexArray[otherIdx]; - break; + result = m_unifiedMesh->addFace(unifiedIndices); + XA_UNUSED(result); + XA_DEBUG_ASSERT(result == Mesh::AddFaceResult::OK); + } + m_mesh->createBoundaries(); // For AtlasPacker::computeBoundingBox + m_unifiedMesh->createBoundaries(); + m_unifiedMesh->linkBoundaries(); + m_isPlanar = meshIsPlanar(*m_unifiedMesh); + if (m_isPlanar) { + m_isDisk = true; + } else { +#if XA_DEBUG_EXPORT_OBJ_BEFORE_FIX_TJUNCTION + m_unifiedMesh->writeObjFile("debug_before_fix_tjunction.obj"); +#endif + bool duplicatedEdge = false, failed = false; + XA_PROFILE_START(fixChartMeshTJunctions) + Mesh *fixedUnifiedMesh = meshFixTJunctions(*m_unifiedMesh, &duplicatedEdge, &failed, &m_fixedTJunctionsCount); + XA_PROFILE_END(fixChartMeshTJunctions) + if (fixedUnifiedMesh) { + if (duplicatedEdge) + m_warningFlags |= ChartWarningFlags::FixTJunctionsDuplicatedEdge; + if (failed) + m_warningFlags |= ChartWarningFlags::FixTJunctionsFailed; + m_unifiedMesh->~Mesh(); + XA_FREE(m_unifiedMesh); + m_unifiedMesh = fixedUnifiedMesh; + m_unifiedMesh->createBoundaries(); + m_unifiedMesh->linkBoundaries(); + } + // See if there are any holes that need closing. + Array<uint32_t> boundaryLoops; + meshGetBoundaryLoops(*m_unifiedMesh, boundaryLoops); + if (boundaryLoops.size() > 1) { +#if XA_DEBUG_EXPORT_OBJ_CLOSE_HOLES_ERROR + const uint32_t faceCountBeforeHolesClosed = m_unifiedMesh->faceCount(); +#endif + // Closing the holes is not always the best solution and does not fix all the problems. + // We need to do some analysis of the holes and the genus to: + // - Find cuts that reduce genus. + // - Find cuts to connect holes. + // - Use minimal spanning trees or seamster. + Array<uint32_t> holeFaceCounts; + XA_PROFILE_START(closeChartMeshHoles) + failed = !meshCloseHoles(m_unifiedMesh, boundaryLoops, basis.normal, holeFaceCounts); + XA_PROFILE_END(closeChartMeshHoles) + m_unifiedMesh->createBoundaries(); + m_unifiedMesh->linkBoundaries(); + meshGetBoundaryLoops(*m_unifiedMesh, boundaryLoops); + if (failed || boundaryLoops.size() > 1) + m_warningFlags |= ChartWarningFlags::CloseHolesFailed; + m_closedHolesCount = holeFaceCounts.size(); +#if XA_DEBUG_EXPORT_OBJ_CLOSE_HOLES_ERROR + if (m_warningFlags & ChartWarningFlags::CloseHolesFailed) { + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_mesh_%03u_chartgroup_%03u_chart_%03u_close_holes_error.obj", meshId, chartGroupId, chartId); + FILE *file; + XA_FOPEN(file, filename, "w"); + if (file) { + m_unifiedMesh->writeObjVertices(file); + fprintf(file, "s off\n"); + fprintf(file, "o object\n"); + for (uint32_t i = 0; i < faceCountBeforeHolesClosed; i++) + m_unifiedMesh->writeObjFace(file, i); + uint32_t face = faceCountBeforeHolesClosed; + for (uint32_t i = 0; i < holeFaceCounts.size(); i++) { + fprintf(file, "s off\n"); + fprintf(file, "o hole%u\n", i); + for (uint32_t j = 0; j < holeFaceCounts[i]; j++) { + m_unifiedMesh->writeObjFace(file, face); + face++; + } } + m_unifiedMesh->writeObjBoundaryEges(file); + m_unifiedMesh->writeObjLinkedBoundaries(file); + fclose(file); } } - // If index not assigned, assign new one. - if (vertexIndexArray[idx] == -1) { - vertexIndexArray[idx] = texelCount++; - } - verticesVisited++; - } - } - xaDebugAssert(cellsVisited == grid.cellArray.size()); - xaDebugAssert(verticesVisited == chartVertexCount); - vertexMapWidth = ftoi_ceil(sqrtf(float(texelCount))); - vertexMapWidth = (vertexMapWidth + 3) & ~3; // Width aligned to 4. - vertexMapHeight = vertexMapWidth == 0 ? 0 : (texelCount + vertexMapWidth - 1) / vertexMapWidth; - //vertexMapHeight = (vertexMapHeight + 3) & ~3; // Height aligned to 4. - xaDebugAssert(vertexMapWidth >= vertexMapHeight); - xaPrint("Reduced vertex count from %d to %d.\n", chartVertexCount, texelCount); - // Lay down the clustered vertices in morton order. - std::vector<uint32_t> texelCodes(texelCount); - // For each texel, assign one morton code. - uint32_t texelCode = 0; - for (uint32_t i = 0; i < texelCount; i++) { - uint32_t x, y; - do { - x = morton::decodeMorton2X(texelCode); - y = morton::decodeMorton2Y(texelCode); - texelCode++; - } while (x >= uint32_t(vertexMapWidth) || y >= uint32_t(vertexMapHeight)); - texelCodes[i] = texelCode - 1; - } - for (uint32_t i = 0; i < chartVertexCount; i++) { - halfedge::Vertex *vertex = m_chartMesh->vertexAt(i); - int idx = vertexIndexArray[i]; - if (idx != -1) { - uint32_t tc = texelCodes[idx]; - uint32_t x = morton::decodeMorton2X(tc); - uint32_t y = morton::decodeMorton2Y(tc); - vertex->tex.x = float(x); - vertex->tex.y = float(y); - } - } - } - - bool closeHoles() - { - xaDebugAssert(!m_isVertexMapped); - std::vector<halfedge::Edge *> boundaryEdges; - getBoundaryEdges(m_unifiedMesh.get(), boundaryEdges); - uint32_t boundaryCount = boundaryEdges.size(); - if (boundaryCount <= 1) { - // Nothing to close. - return true; - } - // Compute lengths and areas. - std::vector<float> boundaryLengths; - for (uint32_t i = 0; i < boundaryCount; i++) { - const halfedge::Edge *startEdge = boundaryEdges[i]; - xaAssert(startEdge->face == NULL); - //float boundaryEdgeCount = 0; - float boundaryLength = 0.0f; - //Vector3 boundaryCentroid(zero); - const halfedge::Edge *edge = startEdge; - do { - Vector3 t0 = edge->from()->pos; - Vector3 t1 = edge->to()->pos; - //boundaryEdgeCount++; - boundaryLength += length(t1 - t0); - //boundaryCentroid += edge->vertex()->pos; - edge = edge->next; - } while (edge != startEdge); - boundaryLengths.push_back(boundaryLength); - //boundaryCentroids.append(boundaryCentroid / boundaryEdgeCount); - } - // Find disk boundary. - uint32_t diskBoundary = 0; - float maxLength = boundaryLengths[0]; - for (uint32_t i = 1; i < boundaryCount; i++) { - if (boundaryLengths[i] > maxLength) { - maxLength = boundaryLengths[i]; - diskBoundary = i; - } - } - // Close holes. - for (uint32_t i = 0; i < boundaryCount; i++) { - if (diskBoundary == i) { - // Skip disk boundary. - continue; +#endif } - halfedge::Edge *startEdge = boundaryEdges[i]; - xaDebugAssert(startEdge != NULL); - xaDebugAssert(startEdge->face == NULL); - std::vector<halfedge::Vertex *> vertexLoop; - std::vector<halfedge::Edge *> edgeLoop; - halfedge::Edge *edge = startEdge; - do { - halfedge::Vertex *vertex = edge->next->vertex; // edge->to() - uint32_t j; - for (j = 0; j < vertexLoop.size(); j++) { - if (vertex->isColocal(vertexLoop[j])) { - break; - } - } - bool isCrossing = (j != vertexLoop.size()); - if (isCrossing) { - halfedge::Edge *prev = edgeLoop[j]; // Previous edge before the loop. - halfedge::Edge *next = edge->next; // Next edge after the loop. - xaDebugAssert(prev->to()->isColocal(next->from())); - // Close loop. - edgeLoop.push_back(edge); - closeLoop(j + 1, edgeLoop); - // Link boundary loop. - prev->setNext(next); - vertex->setEdge(next); - // Start over again. - vertexLoop.clear(); - edgeLoop.clear(); - edge = startEdge; - vertex = edge->to(); - } - vertexLoop.push_back(vertex); - edgeLoop.push_back(edge); - edge = edge->next; - } while (edge != startEdge); - closeLoop(0, edgeLoop); + // Note: MeshTopology needs linked boundaries. + MeshTopology topology(m_unifiedMesh); + m_isDisk = topology.isDisk(); +#if XA_DEBUG_EXPORT_OBJ_NOT_DISK + if (!m_isDisk) { + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_mesh_%03u_chartgroup_%03u_chart_%03u_not_disk.obj", meshId, chartGroupId, chartId); + m_unifiedMesh->writeObjFile(filename); + } +#endif } - getBoundaryEdges(m_unifiedMesh.get(), boundaryEdges); - boundaryCount = boundaryEdges.size(); - xaDebugAssert(boundaryCount == 1); - return boundaryCount == 1; - } - - bool isDisk() const - { - return m_isDisk; - } - bool isVertexMapped() const - { - return m_isVertexMapped; - } - - uint32_t vertexCount() const - { - return m_chartMesh->vertexCount(); - } - uint32_t colocalVertexCount() const - { - return m_unifiedMesh->vertexCount(); } - uint32_t faceCount() const + ~Chart() { - return m_faceArray.size(); - } - uint32_t faceAt(uint32_t i) const - { - return m_faceArray[i]; - } - - const halfedge::Mesh *chartMesh() const - { - return m_chartMesh.get(); - } - halfedge::Mesh *chartMesh() - { - return m_chartMesh.get(); - } - const halfedge::Mesh *unifiedMesh() const - { - return m_unifiedMesh.get(); - } - halfedge::Mesh *unifiedMesh() - { - return m_unifiedMesh.get(); + if (m_mesh) { + m_mesh->~Mesh(); + XA_FREE(m_mesh); + } + if (m_unifiedMesh) { + m_unifiedMesh->~Mesh(); + XA_FREE(m_unifiedMesh); + } } - //uint32_t vertexIndex(uint32_t i) const { return m_vertexIndexArray[i]; } + const Basis &basis() const { return m_basis; } + bool isDisk() const { return m_isDisk; } + bool isOrtho() const { return m_isOrtho; } + bool isPlanar() const { return m_isPlanar; } + uint32_t warningFlags() const { return m_warningFlags; } + uint32_t closedHolesCount() const { return m_closedHolesCount; } + uint32_t fixedTJunctionsCount() const { return m_fixedTJunctionsCount; } + const ParameterizationQuality ¶mQuality() const { return m_paramQuality; } +#if XA_DEBUG_EXPORT_OBJ_INVALID_PARAMETERIZATION + const Array<uint32_t> ¶mFlippedFaces() const { return m_paramFlippedFaces; } +#endif + uint32_t mapFaceToSourceFace(uint32_t i) const { return m_faceArray[i]; } + const Mesh *mesh() const { return m_mesh; } + Mesh *mesh() { return m_mesh; } + const Mesh *unifiedMesh() const { return m_unifiedMesh; } + Mesh *unifiedMesh() { return m_unifiedMesh; } + uint32_t mapChartVertexToOriginalVertex(uint32_t i) const { return m_chartToOriginalMap[i]; } - uint32_t mapChartVertexToOriginalVertex(uint32_t i) const - { - return m_chartToOriginalMap[i]; - } - uint32_t mapChartVertexToUnifiedVertex(uint32_t i) const + void evaluateOrthoParameterizationQuality() { - return m_chartToUnifiedMap[i]; + XA_PROFILE_START(parameterizeChartsEvaluateQuality) + m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, nullptr); + XA_PROFILE_END(parameterizeChartsEvaluateQuality) + // Use orthogonal parameterization if quality is acceptable. + if (!m_paramQuality.boundaryIntersection && m_paramQuality.geometricArea > 0.0f && m_paramQuality.stretchMetric <= 1.1f && m_paramQuality.maxStretchMetric <= 1.25f) + m_isOrtho = true; } - const std::vector<uint32_t> &faceArray() const + void evaluateParameterizationQuality() { - return m_faceArray; + XA_PROFILE_START(parameterizeChartsEvaluateQuality) +#if XA_DEBUG_EXPORT_OBJ_INVALID_PARAMETERIZATION + m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, &m_paramFlippedFaces); +#else + m_paramQuality = calculateParameterizationQuality(m_unifiedMesh, nullptr); +#endif + XA_PROFILE_END(parameterizeChartsEvaluateQuality) } // Transfer parameterization from unified mesh to chart mesh. void transferParameterization() { - xaDebugAssert(!m_isVertexMapped); - uint32_t vertexCount = m_chartMesh->vertexCount(); - for (uint32_t v = 0; v < vertexCount; v++) { - halfedge::Vertex *vertex = m_chartMesh->vertexAt(v); - halfedge::Vertex *unifiedVertex = m_unifiedMesh->vertexAt(mapChartVertexToUnifiedVertex(v)); - vertex->tex = unifiedVertex->tex; - } + const uint32_t vertexCount = m_mesh->vertexCount(); + for (uint32_t v = 0; v < vertexCount; v++) + m_mesh->texcoord(v) = m_unifiedMesh->texcoord(m_chartToUnifiedMap[v]); } float computeSurfaceArea() const { - return halfedge::computeSurfaceArea(m_chartMesh.get()) * scale; + return m_mesh->computeSurfaceArea(); } float computeParametricArea() const { - // This only makes sense in parameterized meshes. - xaDebugAssert(m_isDisk); - xaDebugAssert(!m_isVertexMapped); - return halfedge::computeParametricArea(m_chartMesh.get()); + return m_mesh->computeParametricArea(); } Vector2 computeParametricBounds() const { - // This only makes sense in parameterized meshes. - xaDebugAssert(m_isDisk); - xaDebugAssert(!m_isVertexMapped); - Box bounds; - bounds.clearBounds(); - uint32_t vertexCount = m_chartMesh->vertexCount(); + Vector2 minCorner(FLT_MAX, FLT_MAX); + Vector2 maxCorner(-FLT_MAX, -FLT_MAX); + const uint32_t vertexCount = m_mesh->vertexCount(); for (uint32_t v = 0; v < vertexCount; v++) { - halfedge::Vertex *vertex = m_chartMesh->vertexAt(v); - bounds.addPointToBounds(Vector3(vertex->tex, 0)); + minCorner = min(minCorner, m_mesh->texcoord(v)); + maxCorner = max(maxCorner, m_mesh->texcoord(v)); } - return bounds.extents().xy(); + return (maxCorner - minCorner) * 0.5f; } - float scale = 1.0f; - uint32_t vertexMapWidth; - uint32_t vertexMapHeight; - bool blockAligned = true; - private: - bool closeLoop(uint32_t start, const std::vector<halfedge::Edge *> &loop) - { - const uint32_t vertexCount = loop.size() - start; - xaDebugAssert(vertexCount >= 3); - if (vertexCount < 3) return false; - xaDebugAssert(loop[start]->vertex->isColocal(loop[start + vertexCount - 1]->to())); - // If the hole is planar, then we add a single face that will be properly triangulated later. - // If the hole is not planar, we add a triangle fan with a vertex at the hole centroid. - // This is still a bit of a hack. There surely are better hole filling algorithms out there. - std::vector<Vector3> points(vertexCount); - for (uint32_t i = 0; i < vertexCount; i++) { - points[i] = loop[start + i]->vertex->pos; - } - bool isPlanar = Fit::isPlanar(vertexCount, points.data()); - if (isPlanar) { - // Add face and connect edges. - halfedge::Face *face = m_unifiedMesh->addFace(); - for (uint32_t i = 0; i < vertexCount; i++) { - halfedge::Edge *edge = loop[start + i]; - edge->face = face; - edge->setNext(loop[start + (i + 1) % vertexCount]); - } - face->edge = loop[start]; - xaDebugAssert(face->isValid()); - } else { - // If the polygon is not planar, we just cross our fingers, and hope this will work: - // Compute boundary centroid: - Vector3 centroidPos(0); - for (uint32_t i = 0; i < vertexCount; i++) { - centroidPos += points[i]; - } - centroidPos *= (1.0f / vertexCount); - halfedge::Vertex *centroid = m_unifiedMesh->addVertex(centroidPos); - // Add one pair of edges for each boundary vertex. - for (uint32_t j = vertexCount - 1, i = 0; i < vertexCount; j = i++) { - halfedge::Face *face = m_unifiedMesh->addFace(centroid->id, loop[start + j]->vertex->id, loop[start + i]->vertex->id); - xaDebugAssert(face != NULL); -#ifdef NDEBUG - face = NULL; // silence unused parameter warning -#endif - } - } - return true; - } - - static void getBoundaryEdges(halfedge::Mesh *mesh, std::vector<halfedge::Edge *> &boundaryEdges) - { - xaDebugAssert(mesh != NULL); - const uint32_t edgeCount = mesh->edgeCount(); - BitArray bitFlags(edgeCount); - bitFlags.clearAll(); - boundaryEdges.clear(); - // Search for boundary edges. Mark all the edges that belong to the same boundary. - for (uint32_t e = 0; e < edgeCount; e++) { - halfedge::Edge *startEdge = mesh->edgeAt(e); - if (startEdge != NULL && startEdge->isBoundary() && bitFlags.bitAt(e) == false) { - xaDebugAssert(startEdge->face != NULL); - xaDebugAssert(startEdge->pair->face == NULL); - startEdge = startEdge->pair; - const halfedge::Edge *edge = startEdge; - do { - xaDebugAssert(edge->face == NULL); - xaDebugAssert(bitFlags.bitAt(edge->id / 2) == false); - bitFlags.setBitAt(edge->id / 2); - edge = edge->next; - } while (startEdge != edge); - boundaryEdges.push_back(startEdge); - } - } - } - - // Chart mesh. - std::auto_ptr<halfedge::Mesh> m_chartMesh; + Basis m_basis; + Mesh *m_mesh; + Mesh *m_unifiedMesh; + bool m_isDisk, m_isOrtho, m_isPlanar; + uint32_t m_warningFlags; + uint32_t m_closedHolesCount, m_fixedTJunctionsCount; - std::auto_ptr<halfedge::Mesh> m_unifiedMesh; - bool m_isDisk; - bool m_isVertexMapped; - // List of faces of the original mesh that belong to this chart. - std::vector<uint32_t> m_faceArray; + Array<uint32_t> m_faceArray; // Map vertices of the chart mesh to vertices of the original mesh. - std::vector<uint32_t> m_chartToOriginalMap; + Array<uint32_t> m_chartToOriginalMap; + + Array<uint32_t> m_chartToUnifiedMap; - std::vector<uint32_t> m_chartToUnifiedMap; + ParameterizationQuality m_paramQuality; +#if XA_DEBUG_EXPORT_OBJ_INVALID_PARAMETERIZATION + Array<uint32_t> m_paramFlippedFaces; +#endif }; -// Estimate quality of existing parameterization. -class ParameterizationQuality +struct CreateChartTaskArgs { -public: - ParameterizationQuality() - { - m_totalTriangleCount = 0; - m_flippedTriangleCount = 0; - m_zeroAreaTriangleCount = 0; - m_parametricArea = 0.0f; - m_geometricArea = 0.0f; - m_stretchMetric = 0.0f; - m_maxStretchMetric = 0.0f; - m_conformalMetric = 0.0f; - m_authalicMetric = 0.0f; - } - - ParameterizationQuality(const halfedge::Mesh *mesh) - { - xaDebugAssert(mesh != NULL); - m_totalTriangleCount = 0; - m_flippedTriangleCount = 0; - m_zeroAreaTriangleCount = 0; - m_parametricArea = 0.0f; - m_geometricArea = 0.0f; - m_stretchMetric = 0.0f; - m_maxStretchMetric = 0.0f; - m_conformalMetric = 0.0f; - m_authalicMetric = 0.0f; - const uint32_t faceCount = mesh->faceCount(); - for (uint32_t f = 0; f < faceCount; f++) { - const halfedge::Face *face = mesh->faceAt(f); - const halfedge::Vertex *vertex0 = NULL; - Vector3 p[3]; - Vector2 t[3]; - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - if (vertex0 == NULL) { - vertex0 = edge->vertex; - p[0] = vertex0->pos; - t[0] = vertex0->tex; - } else if (edge->to() != vertex0) { - p[1] = edge->from()->pos; - p[2] = edge->to()->pos; - t[1] = edge->from()->tex; - t[2] = edge->to()->tex; - processTriangle(p, t); - } - } - } - if (m_flippedTriangleCount + m_zeroAreaTriangleCount == faceCount) { - // If all triangles are flipped, then none is. - m_flippedTriangleCount = 0; - } - xaDebugAssert(std::isfinite(m_parametricArea) && m_parametricArea >= 0); - xaDebugAssert(std::isfinite(m_geometricArea) && m_geometricArea >= 0); - xaDebugAssert(std::isfinite(m_stretchMetric)); - xaDebugAssert(std::isfinite(m_maxStretchMetric)); - xaDebugAssert(std::isfinite(m_conformalMetric)); - xaDebugAssert(std::isfinite(m_authalicMetric)); - } - - bool isValid() const - { - return m_flippedTriangleCount == 0; // @@ Does not test for self-overlaps. - } - - float rmsStretchMetric() const - { - if (m_geometricArea == 0) return 0.0f; - float normFactor = sqrtf(m_parametricArea / m_geometricArea); - return sqrtf(m_stretchMetric / m_geometricArea) * normFactor; - } - - float maxStretchMetric() const - { - if (m_geometricArea == 0) return 0.0f; - float normFactor = sqrtf(m_parametricArea / m_geometricArea); - return m_maxStretchMetric * normFactor; - } - - float rmsConformalMetric() const - { - if (m_geometricArea == 0) return 0.0f; - return sqrtf(m_conformalMetric / m_geometricArea); - } + const Mesh *mesh; + const Array<uint32_t> *faceArray; + const Basis *basis; + uint32_t meshId; + uint32_t chartGroupId; + uint32_t chartId; + Chart **chart; +}; - float maxAuthalicMetric() const - { - if (m_geometricArea == 0) return 0.0f; - return sqrtf(m_authalicMetric / m_geometricArea); - } +static void runCreateChartTask(void *userData) +{ + XA_PROFILE_START(createChartMeshesThread) + auto args = (CreateChartTaskArgs *)userData; + *(args->chart) = XA_NEW(MemTag::Default, Chart, args->mesh, *(args->faceArray), *(args->basis), args->meshId, args->chartGroupId, args->chartId); + XA_PROFILE_END(createChartMeshesThread) +} - void operator+=(const ParameterizationQuality &pq) - { - m_totalTriangleCount += pq.m_totalTriangleCount; - m_flippedTriangleCount += pq.m_flippedTriangleCount; - m_zeroAreaTriangleCount += pq.m_zeroAreaTriangleCount; - m_parametricArea += pq.m_parametricArea; - m_geometricArea += pq.m_geometricArea; - m_stretchMetric += pq.m_stretchMetric; - m_maxStretchMetric = std::max(m_maxStretchMetric, pq.m_maxStretchMetric); - m_conformalMetric += pq.m_conformalMetric; - m_authalicMetric += pq.m_authalicMetric; - } +struct ParameterizeChartTaskArgs +{ + Chart *chart; + ParameterizeFunc func; +}; -private: - void processTriangle(Vector3 q[3], Vector2 p[3]) - { - m_totalTriangleCount++; - // Evaluate texture stretch metric. See: - // - "Texture Mapping Progressive Meshes", Sander, Snyder, Gortler & Hoppe - // - "Mesh Parameterization: Theory and Practice", Siggraph'07 Course Notes, Hormann, Levy & Sheffer. - float t1 = p[0].x; - float s1 = p[0].y; - float t2 = p[1].x; - float s2 = p[1].y; - float t3 = p[2].x; - float s3 = p[2].y; - float geometricArea = length(cross(q[1] - q[0], q[2] - q[0])) / 2; - float parametricArea = ((s2 - s1) * (t3 - t1) - (s3 - s1) * (t2 - t1)) / 2; - if (isZero(parametricArea)) { - m_zeroAreaTriangleCount++; - return; - } - Vector3 Ss = (q[0] * (t2 - t3) + q[1] * (t3 - t1) + q[2] * (t1 - t2)) / (2 * parametricArea); - Vector3 St = (q[0] * (s3 - s2) + q[1] * (s1 - s3) + q[2] * (s2 - s1)) / (2 * parametricArea); - float a = dot(Ss, Ss); // E - float b = dot(Ss, St); // F - float c = dot(St, St); // G - // Compute eigen-values of the first fundamental form: - float sigma1 = sqrtf(0.5f * std::max(0.0f, a + c - sqrtf(square(a - c) + 4 * square(b)))); // gamma uppercase, min eigenvalue. - float sigma2 = sqrtf(0.5f * std::max(0.0f, a + c + sqrtf(square(a - c) + 4 * square(b)))); // gamma lowercase, max eigenvalue. - xaAssert(sigma2 >= sigma1); - // isometric: sigma1 = sigma2 = 1 - // conformal: sigma1 / sigma2 = 1 - // authalic: sigma1 * sigma2 = 1 - float rmsStretch = sqrtf((a + c) * 0.5f); - float rmsStretch2 = sqrtf((square(sigma1) + square(sigma2)) * 0.5f); - xaDebugAssert(equal(rmsStretch, rmsStretch2, 0.01f)); -#ifdef NDEBUG - rmsStretch2 = 0; // silence unused parameter warning +static void runParameterizeChartTask(void *userData) +{ + auto args = (ParameterizeChartTaskArgs *)userData; + Mesh *mesh = args->chart->unifiedMesh(); + XA_PROFILE_START(parameterizeChartsOrthogonal) +#if 1 + computeOrthogonalProjectionMap(mesh); +#else + for (uint32_t i = 0; i < vertexCount; i++) + mesh->texcoord(i) = Vector2(dot(args->chart->basis().tangent, mesh->position(i)), dot(args->chart->basis().bitangent, mesh->position(i))); #endif - if (parametricArea < 0.0f) { - // Count flipped triangles. - m_flippedTriangleCount++; - parametricArea = fabsf(parametricArea); - } - m_stretchMetric += square(rmsStretch) * geometricArea; - m_maxStretchMetric = std::max(m_maxStretchMetric, sigma2); - if (!isZero(sigma1, 0.000001f)) { - // sigma1 is zero when geometricArea is zero. - m_conformalMetric += (sigma2 / sigma1) * geometricArea; - } - m_authalicMetric += (sigma1 * sigma2) * geometricArea; - // Accumulate total areas. - m_geometricArea += geometricArea; - m_parametricArea += parametricArea; - //triangleConformalEnergy(q, p); - } - - uint32_t m_totalTriangleCount; - uint32_t m_flippedTriangleCount; - uint32_t m_zeroAreaTriangleCount; - float m_parametricArea; - float m_geometricArea; - float m_stretchMetric; - float m_maxStretchMetric; - float m_conformalMetric; - float m_authalicMetric; -}; + XA_PROFILE_END(parameterizeChartsOrthogonal) + args->chart->evaluateOrthoParameterizationQuality(); + if (!args->chart->isOrtho() && !args->chart->isPlanar()) { + XA_PROFILE_START(parameterizeChartsLSCM) + if (args->func) + args->func(&mesh->position(0).x, &mesh->texcoord(0).x, mesh->vertexCount(), mesh->indices(), mesh->indexCount()); + else if (args->chart->isDisk()) + computeLeastSquaresConformalMap(mesh); + XA_PROFILE_END(parameterizeChartsLSCM) + args->chart->evaluateParameterizationQuality(); + } + // @@ Check that parameterization quality is above a certain threshold. + // Transfer parameterization from unified mesh to chart mesh. + args->chart->transferParameterization(); +} -// Set of charts corresponding to a single mesh. -class MeshCharts +// Set of charts corresponding to mesh faces in the same face group. +class ChartGroup { public: - MeshCharts(const halfedge::Mesh *mesh) : m_mesh(mesh) {} - - ~MeshCharts() - { - for (size_t i = 0; i < m_chartArray.size(); i++) - delete m_chartArray[i]; - } - - uint32_t chartCount() const - { - return m_chartArray.size(); - } - uint32_t vertexCount () const - { - return m_totalVertexCount; - } - - const Chart *chartAt(uint32_t i) const - { - return m_chartArray[i]; - } - Chart *chartAt(uint32_t i) - { - return m_chartArray[i]; - } - - // Extract the charts of the input mesh. - void extractCharts() - { - const uint32_t faceCount = m_mesh->faceCount(); - int first = 0; - std::vector<uint32_t> queue; - queue.reserve(faceCount); - BitArray bitFlags(faceCount); - bitFlags.clearAll(); + ChartGroup(uint32_t id, const Mesh *sourceMesh, uint32_t faceGroup) : m_sourceId(sourceMesh->id()), m_id(id), m_isVertexMap(faceGroup == UINT32_MAX), m_paramAddedChartsCount(0), m_paramDeletedChartsCount(0) + { + // Create new mesh from the source mesh, using faces that belong to this group. + const uint32_t sourceFaceCount = sourceMesh->faceCount(); + for (uint32_t f = 0; f < sourceFaceCount; f++) { + if (sourceMesh->faceGroupAt(f) == faceGroup) + m_faceToSourceFaceMap.push_back(f); + } + // Only initial meshes have face groups and ignored faces. The only flag we care about is HasNormals. + const uint32_t faceCount = m_faceToSourceFaceMap.size(); + m_mesh = XA_NEW(MemTag::Mesh, Mesh, sourceMesh->epsilon(), faceCount * 3, faceCount, sourceMesh->flags() & MeshFlags::HasNormals); + XA_DEBUG_ASSERT(faceCount > 0); + Array<uint32_t> meshIndices; + meshIndices.resize(sourceMesh->vertexCount(), (uint32_t)~0); for (uint32_t f = 0; f < faceCount; f++) { - if (bitFlags.bitAt(f) == false) { - // Start new patch. Reset queue. - first = 0; - queue.clear(); - queue.push_back(f); - bitFlags.setBitAt(f); - while (first != (int)queue.size()) { - const halfedge::Face *face = m_mesh->faceAt(queue[first]); - // Visit face neighbors of queue[first] - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - const halfedge::Edge *edge = it.current(); - xaDebugAssert(edge->pair != NULL); - if (!edge->isBoundary() && /*!edge->isSeam()*/ - //!(edge->from()->tex() != edge->pair()->to()->tex() || edge->to()->tex() != edge->pair()->from()->tex())) - !(edge->from() != edge->pair->to() || edge->to() != edge->pair->from())) { // Preserve existing seams (not just texture seams). - const halfedge::Face *neighborFace = edge->pair->face; - xaDebugAssert(neighborFace != NULL); - if (bitFlags.bitAt(neighborFace->id) == false) { - queue.push_back(neighborFace->id); - bitFlags.setBitAt(neighborFace->id); - } - } - } - first++; + const uint32_t face = m_faceToSourceFaceMap[f]; + for (uint32_t i = 0; i < 3; i++) { + const uint32_t vertex = sourceMesh->vertexAt(face * 3 + i); + if (meshIndices[vertex] == (uint32_t)~0) { + meshIndices[vertex] = m_mesh->vertexCount(); + m_vertexToSourceVertexMap.push_back(vertex); + Vector3 normal(0.0f); + if (sourceMesh->flags() & MeshFlags::HasNormals) + normal = sourceMesh->normal(vertex); + m_mesh->addVertex(sourceMesh->position(vertex), normal, sourceMesh->texcoord(vertex)); } - Chart *chart = new Chart(); - chart->build(m_mesh, queue); - m_chartArray.push_back(chart); } } + // Add faces. + for (uint32_t f = 0; f < faceCount; f++) { + const uint32_t face = m_faceToSourceFaceMap[f]; + uint32_t indices[3]; + for (uint32_t i = 0; i < 3; i++) { + const uint32_t vertex = sourceMesh->vertexAt(face * 3 + i); + XA_DEBUG_ASSERT(meshIndices[vertex] != (uint32_t)~0); + indices[i] = meshIndices[vertex]; + } + // Don't copy flags, it doesn't matter if a face is ignored after this point. All ignored faces get their own vertex map (m_isVertexMap) ChartGroup. + // Don't hash edges if m_isVertexMap, they may be degenerate. + Mesh::AddFaceResult::Enum result = m_mesh->addFace(indices, false, !m_isVertexMap); + XA_UNUSED(result); + XA_DEBUG_ASSERT(result == Mesh::AddFaceResult::OK); + } + if (!m_isVertexMap) { + m_mesh->createColocals(); + m_mesh->createBoundaries(); + m_mesh->linkBoundaries(); + } +#if XA_DEBUG_EXPORT_OBJ_CHART_GROUPS + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_mesh_%03u_chartgroup_%03u.obj", m_sourceId, m_id); + m_mesh->writeObjFile(filename); +#else + XA_UNUSED(m_id); +#endif + } + + ~ChartGroup() + { + m_mesh->~Mesh(); + XA_FREE(m_mesh); + for (uint32_t i = 0; i < m_chartArray.size(); i++) { + m_chartArray[i]->~Chart(); + XA_FREE(m_chartArray[i]); + } } + uint32_t chartCount() const { return m_chartArray.size(); } + Chart *chartAt(uint32_t i) const { return m_chartArray[i]; } + uint32_t paramAddedChartsCount() const { return m_paramAddedChartsCount; } + uint32_t paramDeletedChartsCount() const { return m_paramDeletedChartsCount; } + bool isVertexMap() const { return m_isVertexMap; } + uint32_t mapFaceToSourceFace(uint32_t face) const { return m_faceToSourceFaceMap[face]; } + uint32_t mapVertexToSourceVertex(uint32_t i) const { return m_vertexToSourceVertexMap[i]; } + const Mesh *mesh() const { return m_mesh; } + /* Compute charts using a simple segmentation algorithm. @@ -6481,867 +6169,1304 @@ public: - emphasize roundness metrics to prevent those cases. - If interior self-overlaps: preserve boundary parameterization and use mean-value map. */ - void computeCharts(const CharterOptions &options, const std::vector<uint32_t> &unchartedMaterialArray) - { - Chart *vertexMap = NULL; - if (unchartedMaterialArray.size() != 0) { - vertexMap = new Chart(); - vertexMap->buildVertexMap(m_mesh, unchartedMaterialArray); - if (vertexMap->faceCount() == 0) { - delete vertexMap; - vertexMap = NULL; - } - } - AtlasBuilder builder(m_mesh); - if (vertexMap != NULL) { - // Mark faces that do not need to be charted. - builder.markUnchartedFaces(vertexMap->faceArray()); - m_chartArray.push_back(vertexMap); - } - if (builder.facesLeft != 0) { - // Tweak these values: - const float maxThreshold = 2; - const uint32_t growFaceCount = 32; - const uint32_t maxIterations = 4; - builder.options = options; - //builder.options.proxyFitMetricWeight *= 0.75; // relax proxy fit weight during initial seed placement. - //builder.options.roundnessMetricWeight = 0; - //builder.options.straightnessMetricWeight = 0; - // This seems a reasonable estimate. - uint32_t maxSeedCount = std::max(6U, builder.facesLeft); - // Create initial charts greedely. - xaPrint("### Placing seeds\n"); - builder.placeSeeds(maxThreshold, maxSeedCount); - xaPrint("### Placed %d seeds (max = %d)\n", builder.chartCount(), maxSeedCount); - builder.updateProxies(); - builder.mergeCharts(); - #if 1 - xaPrint("### Relocating seeds\n"); - builder.relocateSeeds(); - xaPrint("### Reset charts\n"); - builder.resetCharts(); - if (vertexMap != NULL) { - builder.markUnchartedFaces(vertexMap->faceArray()); - } - builder.options = options; - xaPrint("### Growing charts\n"); - // Restart process growing charts in parallel. - uint32_t iteration = 0; - while (true) { - if (!builder.growCharts(maxThreshold, growFaceCount)) { - xaPrint("### Can't grow anymore\n"); - // If charts cannot grow more: fill holes, merge charts, relocate seeds and start new iteration. - xaPrint("### Filling holes\n"); - builder.fillHoles(maxThreshold); - xaPrint("### Using %d charts now\n", builder.chartCount()); - builder.updateProxies(); - xaPrint("### Merging charts\n"); - builder.mergeCharts(); - xaPrint("### Using %d charts now\n", builder.chartCount()); - xaPrint("### Reseeding\n"); - if (!builder.relocateSeeds()) { - xaPrint("### Cannot relocate seeds anymore\n"); - // Done! - break; - } - if (iteration == maxIterations) { - xaPrint("### Reached iteration limit\n"); - break; - } - iteration++; - xaPrint("### Reset charts\n"); - builder.resetCharts(); - if (vertexMap != NULL) { - builder.markUnchartedFaces(vertexMap->faceArray()); - } - xaPrint("### Growing charts\n"); - } - }; - #endif - // Make sure no holes are left! - xaDebugAssert(builder.facesLeft == 0); - const uint32_t chartCount = builder.chartArray.size(); - for (uint32_t i = 0; i < chartCount; i++) { - Chart *chart = new Chart(); - m_chartArray.push_back(chart); - chart->build(m_mesh, builder.chartFaces(i)); - } - } - const uint32_t chartCount = m_chartArray.size(); - // Build face indices. - m_faceChart.resize(m_mesh->faceCount()); - m_faceIndex.resize(m_mesh->faceCount()); + void computeCharts(TaskScheduler *taskScheduler, const ChartOptions &options) + { + m_chartOptions = options; + // This function may be called multiple times, so destroy existing charts. + for (uint32_t i = 0; i < m_chartArray.size(); i++) { + m_chartArray[i]->~Chart(); + XA_FREE(m_chartArray[i]); + } + m_chartArray.clear(); +#if XA_DEBUG_SINGLE_CHART + Array<uint32_t> chartFaces; + chartFaces.resize(m_mesh->faceCount()); + for (uint32_t i = 0; i < chartFaces.size(); i++) + chartFaces[i] = i; + Chart *chart = XA_NEW(MemTag::Default, Chart, m_mesh, chartFaces, m_sourceId, m_id, 0); + m_chartArray.push_back(chart); +#else + XA_PROFILE_START(atlasBuilder) + AtlasBuilder builder(m_mesh, nullptr, options); + runAtlasBuilder(builder, options); + XA_PROFILE_END(atlasBuilder) + const uint32_t chartCount = builder.chartCount(); + m_chartArray.resize(chartCount); + Array<CreateChartTaskArgs> taskArgs; + taskArgs.resize(chartCount); for (uint32_t i = 0; i < chartCount; i++) { - const Chart *chart = m_chartArray[i]; - const uint32_t faceCount = chart->faceCount(); - for (uint32_t f = 0; f < faceCount; f++) { - uint32_t idx = chart->faceAt(f); - m_faceChart[idx] = i; - m_faceIndex[idx] = f; - } + CreateChartTaskArgs &args = taskArgs[i]; + args.mesh = m_mesh; + args.faceArray = &builder.chartFaces(i); + args.basis = &builder.chartBasis(i); + args.meshId = m_sourceId; + args.chartGroupId = m_id; + args.chartId = i; + args.chart = &m_chartArray[i]; + } + XA_PROFILE_START(createChartMeshesReal) + TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(chartCount); + for (uint32_t i = 0; i < chartCount; i++) { + Task task; + task.userData = &taskArgs[i]; + task.func = runCreateChartTask; + taskScheduler->run(taskGroup, task); } - // Build an exclusive prefix sum of the chart vertex counts. - m_chartVertexCountPrefixSum.resize(chartCount); - if (chartCount > 0) { - m_chartVertexCountPrefixSum[0] = 0; - for (uint32_t i = 1; i < chartCount; i++) { - const Chart *chart = m_chartArray[i - 1]; - m_chartVertexCountPrefixSum[i] = m_chartVertexCountPrefixSum[i - 1] + chart->vertexCount(); + taskScheduler->wait(&taskGroup); + XA_PROFILE_END(createChartMeshesReal) +#endif +#if XA_DEBUG_EXPORT_OBJ_CHARTS + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_mesh_%03u_chartgroup_%03u_charts.obj", m_sourceId, m_id); + FILE *file; + XA_FOPEN(file, filename, "w"); + if (file) { + m_mesh->writeObjVertices(file); + for (uint32_t i = 0; i < chartCount; i++) { + fprintf(file, "o chart_%04d\n", i); + fprintf(file, "s off\n"); + const Array<uint32_t> &faces = builder.chartFaces(i); + for (uint32_t f = 0; f < faces.size(); f++) + m_mesh->writeObjFace(file, faces[f]); } - m_totalVertexCount = m_chartVertexCountPrefixSum[chartCount - 1] + m_chartArray[chartCount - 1]->vertexCount(); - } else { - m_totalVertexCount = 0; + m_mesh->writeObjBoundaryEges(file); + m_mesh->writeObjLinkedBoundaries(file); + fclose(file); } +#endif } - void parameterizeCharts() + void parameterizeCharts(TaskScheduler *taskScheduler, ParameterizeFunc func) { - ParameterizationQuality globalParameterizationQuality; - // Parameterize the charts. - uint32_t diskCount = 0; const uint32_t chartCount = m_chartArray.size(); - for (uint32_t i = 0; i < chartCount; i++) - { + Array<ParameterizeChartTaskArgs> taskArgs; + taskArgs.resize(chartCount); + TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(chartCount); + for (uint32_t i = 0; i < chartCount; i++) { + ParameterizeChartTaskArgs &args = taskArgs[i]; + args.chart = m_chartArray[i]; + args.func = func; + Task task; + task.userData = &args; + task.func = runParameterizeChartTask; + taskScheduler->run(taskGroup, task); + } + taskScheduler->wait(&taskGroup); +#if XA_RECOMPUTE_CHARTS + // Find charts with invalid parameterizations. + Array<Chart *> invalidCharts; + for (uint32_t i = 0; i < chartCount; i++) { Chart *chart = m_chartArray[i]; - - bool isValid = false; - - if (chart->isVertexMapped()) - { - continue; - } - - if (chart->isDisk()) - { - diskCount++; - ParameterizationQuality chartParameterizationQuality; - if (chart->faceCount() == 1) { - computeSingleFaceMap(chart->unifiedMesh()); - chartParameterizationQuality = ParameterizationQuality(chart->unifiedMesh()); - } else { - computeOrthogonalProjectionMap(chart->unifiedMesh()); - ParameterizationQuality orthogonalQuality(chart->unifiedMesh()); - computeLeastSquaresConformalMap(chart->unifiedMesh()); - ParameterizationQuality lscmQuality(chart->unifiedMesh()); - chartParameterizationQuality = lscmQuality; - } - isValid = chartParameterizationQuality.isValid(); - if (!isValid) { - xaPrint("*** Invalid parameterization.\n"); + const ParameterizationQuality &quality = chart->paramQuality(); + if (quality.boundaryIntersection || quality.flippedTriangleCount > 0) + invalidCharts.push_back(chart); + } + if (invalidCharts.isEmpty()) + return; + // Recompute charts with invalid parameterizations. + Array<uint32_t> meshFaces; + for (uint32_t i = 0; i < invalidCharts.size(); i++) { + Chart *invalidChart = invalidCharts[i]; + const Mesh *invalidMesh = invalidChart->mesh(); + const uint32_t faceCount = invalidMesh->faceCount(); + meshFaces.resize(faceCount); + float invalidChartArea = 0.0f; + for (uint32_t j = 0; j < faceCount; j++) { + meshFaces[j] = invalidChart->mapFaceToSourceFace(j); + invalidChartArea += invalidMesh->faceArea(j); + } + ChartOptions options = m_chartOptions; + options.maxChartArea = invalidChartArea * 0.2f; + options.maxThreshold = 0.25f; + options.maxIterations = 3; + AtlasBuilder builder(m_mesh, &meshFaces, options); + runAtlasBuilder(builder, options); + for (uint32_t j = 0; j < builder.chartCount(); j++) { + Chart *chart = XA_NEW(MemTag::Default, Chart, m_mesh, builder.chartFaces(j), builder.chartBasis(j), m_sourceId, m_id, m_chartArray.size()); + m_chartArray.push_back(chart); + m_paramAddedChartsCount++; + } +#if XA_DEBUG_EXPORT_OBJ_RECOMPUTED_CHARTS + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_mesh_%03u_chartgroup_%03u_recomputed_chart_%u.obj", m_sourceId, m_id, i); + FILE *file; + XA_FOPEN(file, filename, "w"); + if (file) { + m_mesh->writeObjVertices(file); + for (uint32_t j = 0; j < builder.chartCount(); j++) { + fprintf(file, "o chart_%04d\n", j); + fprintf(file, "s off\n"); + const Array<uint32_t> &faces = builder.chartFaces(j); + for (uint32_t f = 0; f < faces.size(); f++) + m_mesh->writeObjFace(file, faces[f]); } - // @@ Check that parameterization quality is above a certain threshold. - // @@ Detect boundary self-intersections. - globalParameterizationQuality += chartParameterizationQuality; + fclose(file); } - - // Transfer parameterization from unified mesh to chart mesh. - chart->transferParameterization(); - +#endif + } + // Parameterize the new charts. + taskGroup = taskScheduler->createTaskGroup(m_chartArray.size() - chartCount); + taskArgs.resize(m_chartArray.size() - chartCount); + for (uint32_t i = chartCount; i < m_chartArray.size(); i++) { + ParameterizeChartTaskArgs &args = taskArgs[i - chartCount]; + args.chart = m_chartArray[i]; + args.func = func; + Task task; + task.userData = &args; + task.func = runParameterizeChartTask; + taskScheduler->run(taskGroup, task); + } + taskScheduler->wait(&taskGroup); + // Remove and delete the invalid charts. + for (uint32_t i = 0; i < invalidCharts.size(); i++) { + Chart *chart = invalidCharts[i]; + removeChart(chart); + chart->~Chart(); + XA_FREE(chart); + m_paramDeletedChartsCount++; } - xaPrint(" Parameterized %d/%d charts.\n", diskCount, chartCount); - xaPrint(" RMS stretch metric: %f\n", globalParameterizationQuality.rmsStretchMetric()); - xaPrint(" MAX stretch metric: %f\n", globalParameterizationQuality.maxStretchMetric()); - xaPrint(" RMS conformal metric: %f\n", globalParameterizationQuality.rmsConformalMetric()); - xaPrint(" RMS authalic metric: %f\n", globalParameterizationQuality.maxAuthalicMetric()); +#endif } - uint32_t faceChartAt(uint32_t i) const - { - return m_faceChart[i]; - } - uint32_t faceIndexWithinChartAt(uint32_t i) const +private: + void runAtlasBuilder(AtlasBuilder &builder, const ChartOptions &options) { - return m_faceIndex[i]; + if (builder.facesLeft() == 0) + return; + // This seems a reasonable estimate. + XA_PROFILE_START(atlasBuilderCreateInitialCharts) + // Create initial charts greedely. + builder.placeSeeds(options.maxThreshold * 0.5f); + if (options.maxIterations == 0) { + XA_DEBUG_ASSERT(builder.facesLeft() == 0); + XA_PROFILE_END(atlasBuilderCreateInitialCharts) + return; + } + builder.updateProxies(); + builder.relocateSeeds(); + builder.resetCharts(); + XA_PROFILE_END(atlasBuilderCreateInitialCharts) + // Restart process growing charts in parallel. + uint32_t iteration = 0; + while (true) { + if (!builder.growCharts(options.maxThreshold, options.growFaceCount)) { + // If charts cannot grow more: fill holes, merge charts, relocate seeds and start new iteration. + builder.fillHoles(options.maxThreshold * 0.5f); + builder.updateProxies(); +#if XA_MERGE_CHARTS + builder.mergeCharts(); +#endif + if (++iteration == options.maxIterations) + break; + if (!builder.relocateSeeds()) + break; + builder.resetCharts(); + } + } + // Make sure no holes are left! + XA_DEBUG_ASSERT(builder.facesLeft() == 0); } - uint32_t vertexCountBeforeChartAt(uint32_t i) const + void removeChart(const Chart *chart) { - return m_chartVertexCountPrefixSum[i]; + for (uint32_t i = 0; i < m_chartArray.size(); i++) { + if (m_chartArray[i] == chart) { + m_chartArray.removeAt(i); + return; + } + } } -private: + uint32_t m_sourceId, m_id; + bool m_isVertexMap; + Mesh *m_mesh; + Array<uint32_t> m_faceToSourceFaceMap; // List of faces of the source mesh that belong to this chart group. + Array<uint32_t> m_vertexToSourceVertexMap; // Map vertices of the mesh to vertices of the source mesh. + Array<Chart *> m_chartArray; + ChartOptions m_chartOptions; + uint32_t m_paramAddedChartsCount; // Number of new charts added by recomputing charts with invalid parameterizations. + uint32_t m_paramDeletedChartsCount; // Number of charts with invalid parameterizations that were deleted, after charts were recomputed. +}; - const halfedge::Mesh *m_mesh; +struct CreateChartGroupTaskArgs +{ + uint32_t faceGroup; + uint32_t groupId; + const Mesh *mesh; + ChartGroup **chartGroup; +}; - std::vector<Chart *> m_chartArray; +static void runCreateChartGroupTask(void *userData) +{ + XA_PROFILE_START(addMeshCreateChartGroupsThread) + auto args = (CreateChartGroupTaskArgs *)userData; + *(args->chartGroup) = XA_NEW(MemTag::Default, ChartGroup, args->groupId, args->mesh, args->faceGroup); + XA_PROFILE_END(addMeshCreateChartGroupsThread) +} - std::vector<uint32_t> m_chartVertexCountPrefixSum; - uint32_t m_totalVertexCount; +struct ComputeChartsTaskArgs +{ + TaskScheduler *taskScheduler; + ChartGroup *chartGroup; + const ChartOptions *options; + Progress *progress; +}; - std::vector<uint32_t> m_faceChart; // the chart of every face of the input mesh. - std::vector<uint32_t> m_faceIndex; // the index within the chart for every face of the input mesh. +static void runComputeChartsJob(void *userData) +{ + auto args = (ComputeChartsTaskArgs *)userData; + if (args->progress->cancel) + return; + XA_PROFILE_START(computeChartsThread) + args->chartGroup->computeCharts(args->taskScheduler, *args->options); + XA_PROFILE_END(computeChartsThread) + args->progress->value++; + args->progress->update(); +} + +struct ParameterizeChartsTaskArgs +{ + TaskScheduler *taskScheduler; + ChartGroup *chartGroup; + ParameterizeFunc func; + Progress *progress; }; -/// An atlas is a set of charts. +static void runParameterizeChartsJob(void *userData) +{ + auto args = (ParameterizeChartsTaskArgs *)userData; + if (args->progress->cancel) + return; + XA_PROFILE_START(parameterizeChartsThread) + args->chartGroup->parameterizeCharts(args->taskScheduler, args->func); + XA_PROFILE_END(parameterizeChartsThread) + args->progress->value++; + args->progress->update(); +} + +/// An atlas is a set of chart groups. class Atlas { public: + Atlas() : m_chartsComputed(false), m_chartsParameterized(false) {} + ~Atlas() { - for (size_t i = 0; i < m_meshChartsArray.size(); i++) - delete m_meshChartsArray[i]; + for (uint32_t i = 0; i < m_chartGroups.size(); i++) { + m_chartGroups[i]->~ChartGroup(); + XA_FREE(m_chartGroups[i]); + } } - uint32_t meshCount() const - { - return m_meshChartsArray.size(); - } + bool chartsComputed() const { return m_chartsComputed; } + bool chartsParameterized() const { return m_chartsParameterized; } - const MeshCharts *meshAt(uint32_t i) const + uint32_t chartGroupCount(uint32_t mesh) const { - return m_meshChartsArray[i]; + uint32_t count = 0; + for (uint32_t i = 0; i < m_chartGroups.size(); i++) { + if (m_chartGroupSourceMeshes[i] == mesh) + count++; + } + return count; } - MeshCharts *meshAt(uint32_t i) + const ChartGroup *chartGroupAt(uint32_t mesh, uint32_t group) const { - return m_meshChartsArray[i]; + for (uint32_t c = 0; c < m_chartGroups.size(); c++) { + if (m_chartGroupSourceMeshes[c] != mesh) + continue; + if (group == 0) + return m_chartGroups[c]; + group--; + } + return nullptr; } uint32_t chartCount() const { uint32_t count = 0; - for (uint32_t c = 0; c < m_meshChartsArray.size(); c++) { - count += m_meshChartsArray[c]->chartCount(); - } + for (uint32_t i = 0; i < m_chartGroups.size(); i++) + count += m_chartGroups[i]->chartCount(); return count; } - const Chart *chartAt(uint32_t i) const + Chart *chartAt(uint32_t i) { - for (uint32_t c = 0; c < m_meshChartsArray.size(); c++) { - uint32_t count = m_meshChartsArray[c]->chartCount(); + for (uint32_t c = 0; c < m_chartGroups.size(); c++) { + uint32_t count = m_chartGroups[c]->chartCount(); if (i < count) { - return m_meshChartsArray[c]->chartAt(i); + return m_chartGroups[c]->chartAt(i); } i -= count; } - return NULL; + return nullptr; } - Chart *chartAt(uint32_t i) + // This function is thread safe. + void addMesh(TaskScheduler *taskScheduler, const Mesh *mesh) { - for (uint32_t c = 0; c < m_meshChartsArray.size(); c++) { - uint32_t count = m_meshChartsArray[c]->chartCount(); - if (i < count) { - return m_meshChartsArray[c]->chartAt(i); + // Get list of face groups. + const uint32_t faceCount = mesh->faceCount(); + Array<uint32_t> faceGroups; + for (uint32_t f = 0; f < faceCount; f++) { + const uint32_t group = mesh->faceGroupAt(f); + bool exists = false; + for (uint32_t g = 0; g < faceGroups.size(); g++) { + if (faceGroups[g] == group) { + exists = true; + break; + } } - i -= count; + if (!exists) + faceGroups.push_back(group); + } + // Create one chart group per face group. + // Chart group creation is slow since it copies a chunk of the source mesh, so use tasks. + Array<ChartGroup *> chartGroups; + chartGroups.resize(faceGroups.size()); + Array<CreateChartGroupTaskArgs> taskArgs; + taskArgs.resize(chartGroups.size()); + for (uint32_t g = 0; g < chartGroups.size(); g++) { + CreateChartGroupTaskArgs &args = taskArgs[g]; + args.chartGroup = &chartGroups[g]; + args.faceGroup = faceGroups[g]; + args.groupId = g; + args.mesh = mesh; + } + TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(chartGroups.size()); + for (uint32_t g = 0; g < chartGroups.size(); g++) { + Task task; + task.userData = &taskArgs[g]; + task.func = runCreateChartGroupTask; + taskScheduler->run(taskGroup, task); + } + taskScheduler->wait(&taskGroup); + // Thread-safe append. + m_addMeshMutex.lock(); + for (uint32_t g = 0; g < chartGroups.size(); g++) { + m_chartGroups.push_back(chartGroups[g]); + m_chartGroupSourceMeshes.push_back(mesh->id()); + } + m_addMeshMutex.unlock(); + } + + bool computeCharts(TaskScheduler *taskScheduler, const ChartOptions &options, ProgressFunc progressFunc, void *progressUserData) + { + m_chartsComputed = false; + m_chartsParameterized = false; + // Ignore vertex maps. + uint32_t chartGroupCount = 0; + for (uint32_t i = 0; i < m_chartGroups.size(); i++) { + if (!m_chartGroups[i]->isVertexMap()) + chartGroupCount++; + } + Progress progress(ProgressCategory::ComputeCharts, progressFunc, progressUserData, chartGroupCount); + Array<ComputeChartsTaskArgs> taskArgs; + taskArgs.reserve(chartGroupCount); + for (uint32_t i = 0; i < m_chartGroups.size(); i++) { + if (!m_chartGroups[i]->isVertexMap()) { + ComputeChartsTaskArgs args; + args.taskScheduler = taskScheduler; + args.chartGroup = m_chartGroups[i]; + args.options = &options; + args.progress = &progress; + taskArgs.push_back(args); + } + } + // Sort chart groups by mesh indexCount. + m_chartGroupsRadix = RadixSort(); + Array<float> chartGroupSortData; + chartGroupSortData.resize(chartGroupCount); + for (uint32_t i = 0; i < chartGroupCount; i++) + chartGroupSortData[i] = (float)taskArgs[i].chartGroup->mesh()->indexCount(); + m_chartGroupsRadix.sort(chartGroupSortData); + // Larger chart group meshes are added first to reduce the chance of thread starvation. + TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(chartGroupCount); + for (uint32_t i = 0; i < chartGroupCount; i++) { + Task task; + task.userData = &taskArgs[m_chartGroupsRadix.ranks()[chartGroupCount - i - 1]]; + task.func = runComputeChartsJob; + taskScheduler->run(taskGroup, task); + } + taskScheduler->wait(&taskGroup); + if (progress.cancel) + return false; + m_chartsComputed = true; + return true; + } + + bool parameterizeCharts(TaskScheduler *taskScheduler, ParameterizeFunc func, ProgressFunc progressFunc, void *progressUserData) + { + m_chartsParameterized = false; + // Ignore vertex maps. + uint32_t chartGroupCount = 0; + for (uint32_t i = 0; i < m_chartGroups.size(); i++) { + if (!m_chartGroups[i]->isVertexMap()) + chartGroupCount++; + } + Progress progress(ProgressCategory::ParameterizeCharts, progressFunc, progressUserData, chartGroupCount); + Array<ParameterizeChartsTaskArgs> taskArgs; + taskArgs.reserve(chartGroupCount); + for (uint32_t i = 0; i < m_chartGroups.size(); i++) { + if (!m_chartGroups[i]->isVertexMap()) { + ParameterizeChartsTaskArgs args; + args.taskScheduler = taskScheduler; + args.chartGroup = m_chartGroups[i]; + args.func = func; + args.progress = &progress; + taskArgs.push_back(args); + } + } + // Larger chart group meshes are added first to reduce the chance of thread starvation. + TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(chartGroupCount); + for (uint32_t i = 0; i < chartGroupCount; i++) { + Task task; + task.userData = &taskArgs[m_chartGroupsRadix.ranks()[chartGroupCount - i - 1]]; + task.func = runParameterizeChartsJob; + taskScheduler->run(taskGroup, task); + } + taskScheduler->wait(&taskGroup); + if (progress.cancel) + return false; + // Save original texcoords so PackCharts can be called multiple times (packing overwrites the texcoords). + const uint32_t nCharts = chartCount(); + m_originalChartTexcoords.resize(nCharts); + for (uint32_t i = 0; i < nCharts; i++) { + const Mesh *mesh = chartAt(i)->mesh(); + m_originalChartTexcoords[i].resize(mesh->vertexCount()); + for (uint32_t j = 0; j < mesh->vertexCount(); j++) + m_originalChartTexcoords[i][j] = mesh->texcoord(j); } - return NULL; + m_chartsParameterized = true; + return true; } - // Add mesh charts and takes ownership. - // Extract the charts and add to this atlas. - void addMeshCharts(MeshCharts *meshCharts) + void restoreOriginalChartTexcoords() { - m_meshChartsArray.push_back(meshCharts); + const uint32_t nCharts = chartCount(); + for (uint32_t i = 0; i < nCharts; i++) { + Mesh *mesh = chartAt(i)->mesh(); + for (uint32_t j = 0; j < mesh->vertexCount(); j++) + mesh->texcoord(j) = m_originalChartTexcoords[i][j]; + } } - void extractCharts(const halfedge::Mesh *mesh) +private: + std::mutex m_addMeshMutex; + bool m_chartsComputed; + bool m_chartsParameterized; + Array<ChartGroup *> m_chartGroups; + RadixSort m_chartGroupsRadix; // By mesh indexCount. + Array<uint32_t> m_chartGroupSourceMeshes; + Array<Array<Vector2> > m_originalChartTexcoords; +}; + +} // namespace param + +namespace pack { + +#if XA_DEBUG_EXPORT_ATLAS_IMAGES +const uint8_t TGA_TYPE_RGB = 2; +const uint8_t TGA_ORIGIN_UPPER = 0x20; + +#pragma pack(push, 1) +struct TgaHeader +{ + uint8_t id_length; + uint8_t colormap_type; + uint8_t image_type; + uint16_t colormap_index; + uint16_t colormap_length; + uint8_t colormap_size; + uint16_t x_origin; + uint16_t y_origin; + uint16_t width; + uint16_t height; + uint8_t pixel_size; + uint8_t flags; + enum { Size = 18 }; +}; +#pragma pack(pop) + +static void WriteTga(const char *filename, const uint8_t *data, uint32_t width, uint32_t height) +{ + XA_DEBUG_ASSERT(sizeof(TgaHeader) == TgaHeader::Size); + FILE *f; + XA_FOPEN(f, filename, "wb"); + if (!f) + return; + TgaHeader tga; + tga.id_length = 0; + tga.colormap_type = 0; + tga.image_type = TGA_TYPE_RGB; + tga.colormap_index = 0; + tga.colormap_length = 0; + tga.colormap_size = 0; + tga.x_origin = 0; + tga.y_origin = 0; + tga.width = (uint16_t)width; + tga.height = (uint16_t)height; + tga.pixel_size = 24; + tga.flags = TGA_ORIGIN_UPPER; + fwrite(&tga, sizeof(TgaHeader), 1, f); + fwrite(data, sizeof(uint8_t), width * height * 3, f); + fclose(f); +} +#endif + +class AtlasImage +{ +public: + AtlasImage(uint32_t width, uint32_t height) : m_width(width), m_height(height) { - MeshCharts *meshCharts = new MeshCharts(mesh); - meshCharts->extractCharts(); - addMeshCharts(meshCharts); + m_data.resize(m_width * m_height); + memset(m_data.data(), 0, sizeof(uint32_t) * m_data.size()); } - void computeCharts(const halfedge::Mesh *mesh, const CharterOptions &options, const std::vector<uint32_t> &unchartedMaterialArray) + void resize(uint32_t width, uint32_t height) { - MeshCharts *meshCharts = new MeshCharts(mesh); - meshCharts->computeCharts(options, unchartedMaterialArray); - addMeshCharts(meshCharts); + Array<uint32_t> data; + data.resize(width * height); + memset(data.data(), 0, sizeof(uint32_t) * data.size()); + for (uint32_t y = 0; y < min(m_height, height); y++) + memcpy(&data[y * width], &m_data[y * m_width], min(m_width, width) * sizeof(uint32_t)); + m_width = width; + m_height = height; + swap(m_data, data); } - void parameterizeCharts() + void addChart(uint32_t chartIndex, const BitImage *image, bool imageHasPadding, int atlas_w, int atlas_h, int offset_x, int offset_y) { - for (uint32_t i = 0; i < m_meshChartsArray.size(); i++) { - m_meshChartsArray[i]->parameterizeCharts(); + const int w = image->width(); + const int h = image->height(); + for (int y = 0; y < h; y++) { + const int yy = y + offset_y; + if (yy < 0) + continue; + for (int x = 0; x < w; x++) { + const int xx = x + offset_x; + if (xx >= 0 && xx < atlas_w && yy < atlas_h && image->bitAt(x, y)) { + const uint32_t dataOffset = xx + yy * m_width; + if (m_data[dataOffset] != 0) + continue; + uint32_t value = chartIndex | kImageHasChartIndexBit; + if (imageHasPadding) + value |= kImageIsPaddingBit; + m_data[dataOffset] = value; + } + } } } + void copyTo(uint32_t *dest, uint32_t destWidth, uint32_t destHeight) const + { + for (uint32_t y = 0; y < destHeight; y++) + memcpy(&dest[y * destWidth], &m_data[y * m_width], destWidth * sizeof(uint32_t)); + } + +#if XA_DEBUG_EXPORT_ATLAS_IMAGES + void writeTga(const char *filename, uint32_t width, uint32_t height) const + { + Array<uint8_t> image; + image.resize(width * height * 3); + for (uint32_t y = 0; y < height; y++) { + if (y >= m_height) + continue; + for (uint32_t x = 0; x < width; x++) { + if (x >= m_width) + continue; + const uint32_t data = m_data[x + y * m_width]; + if (!(data & kImageHasChartIndexBit)) + continue; + const uint32_t chartIndex = data & kImageChartIndexMask; + uint8_t *color = &image[(x + y * width) * 3]; + if (data & kImageIsPaddingBit) { + color[0] = 255; + color[1] = 0; + color[2] = 255; + } else { + const int mix = 192; + srand((unsigned int)chartIndex); + color[0] = uint8_t((rand() % 255 + mix) * 0.5f); + color[1] = uint8_t((rand() % 255 + mix) * 0.5f); + color[2] = uint8_t((rand() % 255 + mix) * 0.5f); + } + } + } + WriteTga(filename, image.data(), width, height); + } +#endif + private: - std::vector<MeshCharts *> m_meshChartsArray; + uint32_t m_width, m_height; + Array<uint32_t> m_data; +}; + +struct Chart +{ + int32_t atlasIndex; + uint32_t material; + uint32_t indexCount; + const uint32_t *indices; + float parametricArea; + float surfaceArea; + Vector2 *vertices; + uint32_t vertexCount; + Array<uint32_t> uniqueVertices; + bool allowRotate; + // bounding box + Vector2 majorAxis, minorAxis, minCorner, maxCorner; + + Vector2 &uniqueVertexAt(uint32_t v) { return uniqueVertices.isEmpty() ? vertices[v] : vertices[uniqueVertices[v]]; } + uint32_t uniqueVertexCount() const { return uniqueVertices.isEmpty() ? vertexCount : uniqueVertices.size(); } +}; + +struct FindChartLocationBruteForceTaskArgs +{ + std::atomic<bool> *finished; // One of the tasks found a location that doesn't expand the atlas. + Vector2i startPosition; + const BitImage *atlasBitImage; + const BitImage *chartBitImage; + const BitImage *chartBitImageRotated; + int w, h; + bool blockAligned, resizableAtlas, allowRotate; + // out + bool best_insideAtlas; + int best_metric, best_x, best_y, best_w, best_h, best_r; }; -struct AtlasPacker +static void runFindChartLocationBruteForceTask(void *userData) +{ + XA_PROFILE_START(packChartsFindLocationThread) + auto args = (FindChartLocationBruteForceTaskArgs *)userData; + args->best_metric = INT_MAX; + if (args->finished->load()) + return; + // Try two different orientations. + for (int r = 0; r < 2; r++) { + int cw = args->chartBitImage->width(); + int ch = args->chartBitImage->height(); + if (r == 1) { + if (args->allowRotate) + swap(cw, ch); + else + break; + } + const int y = args->startPosition.y; + const int stepSize = args->blockAligned ? 4 : 1; + for (int x = args->startPosition.x; x <= args->w + stepSize; x += stepSize) { // + 1 not really necessary here. + if (!args->resizableAtlas && (x > (int)args->atlasBitImage->width() - cw || y > (int)args->atlasBitImage->height() - ch)) + continue; + if (args->finished->load()) + break; + // Early out if metric not better. + const int area = max(args->w, x + cw) * max(args->h, y + ch); + const int extents = max(max(args->w, x + cw), max(args->h, y + ch)); + const int metric = extents * extents + area; + if (metric > args->best_metric) + continue; + // If metric is the same, pick the one closest to the origin. + if (metric == args->best_metric && max(x, y) >= max(args->best_x, args->best_y)) + continue; + if (!args->atlasBitImage->canBlit(r == 1 ? *(args->chartBitImageRotated) : *(args->chartBitImage), x, y)) + continue; + args->best_metric = metric; + args->best_insideAtlas = area == args->w * args->h; + args->best_x = x; + args->best_y = y; + args->best_w = cw; + args->best_h = ch; + args->best_r = r; + if (args->best_insideAtlas) { + args->finished->store(true); + break; + } + } + } + XA_PROFILE_END(packChartsFindLocationThread) +} + +struct Atlas { - AtlasPacker(Atlas *atlas) : m_atlas(atlas), m_width(0), m_height(0) + ~Atlas() { - // Save the original uvs. - m_originalChartUvs.resize(m_atlas->chartCount()); - for (uint32_t i = 0; i < m_atlas->chartCount(); i++) { - const halfedge::Mesh *mesh = atlas->chartAt(i)->chartMesh(); - m_originalChartUvs[i].resize(mesh->vertexCount()); - for (uint32_t j = 0; j < mesh->vertexCount(); j++) - m_originalChartUvs[i][j] = mesh->vertexAt(j)->tex; + for (uint32_t i = 0; i < m_bitImages.size(); i++) { + m_bitImages[i]->~BitImage(); + XA_FREE(m_bitImages[i]); + } + for (uint32_t i = 0; i < m_charts.size(); i++) { + m_charts[i]->~Chart(); + XA_FREE(m_charts[i]); } } uint32_t getWidth() const { return m_width; } uint32_t getHeight() const { return m_height; } + uint32_t getNumAtlases() const { return m_bitImages.size(); } + float getTexelsPerUnit() const { return m_texelsPerUnit; } + const Chart *getChart(uint32_t index) const { return m_charts[index]; } + uint32_t getChartCount() const { return m_charts.size(); } + const Array<AtlasImage *> &getImages() const { return m_atlasImages; } + float getUtilization(uint32_t atlas) const { return m_utilization[atlas]; } + + void addChart(param::Chart *paramChart) + { + Mesh *mesh = paramChart->mesh(); + Chart *chart = XA_NEW(MemTag::Default, Chart); + chart->atlasIndex = -1; + chart->material = 0; + chart->indexCount = mesh->indexCount(); + chart->indices = mesh->indices(); + chart->parametricArea = paramChart->computeParametricArea(); + if (chart->parametricArea < kAreaEpsilon) { + // When the parametric area is too small we use a rough approximation to prevent divisions by very small numbers. + const Vector2 bounds = paramChart->computeParametricBounds(); + chart->parametricArea = bounds.x * bounds.y; + } + chart->surfaceArea = paramChart->computeSurfaceArea(); + chart->vertices = mesh->texcoords(); + chart->vertexCount = mesh->vertexCount(); + chart->allowRotate = true; + // Compute list of boundary vertices. + Array<Vector2> boundary; + boundary.reserve(16); + for (uint32_t v = 0; v < chart->vertexCount; v++) { + if (mesh->isBoundaryVertex(v)) + boundary.push_back(mesh->texcoord(v)); + } + XA_DEBUG_ASSERT(boundary.size() > 0); + // Compute bounding box of chart. + m_boundingBox.compute(boundary.data(), boundary.size(), mesh->texcoords(), mesh->vertexCount()); + chart->majorAxis = m_boundingBox.majorAxis(); + chart->minorAxis = m_boundingBox.minorAxis(); + chart->minCorner = m_boundingBox.minCorner(); + chart->maxCorner = m_boundingBox.maxCorner(); + m_charts.push_back(chart); + } + + void addUvMeshCharts(UvMeshInstance *mesh) + { + BitArray vertexUsed(mesh->texcoords.size()); + Array<Vector2> boundary; + boundary.reserve(16); + for (uint32_t c = 0; c < mesh->mesh->charts.size(); c++) { + UvMeshChart *uvChart = mesh->mesh->charts[c]; + Chart *chart = XA_NEW(MemTag::Default, Chart); + chart->atlasIndex = -1; + chart->material = uvChart->material; + chart->indexCount = uvChart->indices.size(); + chart->indices = uvChart->indices.data(); + chart->vertices = mesh->texcoords.data(); + chart->vertexCount = mesh->texcoords.size(); + chart->allowRotate = mesh->rotateCharts; + // Find unique vertices. + vertexUsed.clearAll(); + for (uint32_t i = 0; i < chart->indexCount; i++) { + const uint32_t vertex = chart->indices[i]; + if (!vertexUsed.bitAt(vertex)) { + vertexUsed.setBitAt(vertex); + chart->uniqueVertices.push_back(vertex); + } + } + // Compute parametric and surface areas. + chart->parametricArea = 0.0f; + for (uint32_t f = 0; f < chart->indexCount / 3; f++) { + const Vector2 &v1 = chart->vertices[chart->indices[f * 3 + 0]]; + const Vector2 &v2 = chart->vertices[chart->indices[f * 3 + 1]]; + const Vector2 &v3 = chart->vertices[chart->indices[f * 3 + 2]]; + chart->parametricArea += fabsf(triangleArea(v1, v2, v3)); + } + chart->parametricArea *= 0.5f; + chart->surfaceArea = chart->parametricArea; // Identical for UV meshes. + if (chart->parametricArea < kAreaEpsilon) { + // When the parametric area is too small we use a rough approximation to prevent divisions by very small numbers. + Vector2 minCorner(FLT_MAX, FLT_MAX); + Vector2 maxCorner(-FLT_MAX, -FLT_MAX); + for (uint32_t v = 0; v < chart->uniqueVertexCount(); v++) { + minCorner = min(minCorner, chart->uniqueVertexAt(v)); + maxCorner = max(maxCorner, chart->uniqueVertexAt(v)); + } + const Vector2 bounds = (maxCorner - minCorner) * 0.5f; + chart->parametricArea = bounds.x * bounds.y; + } + // Compute list of boundary vertices. + // Using all unique vertices for simplicity, can compute real boundaries if this is too slow. + boundary.clear(); + for (uint32_t v = 0; v < chart->uniqueVertexCount(); v++) + boundary.push_back(chart->uniqueVertexAt(v)); + XA_DEBUG_ASSERT(boundary.size() > 0); + // Compute bounding box of chart. + m_boundingBox.compute(boundary.data(), boundary.size(), boundary.data(), boundary.size()); + chart->majorAxis = m_boundingBox.majorAxis(); + chart->minorAxis = m_boundingBox.minorAxis(); + chart->minCorner = m_boundingBox.minCorner(); + chart->maxCorner = m_boundingBox.maxCorner(); + m_charts.push_back(chart); + } + } // Pack charts in the smallest possible rectangle. - void packCharts(const PackerOptions &options) - { - const uint32_t chartCount = m_atlas->chartCount(); - if (chartCount == 0) return; - float texelsPerUnit = 1; - if (options.method == PackMethod::TexelArea) - texelsPerUnit = options.texelArea; - for (int iteration = 0;; iteration++) { - m_rand = MTRand(); - std::vector<float> chartOrderArray(chartCount); - std::vector<Vector2> chartExtents(chartCount); + bool packCharts(TaskScheduler *taskScheduler, const PackOptions &options, ProgressFunc progressFunc, void *progressUserData) + { + if (progressFunc) { + if (!progressFunc(ProgressCategory::PackCharts, 0, progressUserData)) + return false; + } + const uint32_t chartCount = m_charts.size(); + XA_PRINT("Packing %u charts\n", chartCount); + if (chartCount == 0) { + if (progressFunc) { + if (!progressFunc(ProgressCategory::PackCharts, 100, progressUserData)) + return false; + } + return true; + } + uint32_t resolution = options.resolution; + m_texelsPerUnit = options.texelsPerUnit; + if (resolution <= 0 || m_texelsPerUnit <= 0) { + if (resolution <= 0 && m_texelsPerUnit <= 0) + resolution = 1024; float meshArea = 0; - for (uint32_t c = 0; c < chartCount; c++) { - Chart *chart = m_atlas->chartAt(c); - if (!chart->isVertexMapped() && !chart->isDisk()) { - chartOrderArray[c] = 0; - // Skip non-disks. - continue; - } - Vector2 extents(0.0f); - if (chart->isVertexMapped()) { - // Arrange vertices in a rectangle. - extents.x = float(chart->vertexMapWidth); - extents.y = float(chart->vertexMapHeight); + for (uint32_t c = 0; c < chartCount; c++) + meshArea += m_charts[c]->surfaceArea; + if (resolution <= 0) { + // Estimate resolution based on the mesh surface area and given texel scale. + const float texelCount = max(1.0f, meshArea * square(m_texelsPerUnit) / 0.75f); // Assume 75% utilization. + resolution = max(1u, nextPowerOfTwo(uint32_t(sqrtf(texelCount)))); + } + if (m_texelsPerUnit <= 0) { + // Estimate a suitable texelsPerUnit to fit the given resolution. + const float texelCount = max(1.0f, meshArea / 0.75f); // Assume 75% utilization. + m_texelsPerUnit = sqrtf((resolution * resolution) / texelCount); + XA_PRINT(" Estimating texelsPerUnit as %g\n", m_texelsPerUnit); + } + } + Array<float> chartOrderArray; + chartOrderArray.resize(chartCount); + Array<Vector2> chartExtents; + chartExtents.resize(chartCount); + float minChartPerimeter = FLT_MAX, maxChartPerimeter = 0.0f; + for (uint32_t c = 0; c < chartCount; c++) { + Chart *chart = m_charts[c]; + //chartOrderArray[c] = chart.surfaceArea; + // Compute chart scale + float scale = (chart->surfaceArea / chart->parametricArea) * m_texelsPerUnit; + if (chart->parametricArea == 0) { // < kAreaEpsilon) + scale = 0; + } + XA_ASSERT(isFinite(scale)); + // Sort charts by perimeter. @@ This is sometimes producing somewhat unexpected results. Is this right? + //chartOrderArray[c] = ((chart->maxCorner.x - chart->minCorner.x) + (chart->maxCorner.y - chart->minCorner.y)) * scale; + // Translate, rotate and scale vertices. Compute extents. + Vector2 minCorner(FLT_MAX, FLT_MAX); + if (!chart->allowRotate) { + for (uint32_t i = 0; i < chart->uniqueVertexCount(); i++) + minCorner = min(minCorner, chart->uniqueVertexAt(i)); + } + Vector2 extents(0.0f); + for (uint32_t i = 0; i < chart->uniqueVertexCount(); i++) { + Vector2 &texcoord = chart->uniqueVertexAt(i); + if (chart->allowRotate) { + const float x = dot(texcoord, chart->majorAxis); + const float y = dot(texcoord, chart->minorAxis); + texcoord.x = x; + texcoord.y = y; + texcoord -= chart->minCorner; } else { - // Compute surface area to sort charts. - float chartArea = chart->computeSurfaceArea(); - meshArea += chartArea; - //chartOrderArray[c] = chartArea; - // Compute chart scale - float parametricArea = fabsf(chart->computeParametricArea()); // @@ There doesn't seem to be anything preventing parametric area to be negative. - if (parametricArea < NV_EPSILON) { - // When the parametric area is too small we use a rough approximation to prevent divisions by very small numbers. - Vector2 bounds = chart->computeParametricBounds(); - parametricArea = bounds.x * bounds.y; - } - float scale = (chartArea / parametricArea) * texelsPerUnit; - if (parametricArea == 0) { // < NV_EPSILON) - scale = 0; - } - xaAssert(std::isfinite(scale)); - // Compute bounding box of chart. - Vector2 majorAxis, minorAxis, origin, end; - computeBoundingBox(chart, &majorAxis, &minorAxis, &origin, &end); - xaAssert(isFinite(majorAxis) && isFinite(minorAxis) && isFinite(origin)); - // Sort charts by perimeter. @@ This is sometimes producing somewhat unexpected results. Is this right? - //chartOrderArray[c] = ((end.x - origin.x) + (end.y - origin.y)) * scale; - // Translate, rotate and scale vertices. Compute extents. - halfedge::Mesh *mesh = chart->chartMesh(); - const uint32_t vertexCount = mesh->vertexCount(); - for (uint32_t i = 0; i < vertexCount; i++) { - halfedge::Vertex *vertex = mesh->vertexAt(i); - //Vector2 t = vertex->tex - origin; - Vector2 tmp; - tmp.x = dot(vertex->tex, majorAxis); - tmp.y = dot(vertex->tex, minorAxis); - tmp -= origin; - tmp *= scale; - if (tmp.x < 0 || tmp.y < 0) { - xaPrint("tmp: %f %f\n", tmp.x, tmp.y); - xaPrint("scale: %f\n", scale); - xaPrint("origin: %f %f\n", origin.x, origin.y); - xaPrint("majorAxis: %f %f\n", majorAxis.x, majorAxis.y); - xaPrint("minorAxis: %f %f\n", minorAxis.x, minorAxis.y); - xaDebugAssert(false); - } - //xaAssert(tmp.x >= 0 && tmp.y >= 0); - vertex->tex = tmp; - xaAssert(std::isfinite(vertex->tex.x) && std::isfinite(vertex->tex.y)); - extents = max(extents, tmp); - } - xaDebugAssert(extents.x >= 0 && extents.y >= 0); - // Limit chart size. - if (extents.x > 1024 || extents.y > 1024) { - float limit = std::max(extents.x, extents.y); - scale = 1024 / (limit + 1); - for (uint32_t i = 0; i < vertexCount; i++) { - halfedge::Vertex *vertex = mesh->vertexAt(i); - vertex->tex *= scale; - } - extents *= scale; - xaDebugAssert(extents.x <= 1024 && extents.y <= 1024); - } - // Scale the charts to use the entire texel area available. So, if the width is 0.1 we could scale it to 1 without increasing the lightmap usage and making a better - // use of it. In many cases this also improves the look of the seams, since vertices on the chart boundaries have more chances of being aligned with the texel centers. - float scale_x = 1.0f; - float scale_y = 1.0f; - float divide_x = 1.0f; - float divide_y = 1.0f; - if (extents.x > 0) { - int cw = ftoi_ceil(extents.x); - if (options.blockAlign && chart->blockAligned) { - // Align all chart extents to 4x4 blocks, but taking padding into account. - if (options.conservative) { - cw = align(cw + 2, 4) - 2; - } else { - cw = align(cw + 1, 4) - 1; - } - } - scale_x = (float(cw) - NV_EPSILON); - divide_x = extents.x; - extents.x = float(cw); - } - if (extents.y > 0) { - int ch = ftoi_ceil(extents.y); - if (options.blockAlign && chart->blockAligned) { - // Align all chart extents to 4x4 blocks, but taking padding into account. - if (options.conservative) { - ch = align(ch + 2, 4) - 2; - } else { - ch = align(ch + 1, 4) - 1; - } - } - scale_y = (float(ch) - NV_EPSILON); - divide_y = extents.y; - extents.y = float(ch); - } - for (uint32_t v = 0; v < vertexCount; v++) { - halfedge::Vertex *vertex = mesh->vertexAt(v); - vertex->tex.x /= divide_x; - vertex->tex.y /= divide_y; - vertex->tex.x *= scale_x; - vertex->tex.y *= scale_y; - xaAssert(std::isfinite(vertex->tex.x) && std::isfinite(vertex->tex.y)); - } + texcoord -= minCorner; + } + texcoord *= scale; + XA_DEBUG_ASSERT(texcoord.x >= 0 && texcoord.y >= 0); + XA_DEBUG_ASSERT(isFinite(texcoord.x) && isFinite(texcoord.y)); + extents = max(extents, texcoord); + } + XA_DEBUG_ASSERT(extents.x >= 0 && extents.y >= 0); + // Limit chart size. + const float maxChartSize = (float)options.maxChartSize; + if (extents.x > maxChartSize || extents.y > maxChartSize) { + const float limit = max(extents.x, extents.y); + scale = maxChartSize / (limit + 1.0f); + for (uint32_t i = 0; i < chart->uniqueVertexCount(); i++) + chart->uniqueVertexAt(i) *= scale; + extents *= scale; + XA_DEBUG_ASSERT(extents.x <= maxChartSize && extents.y <= maxChartSize); + } + // Scale the charts to use the entire texel area available. So, if the width is 0.1 we could scale it to 1 without increasing the lightmap usage and making a better + // use of it. In many cases this also improves the look of the seams, since vertices on the chart boundaries have more chances of being aligned with the texel centers. + float scale_x = 1.0f; + float scale_y = 1.0f; + float divide_x = 1.0f; + float divide_y = 1.0f; + if (extents.x > 0) { + int cw = ftoi_ceil(extents.x); + if (options.blockAlign) { + // Align all chart extents to 4x4 blocks, but taking padding into account. + cw = align(cw + 2, 4) - 2; + } + scale_x = (float(cw) - kEpsilon); + divide_x = extents.x; + extents.x = float(cw); + } + if (extents.y > 0) { + int ch = ftoi_ceil(extents.y); + if (options.blockAlign) { + // Align all chart extents to 4x4 blocks, but taking padding into account. + ch = align(ch + 2, 4) - 2; + } + scale_y = (float(ch) - kEpsilon); + divide_y = extents.y; + extents.y = float(ch); + } + for (uint32_t v = 0; v < chart->uniqueVertexCount(); v++) { + Vector2 &texcoord = chart->uniqueVertexAt(v); + texcoord.x /= divide_x; + texcoord.y /= divide_y; + texcoord.x *= scale_x; + texcoord.y *= scale_y; + XA_ASSERT(isFinite(texcoord.x) && isFinite(texcoord.y)); + } + chartExtents[c] = extents; + // Sort charts by perimeter. + chartOrderArray[c] = extents.x + extents.y; + minChartPerimeter = min(minChartPerimeter, chartOrderArray[c]); + maxChartPerimeter = max(maxChartPerimeter, chartOrderArray[c]); + } + // Sort charts by perimeter. + m_radix = RadixSort(); + m_radix.sort(chartOrderArray); + const uint32_t *ranks = m_radix.ranks(); + // Divide chart perimeter range into buckets. + const float chartPerimeterBucketSize = (maxChartPerimeter - minChartPerimeter) / 16.0f; + uint32_t currentChartBucket = 0; + Array<Vector2i> chartStartPositions; // per atlas + chartStartPositions.push_back(Vector2i(0, 0)); + // Pack sorted charts. +#if XA_DEBUG_EXPORT_ATLAS_IMAGES + const bool createImage = true; +#else + const bool createImage = options.createImage; +#endif + BitImage chartBitImage, chartBitImageRotated; + int atlasWidth = 0, atlasHeight = 0; + const bool resizableAtlas = !(options.resolution > 0 && options.texelsPerUnit > 0.0f); + int progress = 0; + for (uint32_t i = 0; i < chartCount; i++) { + uint32_t c = ranks[chartCount - i - 1]; // largest chart first + Chart *chart = m_charts[c]; + // @@ Add special cases for dot and line charts. @@ Lightmap rasterizer also needs to handle these special cases. + // @@ We could also have a special case for chart quads. If the quad surface <= 4 texels, align vertices with texel centers and do not add padding. May be very useful for foliage. + // @@ In general we could reduce the padding of all charts by one texel by using a rasterizer that takes into account the 2-texel footprint of the tent bilinear filter. For example, + // if we have a chart that is less than 1 texel wide currently we add one texel to the left and one texel to the right creating a 3-texel-wide bitImage. However, if we know that the + // chart is only 1 texel wide we could align it so that it only touches the footprint of two texels: + // | | <- Touches texels 0, 1 and 2. + // | | <- Only touches texels 0 and 1. + // \ \ / \ / / + // \ X X / + // \ / \ / \ / + // V V V + // 0 1 2 + XA_PROFILE_START(packChartsRasterize) + // Leave room for padding. + chartBitImage.resize(ftoi_ceil(chartExtents[c].x) + 1 + options.padding * 2, ftoi_ceil(chartExtents[c].y) + 1 + options.padding * 2, true); + if (chart->allowRotate) + chartBitImageRotated.resize(chartBitImage.height(), chartBitImage.width(), true); + // Rasterize chart faces. + const uint32_t faceCount = chart->indexCount / 3; + for (uint32_t f = 0; f < faceCount; f++) { + // Offset vertices by padding. + Vector2 vertices[3]; + for (uint32_t v = 0; v < 3; v++) + vertices[v] = chart->vertices[chart->indices[f * 3 + v]] + Vector2(0.5f) + Vector2(float(options.padding)); + DrawTriangleCallbackArgs args; + args.chartBitImage = &chartBitImage; + args.chartBitImageRotated = chart->allowRotate ? &chartBitImageRotated : nullptr; + raster::drawTriangle(Vector2((float)chartBitImage.width(), (float)chartBitImage.height()), vertices, drawTriangleCallback, &args); + } + // Expand chart by padding pixels. (dilation) + BitImage chartBitImageNoPadding(chartBitImage), chartBitImageNoPaddingRotated(chartBitImageRotated); + if (options.padding > 0) { + XA_PROFILE_START(packChartsDilate) + chartBitImage.dilate(options.padding); + if (chart->allowRotate) + chartBitImageRotated.dilate(options.padding); + XA_PROFILE_END(packChartsDilate) + } + XA_PROFILE_END(packChartsRasterize) + // Update brute force bucketing. + if (options.bruteForce) { + if (chartOrderArray[c] > minChartPerimeter && chartOrderArray[c] <= maxChartPerimeter - (chartPerimeterBucketSize * (currentChartBucket + 1))) { + // Moved to a smaller bucket, reset start location. + for (uint32_t j = 0; j < chartStartPositions.size(); j++) + chartStartPositions[j] = Vector2i(0, 0); + currentChartBucket++; } - chartExtents[c] = extents; - // Sort charts by perimeter. - chartOrderArray[c] = extents.x + extents.y; - } - // @@ We can try to improve compression of small charts by sorting them by proximity like we do with vertex samples. - // @@ How to do that? One idea: compute chart centroid, insert into grid, compute morton index of the cell, sort based on morton index. - // @@ We would sort by morton index, first, then quantize the chart sizes, so that all small charts have the same size, and sort by size preserving the morton order. - //xaPrint("Sorting charts.\n"); - // Sort charts by area. - m_radix = RadixSort(); - m_radix.sort(chartOrderArray); - const uint32_t *ranks = m_radix.ranks(); - // First iteration - guess texelsPerUnit. - if (options.method != PackMethod::TexelArea && iteration == 0) { - // Estimate size of the map based on the mesh surface area and given texel scale. - const float texelCount = std::max(1.0f, meshArea * square(texelsPerUnit) / 0.75f); // Assume 75% utilization. - texelsPerUnit = sqrt((options.resolution * options.resolution) / texelCount); - resetUvs(); - continue; } - // Init bit map. - m_bitmap.clearAll(); - m_bitmap.resize(options.resolution, options.resolution, false); - int w = 0; - int h = 0; - // Add sorted charts to bitmap. - for (uint32_t i = 0; i < chartCount; i++) { - uint32_t c = ranks[chartCount - i - 1]; // largest chart first - Chart *chart = m_atlas->chartAt(c); - if (!chart->isVertexMapped() && !chart->isDisk()) continue; - //float scale_x = 1; - //float scale_y = 1; - BitMap chart_bitmap; - if (chart->isVertexMapped()) { - chart->blockAligned = false; - // Init all bits to 1. - chart_bitmap.resize(ftoi_ceil(chartExtents[c].x), ftoi_ceil(chartExtents[c].y), /*initValue=*/true); - // @@ Another alternative would be to try to map each vertex to a different texel trying to fill all the available unused texels. - } else { - // @@ Add special cases for dot and line charts. @@ Lightmap rasterizer also needs to handle these special cases. - // @@ We could also have a special case for chart quads. If the quad surface <= 4 texels, align vertices with texel centers and do not add padding. May be very useful for foliage. - // @@ In general we could reduce the padding of all charts by one texel by using a rasterizer that takes into account the 2-texel footprint of the tent bilinear filter. For example, - // if we have a chart that is less than 1 texel wide currently we add one texel to the left and one texel to the right creating a 3-texel-wide bitmap. However, if we know that the - // chart is only 1 texel wide we could align it so that it only touches the footprint of two texels: - // | | <- Touches texels 0, 1 and 2. - // | | <- Only touches texels 0 and 1. - // \ \ / \ / / - // \ X X / - // \ / \ / \ / - // V V V - // 0 1 2 - if (options.conservative) { - // Init all bits to 0. - chart_bitmap.resize(ftoi_ceil(chartExtents[c].x) + 1 + options.padding, ftoi_ceil(chartExtents[c].y) + 1 + options.padding, /*initValue=*/false); // + 2 to add padding on both sides. - // Rasterize chart and dilate. - drawChartBitmapDilate(chart, &chart_bitmap, options.padding); - } else { - // Init all bits to 0. - chart_bitmap.resize(ftoi_ceil(chartExtents[c].x) + 1, ftoi_ceil(chartExtents[c].y) + 1, /*initValue=*/false); // Add half a texels on each side. - // Rasterize chart and dilate. - drawChartBitmap(chart, &chart_bitmap, Vector2(1), Vector2(0.5)); - } + // Find a location to place the chart in the atlas. + uint32_t currentAtlas = 0; + int best_x = 0, best_y = 0; + int best_cw = 0, best_ch = 0; + int best_r = 0; + for (;;) + { + bool firstChartInBitImage = false; + if (currentAtlas + 1 > m_bitImages.size()) { + // Chart doesn't fit in the current bitImage, create a new one. + BitImage *bi = XA_NEW(MemTag::Default, BitImage); + bi->resize(resolution, resolution, true); + m_bitImages.push_back(bi); + firstChartInBitImage = true; + if (createImage) + m_atlasImages.push_back(XA_NEW(MemTag::Default, AtlasImage, resolution, resolution)); + // Start positions are per-atlas, so create a new one of those too. + chartStartPositions.push_back(Vector2i(0, 0)); } - int best_x, best_y; - int best_cw, best_ch; // Includes padding now. - int best_r; - findChartLocation(options.quality, &chart_bitmap, chartExtents[c], w, h, &best_x, &best_y, &best_cw, &best_ch, &best_r, chart->blockAligned); - /*if (w < best_x + best_cw || h < best_y + best_ch) - { - xaPrint("Resize extents to (%d, %d).\n", best_x + best_cw, best_y + best_ch); - }*/ - // Update parametric extents. - w = std::max(w, best_x + best_cw); - h = std::max(h, best_y + best_ch); - w = align(w, 4); - h = align(h, 4); - // Resize bitmap if necessary. - if (uint32_t(w) > m_bitmap.width() || uint32_t(h) > m_bitmap.height()) { - //xaPrint("Resize bitmap (%d, %d).\n", nextPowerOfTwo(w), nextPowerOfTwo(h)); - m_bitmap.resize(nextPowerOfTwo(uint32_t(w)), nextPowerOfTwo(uint32_t(h)), false); + XA_PROFILE_START(packChartsFindLocation) + const bool foundLocation = findChartLocation(taskScheduler, chartStartPositions[currentAtlas], options.bruteForce, m_bitImages[currentAtlas], &chartBitImage, &chartBitImageRotated, atlasWidth, atlasHeight, &best_x, &best_y, &best_cw, &best_ch, &best_r, options.blockAlign, resizableAtlas, chart->allowRotate); + XA_PROFILE_END(packChartsFindLocation) + if (firstChartInBitImage && !foundLocation) { + // Chart doesn't fit in an empty, newly allocated bitImage. texelsPerUnit must be too large for the resolution. + XA_ASSERT(true && "chart doesn't fit"); + break; + } + if (resizableAtlas) { + XA_DEBUG_ASSERT(foundLocation); + break; + } + if (foundLocation) + break; + // Chart doesn't fit in the current bitImage, try the next one. + currentAtlas++; + } + // Update brute force start location. + if (options.bruteForce) { + // Reset start location if the chart expanded the atlas. + if (best_x + best_cw > atlasWidth || best_y + best_ch > atlasHeight) { + for (uint32_t j = 0; j < chartStartPositions.size(); j++) + chartStartPositions[j] = Vector2i(0, 0); } - //xaPrint("Add chart at (%d, %d).\n", best_x, best_y); - addChart(&chart_bitmap, w, h, best_x, best_y, best_r); - //float best_angle = 2 * PI * best_r; - // Translate and rotate chart texture coordinates. - halfedge::Mesh *mesh = chart->chartMesh(); - const uint32_t vertexCount = mesh->vertexCount(); - for (uint32_t v = 0; v < vertexCount; v++) { - halfedge::Vertex *vertex = mesh->vertexAt(v); - Vector2 t = vertex->tex; - if (best_r) std::swap(t.x, t.y); - //vertex->tex.x = best_x + t.x * cosf(best_angle) - t.y * sinf(best_angle); - //vertex->tex.y = best_y + t.x * sinf(best_angle) + t.y * cosf(best_angle); - vertex->tex.x = best_x + t.x + 0.5f; - vertex->tex.y = best_y + t.y + 0.5f; - xaAssert(vertex->tex.x >= 0 && vertex->tex.y >= 0); - xaAssert(std::isfinite(vertex->tex.x) && std::isfinite(vertex->tex.y)); + else { + chartStartPositions[currentAtlas] = Vector2i(best_x, best_y); } } - //w -= padding - 1; // Leave one pixel border! - //h -= padding - 1; - m_width = std::max(0, w); - m_height = std::max(0, h); - xaAssert(isAligned(m_width, 4)); - xaAssert(isAligned(m_height, 4)); - if (options.method == PackMethod::ExactResolution) { - texelsPerUnit *= sqrt((options.resolution * options.resolution) / (float)(m_width * m_height)); - if (iteration > 1 && m_width <= options.resolution && m_height <= options.resolution) { - m_width = m_height = options.resolution; - return; + // Update parametric extents. + atlasWidth = max(atlasWidth, best_x + best_cw); + atlasHeight = max(atlasHeight, best_y + best_ch); + if (resizableAtlas) { + // Resize bitImage if necessary. + if (uint32_t(atlasWidth) > m_bitImages[0]->width() || uint32_t(atlasHeight) > m_bitImages[0]->height()) { + m_bitImages[0]->resize(nextPowerOfTwo(uint32_t(atlasWidth)), nextPowerOfTwo(uint32_t(atlasHeight)), false); + if (createImage) + m_atlasImages[0]->resize(m_bitImages[0]->width(), m_bitImages[0]->height()); } - resetUvs(); } else { - return; + atlasWidth = min((int)options.resolution, atlasWidth); + atlasHeight = min((int)options.resolution, atlasHeight); + } + XA_PROFILE_START(packChartsBlit) + addChart(m_bitImages[currentAtlas], &chartBitImage, &chartBitImageRotated, atlasWidth, atlasHeight, best_x, best_y, best_r); + XA_PROFILE_END(packChartsBlit) + if (createImage) { + m_atlasImages[currentAtlas]->addChart(c, best_r == 0 ? &chartBitImageNoPadding : &chartBitImageNoPaddingRotated, false, atlasWidth, atlasHeight, best_x, best_y); + m_atlasImages[currentAtlas]->addChart(c, best_r == 0 ? &chartBitImage : &chartBitImageRotated, true, atlasWidth, atlasHeight, best_x, best_y); + } + chart->atlasIndex = (int32_t)currentAtlas; + // Translate and rotate chart texture coordinates. + for (uint32_t v = 0; v < chart->uniqueVertexCount(); v++) { + Vector2 &texcoord = chart->uniqueVertexAt(v); + Vector2 t = texcoord; + if (best_r) { + XA_DEBUG_ASSERT(chart->allowRotate); + swap(t.x, t.y); + } + texcoord.x = best_x + t.x + 0.5f; + texcoord.y = best_y + t.y + 0.5f; + XA_ASSERT(texcoord.x >= 0 && texcoord.y >= 0); + XA_ASSERT(isFinite(texcoord.x) && isFinite(texcoord.y)); + } + if (progressFunc) { + const int newProgress = int((i + 1) / (float)chartCount * 100.0f); + if (newProgress != progress) { + progress = newProgress; + if (!progressFunc(ProgressCategory::PackCharts, progress, progressUserData)) + return false; + } } } - } - - float computeAtlasUtilization() const - { - const uint32_t w = m_width; - const uint32_t h = m_height; - xaDebugAssert(w <= m_bitmap.width()); - xaDebugAssert(h <= m_bitmap.height()); - uint32_t count = 0; - for (uint32_t y = 0; y < h; y++) { - for (uint32_t x = 0; x < w; x++) { - count += m_bitmap.bitAt(x, y); + if (resizableAtlas) { + m_width = max(0, atlasWidth - (int)options.padding * 2); + m_height = max(0, atlasHeight - (int)options.padding * 2); + } else { + m_width = m_height = options.resolution; + } + XA_PRINT(" %dx%d resolution\n", m_width, m_height); + m_utilization.resize(m_bitImages.size()); + for (uint32_t i = 0; i < m_utilization.size(); i++) { + uint32_t count = 0; + for (uint32_t y = 0; y < m_height; y++) { + for (uint32_t x = 0; x < m_width; x++) + count += m_bitImages[i]->bitAt(x, y); + } + m_utilization[i] = float(count) / (m_width * m_height); + if (m_utilization.size() > 1) { + XA_PRINT(" %u: %f%% utilization\n", i, m_utilization[i] * 100.0f); + } + else { + XA_PRINT(" %f%% utilization\n", m_utilization[i] * 100.0f); } } - return float(count) / (w * h); - } - -private: - void resetUvs() - { - for (uint32_t i = 0; i < m_atlas->chartCount(); i++) { - halfedge::Mesh *mesh = m_atlas->chartAt(i)->chartMesh(); - for (uint32_t j = 0; j < mesh->vertexCount(); j++) - mesh->vertexAt(j)->tex = m_originalChartUvs[i][j]; +#if XA_DEBUG_EXPORT_ATLAS_IMAGES + for (uint32_t i = 0; i < m_atlasImages.size(); i++) { + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_atlas_image%02u.tga", i); + m_atlasImages[i]->writeTga(filename, m_width, m_height); + } +#endif + if (progressFunc && progress != 100) { + if (!progressFunc(ProgressCategory::PackCharts, 100, progressUserData)) + return false; } + return true; } +private: // IC: Brute force is slow, and random may take too much time to converge. We start inserting large charts in a small atlas. Using brute force is lame, because most of the space // is occupied at this point. At the end we have many small charts and a large atlas with sparse holes. Finding those holes randomly is slow. A better approach would be to // start stacking large charts as if they were tetris pieces. Once charts get small try to place them randomly. It may be interesting to try a intermediate strategy, first try // along one axis and then try exhaustively along that axis. - void findChartLocation(int quality, const BitMap *bitmap, Vector2::Arg extents, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, bool blockAligned) - { - int attempts = 256; - if (quality == 1) attempts = 4096; - if (quality == 2) attempts = 2048; - if (quality == 3) attempts = 1024; - if (quality == 4) attempts = 512; - if (quality == 0 || w * h < attempts) { - findChartLocation_bruteForce(bitmap, extents, w, h, best_x, best_y, best_w, best_h, best_r, blockAligned); - } else { - findChartLocation_random(bitmap, extents, w, h, best_x, best_y, best_w, best_h, best_r, attempts, blockAligned); - } + bool findChartLocation(TaskScheduler *taskScheduler, const Vector2i &startPosition, bool bruteForce, const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, bool blockAligned, bool resizableAtlas, bool allowRotate) + { + const int attempts = 4096; + if (bruteForce || attempts >= w * h) + return findChartLocation_bruteForce(taskScheduler, startPosition, atlasBitImage, chartBitImage, chartBitImageRotated, w, h, best_x, best_y, best_w, best_h, best_r, blockAligned, resizableAtlas, allowRotate); + return findChartLocation_random(atlasBitImage, chartBitImage, chartBitImageRotated, w, h, best_x, best_y, best_w, best_h, best_r, attempts, blockAligned, resizableAtlas, allowRotate); } - void findChartLocation_bruteForce(const BitMap *bitmap, Vector2::Arg /*extents*/, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, bool blockAligned) + bool findChartLocation_bruteForce(TaskScheduler *taskScheduler, const Vector2i &startPosition, const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, bool blockAligned, bool resizableAtlas, bool allowRotate) { - const int BLOCK_SIZE = 4; + const int stepSize = blockAligned ? 4 : 1; + uint32_t taskCount = 0; + for (int y = startPosition.y; y <= h + stepSize; y += stepSize) + taskCount++; + Array<FindChartLocationBruteForceTaskArgs> taskArgs; + taskArgs.resize(taskCount); + TaskGroupHandle taskGroup = taskScheduler->createTaskGroup(taskCount); + std::atomic<bool> finished(false); // One of the tasks found a location that doesn't expand the atlas. + uint32_t i = 0; + for (int y = startPosition.y; y <= h + stepSize; y += stepSize) { + FindChartLocationBruteForceTaskArgs &args = taskArgs[i]; + args.finished = &finished; + args.startPosition = Vector2i(y == startPosition.y ? startPosition.x : 0, y); + args.atlasBitImage = atlasBitImage; + args.chartBitImage = chartBitImage; + args.chartBitImageRotated = chartBitImageRotated; + args.w = w; + args.h = h; + args.blockAligned = blockAligned; + args.resizableAtlas = resizableAtlas; + args.allowRotate = allowRotate; + Task task; + task.userData = &taskArgs[i]; + task.func = runFindChartLocationBruteForceTask; + taskScheduler->run(taskGroup, task); + i++; + } + taskScheduler->wait(&taskGroup); + // Find the task result with the best metric. int best_metric = INT_MAX; - int step_size = blockAligned ? BLOCK_SIZE : 1; - // Try two different orientations. - for (int r = 0; r < 2; r++) { - int cw = bitmap->width(); - int ch = bitmap->height(); - if (r & 1) std::swap(cw, ch); - for (int y = 0; y <= h + 1; y += step_size) { // + 1 to extend atlas in case atlas full. - for (int x = 0; x <= w + 1; x += step_size) { // + 1 not really necessary here. - // Early out. - int area = std::max(w, x + cw) * std::max(h, y + ch); - //int perimeter = max(w, x+cw) + max(h, y+ch); - int extents = std::max(std::max(w, x + cw), std::max(h, y + ch)); - int metric = extents * extents + area; - if (metric > best_metric) { - continue; - } - if (metric == best_metric && std::max(x, y) >= std::max(*best_x, *best_y)) { - // If metric is the same, pick the one closest to the origin. - continue; - } - if (canAddChart(bitmap, w, h, x, y, r)) { - best_metric = metric; - *best_x = x; - *best_y = y; - *best_w = cw; - *best_h = ch; - *best_r = r; - if (area == w * h) { - // Chart is completely inside, do not look at any other location. - goto done; - } - } - } - } + bool best_insideAtlas = false; + for (i = 0; i < taskCount; i++) { + FindChartLocationBruteForceTaskArgs &args = taskArgs[i]; + if (args.best_metric > best_metric) + continue; + // A location that doesn't expand the atlas is always preferred. + if (!args.best_insideAtlas && best_insideAtlas) + continue; + // If metric is the same, pick the one closest to the origin. + if (args.best_insideAtlas == best_insideAtlas && args.best_metric == best_metric && max(args.best_x, args.best_y) >= max(*best_x, *best_y)) + continue; + best_metric = args.best_metric; + best_insideAtlas = args.best_insideAtlas; + *best_x = args.best_x; + *best_y = args.best_y; + *best_w = args.best_w; + *best_h = args.best_h; + *best_r = args.best_r; } - done: - xaDebugAssert (best_metric != INT_MAX); + return best_metric != INT_MAX; } - void findChartLocation_random(const BitMap *bitmap, Vector2::Arg /*extents*/, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, int minTrialCount, bool blockAligned) + bool findChartLocation_random(const BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int w, int h, int *best_x, int *best_y, int *best_w, int *best_h, int *best_r, int minTrialCount, bool blockAligned, bool resizableAtlas, bool allowRotate) { + bool result = false; const int BLOCK_SIZE = 4; int best_metric = INT_MAX; - for (int i = 0; i < minTrialCount || best_metric == INT_MAX; i++) { - int r = m_rand.getRange(1); - int x = m_rand.getRange(w + 1); // + 1 to extend atlas in case atlas full. We may want to use a higher number to increase probability of extending atlas. - int y = m_rand.getRange(h + 1); // + 1 to extend atlas in case atlas full. + for (int i = 0; i < minTrialCount; i++) { + int cw = chartBitImage->width(); + int ch = chartBitImage->height(); + int r = allowRotate ? m_rand.getRange(1) : 0; + if (r == 1) + swap(cw, ch); + // + 1 to extend atlas in case atlas full. We may want to use a higher number to increase probability of extending atlas. + int xRange = w + 1; + int yRange = h + 1; + if (!resizableAtlas) { + xRange = min(xRange, (int)atlasBitImage->width() - cw); + yRange = min(yRange, (int)atlasBitImage->height() - ch); + } + int x = m_rand.getRange(xRange); + int y = m_rand.getRange(yRange); if (blockAligned) { x = align(x, BLOCK_SIZE); y = align(y, BLOCK_SIZE); + if (!resizableAtlas && (x > (int)atlasBitImage->width() - cw || y > (int)atlasBitImage->height() - ch)) + continue; // Block alignment pushed the chart outside the atlas. } - int cw = bitmap->width(); - int ch = bitmap->height(); - if (r & 1) std::swap(cw, ch); // Early out. - int area = std::max(w, x + cw) * std::max(h, y + ch); + int area = max(w, x + cw) * max(h, y + ch); //int perimeter = max(w, x+cw) + max(h, y+ch); - int extents = std::max(std::max(w, x + cw), std::max(h, y + ch)); + int extents = max(max(w, x + cw), max(h, y + ch)); int metric = extents * extents + area; if (metric > best_metric) { continue; } - if (metric == best_metric && std::min(x, y) > std::min(*best_x, *best_y)) { + if (metric == best_metric && min(x, y) > min(*best_x, *best_y)) { // If metric is the same, pick the one closest to the origin. continue; } - if (canAddChart(bitmap, w, h, x, y, r)) { + if (atlasBitImage->canBlit(r == 1 ? *chartBitImageRotated : *chartBitImage, x, y)) { + result = true; best_metric = metric; *best_x = x; *best_y = y; *best_w = cw; *best_h = ch; - *best_r = r; + *best_r = allowRotate ? r : 0; if (area == w * h) { // Chart is completely inside, do not look at any other location. break; } } } + return result; } - void drawChartBitmapDilate(const Chart *chart, BitMap *bitmap, int padding) - { - const int w = bitmap->width(); - const int h = bitmap->height(); - const Vector2 extents = Vector2(float(w), float(h)); - // Rasterize chart faces, check that all bits are not set. - const uint32_t faceCount = chart->faceCount(); - for (uint32_t f = 0; f < faceCount; f++) { - const halfedge::Face *face = chart->chartMesh()->faceAt(f); - Vector2 vertices[4]; - uint32_t edgeCount = 0; - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - if (edgeCount < 4) { - vertices[edgeCount] = it.vertex()->tex + Vector2(0.5) + Vector2(float(padding), float(padding)); - } - edgeCount++; - } - if (edgeCount == 3) { - raster::drawTriangle(raster::Mode_Antialiased, extents, true, vertices, AtlasPacker::setBitsCallback, bitmap); - } else { - raster::drawQuad(raster::Mode_Antialiased, extents, true, vertices, AtlasPacker::setBitsCallback, bitmap); - } - } - // Expand chart by padding pixels. (dilation) - BitMap tmp(w, h); - for (int i = 0; i < padding; i++) { - tmp.clearAll(); - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - bool b = bitmap->bitAt(x, y); - if (!b) { - if (x > 0) { - b |= bitmap->bitAt(x - 1, y); - if (y > 0) b |= bitmap->bitAt(x - 1, y - 1); - if (y < h - 1) b |= bitmap->bitAt(x - 1, y + 1); - } - if (y > 0) b |= bitmap->bitAt(x, y - 1); - if (y < h - 1) b |= bitmap->bitAt(x, y + 1); - if (x < w - 1) { - b |= bitmap->bitAt(x + 1, y); - if (y > 0) b |= bitmap->bitAt(x + 1, y - 1); - if (y < h - 1) b |= bitmap->bitAt(x + 1, y + 1); - } - } - if (b) tmp.setBitAt(x, y); - } - } - std::swap(tmp, *bitmap); - } - } - - void drawChartBitmap(const Chart *chart, BitMap *bitmap, const Vector2 &scale, const Vector2 &offset) + void addChart(BitImage *atlasBitImage, const BitImage *chartBitImage, const BitImage *chartBitImageRotated, int atlas_w, int atlas_h, int offset_x, int offset_y, int r) { - const int w = bitmap->width(); - const int h = bitmap->height(); - const Vector2 extents = Vector2(float(w), float(h)); - static const Vector2 pad[4] = { - Vector2(-0.5, -0.5), - Vector2(0.5, -0.5), - Vector2(-0.5, 0.5), - Vector2(0.5, 0.5) - }; - // Rasterize 4 times to add proper padding. - for (int i = 0; i < 4; i++) { - // Rasterize chart faces, check that all bits are not set. - const uint32_t faceCount = chart->chartMesh()->faceCount(); - for (uint32_t f = 0; f < faceCount; f++) { - const halfedge::Face *face = chart->chartMesh()->faceAt(f); - Vector2 vertices[4]; - uint32_t edgeCount = 0; - for (halfedge::Face::ConstEdgeIterator it(face->edges()); !it.isDone(); it.advance()) { - if (edgeCount < 4) { - vertices[edgeCount] = it.vertex()->tex * scale + offset + pad[i]; - xaAssert(ftoi_ceil(vertices[edgeCount].x) >= 0); - xaAssert(ftoi_ceil(vertices[edgeCount].y) >= 0); - xaAssert(ftoi_ceil(vertices[edgeCount].x) <= w); - xaAssert(ftoi_ceil(vertices[edgeCount].y) <= h); - } - edgeCount++; - } - if (edgeCount == 3) { - raster::drawTriangle(raster::Mode_Antialiased, extents, /*enableScissors=*/true, vertices, AtlasPacker::setBitsCallback, bitmap); - } else { - raster::drawQuad(raster::Mode_Antialiased, extents, /*enableScissors=*/true, vertices, AtlasPacker::setBitsCallback, bitmap); - } - } - } - // Expand chart by padding pixels. (dilation) - BitMap tmp(w, h); - tmp.clearAll(); + XA_DEBUG_ASSERT(r == 0 || r == 1); + const BitImage *image = r == 0 ? chartBitImage : chartBitImageRotated; + const int w = image->width(); + const int h = image->height(); for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - bool b = bitmap->bitAt(x, y); - if (!b) { - if (x > 0) { - b |= bitmap->bitAt(x - 1, y); - if (y > 0) b |= bitmap->bitAt(x - 1, y - 1); - if (y < h - 1) b |= bitmap->bitAt(x - 1, y + 1); - } - if (y > 0) b |= bitmap->bitAt(x, y - 1); - if (y < h - 1) b |= bitmap->bitAt(x, y + 1); - if (x < w - 1) { - b |= bitmap->bitAt(x + 1, y); - if (y > 0) b |= bitmap->bitAt(x + 1, y - 1); - if (y < h - 1) b |= bitmap->bitAt(x + 1, y + 1); - } - } - if (b) tmp.setBitAt(x, y); - } - } - std::swap(tmp, *bitmap); - } - - bool canAddChart(const BitMap *bitmap, int atlas_w, int atlas_h, int offset_x, int offset_y, int r) - { - xaDebugAssert(r == 0 || r == 1); - // Check whether the two bitmaps overlap. - const int w = bitmap->width(); - const int h = bitmap->height(); - if (r == 0) { - for (int y = 0; y < h; y++) { - int yy = y + offset_y; - if (yy >= 0) { - for (int x = 0; x < w; x++) { - int xx = x + offset_x; - if (xx >= 0) { - if (bitmap->bitAt(x, y)) { - if (xx < atlas_w && yy < atlas_h) { - if (m_bitmap.bitAt(xx, yy)) return false; - } - } - } - } - } - } - } else if (r == 1) { - for (int y = 0; y < h; y++) { - int xx = y + offset_x; - if (xx >= 0) { - for (int x = 0; x < w; x++) { - int yy = x + offset_y; - if (yy >= 0) { - if (bitmap->bitAt(x, y)) { - if (xx < atlas_w && yy < atlas_h) { - if (m_bitmap.bitAt(xx, yy)) return false; - } - } - } - } - } - } - } - return true; - } - - void addChart(const BitMap *bitmap, int atlas_w, int atlas_h, int offset_x, int offset_y, int r) - { - xaDebugAssert(r == 0 || r == 1); - // Check whether the two bitmaps overlap. - const int w = bitmap->width(); - const int h = bitmap->height(); - if (r == 0) { - for (int y = 0; y < h; y++) { - int yy = y + offset_y; - if (yy >= 0) { - for (int x = 0; x < w; x++) { - int xx = x + offset_x; - if (xx >= 0) { - if (bitmap->bitAt(x, y)) { - if (xx < atlas_w && yy < atlas_h) { - xaDebugAssert(m_bitmap.bitAt(xx, yy) == false); - m_bitmap.setBitAt(xx, yy); - } - } - } - } - } - } - } else if (r == 1) { - for (int y = 0; y < h; y++) { - int xx = y + offset_x; - if (xx >= 0) { - for (int x = 0; x < w; x++) { - int yy = x + offset_y; - if (yy >= 0) { - if (bitmap->bitAt(x, y)) { - if (xx < atlas_w && yy < atlas_h) { - xaDebugAssert(m_bitmap.bitAt(xx, yy) == false); - m_bitmap.setBitAt(xx, yy); - } + int yy = y + offset_y; + if (yy >= 0) { + for (int x = 0; x < w; x++) { + int xx = x + offset_x; + if (xx >= 0) { + if (image->bitAt(x, y)) { + if (xx < atlas_w && yy < atlas_h) { + XA_DEBUG_ASSERT(atlasBitImage->bitAt(xx, yy) == false); + atlasBitImage->setBitAt(xx, yy); } } } @@ -7350,458 +7475,996 @@ private: } } - static bool setBitsCallback(void *param, int x, int y, Vector3::Arg, Vector3::Arg, Vector3::Arg, float area) + struct DrawTriangleCallbackArgs { - BitMap *bitmap = (BitMap * )param; - if (area > 0.0) { - bitmap->setBitAt(x, y); - } - return true; - } + BitImage *chartBitImage; + BitImage *chartBitImageRotated; + }; - // Compute the convex hull using Graham Scan. - static void convexHull(const std::vector<Vector2> &input, std::vector<Vector2> &output, float epsilon) + static bool drawTriangleCallback(void *param, int x, int y) { - const uint32_t inputCount = input.size(); - std::vector<float> coords(inputCount); - for (uint32_t i = 0; i < inputCount; i++) { - coords[i] = input[i].x; - } - RadixSort radix; - radix.sort(coords); - const uint32_t *ranks = radix.ranks(); - std::vector<Vector2> top; - top.reserve(inputCount); - std::vector<Vector2> bottom; - bottom.reserve(inputCount); - Vector2 P = input[ranks[0]]; - Vector2 Q = input[ranks[inputCount - 1]]; - float topy = std::max(P.y, Q.y); - float boty = std::min(P.y, Q.y); - for (uint32_t i = 0; i < inputCount; i++) { - Vector2 p = input[ranks[i]]; - if (p.y >= boty) top.push_back(p); - } - for (uint32_t i = 0; i < inputCount; i++) { - Vector2 p = input[ranks[inputCount - 1 - i]]; - if (p.y <= topy) bottom.push_back(p); - } - // Filter top list. - output.clear(); - output.push_back(top[0]); - output.push_back(top[1]); - for (uint32_t i = 2; i < top.size(); ) { - Vector2 a = output[output.size() - 2]; - Vector2 b = output[output.size() - 1]; - Vector2 c = top[i]; - float area = triangleArea(a, b, c); - if (area >= -epsilon) { - output.pop_back(); - } - if (area < -epsilon || output.size() == 1) { - output.push_back(c); - i++; - } - } - uint32_t top_count = output.size(); - output.push_back(bottom[1]); - // Filter bottom list. - for (uint32_t i = 2; i < bottom.size(); ) { - Vector2 a = output[output.size() - 2]; - Vector2 b = output[output.size() - 1]; - Vector2 c = bottom[i]; - float area = triangleArea(a, b, c); - if (area >= -epsilon) { - output.pop_back(); - } - if (area < -epsilon || output.size() == top_count) { - output.push_back(c); - i++; - } - } - // Remove duplicate element. - xaDebugAssert(output.front() == output.back()); - output.pop_back(); + auto args = (DrawTriangleCallbackArgs *)param; + args->chartBitImage->setBitAt(x, y); + if (args->chartBitImageRotated) + args->chartBitImageRotated->setBitAt(y, x); + return true; } - // This should compute convex hull and use rotating calipers to find the best box. Currently it uses a brute force method. - static void computeBoundingBox(Chart *chart, Vector2 *majorAxis, Vector2 *minorAxis, Vector2 *minCorner, Vector2 *maxCorner) - { - // Compute list of boundary points. - std::vector<Vector2> points; - points.reserve(16); - halfedge::Mesh *mesh = chart->chartMesh(); - const uint32_t vertexCount = mesh->vertexCount(); - for (uint32_t i = 0; i < vertexCount; i++) { - halfedge::Vertex *vertex = mesh->vertexAt(i); - if (vertex->isBoundary()) { - points.push_back(vertex->tex); - } - } - xaDebugAssert(points.size() > 0); - std::vector<Vector2> hull; - convexHull(points, hull, 0.00001f); - // @@ Ideally I should use rotating calipers to find the best box. Using brute force for now. - float best_area = FLT_MAX; - Vector2 best_min; - Vector2 best_max; - Vector2 best_axis; - const uint32_t hullCount = hull.size(); - for (uint32_t i = 0, j = hullCount - 1; i < hullCount; j = i, i++) { - if (equal(hull[i], hull[j])) { - continue; - } - Vector2 axis = normalize(hull[i] - hull[j], 0.0f); - xaDebugAssert(isFinite(axis)); - // Compute bounding box. - Vector2 box_min(FLT_MAX, FLT_MAX); - Vector2 box_max(-FLT_MAX, -FLT_MAX); - for (uint32_t v = 0; v < hullCount; v++) { - Vector2 point = hull[v]; - float x = dot(axis, point); - if (x < box_min.x) box_min.x = x; - if (x > box_max.x) box_max.x = x; - float y = dot(Vector2(-axis.y, axis.x), point); - if (y < box_min.y) box_min.y = y; - if (y > box_max.y) box_max.y = y; - } - // Compute box area. - float area = (box_max.x - box_min.x) * (box_max.y - box_min.y); - if (area < best_area) { - best_area = area; - best_min = box_min; - best_max = box_max; - best_axis = axis; - } - } - // Consider all points, not only boundary points, in case the input chart is malformed. - for (uint32_t i = 0; i < vertexCount; i++) { - halfedge::Vertex *vertex = mesh->vertexAt(i); - Vector2 point = vertex->tex; - float x = dot(best_axis, point); - if (x < best_min.x) best_min.x = x; - if (x > best_max.x) best_max.x = x; - float y = dot(Vector2(-best_axis.y, best_axis.x), point); - if (y < best_min.y) best_min.y = y; - if (y > best_max.y) best_max.y = y; - } - *majorAxis = best_axis; - *minorAxis = Vector2(-best_axis.y, best_axis.x); - *minCorner = best_min; - *maxCorner = best_max; - } - - Atlas *m_atlas; - BitMap m_bitmap; + Array<AtlasImage *> m_atlasImages; + Array<float> m_utilization; + Array<BitImage *> m_bitImages; + BoundingBox2D m_boundingBox; + Array<Chart *> m_charts; RadixSort m_radix; - uint32_t m_width; - uint32_t m_height; - MTRand m_rand; - std::vector<std::vector<Vector2> > m_originalChartUvs; + uint32_t m_width = 0; + uint32_t m_height = 0; + float m_texelsPerUnit = 0.0f; + KISSRng m_rand; }; -} // namespace param +} // namespace pack } // namespace internal -struct Atlas -{ - internal::param::Atlas atlas; - std::vector<internal::halfedge::Mesh *> heMeshes; - uint32_t width = 0; - uint32_t height = 0; - OutputMesh **outputMeshes = NULL; +struct Context +{ + Atlas atlas; + uint32_t meshCount = 0; + internal::Progress *addMeshProgress = nullptr; + internal::TaskGroupHandle addMeshTaskGroup; + internal::param::Atlas paramAtlas; + ProgressFunc progressFunc = nullptr; + void *progressUserData = nullptr; + internal::TaskScheduler *taskScheduler; + internal::Array<internal::UvMesh *> uvMeshes; + internal::Array<internal::UvMeshInstance *> uvMeshInstances; }; -void SetPrint(PrintFunc print) +Atlas *Create() { - internal::s_print = print; + Context *ctx = XA_NEW(internal::MemTag::Default, Context); + memset(&ctx->atlas, 0, sizeof(Atlas)); + ctx->taskScheduler = XA_NEW(internal::MemTag::Default, internal::TaskScheduler); + return &ctx->atlas; } -Atlas *Create() -{ - Atlas *atlas = new Atlas(); - return atlas; +static void DestroyOutputMeshes(Context *ctx) +{ + if (!ctx->atlas.meshes) + return; + for (int i = 0; i < (int)ctx->atlas.meshCount; i++) { + Mesh &mesh = ctx->atlas.meshes[i]; + for (uint32_t j = 0; j < mesh.chartCount; j++) { + if (mesh.chartArray[j].indexArray) + XA_FREE(mesh.chartArray[j].indexArray); + } + if (mesh.chartArray) + XA_FREE(mesh.chartArray); + if (mesh.vertexArray) + XA_FREE(mesh.vertexArray); + if (mesh.indexArray) + XA_FREE(mesh.indexArray); + } + if (ctx->atlas.meshes) + XA_FREE(ctx->atlas.meshes); + ctx->atlas.meshes = nullptr; } void Destroy(Atlas *atlas) { - xaAssert(atlas); - for (int i = 0; i < (int)atlas->heMeshes.size(); i++) { - delete atlas->heMeshes[i]; - if (atlas->outputMeshes) { - OutputMesh *outputMesh = atlas->outputMeshes[i]; - for (uint32_t j = 0; j < outputMesh->chartCount; j++) - delete [] outputMesh->chartArray[j].indexArray; - delete [] outputMesh->chartArray; - delete [] outputMesh->vertexArray; - delete [] outputMesh->indexArray; - delete outputMesh; - } - } - delete [] atlas->outputMeshes; - delete atlas; + XA_DEBUG_ASSERT(atlas); + Context *ctx = (Context *)atlas; + if (atlas->utilization) + XA_FREE(atlas->utilization); + if (atlas->image) + XA_FREE(atlas->image); + DestroyOutputMeshes(ctx); + if (ctx->addMeshProgress) { + ctx->addMeshProgress->cancel = true; + AddMeshJoin(atlas); // frees addMeshProgress + } + ctx->taskScheduler->~TaskScheduler(); + XA_FREE(ctx->taskScheduler); + for (uint32_t i = 0; i < ctx->uvMeshes.size(); i++) { + internal::UvMesh *mesh = ctx->uvMeshes[i]; + for (uint32_t j = 0; j < mesh->charts.size(); j++) { + mesh->charts[j]->~UvMeshChart(); + XA_FREE(mesh->charts[j]); + } + mesh->~UvMesh(); + XA_FREE(mesh); + } + for (uint32_t i = 0; i < ctx->uvMeshInstances.size(); i++) { + internal::UvMeshInstance *mesh = ctx->uvMeshInstances[i]; + mesh->~UvMeshInstance(); + XA_FREE(mesh); + } + ctx->~Context(); + XA_FREE(ctx); +#if XA_DEBUG_HEAP + internal::ReportLeaks(); +#endif } -static internal::Vector3 DecodePosition(const InputMesh &mesh, uint32_t index) +struct AddMeshTaskArgs { - xaAssert(mesh.vertexPositionData); - return *((const internal::Vector3 *)&((const uint8_t *)mesh.vertexPositionData)[mesh.vertexPositionStride * index]); + Context *ctx; + internal::Mesh *mesh; +}; + +static void runAddMeshTask(void *userData) +{ + XA_PROFILE_START(addMeshThread) + auto args = (AddMeshTaskArgs *)userData; // Responsible for freeing this. + internal::Mesh *mesh = args->mesh; + internal::Progress *progress = args->ctx->addMeshProgress; + if (progress->cancel) + goto cleanup; + { + XA_PROFILE_START(addMeshCreateColocals) + mesh->createColocals(); + XA_PROFILE_END(addMeshCreateColocals) + } + if (progress->cancel) + goto cleanup; + { + XA_PROFILE_START(addMeshCreateFaceGroups) + mesh->createFaceGroups(); + XA_PROFILE_END(addMeshCreateFaceGroups) + } + if (progress->cancel) + goto cleanup; + { + XA_PROFILE_START(addMeshCreateBoundaries) + mesh->createBoundaries(); + XA_PROFILE_END(addMeshCreateBoundaries) + } + if (progress->cancel) + goto cleanup; +#if XA_DEBUG_EXPORT_OBJ_SOURCE_MESHES + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_mesh_%03u.obj", mesh->id()); + FILE *file; + XA_FOPEN(file, filename, "w"); + if (file) { + mesh->writeObjVertices(file); + // groups + uint32_t numGroups = 0; + for (uint32_t i = 0; i < mesh->faceGroupCount(); i++) { + if (mesh->faceGroupAt(i) != UINT32_MAX) + numGroups = internal::max(numGroups, mesh->faceGroupAt(i) + 1); + } + for (uint32_t i = 0; i < numGroups; i++) { + fprintf(file, "o group_%04d\n", i); + fprintf(file, "s off\n"); + for (uint32_t f = 0; f < mesh->faceGroupCount(); f++) { + if (mesh->faceGroupAt(f) == i) + mesh->writeObjFace(file, f); + } + } + fprintf(file, "o group_ignored\n"); + fprintf(file, "s off\n"); + for (uint32_t f = 0; f < mesh->faceGroupCount(); f++) { + if (mesh->faceGroupAt(f) == UINT32_MAX) + mesh->writeObjFace(file, f); + } + mesh->writeObjBoundaryEges(file); + fclose(file); + } +#endif + { + XA_PROFILE_START(addMeshCreateChartGroupsReal) + args->ctx->paramAtlas.addMesh(args->ctx->taskScheduler, mesh); // addMesh is thread safe + XA_PROFILE_END(addMeshCreateChartGroupsReal) + } + if (progress->cancel) + goto cleanup; + progress->value++; + progress->update(); +cleanup: + mesh->~Mesh(); + XA_FREE(mesh); + args->~AddMeshTaskArgs(); + XA_FREE(args); + XA_PROFILE_END(addMeshThread) } -static internal::Vector3 DecodeNormal(const InputMesh &mesh, uint32_t index) +static internal::Vector3 DecodePosition(const MeshDecl &meshDecl, uint32_t index) { - xaAssert(mesh.vertexNormalData); - return *((const internal::Vector3 *)&((const uint8_t *)mesh.vertexNormalData)[mesh.vertexNormalStride * index]); + XA_DEBUG_ASSERT(meshDecl.vertexPositionData); + XA_DEBUG_ASSERT(meshDecl.vertexPositionStride > 0); + return *((const internal::Vector3 *)&((const uint8_t *)meshDecl.vertexPositionData)[meshDecl.vertexPositionStride * index]); } -static internal::Vector2 DecodeUv(const InputMesh &mesh, uint32_t index) +static internal::Vector3 DecodeNormal(const MeshDecl &meshDecl, uint32_t index) { - xaAssert(mesh.vertexUvData); - return *((const internal::Vector2 *)&((const uint8_t *)mesh.vertexUvData)[mesh.vertexUvStride * index]); + XA_DEBUG_ASSERT(meshDecl.vertexNormalData); + XA_DEBUG_ASSERT(meshDecl.vertexNormalStride > 0); + return *((const internal::Vector3 *)&((const uint8_t *)meshDecl.vertexNormalData)[meshDecl.vertexNormalStride * index]); } -static uint32_t DecodeIndex(IndexFormat::Enum format, const void *indexData, uint32_t i) +static internal::Vector2 DecodeUv(const MeshDecl &meshDecl, uint32_t index) { - if (format == IndexFormat::HalfFloat) - return (uint32_t)((const uint16_t *)indexData)[i]; - return ((const uint32_t *)indexData)[i]; + XA_DEBUG_ASSERT(meshDecl.vertexUvData); + XA_DEBUG_ASSERT(meshDecl.vertexUvStride > 0); + return *((const internal::Vector2 *)&((const uint8_t *)meshDecl.vertexUvData)[meshDecl.vertexUvStride * index]); } -static float EdgeLength(internal::Vector3 pos1, internal::Vector3 pos2) +static uint32_t DecodeIndex(IndexFormat::Enum format, const void *indexData, int32_t offset, uint32_t i) { - return internal::length(pos2 - pos1); + XA_DEBUG_ASSERT(indexData); + if (format == IndexFormat::UInt16) + return uint16_t((int32_t)((const uint16_t *)indexData)[i] + offset); + return uint32_t((int32_t)((const uint32_t *)indexData)[i] + offset); } -AddMeshError AddMesh(Atlas *atlas, const InputMesh &mesh, bool useColocalVertices) +AddMeshError::Enum AddMesh(Atlas *atlas, const MeshDecl &meshDecl, uint32_t meshCountHint) { - xaAssert(atlas); - AddMeshError error; - error.code = AddMeshErrorCode::Success; - error.face = error.index0 = error.index1 = UINT32_MAX; - // Expecting triangle faces. - if ((mesh.indexCount % 3) != 0) - { - error.code = AddMeshErrorCode::InvalidIndexCount; - return error; - } - // Check if any index is out of range. - for (uint32_t j = 0; j < mesh.indexCount; j++) { - const uint32_t index = DecodeIndex(mesh.indexFormat, mesh.indexData, j); - if (index < 0 || index >= mesh.vertexCount) { - error.code = AddMeshErrorCode::IndexOutOfRange; - error.index0 = index; - return error; - } - } - // Build half edge mesh. - internal::halfedge::Mesh *heMesh = new internal::halfedge::Mesh; - std::vector<uint32_t> canonicalMap; - canonicalMap.reserve(mesh.vertexCount); - for (uint32_t i = 0; i < mesh.vertexCount; i++) { - internal::halfedge::Vertex *vertex = heMesh->addVertex(DecodePosition(mesh, i)); - if (mesh.vertexNormalData) - vertex->nor = DecodeNormal(mesh, i); - if (mesh.vertexUvData) - vertex->tex = DecodeUv(mesh, i); - // Link colocals. You probably want to do this more efficiently! Sort by one axis or use a hash or grid. - uint32_t firstColocal = i; - if (useColocalVertices) { - for (uint32_t j = 0; j < i; j++) { - if (vertex->pos != DecodePosition(mesh, j)) - continue; -#if 0 - if (mesh.vertexNormalData && vertex->nor != DecodeNormal(mesh, j)) - continue; + XA_DEBUG_ASSERT(atlas); + if (!atlas) { + XA_PRINT_WARNING("AddMesh: atlas is null.\n"); + return AddMeshError::Error; + } + Context *ctx = (Context *)atlas; + if (!ctx->uvMeshes.isEmpty()) { + XA_PRINT_WARNING("AddMesh: Meshes and UV meshes cannot be added to the same atlas.\n"); + return AddMeshError::Error; + } +#if XA_PROFILE + if (ctx->meshCount == 0) + internal::s_profile.addMeshReal = clock(); #endif - if (mesh.vertexUvData && vertex->tex != DecodeUv(mesh, j)) - continue; - firstColocal = j; - break; - } - } - canonicalMap.push_back(firstColocal); + // Don't know how many times AddMesh will be called, so progress needs to adjusted each time. + if (!ctx->addMeshProgress) { + ctx->addMeshProgress = XA_NEW(internal::MemTag::Default, internal::Progress, ProgressCategory::AddMesh, ctx->progressFunc, ctx->progressUserData, 1); + } + else { + ctx->addMeshProgress->setMaxValue(internal::max(ctx->meshCount + 1, meshCountHint)); } - heMesh->linkColocalsWithCanonicalMap(canonicalMap); - for (uint32_t i = 0; i < mesh.indexCount / 3; i++) { + bool decoded = (meshDecl.indexCount <= 0); + uint32_t indexCount = decoded ? meshDecl.vertexCount : meshDecl.indexCount; + XA_PRINT("Adding mesh %d: %u vertices, %u triangles\n", ctx->meshCount, meshDecl.vertexCount, indexCount / 3); + // Expecting triangle faces. + if ((indexCount % 3) != 0) + return AddMeshError::InvalidIndexCount; + if (!decoded) { + // Check if any index is out of range. + for (uint32_t i = 0; i < indexCount; i++) { + const uint32_t index = DecodeIndex(meshDecl.indexFormat, meshDecl.indexData, meshDecl.indexOffset, i); + if (index >= meshDecl.vertexCount) + return AddMeshError::IndexOutOfRange; + } + } + uint32_t meshFlags = internal::MeshFlags::HasFaceGroups | internal::MeshFlags::HasIgnoredFaces; + if (meshDecl.vertexNormalData) + meshFlags |= internal::MeshFlags::HasNormals; + internal::Mesh *mesh = XA_NEW(internal::MemTag::Mesh, internal::Mesh, meshDecl.epsilon, meshDecl.vertexCount, indexCount / 3, meshFlags, ctx->meshCount); + for (uint32_t i = 0; i < meshDecl.vertexCount; i++) { + internal::Vector3 normal(0.0f); + internal::Vector2 texcoord(0.0f); + if (meshDecl.vertexNormalData) + normal = DecodeNormal(meshDecl, i); + if (meshDecl.vertexUvData) + texcoord = DecodeUv(meshDecl, i); + mesh->addVertex(DecodePosition(meshDecl, i), normal, texcoord); + } + for (uint32_t i = 0; i < indexCount / 3; i++) { uint32_t tri[3]; for (int j = 0; j < 3; j++) - tri[j] = DecodeIndex(mesh.indexFormat, mesh.indexData, i * 3 + j); - // Check for zero length edges. + tri[j] = decoded ? i * 3 + j : DecodeIndex(meshDecl.indexFormat, meshDecl.indexData, meshDecl.indexOffset, i * 3 + j); + bool ignore = false; + // Check for degenerate or zero length edges. for (int j = 0; j < 3; j++) { - const uint32_t edges[6] = { 0, 1, 1, 2, 2, 0 }; - const uint32_t index1 = tri[edges[j * 2 + 0]]; - const uint32_t index2 = tri[edges[j * 2 + 1]]; - const internal::Vector3 pos1 = DecodePosition(mesh, index1); - const internal::Vector3 pos2 = DecodePosition(mesh, index2); - if (EdgeLength(pos1, pos2) <= 0.0f) { - delete heMesh; - error.code = AddMeshErrorCode::ZeroLengthEdge; - error.face = i; - error.index0 = index1; - error.index1 = index2; - return error; - } - } - // Check for zero area faces. - { - const internal::Vector3 a = DecodePosition(mesh, tri[0]); - const internal::Vector3 b = DecodePosition(mesh, tri[1]); - const internal::Vector3 c = DecodePosition(mesh, tri[2]); - const float area = internal::length(internal::cross(b - a, c - a)) * 0.5f; - if (area <= 0.0f) { - delete heMesh; - error.code = AddMeshErrorCode::ZeroAreaFace; - error.face = i; - return error; - } - } - internal::halfedge::Face *face = heMesh->addFace(tri[0], tri[1], tri[2]); - - // -- GODOT start -- - if (!face && heMesh->errorCode == internal::halfedge::Mesh::ErrorCode::AlreadyAddedEdge) { - //there is still hope for this, no reason to not add, at least add as separate - face = heMesh->addUniqueFace(tri[0], tri[1], tri[2]); - } - // -- GODOT end -- - - if (!face) { - if (heMesh->errorCode == internal::halfedge::Mesh::ErrorCode::AlreadyAddedEdge) - error.code = AddMeshErrorCode::AlreadyAddedEdge; - else if (heMesh->errorCode == internal::halfedge::Mesh::ErrorCode::DegenerateColocalEdge) - error.code = AddMeshErrorCode::DegenerateColocalEdge; - else if (heMesh->errorCode == internal::halfedge::Mesh::ErrorCode::DegenerateEdge) - error.code = AddMeshErrorCode::DegenerateEdge; - else if (heMesh->errorCode == internal::halfedge::Mesh::ErrorCode::DuplicateEdge) - error.code = AddMeshErrorCode::DuplicateEdge; - error.face = i; - error.index0 = heMesh->errorIndex0; - error.index1 = heMesh->errorIndex1; - delete heMesh; - return error; - } - if (mesh.faceMaterialData) - face->material = mesh.faceMaterialData[i]; - } - heMesh->linkBoundary(); - atlas->heMeshes.push_back(heMesh); - return error; + const uint32_t index1 = tri[j]; + const uint32_t index2 = tri[(j + 1) % 3]; + if (index1 == index2) { + ignore = true; + XA_PRINT(" Degenerate edge: index %d, index %d\n", index1, index2); + break; + } + const internal::Vector3 &pos1 = mesh->position(index1); + const internal::Vector3 &pos2 = mesh->position(index2); + if (internal::length(pos2 - pos1) <= 0.0f) { + ignore = true; + XA_PRINT(" Zero length edge: index %d position (%g %g %g), index %d position (%g %g %g)\n", index1, pos1.x, pos1.y, pos1.z, index2, pos2.x, pos2.y, pos2.z); + break; + } + } + const internal::Vector3 &a = mesh->position(tri[0]); + const internal::Vector3 &b = mesh->position(tri[1]); + const internal::Vector3 &c = mesh->position(tri[2]); + // Check for zero area faces. Don't bother if a degenerate or zero length edge was already detected. + float area = 0.0f; + if (!ignore) { + area = internal::length(internal::cross(b - a, c - a)) * 0.5f; + if (area <= internal::kAreaEpsilon) { + ignore = true; + XA_PRINT(" Zero area face: %d, indices (%d %d %d), area is %f\n", i, tri[0], tri[1], tri[2], area); + } + } + if (!ignore) { + if (internal::equal(a, b, meshDecl.epsilon) || internal::equal(a, c, meshDecl.epsilon) || internal::equal(b, c, meshDecl.epsilon)) { + ignore = true; + XA_PRINT(" Degenerate face: %d, area is %f\n", i, area); + } + } + if (meshDecl.faceIgnoreData && meshDecl.faceIgnoreData[i]) + ignore = true; + mesh->addFace(tri[0], tri[1], tri[2], ignore); + } + if (ctx->addMeshTaskGroup.value == UINT32_MAX) + ctx->addMeshTaskGroup = ctx->taskScheduler->createTaskGroup(); + AddMeshTaskArgs *taskArgs = XA_NEW(internal::MemTag::Default, AddMeshTaskArgs); // The task frees this. + taskArgs->ctx = ctx; + taskArgs->mesh = mesh; + internal::Task task; + task.userData = taskArgs; + task.func = runAddMeshTask; + ctx->taskScheduler->run(ctx->addMeshTaskGroup, task); + ctx->meshCount++; + return AddMeshError::Success; } -void Generate(Atlas *atlas, CharterOptions charterOptions, PackerOptions packerOptions) -{ - xaAssert(atlas); - xaAssert(packerOptions.texelArea > 0); - // Chart meshes. - for (int i = 0; i < (int)atlas->heMeshes.size(); i++) { - std::vector<uint32_t> uncharted_materials; - atlas->atlas.computeCharts(atlas->heMeshes[i], charterOptions, uncharted_materials); - } - atlas->atlas.parameterizeCharts(); - internal::param::AtlasPacker packer(&atlas->atlas); - packer.packCharts(packerOptions); - //float utilization = return packer.computeAtlasUtilization(); - atlas->width = packer.getWidth(); - atlas->height = packer.getHeight(); - // Build output meshes. - atlas->outputMeshes = new OutputMesh*[atlas->heMeshes.size()]; - for (int i = 0; i < (int)atlas->heMeshes.size(); i++) { - const internal::halfedge::Mesh *heMesh = atlas->heMeshes[i]; - OutputMesh *outputMesh = atlas->outputMeshes[i] = new OutputMesh; - const internal::param::MeshCharts *charts = atlas->atlas.meshAt(i); - // Vertices. - outputMesh->vertexCount = charts->vertexCount(); - outputMesh->vertexArray = new OutputVertex[outputMesh->vertexCount]; - for (uint32_t i = 0; i < charts->chartCount(); i++) { - const internal::param::Chart *chart = charts->chartAt(i); - const uint32_t vertexOffset = charts->vertexCountBeforeChartAt(i); - for (uint32_t v = 0; v < chart->vertexCount(); v++) { - OutputVertex &output_vertex = outputMesh->vertexArray[vertexOffset + v]; - output_vertex.xref = chart->mapChartVertexToOriginalVertex(v); - internal::Vector2 uv = chart->chartMesh()->vertexAt(v)->tex; - output_vertex.uv[0] = uv.x; - output_vertex.uv[1] = uv.y; - } - } - // Indices. - outputMesh->indexCount = heMesh->faceCount() * 3; - outputMesh->indexArray = new uint32_t[outputMesh->indexCount]; - for (uint32_t f = 0; f < heMesh->faceCount(); f++) { - const uint32_t c = charts->faceChartAt(f); - const uint32_t i = charts->faceIndexWithinChartAt(f); - const uint32_t vertexOffset = charts->vertexCountBeforeChartAt(c); - const internal::param::Chart *chart = charts->chartAt(c); - xaDebugAssert(i < chart->chartMesh()->faceCount()); - xaDebugAssert(chart->faceAt(i) == f); - const internal::halfedge::Face *face = chart->chartMesh()->faceAt(i); - const internal::halfedge::Edge *edge = face->edge; - outputMesh->indexArray[3 * f + 0] = vertexOffset + edge->vertex->id; - outputMesh->indexArray[3 * f + 1] = vertexOffset + edge->next->vertex->id; - outputMesh->indexArray[3 * f + 2] = vertexOffset + edge->next->next->vertex->id; - } - // Charts. - outputMesh->chartCount = charts->chartCount(); - outputMesh->chartArray = new OutputChart[outputMesh->chartCount]; - for (uint32_t i = 0; i < charts->chartCount(); i++) { - OutputChart *outputChart = &outputMesh->chartArray[i]; - const internal::param::Chart *chart = charts->chartAt(i); - const uint32_t vertexOffset = charts->vertexCountBeforeChartAt(i); - const internal::halfedge::Mesh *mesh = chart->chartMesh(); - outputChart->indexCount = mesh->faceCount() * 3; - outputChart->indexArray = new uint32_t[outputChart->indexCount]; - for (uint32_t j = 0; j < mesh->faceCount(); j++) { - const internal::halfedge::Face *face = mesh->faceAt(j); - const internal::halfedge::Edge *edge = face->edge; - outputChart->indexArray[3 * j + 0] = vertexOffset + edge->vertex->id; - outputChart->indexArray[3 * j + 1] = vertexOffset + edge->next->vertex->id; - outputChart->indexArray[3 * j + 2] = vertexOffset + edge->next->next->vertex->id; +void AddMeshJoin(Atlas *atlas) +{ + XA_DEBUG_ASSERT(atlas); + if (!atlas) { + XA_PRINT_WARNING("AddMeshJoin: atlas is null.\n"); + return; + } + Context *ctx = (Context *)atlas; + if (!ctx->addMeshProgress) + return; + ctx->taskScheduler->wait(&ctx->addMeshTaskGroup); + ctx->addMeshProgress->~Progress(); + XA_FREE(ctx->addMeshProgress); + ctx->addMeshProgress = nullptr; +#if XA_PROFILE + XA_PRINT("Added %u meshes\n", ctx->meshCount); + internal::s_profile.addMeshReal = clock() - internal::s_profile.addMeshReal; +#endif + XA_PROFILE_PRINT_AND_RESET(" Total (real): ", addMeshReal) + XA_PROFILE_PRINT_AND_RESET(" Total (thread): ", addMeshThread) + XA_PROFILE_PRINT_AND_RESET(" Create colocals: ", addMeshCreateColocals) + XA_PROFILE_PRINT_AND_RESET(" Create face groups: ", addMeshCreateFaceGroups) + XA_PROFILE_PRINT_AND_RESET(" Create boundaries: ", addMeshCreateBoundaries) + XA_PROFILE_PRINT_AND_RESET(" Create chart groups (real): ", addMeshCreateChartGroupsReal) + XA_PROFILE_PRINT_AND_RESET(" Create chart groups (thread): ", addMeshCreateChartGroupsThread) + XA_PRINT_MEM_USAGE +} + +struct EdgeKey +{ + EdgeKey() {} + EdgeKey(const EdgeKey &k) : v0(k.v0), v1(k.v1) {} + EdgeKey(uint32_t v0, uint32_t v1) : v0(v0), v1(v1) {} + + void operator=(const EdgeKey &k) + { + v0 = k.v0; + v1 = k.v1; + } + bool operator==(const EdgeKey &k) const + { + return v0 == k.v0 && v1 == k.v1; + } + + uint32_t v0; + uint32_t v1; +}; + +AddMeshError::Enum AddUvMesh(Atlas *atlas, const UvMeshDecl &decl) +{ + XA_DEBUG_ASSERT(atlas); + if (!atlas) { + XA_PRINT_WARNING("AddUvMesh: atlas is null.\n"); + return AddMeshError::Error; + } + Context *ctx = (Context *)atlas; + if (ctx->meshCount > 0) { + XA_PRINT_WARNING("AddUvMesh: Meshes and UV meshes cannot be added to the same atlas.\n"); + return AddMeshError::Error; + } + const bool decoded = (decl.indexCount <= 0); + const uint32_t indexCount = decoded ? decl.vertexCount : decl.indexCount; + XA_PRINT("Adding UV mesh %d: %u vertices, %u triangles\n", ctx->uvMeshes.size(), decl.vertexCount, indexCount / 3); + // Expecting triangle faces. + if ((indexCount % 3) != 0) + return AddMeshError::InvalidIndexCount; + if (!decoded) { + // Check if any index is out of range. + for (uint32_t i = 0; i < indexCount; i++) { + const uint32_t index = DecodeIndex(decl.indexFormat, decl.indexData, decl.indexOffset, i); + if (index >= decl.vertexCount) + return AddMeshError::IndexOutOfRange; + } + } + internal::UvMeshInstance *meshInstance = XA_NEW(internal::MemTag::Default, internal::UvMeshInstance); + meshInstance->texcoords.resize(decl.vertexCount); + for (uint32_t i = 0; i < decl.vertexCount; i++) + meshInstance->texcoords[i] = *((const internal::Vector2 *)&((const uint8_t *)decl.vertexUvData)[decl.vertexStride * i]); + meshInstance->rotateCharts = decl.rotateCharts; + // See if this is an instance of an already existing mesh. + internal::UvMesh *mesh = nullptr; + for (uint32_t m = 0; m < ctx->uvMeshes.size(); m++) { + if (memcmp(&ctx->uvMeshes[m]->decl, &decl, sizeof(UvMeshDecl)) == 0) { + meshInstance->mesh = mesh = ctx->uvMeshes[m]; + break; + } + } + if (!mesh) { + // Copy geometry to mesh. + meshInstance->mesh = mesh = XA_NEW(internal::MemTag::Default, internal::UvMesh); + mesh->decl = decl; + mesh->indices.resize(decl.indexCount); + for (uint32_t i = 0; i < indexCount; i++) + mesh->indices[i] = decoded ? i : DecodeIndex(decl.indexFormat, decl.indexData, decl.indexOffset, i); + mesh->vertexToChartMap.resize(decl.vertexCount); + for (uint32_t i = 0; i < mesh->vertexToChartMap.size(); i++) + mesh->vertexToChartMap[i] = UINT32_MAX; + // Calculate charts (incident faces). + internal::HashMap<internal::Vector2, uint32_t> vertexToFaceMap(internal::MemTag::Default, indexCount); + const uint32_t faceCount = indexCount / 3; + for (uint32_t i = 0; i < indexCount; i++) + vertexToFaceMap.add(meshInstance->texcoords[mesh->indices[i]], i / 3); + internal::BitArray faceAssigned(faceCount); + faceAssigned.clearAll(); + internal::Array<uint32_t> chartFaces; + for (uint32_t f = 0; f < faceCount; f++) { + if (faceAssigned.bitAt(f)) + continue; + // Found an unassigned face, create a new chart. + internal::UvMeshChart *chart = XA_NEW(internal::MemTag::Default, internal::UvMeshChart); + chart->material = decl.faceMaterialData ? decl.faceMaterialData[f] : 0; + // Walk incident faces and assign them to the chart. + faceAssigned.setBitAt(f); + chartFaces.clear(); + chartFaces.push_back(f); + for (;;) { + bool newFaceAssigned = false; + const uint32_t faceCount2 = chartFaces.size(); + for (uint32_t f2 = 0; f2 < faceCount2; f2++) { + const uint32_t face = chartFaces[f2]; + for (uint32_t i = 0; i < 3; i++) { + const internal::Vector2 &texcoord = meshInstance->texcoords[meshInstance->mesh->indices[face * 3 + i]]; + uint32_t mapFaceIndex = vertexToFaceMap.get(texcoord); + while (mapFaceIndex != UINT32_MAX) { + const uint32_t face2 = vertexToFaceMap.value(mapFaceIndex); + // Materials must match. + if (!faceAssigned.bitAt(face2) && (!decl.faceMaterialData || decl.faceMaterialData[face] == decl.faceMaterialData[face2])) { + faceAssigned.setBitAt(face2); + chartFaces.push_back(face2); + newFaceAssigned = true; + } + mapFaceIndex = vertexToFaceMap.getNext(mapFaceIndex); + } + } + } + if (!newFaceAssigned) + break; + } + for (uint32_t i = 0; i < chartFaces.size(); i++) { + for (uint32_t j = 0; j < 3; j++) { + const uint32_t vertex = meshInstance->mesh->indices[chartFaces[i] * 3 + j]; + chart->indices.push_back(vertex); + mesh->vertexToChartMap[vertex] = mesh->charts.size(); + } + } + mesh->charts.push_back(chart); + } + ctx->uvMeshes.push_back(mesh); + } else { + XA_PRINT(" instance of a previous UV mesh\n"); + } + XA_PRINT(" %u charts\n", meshInstance->mesh->charts.size()); + ctx->uvMeshInstances.push_back(meshInstance); + return AddMeshError::Success; +} + +void ComputeCharts(Atlas *atlas, ChartOptions chartOptions) +{ + if (!atlas) { + XA_PRINT_WARNING("ComputeCharts: atlas is null.\n"); + return; + } + Context *ctx = (Context *)atlas; + if (!ctx->uvMeshInstances.isEmpty()) { + XA_PRINT_WARNING("ComputeCharts: This function should not be called with UV meshes.\n"); + return; + } + AddMeshJoin(atlas); + if (ctx->meshCount == 0) { + XA_PRINT_WARNING("ComputeCharts: No meshes. Call AddMesh first.\n"); + return; + } + XA_PRINT("Computing charts\n"); + uint32_t chartCount = 0, chartsWithHolesCount = 0, holesCount = 0, chartsWithTJunctionsCount = 0, tJunctionsCount = 0; + XA_PROFILE_START(computeChartsReal) + if (!ctx->paramAtlas.computeCharts(ctx->taskScheduler, chartOptions, ctx->progressFunc, ctx->progressUserData)) { + XA_PRINT(" Cancelled by user\n"); + return; + } + XA_PROFILE_END(computeChartsReal) + // Count charts and print warnings. + for (uint32_t i = 0; i < ctx->meshCount; i++) { + for (uint32_t j = 0; j < ctx->paramAtlas.chartGroupCount(i); j++) { + const internal::param::ChartGroup *chartGroup = ctx->paramAtlas.chartGroupAt(i, j); + if (chartGroup->isVertexMap()) + continue; + for (uint32_t k = 0; k < chartGroup->chartCount(); k++) { + const internal::param::Chart *chart = chartGroup->chartAt(k); + if (chart->warningFlags() & internal::param::ChartWarningFlags::CloseHolesFailed) + XA_PRINT_WARNING(" Chart %u (mesh %u, group %u, id %u): failed to close holes\n", chartCount, i, j, k); + if (chart->warningFlags() & internal::param::ChartWarningFlags::FixTJunctionsDuplicatedEdge) + XA_PRINT_WARNING(" Chart %u (mesh %u, group %u, id %u): fixing t-junctions created non-manifold geometry\n", chartCount, i, j, k); + if (chart->warningFlags() & internal::param::ChartWarningFlags::FixTJunctionsFailed) + XA_PRINT_WARNING(" Chart %u (mesh %u, group %u, id %u): fixing t-junctions failed\n", chartCount, i, j, k); + if (chart->warningFlags() & internal::param::ChartWarningFlags::TriangulateDuplicatedEdge) + XA_PRINT_WARNING(" Chart %u (mesh %u, group %u, id %u): triangulation created non-manifold geometry\n", chartCount, i, j, k); + if (!chart->isDisk()) + XA_PRINT_WARNING(" Chart %u (mesh %u, group %u, id %u): doesn't have disk topology\n", chartCount, i, j, k); + holesCount += chart->closedHolesCount(); + if (chart->closedHolesCount() > 0) + chartsWithHolesCount++; + tJunctionsCount += chart->fixedTJunctionsCount(); + if (chart->fixedTJunctionsCount() > 0) + chartsWithTJunctionsCount++; + chartCount++; + } + } + } + if (holesCount > 0) + XA_PRINT(" Closed %u holes in %u charts\n", holesCount, chartsWithHolesCount); + if (tJunctionsCount > 0) + XA_PRINT(" Fixed %u t-junctions in %u charts\n", tJunctionsCount, chartsWithTJunctionsCount); + XA_PRINT(" %u charts\n", chartCount); + XA_PROFILE_PRINT_AND_RESET(" Total (real): ", computeChartsReal) + XA_PROFILE_PRINT_AND_RESET(" Total (thread): ", computeChartsThread) + XA_PROFILE_PRINT_AND_RESET(" Atlas builder: ", atlasBuilder) + XA_PROFILE_PRINT_AND_RESET(" Init: ", atlasBuilderInit) + XA_PROFILE_PRINT_AND_RESET(" Create initial charts: ", atlasBuilderCreateInitialCharts) + XA_PROFILE_PRINT_AND_RESET(" Grow charts: ", atlasBuilderGrowCharts) + XA_PROFILE_PRINT_AND_RESET(" Merge charts: ", atlasBuilderMergeCharts) + XA_PROFILE_PRINT_AND_RESET(" Create chart meshes (real): ", createChartMeshesReal) + XA_PROFILE_PRINT_AND_RESET(" Create chart meshes (thread): ", createChartMeshesThread) + XA_PROFILE_PRINT_AND_RESET(" Fix t-junctions: ", fixChartMeshTJunctions) + XA_PROFILE_PRINT_AND_RESET(" Close holes: ", closeChartMeshHoles) + XA_PRINT_MEM_USAGE +} + +void ParameterizeCharts(Atlas *atlas, ParameterizeFunc func) +{ + if (!atlas) { + XA_PRINT_WARNING("ParameterizeCharts: atlas is null.\n"); + return; + } + Context *ctx = (Context *)atlas; + if (!ctx->uvMeshInstances.isEmpty()) { + XA_PRINT_WARNING("ParameterizeCharts: This function should not be called with UV meshes.\n"); + return; + } + if (!ctx->paramAtlas.chartsComputed()) { + XA_PRINT_WARNING("ParameterizeCharts: ComputeCharts must be called first.\n"); + return; + } + atlas->atlasCount = 0; + atlas->height = 0; + atlas->texelsPerUnit = 0; + atlas->width = 0; + if (atlas->utilization) { + XA_FREE(atlas->utilization); + atlas->utilization = nullptr; + } + if (atlas->image) { + XA_FREE(atlas->image); + atlas->image = nullptr; + } + DestroyOutputMeshes(ctx); + XA_PRINT("Parameterizing charts\n"); + XA_PROFILE_START(parameterizeChartsReal) + if (!ctx->paramAtlas.parameterizeCharts(ctx->taskScheduler, func, ctx->progressFunc, ctx->progressUserData)) { + XA_PRINT(" Cancelled by user\n"); + return; + } + XA_PROFILE_END(parameterizeChartsReal) + uint32_t chartCount = 0, orthoChartsCount = 0, planarChartsCount = 0, chartsAddedCount = 0, chartsDeletedCount = 0; + for (uint32_t i = 0; i < ctx->meshCount; i++) { + for (uint32_t j = 0; j < ctx->paramAtlas.chartGroupCount(i); j++) { + const internal::param::ChartGroup *chartGroup = ctx->paramAtlas.chartGroupAt(i, j); + if (chartGroup->isVertexMap()) + continue; + for (uint32_t k = 0; k < chartGroup->chartCount(); k++) { + const internal::param::Chart *chart = chartGroup->chartAt(k); + if (chart->isPlanar()) + planarChartsCount++; + else if (chart->isOrtho()) + orthoChartsCount++; + } + chartCount += chartGroup->chartCount(); + chartsAddedCount += chartGroup->paramAddedChartsCount(); + chartsDeletedCount += chartGroup->paramDeletedChartsCount(); + } + } + XA_PRINT(" %u planar charts, %u ortho charts, %u other\n", planarChartsCount, orthoChartsCount, chartCount - (planarChartsCount + orthoChartsCount)); + if (chartsDeletedCount > 0) { + XA_PRINT(" %u charts deleted due to invalid parameterizations, %u new charts added\n", chartsDeletedCount, chartsAddedCount); + XA_PRINT(" %u charts\n", ctx->paramAtlas.chartCount()); + } + uint32_t chartIndex = 0, invalidParamCount = 0; + for (uint32_t i = 0; i < ctx->meshCount; i++) { + for (uint32_t j = 0; j < ctx->paramAtlas.chartGroupCount(i); j++) { + const internal::param::ChartGroup *chartGroup = ctx->paramAtlas.chartGroupAt(i, j); + if (chartGroup->isVertexMap()) + continue; + for (uint32_t k = 0; k < chartGroup->chartCount(); k++) { + const internal::param::Chart *chart = chartGroup->chartAt(k); + const internal::param::ParameterizationQuality &quality = chart->paramQuality(); +#if XA_DEBUG_EXPORT_OBJ_CHARTS_AFTER_PARAMETERIZATION + { + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_chart_%03u_after_parameterization.obj", chartIndex); + chart->unifiedMesh()->writeObjFile(filename); + } +#endif + bool invalid = false; + if (quality.boundaryIntersection) { + invalid = true; + XA_PRINT_WARNING(" Chart %u (mesh %u, group %u, id %u) (%s): invalid parameterization, self-intersecting boundary.\n", chartIndex, i, j, k, chart->isPlanar() ? "planar" : chart->isOrtho() ? "ortho" : "other"); + } + if (quality.flippedTriangleCount > 0) { + invalid = true; + XA_PRINT_WARNING(" Chart %u (mesh %u, group %u, id %u) (%s): invalid parameterization, %u / %u flipped triangles.\n", chartIndex, i, j, k, chart->isPlanar() ? "planar" : chart->isOrtho() ? "ortho" : "other", quality.flippedTriangleCount, quality.totalTriangleCount); + } + if (invalid) + invalidParamCount++; +#if XA_DEBUG_EXPORT_OBJ_INVALID_PARAMETERIZATION + if (invalid) { + char filename[256]; + XA_SPRINTF(filename, sizeof(filename), "debug_chart_%03u_invalid_parameterization.obj", chartIndex); + const internal::Mesh *mesh = chart->unifiedMesh(); + FILE *file; + XA_FOPEN(file, filename, "w"); + if (file) { + mesh->writeObjVertices(file); + fprintf(file, "s off\n"); + fprintf(file, "o object\n"); + for (uint32_t f = 0; f < mesh->faceCount(); f++) + mesh->writeObjFace(file, f); + if (!chart->paramFlippedFaces().isEmpty()) { + fprintf(file, "o flipped_faces\n"); + for (uint32_t f = 0; f < chart->paramFlippedFaces().size(); f++) + mesh->writeObjFace(file, chart->paramFlippedFaces()[f]); + } + mesh->writeObjBoundaryEges(file); + mesh->writeObjLinkedBoundaries(file); + fclose(file); + } + } +#endif + chartIndex++; } } } + if (invalidParamCount > 0) + XA_PRINT_WARNING(" %u charts with invalid parameterizations\n", invalidParamCount); + XA_PROFILE_PRINT_AND_RESET(" Total (real): ", parameterizeChartsReal) + XA_PROFILE_PRINT_AND_RESET(" Total (thread): ", parameterizeChartsThread) + XA_PROFILE_PRINT_AND_RESET(" Orthogonal: ", parameterizeChartsOrthogonal) + XA_PROFILE_PRINT_AND_RESET(" LSCM: ", parameterizeChartsLSCM) + XA_PROFILE_PRINT_AND_RESET(" Evaluate quality: ", parameterizeChartsEvaluateQuality) + XA_PRINT_MEM_USAGE } -uint32_t GetWidth(const Atlas *atlas) +void PackCharts(Atlas *atlas, PackOptions packOptions) { - xaAssert(atlas); - return atlas->width; + // Validate arguments and context state. + if (!atlas) { + XA_PRINT_WARNING("PackCharts: atlas is null.\n"); + return; + } + Context *ctx = (Context *)atlas; + if (ctx->meshCount == 0 && ctx->uvMeshInstances.isEmpty()) { + XA_PRINT_WARNING("PackCharts: No meshes. Call AddMesh or AddUvMesh first.\n"); + return; + } + if (ctx->uvMeshInstances.isEmpty()) { + if (!ctx->paramAtlas.chartsComputed()) { + XA_PRINT_WARNING("PackCharts: ComputeCharts must be called first.\n"); + return; + } + if (!ctx->paramAtlas.chartsParameterized()) { + XA_PRINT_WARNING("PackCharts: ParameterizeCharts must be called first.\n"); + return; + } + } + if (packOptions.texelsPerUnit < 0.0f) { + XA_PRINT_WARNING("PackCharts: PackOptions::texelsPerUnit is negative.\n"); + packOptions.texelsPerUnit = 0.0f; + } + // Cleanup atlas. + DestroyOutputMeshes(ctx); + if (atlas->utilization) { + XA_FREE(atlas->utilization); + atlas->utilization = nullptr; + } + if (atlas->image) { + XA_FREE(atlas->image); + atlas->image = nullptr; + } + atlas->meshCount = 0; + // Pack charts. + internal::pack::Atlas packAtlas; + if (!ctx->uvMeshInstances.isEmpty()) { + for (uint32_t i = 0; i < ctx->uvMeshInstances.size(); i++) + packAtlas.addUvMeshCharts(ctx->uvMeshInstances[i]); + } + else if (ctx->paramAtlas.chartCount() > 0) { + ctx->paramAtlas.restoreOriginalChartTexcoords(); + for (uint32_t i = 0; i < ctx->paramAtlas.chartCount(); i++) + packAtlas.addChart(ctx->paramAtlas.chartAt(i)); + } + XA_PROFILE_START(packCharts) + if (!packAtlas.packCharts(ctx->taskScheduler, packOptions, ctx->progressFunc, ctx->progressUserData)) + return; + XA_PROFILE_END(packCharts) + // Populate atlas object with pack results. + atlas->atlasCount = packAtlas.getNumAtlases(); + atlas->chartCount = packAtlas.getChartCount(); + atlas->width = packAtlas.getWidth(); + atlas->height = packAtlas.getHeight(); + atlas->texelsPerUnit = packAtlas.getTexelsPerUnit(); + if (atlas->atlasCount > 0) { + atlas->utilization = XA_ALLOC_ARRAY(internal::MemTag::Default, float, atlas->atlasCount); + for (uint32_t i = 0; i < atlas->atlasCount; i++) + atlas->utilization[i] = packAtlas.getUtilization(i); + } + if (packOptions.createImage) { + atlas->image = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, atlas->atlasCount * atlas->width * atlas->height); + for (uint32_t i = 0; i < atlas->atlasCount; i++) + packAtlas.getImages()[i]->copyTo(&atlas->image[atlas->width * atlas->height * i], atlas->width, atlas->height); + } + XA_PROFILE_PRINT_AND_RESET(" Total: ", packCharts) + XA_PROFILE_PRINT_AND_RESET(" Rasterize: ", packChartsRasterize) + XA_PROFILE_PRINT_AND_RESET(" Dilate (padding): ", packChartsDilate) + XA_PROFILE_PRINT_AND_RESET(" Find location (real): ", packChartsFindLocation) + XA_PROFILE_PRINT_AND_RESET(" Find location (thread): ", packChartsFindLocationThread) + XA_PROFILE_PRINT_AND_RESET(" Blit: ", packChartsBlit) + XA_PRINT_MEM_USAGE + XA_PRINT("Building output meshes\n"); + int progress = 0; + if (ctx->progressFunc) { + if (!ctx->progressFunc(ProgressCategory::BuildOutputMeshes, 0, ctx->progressUserData)) + return; + } + if (ctx->uvMeshInstances.isEmpty()) + atlas->meshCount = ctx->meshCount; + else + atlas->meshCount = ctx->uvMeshInstances.size(); + atlas->meshes = XA_ALLOC_ARRAY(internal::MemTag::Default, Mesh, atlas->meshCount); + memset(atlas->meshes, 0, sizeof(Mesh) * atlas->meshCount); + if (ctx->uvMeshInstances.isEmpty()) { + uint32_t chartIndex = 0; + for (uint32_t i = 0; i < ctx->meshCount; i++) { + Mesh &outputMesh = atlas->meshes[i]; + // Count and alloc arrays. Ignore vertex mapped chart groups in Mesh::chartCount, since they're ignored faces. + for (uint32_t cg = 0; cg < ctx->paramAtlas.chartGroupCount(i); cg++) { + const internal::param::ChartGroup *chartGroup = ctx->paramAtlas.chartGroupAt(i, cg); + if (chartGroup->isVertexMap()) { + outputMesh.vertexCount += chartGroup->mesh()->vertexCount(); + outputMesh.indexCount += chartGroup->mesh()->faceCount() * 3; + } else { + for (uint32_t c = 0; c < chartGroup->chartCount(); c++) { + const internal::param::Chart *chart = chartGroup->chartAt(c); + outputMesh.vertexCount += chart->mesh()->vertexCount(); + outputMesh.indexCount += chart->mesh()->faceCount() * 3; + outputMesh.chartCount++; + } + } + } + outputMesh.vertexArray = XA_ALLOC_ARRAY(internal::MemTag::Default, Vertex, outputMesh.vertexCount); + outputMesh.indexArray = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, outputMesh.indexCount); + outputMesh.chartArray = XA_ALLOC_ARRAY(internal::MemTag::Default, Chart, outputMesh.chartCount); + XA_PRINT(" mesh %u: %u vertices, %u triangles, %u charts\n", i, outputMesh.vertexCount, outputMesh.indexCount / 3, outputMesh.chartCount); + // Copy mesh data. + uint32_t firstVertex = 0; + uint32_t meshChartIndex = 0; + for (uint32_t cg = 0; cg < ctx->paramAtlas.chartGroupCount(i); cg++) { + const internal::param::ChartGroup *chartGroup = ctx->paramAtlas.chartGroupAt(i, cg); + if (chartGroup->isVertexMap()) { + const internal::Mesh *mesh = chartGroup->mesh(); + // Vertices. + for (uint32_t v = 0; v < mesh->vertexCount(); v++) { + Vertex &vertex = outputMesh.vertexArray[firstVertex + v]; + vertex.atlasIndex = -1; + vertex.chartIndex = -1; + vertex.uv[0] = vertex.uv[1] = 0.0f; + vertex.xref = chartGroup->mapVertexToSourceVertex(v); + } + // Indices. + for (uint32_t f = 0; f < mesh->faceCount(); f++) { + const uint32_t indexOffset = chartGroup->mapFaceToSourceFace(f) * 3; + for (uint32_t j = 0; j < 3; j++) + outputMesh.indexArray[indexOffset + j] = firstVertex + mesh->vertexAt(f * 3 + j); + } + firstVertex += mesh->vertexCount(); + } else { + for (uint32_t c = 0; c < chartGroup->chartCount(); c++) { + const internal::param::Chart *chart = chartGroup->chartAt(c); + const internal::Mesh *mesh = chart->mesh(); + // Vertices. + for (uint32_t v = 0; v < mesh->vertexCount(); v++) { + Vertex &vertex = outputMesh.vertexArray[firstVertex + v]; + vertex.atlasIndex = packAtlas.getChart(chartIndex)->atlasIndex; + XA_DEBUG_ASSERT(vertex.atlasIndex >= 0); + vertex.chartIndex = (int32_t)chartIndex; + const internal::Vector2 &uv = mesh->texcoord(v); + vertex.uv[0] = internal::max(0.0f, uv.x); + vertex.uv[1] = internal::max(0.0f, uv.y); + vertex.xref = chartGroup->mapVertexToSourceVertex(chart->mapChartVertexToOriginalVertex(v)); + } + // Indices. + for (uint32_t f = 0; f < mesh->faceCount(); f++) { + const uint32_t indexOffset = chartGroup->mapFaceToSourceFace(chart->mapFaceToSourceFace(f)) * 3; + for (uint32_t j = 0; j < 3; j++) + outputMesh.indexArray[indexOffset + j] = firstVertex + mesh->vertexAt(f * 3 + j); + } + // Charts. + Chart *outputChart = &outputMesh.chartArray[meshChartIndex]; + const int32_t atlasIndex = packAtlas.getChart(chartIndex)->atlasIndex; + XA_DEBUG_ASSERT(atlasIndex >= 0); + outputChart->atlasIndex = (uint32_t)atlasIndex; + outputChart->flags = 0; + if (chart->paramQuality().boundaryIntersection || chart->paramQuality().flippedTriangleCount > 0) + outputChart->flags |= ChartFlags::Invalid; + outputChart->indexCount = mesh->faceCount() * 3; + outputChart->indexArray = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, outputChart->indexCount); + for (uint32_t f = 0; f < mesh->faceCount(); f++) { + for (uint32_t j = 0; j < 3; j++) + outputChart->indexArray[3 * f + j] = firstVertex + mesh->vertexAt(f * 3 + j); + } + outputChart->material = 0; + meshChartIndex++; + chartIndex++; + firstVertex += chart->mesh()->vertexCount(); + } + } + } + XA_DEBUG_ASSERT(outputMesh.vertexCount == firstVertex); + XA_DEBUG_ASSERT(outputMesh.chartCount == meshChartIndex); + if (ctx->progressFunc) { + const int newProgress = int((i + 1) / (float)atlas->meshCount * 100.0f); + if (newProgress != progress) { + progress = newProgress; + if (!ctx->progressFunc(ProgressCategory::BuildOutputMeshes, progress, ctx->progressUserData)) + return; + } + } + } + } else { + uint32_t chartIndex = 0; + for (uint32_t m = 0; m < ctx->uvMeshInstances.size(); m++) { + Mesh &outputMesh = atlas->meshes[m]; + const internal::UvMeshInstance *mesh = ctx->uvMeshInstances[m]; + // Alloc arrays. + outputMesh.vertexCount = mesh->texcoords.size(); + outputMesh.indexCount = mesh->mesh->indices.size(); + outputMesh.chartCount = mesh->mesh->charts.size(); + outputMesh.vertexArray = XA_ALLOC_ARRAY(internal::MemTag::Default, Vertex, outputMesh.vertexCount); + outputMesh.indexArray = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, outputMesh.indexCount); + outputMesh.chartArray = XA_ALLOC_ARRAY(internal::MemTag::Default, Chart, outputMesh.chartCount); + XA_PRINT(" UV mesh %u: %u vertices, %u triangles, %u charts\n", m, outputMesh.vertexCount, outputMesh.indexCount / 3, outputMesh.chartCount); + // Copy mesh data. + // Vertices. + for (uint32_t v = 0; v < mesh->texcoords.size(); v++) { + Vertex &vertex = outputMesh.vertexArray[v]; + vertex.uv[0] = mesh->texcoords[v].x; + vertex.uv[1] = mesh->texcoords[v].y; + vertex.xref = v; + const uint32_t meshChartIndex = mesh->mesh->vertexToChartMap[v]; + if (meshChartIndex == UINT32_MAX) { + // Vertex doesn't exist in any chart. + vertex.atlasIndex = -1; + vertex.chartIndex = -1; + } else { + const internal::pack::Chart *chart = packAtlas.getChart(chartIndex + meshChartIndex); + vertex.atlasIndex = chart->atlasIndex; + vertex.chartIndex = (int32_t)chartIndex + meshChartIndex; + } + } + // Indices. + memcpy(outputMesh.indexArray, mesh->mesh->indices.data(), mesh->mesh->indices.size() * sizeof(uint32_t)); + // Charts. + for (uint32_t c = 0; c < mesh->mesh->charts.size(); c++) { + Chart *outputChart = &outputMesh.chartArray[c]; + const internal::pack::Chart *chart = packAtlas.getChart(chartIndex); + XA_DEBUG_ASSERT(chart->atlasIndex >= 0); + outputChart->atlasIndex = (uint32_t)chart->atlasIndex; + outputChart->indexCount = chart->indexCount; + outputChart->indexArray = XA_ALLOC_ARRAY(internal::MemTag::Default, uint32_t, outputChart->indexCount); + outputChart->material = chart->material; + memcpy(outputChart->indexArray, chart->indices, chart->indexCount * sizeof(uint32_t)); + chartIndex++; + } + if (ctx->progressFunc) { + const int newProgress = int((m + 1) / (float)atlas->meshCount * 100.0f); + if (newProgress != progress) { + progress = newProgress; + if (!ctx->progressFunc(ProgressCategory::BuildOutputMeshes, progress, ctx->progressUserData)) + return; + } + } + } + } + if (ctx->progressFunc && progress != 100) + ctx->progressFunc(ProgressCategory::BuildOutputMeshes, 100, ctx->progressUserData); + XA_PRINT_MEM_USAGE +} + +void Generate(Atlas *atlas, ChartOptions chartOptions, ParameterizeFunc paramFunc, PackOptions packOptions) +{ + if (!atlas) { + XA_PRINT_WARNING("Generate: atlas is null.\n"); + return; + } + Context *ctx = (Context *)atlas; + if (!ctx->uvMeshInstances.isEmpty()) { + XA_PRINT_WARNING("Generate: This function should not be called with UV meshes.\n"); + return; + } + if (ctx->meshCount == 0) { + XA_PRINT_WARNING("Generate: No meshes. Call AddMesh first.\n"); + return; + } + ComputeCharts(atlas, chartOptions); + ParameterizeCharts(atlas, paramFunc); + PackCharts(atlas, packOptions); } -uint32_t GetHeight(const Atlas *atlas) +void SetProgressCallback(Atlas *atlas, ProgressFunc progressFunc, void *progressUserData) { - xaAssert(atlas); - return atlas->height; + if (!atlas) { + XA_PRINT_WARNING("SetProgressCallback: atlas is null.\n"); + return; + } + Context *ctx = (Context *)atlas; + ctx->progressFunc = progressFunc; + ctx->progressUserData = progressUserData; } -uint32_t GetNumCharts(const Atlas *atlas) +void SetRealloc(ReallocFunc reallocFunc) { - xaAssert(atlas); - return atlas->atlas.chartCount(); + internal::s_realloc = reallocFunc; +} + +void SetPrint(PrintFunc print, bool verbose) +{ + internal::s_print = print; + internal::s_printVerbose = verbose; } -const OutputMesh * const *GetOutputMeshes(const Atlas *atlas) +const char *StringForEnum(AddMeshError::Enum error) { - xaAssert(atlas); - return atlas->outputMeshes; + if (error == AddMeshError::Error) + return "Unspecified error"; + if (error == AddMeshError::IndexOutOfRange) + return "Index out of range"; + if (error == AddMeshError::InvalidIndexCount) + return "Invalid index count"; + return "Success"; } -const char *StringForEnum(AddMeshErrorCode::Enum error) -{ - if (error == AddMeshErrorCode::AlreadyAddedEdge) - return "already added edge"; - if (error == AddMeshErrorCode::DegenerateColocalEdge) - return "degenerate colocal edge"; - if (error == AddMeshErrorCode::DegenerateEdge) - return "degenerate edge"; - if (error == AddMeshErrorCode::DuplicateEdge) - return "duplicate edge"; - if (error == AddMeshErrorCode::IndexOutOfRange) - return "index out of range"; - if (error == AddMeshErrorCode::InvalidIndexCount) - return "invalid index count"; - if (error == AddMeshErrorCode::ZeroAreaFace) - return "zero area face"; - if (error == AddMeshErrorCode::ZeroLengthEdge) - return "zero length edge"; - return "success"; +const char *StringForEnum(ProgressCategory::Enum category) +{ + if (category == ProgressCategory::AddMesh) + return "Adding mesh(es)"; + if (category == ProgressCategory::ComputeCharts) + return "Computing charts"; + if (category == ProgressCategory::ParameterizeCharts) + return "Parameterizing charts"; + if (category == ProgressCategory::PackCharts) + return "Packing charts"; + if (category == ProgressCategory::BuildOutputMeshes) + return "Building output meshes"; + return ""; } } // namespace xatlas diff --git a/thirdparty/xatlas/xatlas.h b/thirdparty/xatlas/xatlas.h index dbf8ca08c7..c123e800b4 100644 --- a/thirdparty/xatlas/xatlas.h +++ b/thirdparty/xatlas/xatlas.h @@ -1,176 +1,254 @@ -// This code is in the public domain -- castanyo@yahoo.es +/* +MIT License + +Copyright (c) 2018-2019 Jonathan Young + +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. +*/ +/* +thekla_atlas +MIT License +https://github.com/Thekla/thekla_atlas +Copyright (c) 2013 Thekla, Inc +Copyright NVIDIA Corporation 2006 -- Ignacio Castano <icastano@nvidia.com> +*/ #pragma once #ifndef XATLAS_H #define XATLAS_H -#include <float.h> // FLT_MAX -// -- GODOT start -- -#include <limits.h> // INT_MAX, UINT_MAX -// -- GODOT end -- +#include <stdint.h> namespace xatlas { -typedef void (*PrintFunc)(const char *, ...); +struct ChartFlags +{ + enum + { + Invalid = 1 << 0 + }; +}; -struct Atlas; +// A group of connected faces, belonging to a single atlas. +struct Chart +{ + uint32_t atlasIndex; // Sub-atlas index. + uint32_t flags; + uint32_t *indexArray; + uint32_t indexCount; + uint32_t material; +}; -struct CharterOptions +// Output vertex. +struct Vertex { - float proxyFitMetricWeight; - float roundnessMetricWeight; - float straightnessMetricWeight; - float normalSeamMetricWeight; - float textureSeamMetricWeight; - float maxChartArea; - float maxBoundaryLength; - - CharterOptions() - { - // These are the default values we use on The Witness. - proxyFitMetricWeight = 2.0f; - roundnessMetricWeight = 0.01f; - straightnessMetricWeight = 6.0f; - normalSeamMetricWeight = 4.0f; - textureSeamMetricWeight = 0.5f; - /* - proxyFitMetricWeight = 1.0f; - roundnessMetricWeight = 0.1f; - straightnessMetricWeight = 0.25f; - normalSeamMetricWeight = 1.0f; - textureSeamMetricWeight = 0.1f; - */ - maxChartArea = FLT_MAX; - maxBoundaryLength = FLT_MAX; - } + int32_t atlasIndex; // Sub-atlas index. -1 if the vertex doesn't exist in any atlas. + int32_t chartIndex; // -1 if the vertex doesn't exist in any chart. + float uv[2]; // Not normalized - values are in Atlas width and height range. + uint32_t xref; // Index of input vertex from which this output vertex originated. }; -struct PackMethod +// Output mesh. +struct Mesh { - enum Enum - { - TexelArea, // texel_area determines resolution - ApproximateResolution, // guess texel_area to approximately match desired resolution - ExactResolution // run the packer multiple times to exactly match the desired resolution (slow) - }; + Chart *chartArray; + uint32_t chartCount; + uint32_t *indexArray; + uint32_t indexCount; + Vertex *vertexArray; + uint32_t vertexCount; }; -struct PackerOptions +static const uint32_t kImageChartIndexMask = 0x3FFFFFFF; +static const uint32_t kImageHasChartIndexBit = 0x40000000; +static const uint32_t kImageIsPaddingBit = 0x80000000; + +// Empty on creation. Populated after charts are packed. +struct Atlas { - PackMethod::Enum method; - - // 0 - brute force - // 1 - 4096 attempts - // 2 - 2048 - // 3 - 1024 - // 4 - 512 - // other - 256 - // Avoid brute force packing, since it can be unusably slow in some situations. - int quality; - - float texelArea; // This is not really texel area, but 1 / texel width? - uint32_t resolution; - bool blockAlign; // Align charts to 4x4 blocks. - bool conservative; // Pack charts with extra padding. - int padding; - - PackerOptions() - { - method = PackMethod::ApproximateResolution; - quality = 1; - texelArea = 8; - resolution = 512; - blockAlign = false; - conservative = false; - padding = 0; - } + uint32_t width; // Atlas width in texels. + uint32_t height; // Atlas height in texels. + uint32_t atlasCount; // Number of sub-atlases. Equal to 0 unless PackOptions resolution is changed from default (0). + uint32_t chartCount; // Total number of charts in all meshes. + uint32_t meshCount; // Number of output meshes. Equal to the number of times AddMesh was called. + Mesh *meshes; // The output meshes, corresponding to each AddMesh call. + float *utilization; // Normalized atlas texel utilization array. E.g. a value of 0.8 means 20% empty space. atlasCount in length. + float texelsPerUnit; // Equal to PackOptions texelsPerUnit if texelsPerUnit > 0, otherwise an estimated value to match PackOptions resolution. + uint32_t *image; }; -struct AddMeshErrorCode +// Create an empty atlas. +Atlas *Create(); + +void Destroy(Atlas *atlas); + +struct IndexFormat { enum Enum { - Success, - AlreadyAddedEdge, // index0 and index1 are the edge indices - DegenerateColocalEdge, // index0 and index1 are the edge indices - DegenerateEdge, // index0 and index1 are the edge indices - DuplicateEdge, // index0 and index1 are the edge indices - IndexOutOfRange, // index0 is the index - InvalidIndexCount, // not evenly divisible by 3 - expecting triangles - ZeroAreaFace, - ZeroLengthEdge // index0 and index1 are the edge indices + UInt16, + UInt32 }; }; -struct AddMeshError +// Input mesh declaration. +struct MeshDecl { - AddMeshErrorCode::Enum code; - uint32_t face; - uint32_t index0, index1; + uint32_t vertexCount = 0; + const void *vertexPositionData = nullptr; + uint32_t vertexPositionStride = 0; + const void *vertexNormalData = nullptr; // optional + uint32_t vertexNormalStride = 0; // optional + const void *vertexUvData = nullptr; // optional. The input UVs are provided as a hint to the chart generator. + uint32_t vertexUvStride = 0; // optional + uint32_t indexCount = 0; + const void *indexData = nullptr; // optional + int32_t indexOffset = 0; // optional. Add this offset to all indices. + IndexFormat::Enum indexFormat = IndexFormat::UInt16; + + // Optional. indexCount / 3 (triangle count) in length. + // Don't atlas faces set to true. Ignored faces still exist in the output meshes, Vertex uv is set to (0, 0) and Vertex atlasIndex to -1. + const bool *faceIgnoreData = nullptr; + + // Vertex positions within epsilon distance of each other are considered colocal. + float epsilon = 1.192092896e-07F; }; -struct IndexFormat +struct AddMeshError { enum Enum { - HalfFloat, - Float + Success, // No error. + Error, // Unspecified error. + IndexOutOfRange, // An index is >= MeshDecl vertexCount. + InvalidIndexCount // Not evenly divisible by 3 - expecting triangles. }; }; -struct InputMesh -{ - uint32_t vertexCount; - const void *vertexPositionData; - uint32_t vertexPositionStride; - const void *vertexNormalData; // optional - uint32_t vertexNormalStride; // optional - - // optional - // The input UVs are provided as a hint to the chart generator. - const void *vertexUvData; - uint32_t vertexUvStride; +// Add a mesh to the atlas. MeshDecl data is copied, so it can be freed after AddMesh returns. +AddMeshError::Enum AddMesh(Atlas *atlas, const MeshDecl &meshDecl, uint32_t meshCountHint = 0); - uint32_t indexCount; - const void *indexData; - IndexFormat::Enum indexFormat; +// Wait for AddMesh async processing to finish. ComputeCharts / Generate call this internally. +void AddMeshJoin(Atlas *atlas); - // optional. indexCount / 3 in length. - // Charter also uses material boundaries as a hint to cut charts. - const uint16_t *faceMaterialData; +struct UvMeshDecl +{ + uint32_t vertexCount = 0; + uint32_t vertexStride = 0; + const void *vertexUvData = nullptr; + uint32_t indexCount = 0; + const void *indexData = nullptr; // optional + int32_t indexOffset = 0; // optional. Add this offset to all indices. + IndexFormat::Enum indexFormat = IndexFormat::UInt16; + const uint32_t *faceMaterialData = nullptr; // Optional. Faces with different materials won't be assigned to the same chart. Must be indexCount / 3 in length. + bool rotateCharts = true; }; -struct OutputChart +AddMeshError::Enum AddUvMesh(Atlas *atlas, const UvMeshDecl &decl); + +struct ChartOptions { - uint32_t *indexArray; - uint32_t indexCount; + float maxChartArea = 0.0f; // Don't grow charts to be larger than this. 0 means no limit. + float maxBoundaryLength = 0.0f; // Don't grow charts to have a longer boundary than this. 0 means no limit. + + // Weights determine chart growth. Higher weights mean higher cost for that metric. + float proxyFitMetricWeight = 2.0f; // Angle between face and average chart normal. + float roundnessMetricWeight = 0.01f; + float straightnessMetricWeight = 6.0f; + float normalSeamMetricWeight = 4.0f; // If > 1000, normal seams are fully respected. + float textureSeamMetricWeight = 0.5f; + + float maxThreshold = 2.0f; // If total of all metrics * weights > maxThreshold, don't grow chart. Lower values result in more charts. + uint32_t growFaceCount = 32; // Grow this many faces at a time. + uint32_t maxIterations = 1; // Number of iterations of the chart growing and seeding phases. Higher values result in better charts. }; -struct OutputVertex +// Call after all AddMesh calls. Can be called multiple times to recompute charts with different options. +void ComputeCharts(Atlas *atlas, ChartOptions chartOptions = ChartOptions()); + +// Custom parameterization function. texcoords initial values are an orthogonal parameterization. +typedef void (*ParameterizeFunc)(const float *positions, float *texcoords, uint32_t vertexCount, const uint32_t *indices, uint32_t indexCount); + +// Call after ComputeCharts. Can be called multiple times to re-parameterize charts with a different ParameterizeFunc. +void ParameterizeCharts(Atlas *atlas, ParameterizeFunc func = nullptr); + +struct PackOptions { - float uv[2]; - uint32_t xref; // Index of input vertex from which this output vertex originated. + // Slower, but gives the best result. If false, use random chart placement. + bool bruteForce = false; + + // Create Atlas::image + bool createImage = false; + + // Unit to texel scale. e.g. a 1x1 quad with texelsPerUnit of 32 will take up approximately 32x32 texels in the atlas. + // If 0, an estimated value will be calculated to approximately match the given resolution. + // If resolution is also 0, the estimated value will approximately match a 1024x1024 atlas. + float texelsPerUnit = 0.0f; + + // If 0, generate a single atlas with texelsPerUnit determining the final resolution. + // If not 0, and texelsPerUnit is not 0, generate one or more atlases with that exact resolution. + // If not 0, and texelsPerUnit is 0, texelsPerUnit is estimated to approximately match the resolution. + uint32_t resolution = 0; + + // Charts larger than this will be scaled down. + uint32_t maxChartSize = 1024; + + // Align charts to 4x4 blocks. Also improves packing speed, since there are fewer possible chart locations to consider. + bool blockAlign = false; + + // Number of pixels to pad charts with. + uint32_t padding = 0; }; -struct OutputMesh +// Call after ParameterizeCharts. Can be called multiple times to re-pack charts with different options. +void PackCharts(Atlas *atlas, PackOptions packOptions = PackOptions()); + +// Equivalent to calling ComputeCharts, ParameterizeCharts and PackCharts in sequence. Can be called multiple times to regenerate with different options. +void Generate(Atlas *atlas, ChartOptions chartOptions = ChartOptions(), ParameterizeFunc paramFunc = nullptr, PackOptions packOptions = PackOptions()); + +// Progress tracking. +struct ProgressCategory { - OutputChart *chartArray; - uint32_t chartCount; - uint32_t *indexArray; - uint32_t indexCount; - OutputVertex *vertexArray; - uint32_t vertexCount; + enum Enum + { + AddMesh, + ComputeCharts, + ParameterizeCharts, + PackCharts, + BuildOutputMeshes + }; }; -void SetPrint(PrintFunc print); -Atlas *Create(); -void Destroy(Atlas *atlas); -// useColocalVertices - generates fewer charts (good), but is more sensitive to bad geometry. -AddMeshError AddMesh(Atlas *atlas, const InputMesh &mesh, bool useColocalVertices = true); -void Generate(Atlas *atlas, CharterOptions charterOptions = CharterOptions(), PackerOptions packerOptions = PackerOptions()); -uint32_t GetWidth(const Atlas *atlas); -uint32_t GetHeight(const Atlas *atlas); -uint32_t GetNumCharts(const Atlas *atlas); -const OutputMesh * const *GetOutputMeshes(const Atlas *atlas); -const char *StringForEnum(AddMeshErrorCode::Enum error); +// May be called from any thread. Return false to cancel. +typedef bool (*ProgressFunc)(ProgressCategory::Enum category, int progress, void *userData); + +void SetProgressCallback(Atlas *atlas, ProgressFunc progressFunc = nullptr, void *progressUserData = nullptr); + +// Custom memory allocation. +typedef void *(*ReallocFunc)(void *, size_t); +void SetRealloc(ReallocFunc reallocFunc); + +// Custom print function. +typedef int (*PrintFunc)(const char *, ...); +void SetPrint(PrintFunc print, bool verbose); + +// Helper functions for error messages. +const char *StringForEnum(AddMeshError::Enum error); +const char *StringForEnum(ProgressCategory::Enum category); } // namespace xatlas diff --git a/thirdparty/zstd/common/compiler.h b/thirdparty/zstd/common/compiler.h index 0836e3ed27..87bf51ae8c 100644 --- a/thirdparty/zstd/common/compiler.h +++ b/thirdparty/zstd/common/compiler.h @@ -127,6 +127,13 @@ } \ } +/* vectorization */ +#if !defined(__clang__) && defined(__GNUC__) +# define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) +#else +# define DONT_VECTORIZE +#endif + /* disable warnings */ #ifdef _MSC_VER /* Visual Studio */ # include <intrin.h> /* For Visual 2005 */ diff --git a/thirdparty/zstd/common/zstd_internal.h b/thirdparty/zstd/common/zstd_internal.h index 31f756ab58..81b16eac2e 100644 --- a/thirdparty/zstd/common/zstd_internal.h +++ b/thirdparty/zstd/common/zstd_internal.h @@ -34,7 +34,6 @@ #endif #include "xxhash.h" /* XXH_reset, update, digest */ - #if defined (__cplusplus) extern "C" { #endif @@ -193,19 +192,72 @@ static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG; * Shared functions to include for inlining *********************************************/ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); } + #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; } +static void ZSTD_copy16(void* dst, const void* src) { memcpy(dst, src, 16); } +#define COPY16(d,s) { ZSTD_copy16(d,s); d+=16; s+=16; } + +#define WILDCOPY_OVERLENGTH 8 +#define VECLEN 16 + +typedef enum { + ZSTD_no_overlap, + ZSTD_overlap_src_before_dst, + /* ZSTD_overlap_dst_before_src, */ +} ZSTD_overlap_e; /*! ZSTD_wildcopy() : * custom version of memcpy(), can overwrite up to WILDCOPY_OVERLENGTH bytes (if length==0) */ -#define WILDCOPY_OVERLENGTH 8 -MEM_STATIC void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length) +MEM_STATIC FORCE_INLINE_ATTR DONT_VECTORIZE +void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e ovtype) { + ptrdiff_t diff = (BYTE*)dst - (const BYTE*)src; const BYTE* ip = (const BYTE*)src; BYTE* op = (BYTE*)dst; BYTE* const oend = op + length; - do - COPY8(op, ip) - while (op < oend); + + assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff < -8)); + if (length < VECLEN || (ovtype == ZSTD_overlap_src_before_dst && diff < VECLEN)) { + do + COPY8(op, ip) + while (op < oend); + } + else { + if ((length & 8) == 0) + COPY8(op, ip); + do { + COPY16(op, ip); + } + while (op < oend); + } +} + +/*! ZSTD_wildcopy_16min() : + * same semantics as ZSTD_wilcopy() except guaranteed to be able to copy 16 bytes at the start */ +MEM_STATIC FORCE_INLINE_ATTR DONT_VECTORIZE +void ZSTD_wildcopy_16min(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e ovtype) +{ + ptrdiff_t diff = (BYTE*)dst - (const BYTE*)src; + const BYTE* ip = (const BYTE*)src; + BYTE* op = (BYTE*)dst; + BYTE* const oend = op + length; + + assert(length >= 8); + assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff < -8)); + + if (ovtype == ZSTD_overlap_src_before_dst && diff < VECLEN) { + do + COPY8(op, ip) + while (op < oend); + } + else { + if ((length & 8) == 0) + COPY8(op, ip); + do { + COPY16(op, ip); + } + while (op < oend); + } } MEM_STATIC void ZSTD_wildcopy_e(void* dst, const void* src, void* dstEnd) /* should be faster for decoding, but strangely, not verified on all platform */ diff --git a/thirdparty/zstd/compress/zstd_compress.c b/thirdparty/zstd/compress/zstd_compress.c index 2e163c8bf3..1476512580 100644 --- a/thirdparty/zstd/compress/zstd_compress.c +++ b/thirdparty/zstd/compress/zstd_compress.c @@ -385,6 +385,11 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) bounds.upperBound = ZSTD_lcm_uncompressed; return bounds; + case ZSTD_c_targetCBlockSize: + bounds.lowerBound = ZSTD_TARGETCBLOCKSIZE_MIN; + bounds.upperBound = ZSTD_TARGETCBLOCKSIZE_MAX; + return bounds; + default: { ZSTD_bounds const boundError = { ERROR(parameter_unsupported), 0, 0 }; return boundError; @@ -452,6 +457,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param) case ZSTD_c_ldmHashRateLog: case ZSTD_c_forceAttachDict: case ZSTD_c_literalCompressionMode: + case ZSTD_c_targetCBlockSize: default: return 0; } @@ -497,6 +503,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) case ZSTD_c_ldmHashLog: case ZSTD_c_ldmMinMatch: case ZSTD_c_ldmBucketSizeLog: + case ZSTD_c_targetCBlockSize: break; default: RETURN_ERROR(parameter_unsupported); @@ -671,6 +678,12 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, CCtxParams->ldmParams.hashRateLog = value; return CCtxParams->ldmParams.hashRateLog; + case ZSTD_c_targetCBlockSize : + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_targetCBlockSize, value); + CCtxParams->targetCBlockSize = value; + return CCtxParams->targetCBlockSize; + default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); } } @@ -692,13 +705,13 @@ size_t ZSTD_CCtxParams_getParameter( *value = CCtxParams->compressionLevel; break; case ZSTD_c_windowLog : - *value = CCtxParams->cParams.windowLog; + *value = (int)CCtxParams->cParams.windowLog; break; case ZSTD_c_hashLog : - *value = CCtxParams->cParams.hashLog; + *value = (int)CCtxParams->cParams.hashLog; break; case ZSTD_c_chainLog : - *value = CCtxParams->cParams.chainLog; + *value = (int)CCtxParams->cParams.chainLog; break; case ZSTD_c_searchLog : *value = CCtxParams->cParams.searchLog; @@ -773,6 +786,9 @@ size_t ZSTD_CCtxParams_getParameter( case ZSTD_c_ldmHashRateLog : *value = CCtxParams->ldmParams.hashRateLog; break; + case ZSTD_c_targetCBlockSize : + *value = (int)CCtxParams->targetCBlockSize; + break; default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); } return 0; @@ -930,12 +946,12 @@ size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset) @return : 0, or an error code if one value is beyond authorized range */ size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams) { - BOUNDCHECK(ZSTD_c_windowLog, cParams.windowLog); - BOUNDCHECK(ZSTD_c_chainLog, cParams.chainLog); - BOUNDCHECK(ZSTD_c_hashLog, cParams.hashLog); - BOUNDCHECK(ZSTD_c_searchLog, cParams.searchLog); - BOUNDCHECK(ZSTD_c_minMatch, cParams.minMatch); - BOUNDCHECK(ZSTD_c_targetLength,cParams.targetLength); + BOUNDCHECK(ZSTD_c_windowLog, (int)cParams.windowLog); + BOUNDCHECK(ZSTD_c_chainLog, (int)cParams.chainLog); + BOUNDCHECK(ZSTD_c_hashLog, (int)cParams.hashLog); + BOUNDCHECK(ZSTD_c_searchLog, (int)cParams.searchLog); + BOUNDCHECK(ZSTD_c_minMatch, (int)cParams.minMatch); + BOUNDCHECK(ZSTD_c_targetLength,(int)cParams.targetLength); BOUNDCHECK(ZSTD_c_strategy, cParams.strategy); return 0; } @@ -951,7 +967,7 @@ ZSTD_clampCParams(ZSTD_compressionParameters cParams) if ((int)val<bounds.lowerBound) val=(type)bounds.lowerBound; \ else if ((int)val>bounds.upperBound) val=(type)bounds.upperBound; \ } -# define CLAMP(cParam, val) CLAMP_TYPE(cParam, val, int) +# define CLAMP(cParam, val) CLAMP_TYPE(cParam, val, unsigned) CLAMP(ZSTD_c_windowLog, cParams.windowLog); CLAMP(ZSTD_c_chainLog, cParams.chainLog); CLAMP(ZSTD_c_hashLog, cParams.hashLog); @@ -1282,15 +1298,14 @@ static void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs) } /*! ZSTD_invalidateMatchState() - * Invalidate all the matches in the match finder tables. - * Requires nextSrc and base to be set (can be NULL). + * Invalidate all the matches in the match finder tables. + * Requires nextSrc and base to be set (can be NULL). */ static void ZSTD_invalidateMatchState(ZSTD_matchState_t* ms) { ZSTD_window_clear(&ms->window); ms->nextToUpdate = ms->window.dictLimit; - ms->nextToUpdate3 = ms->window.dictLimit; ms->loadedDictEnd = 0; ms->opt.litLengthSum = 0; /* force reset of btopt stats */ ms->dictMatchState = NULL; @@ -1327,15 +1342,17 @@ static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_CCtx_params params, U64 pl typedef enum { ZSTDcrp_continue, ZSTDcrp_noMemset } ZSTD_compResetPolicy_e; +typedef enum { ZSTD_resetTarget_CDict, ZSTD_resetTarget_CCtx } ZSTD_resetTarget_e; + static void* ZSTD_reset_matchState(ZSTD_matchState_t* ms, void* ptr, const ZSTD_compressionParameters* cParams, - ZSTD_compResetPolicy_e const crp, U32 const forCCtx) + ZSTD_compResetPolicy_e const crp, ZSTD_resetTarget_e const forWho) { size_t const chainSize = (cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cParams->chainLog); size_t const hSize = ((size_t)1) << cParams->hashLog; - U32 const hashLog3 = (forCCtx && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0; + U32 const hashLog3 = ((forWho == ZSTD_resetTarget_CCtx) && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0; size_t const h3Size = ((size_t)1) << hashLog3; size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32); @@ -1349,7 +1366,7 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, ZSTD_invalidateMatchState(ms); /* opt parser space */ - if (forCCtx && (cParams->strategy >= ZSTD_btopt)) { + if ((forWho == ZSTD_resetTarget_CCtx) && (cParams->strategy >= ZSTD_btopt)) { DEBUGLOG(4, "reserving optimal parser space"); ms->opt.litFreq = (unsigned*)ptr; ms->opt.litLengthFreq = ms->opt.litFreq + (1<<Litbits); @@ -1377,6 +1394,19 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, return ptr; } +/* ZSTD_indexTooCloseToMax() : + * minor optimization : prefer memset() rather than reduceIndex() + * which is measurably slow in some circumstances (reported for Visual Studio). + * Works when re-using a context for a lot of smallish inputs : + * if all inputs are smaller than ZSTD_INDEXOVERFLOW_MARGIN, + * memset() will be triggered before reduceIndex(). + */ +#define ZSTD_INDEXOVERFLOW_MARGIN (16 MB) +static int ZSTD_indexTooCloseToMax(ZSTD_window_t w) +{ + return (size_t)(w.nextSrc - w.base) > (ZSTD_CURRENT_MAX - ZSTD_INDEXOVERFLOW_MARGIN); +} + #define ZSTD_WORKSPACETOOLARGE_FACTOR 3 /* define "workspace is too large" as this number of times larger than needed */ #define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128 /* when workspace is continuously too large * during at least this number of times, @@ -1388,7 +1418,7 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, note : `params` are assumed fully validated at this stage */ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, ZSTD_CCtx_params params, - U64 pledgedSrcSize, + U64 const pledgedSrcSize, ZSTD_compResetPolicy_e const crp, ZSTD_buffered_policy_e const zbuff) { @@ -1400,13 +1430,21 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, if (ZSTD_equivalentParams(zc->appliedParams, params, zc->inBuffSize, zc->seqStore.maxNbSeq, zc->seqStore.maxNbLit, - zbuff, pledgedSrcSize)) { - DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> continue mode (wLog1=%u, blockSize1=%zu)", - zc->appliedParams.cParams.windowLog, zc->blockSize); + zbuff, pledgedSrcSize) ) { + DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> consider continue mode"); zc->workSpaceOversizedDuration += (zc->workSpaceOversizedDuration > 0); /* if it was too large, it still is */ - if (zc->workSpaceOversizedDuration <= ZSTD_WORKSPACETOOLARGE_MAXDURATION) + if (zc->workSpaceOversizedDuration <= ZSTD_WORKSPACETOOLARGE_MAXDURATION) { + DEBUGLOG(4, "continue mode confirmed (wLog1=%u, blockSize1=%zu)", + zc->appliedParams.cParams.windowLog, zc->blockSize); + if (ZSTD_indexTooCloseToMax(zc->blockState.matchState.window)) { + /* prefer a reset, faster than a rescale */ + ZSTD_reset_matchState(&zc->blockState.matchState, + zc->entropyWorkspace + HUF_WORKSPACE_SIZE_U32, + ¶ms.cParams, + crp, ZSTD_resetTarget_CCtx); + } return ZSTD_continueCCtx(zc, params, pledgedSrcSize); - } } + } } } DEBUGLOG(4, "ZSTD_equivalentParams()==0 -> reset CCtx"); if (params.ldmParams.enableLdm) { @@ -1449,7 +1487,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, DEBUGLOG(4, "windowSize: %zu - blockSize: %zu", windowSize, blockSize); if (workSpaceTooSmall || workSpaceWasteful) { - DEBUGLOG(4, "Need to resize workSpaceSize from %zuKB to %zuKB", + DEBUGLOG(4, "Resize workSpaceSize from %zuKB to %zuKB", zc->workSpaceSize >> 10, neededSpace >> 10); @@ -1491,7 +1529,10 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, ZSTD_reset_compressedBlockState(zc->blockState.prevCBlock); - ptr = zc->entropyWorkspace + HUF_WORKSPACE_SIZE_U32; + ptr = ZSTD_reset_matchState(&zc->blockState.matchState, + zc->entropyWorkspace + HUF_WORKSPACE_SIZE_U32, + ¶ms.cParams, + crp, ZSTD_resetTarget_CCtx); /* ldm hash table */ /* initialize bucketOffsets table later for pointer alignment */ @@ -1509,8 +1550,6 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, } assert(((size_t)ptr & 3) == 0); /* ensure ptr is properly aligned */ - ptr = ZSTD_reset_matchState(&zc->blockState.matchState, ptr, ¶ms.cParams, crp, /* forCCtx */ 1); - /* sequences storage */ zc->seqStore.maxNbSeq = maxNbSeq; zc->seqStore.sequencesStart = (seqDef*)ptr; @@ -1587,15 +1626,14 @@ static int ZSTD_shouldAttachDict(const ZSTD_CDict* cdict, * handled in _enforceMaxDist */ } -static size_t ZSTD_resetCCtx_byAttachingCDict( - ZSTD_CCtx* cctx, - const ZSTD_CDict* cdict, - ZSTD_CCtx_params params, - U64 pledgedSrcSize, - ZSTD_buffered_policy_e zbuff) +static size_t +ZSTD_resetCCtx_byAttachingCDict(ZSTD_CCtx* cctx, + const ZSTD_CDict* cdict, + ZSTD_CCtx_params params, + U64 pledgedSrcSize, + ZSTD_buffered_policy_e zbuff) { - { - const ZSTD_compressionParameters *cdict_cParams = &cdict->matchState.cParams; + { const ZSTD_compressionParameters* const cdict_cParams = &cdict->matchState.cParams; unsigned const windowLog = params.cParams.windowLog; assert(windowLog != 0); /* Resize working context table params for input only, since the dict @@ -1607,8 +1645,7 @@ static size_t ZSTD_resetCCtx_byAttachingCDict( assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy); } - { - const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc + { const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc - cdict->matchState.window.base); const U32 cdictLen = cdictEnd - cdict->matchState.window.dictLimit; if (cdictLen == 0) { @@ -1625,9 +1662,9 @@ static size_t ZSTD_resetCCtx_byAttachingCDict( cctx->blockState.matchState.window.base + cdictEnd; ZSTD_window_clear(&cctx->blockState.matchState.window); } + /* loadedDictEnd is expressed within the referential of the active context */ cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit; - } - } + } } cctx->dictID = cdict->dictID; @@ -1681,7 +1718,6 @@ static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, ZSTD_matchState_t* dstMatchState = &cctx->blockState.matchState; dstMatchState->window = srcMatchState->window; dstMatchState->nextToUpdate = srcMatchState->nextToUpdate; - dstMatchState->nextToUpdate3= srcMatchState->nextToUpdate3; dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd; } @@ -1761,7 +1797,6 @@ static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx, ZSTD_matchState_t* dstMatchState = &dstCCtx->blockState.matchState; dstMatchState->window = srcMatchState->window; dstMatchState->nextToUpdate = srcMatchState->nextToUpdate; - dstMatchState->nextToUpdate3= srcMatchState->nextToUpdate3; dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd; } dstCCtx->dictID = srcCCtx->dictID; @@ -1831,16 +1866,15 @@ static void ZSTD_reduceTable_btlazy2(U32* const table, U32 const size, U32 const /*! ZSTD_reduceIndex() : * rescale all indexes to avoid future overflow (indexes are U32) */ -static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue) +static void ZSTD_reduceIndex (ZSTD_matchState_t* ms, ZSTD_CCtx_params const* params, const U32 reducerValue) { - ZSTD_matchState_t* const ms = &zc->blockState.matchState; - { U32 const hSize = (U32)1 << zc->appliedParams.cParams.hashLog; + { U32 const hSize = (U32)1 << params->cParams.hashLog; ZSTD_reduceTable(ms->hashTable, hSize, reducerValue); } - if (zc->appliedParams.cParams.strategy != ZSTD_fast) { - U32 const chainSize = (U32)1 << zc->appliedParams.cParams.chainLog; - if (zc->appliedParams.cParams.strategy == ZSTD_btlazy2) + if (params->cParams.strategy != ZSTD_fast) { + U32 const chainSize = (U32)1 << params->cParams.chainLog; + if (params->cParams.strategy == ZSTD_btlazy2) ZSTD_reduceTable_btlazy2(ms->chainTable, chainSize, reducerValue); else ZSTD_reduceTable(ms->chainTable, chainSize, reducerValue); @@ -2524,6 +2558,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr, op[0] = (BYTE)((nbSeq>>8) + 0x80), op[1] = (BYTE)nbSeq, op+=2; else op[0]=0xFF, MEM_writeLE16(op+1, (U16)(nbSeq - LONGNBSEQ)), op+=3; + assert(op <= oend); if (nbSeq==0) { /* Copy the old tables over as if we repeated them */ memcpy(&nextEntropy->fse, &prevEntropy->fse, sizeof(prevEntropy->fse)); @@ -2532,6 +2567,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr, /* seqHead : flags for FSE encoding type */ seqHead = op++; + assert(op <= oend); /* convert length/distances into codes */ ZSTD_seqToCodes(seqStorePtr); @@ -2555,6 +2591,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr, if (LLtype == set_compressed) lastNCount = op; op += countSize; + assert(op <= oend); } } /* build CTable for Offsets */ { unsigned max = MaxOff; @@ -2577,6 +2614,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr, if (Offtype == set_compressed) lastNCount = op; op += countSize; + assert(op <= oend); } } /* build CTable for MatchLengths */ { unsigned max = MaxML; @@ -2597,6 +2635,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr, if (MLtype == set_compressed) lastNCount = op; op += countSize; + assert(op <= oend); } } *seqHead = (BYTE)((LLtype<<6) + (Offtype<<4) + (MLtype<<2)); @@ -2610,6 +2649,7 @@ ZSTD_compressSequences_internal(seqStore_t* seqStorePtr, longOffsets, bmi2); FORWARD_IF_ERROR(bitstreamSize); op += bitstreamSize; + assert(op <= oend); /* zstd versions <= 1.3.4 mistakenly report corruption when * FSE_readNCount() receives a buffer < 4 bytes. * Fixed by https://github.com/facebook/zstd/pull/1146. @@ -2721,30 +2761,24 @@ void ZSTD_resetSeqStore(seqStore_t* ssPtr) ssPtr->longLengthID = 0; } -static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize) +typedef enum { ZSTDbss_compress, ZSTDbss_noCompress } ZSTD_buildSeqStore_e; + +static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) { ZSTD_matchState_t* const ms = &zc->blockState.matchState; - size_t cSize; - DEBUGLOG(5, "ZSTD_compressBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)", - (unsigned)dstCapacity, (unsigned)ms->window.dictLimit, (unsigned)ms->nextToUpdate); + DEBUGLOG(5, "ZSTD_buildSeqStore (srcSize=%zu)", srcSize); assert(srcSize <= ZSTD_BLOCKSIZE_MAX); - /* Assert that we have correctly flushed the ctx params into the ms's copy */ ZSTD_assertEqualCParams(zc->appliedParams.cParams, ms->cParams); - if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) { ZSTD_ldm_skipSequences(&zc->externSeqStore, srcSize, zc->appliedParams.cParams.minMatch); - cSize = 0; - goto out; /* don't even attempt compression below a certain srcSize */ + return ZSTDbss_noCompress; /* don't even attempt compression below a certain srcSize */ } ZSTD_resetSeqStore(&(zc->seqStore)); /* required for optimal parser to read stats from dictionary */ ms->opt.symbolCosts = &zc->blockState.prevCBlock->entropy; /* tell the optimal parser how we expect to compress literals */ ms->opt.literalCompressionMode = zc->appliedParams.literalCompressionMode; - /* a gap between an attached dict and the current window is not safe, * they must remain adjacent, * and when that stops being the case, the dict must be unset */ @@ -2798,6 +2832,21 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, { const BYTE* const lastLiterals = (const BYTE*)src + srcSize - lastLLSize; ZSTD_storeLastLiterals(&zc->seqStore, lastLiterals, lastLLSize); } } + return ZSTDbss_compress; +} + +static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize) +{ + size_t cSize; + DEBUGLOG(5, "ZSTD_compressBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)", + (unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit, (unsigned)zc->blockState.matchState.nextToUpdate); + + { const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize); + FORWARD_IF_ERROR(bss); + if (bss == ZSTDbss_noCompress) { cSize = 0; goto out; } + } /* encode sequences and literals */ cSize = ZSTD_compressSequences(&zc->seqStore, @@ -2826,6 +2875,25 @@ out: } +static void ZSTD_overflowCorrectIfNeeded(ZSTD_matchState_t* ms, ZSTD_CCtx_params const* params, void const* ip, void const* iend) +{ + if (ZSTD_window_needOverflowCorrection(ms->window, iend)) { + U32 const maxDist = (U32)1 << params->cParams.windowLog; + U32 const cycleLog = ZSTD_cycleLog(params->cParams.chainLog, params->cParams.strategy); + U32 const correction = ZSTD_window_correctOverflow(&ms->window, cycleLog, maxDist, ip); + ZSTD_STATIC_ASSERT(ZSTD_CHAINLOG_MAX <= 30); + ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30); + ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31); + ZSTD_reduceIndex(ms, params, correction); + if (ms->nextToUpdate < correction) ms->nextToUpdate = 0; + else ms->nextToUpdate -= correction; + /* invalidate dictionaries on overflow correction */ + ms->loadedDictEnd = 0; + ms->dictMatchState = NULL; + } +} + + /*! ZSTD_compress_frameChunk() : * Compress a chunk of data into one or multiple blocks. * All blocks will be terminated, all input will be consumed. @@ -2844,7 +2912,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx, BYTE* const ostart = (BYTE*)dst; BYTE* op = ostart; U32 const maxDist = (U32)1 << cctx->appliedParams.cParams.windowLog; - assert(cctx->appliedParams.cParams.windowLog <= 31); + assert(cctx->appliedParams.cParams.windowLog <= ZSTD_WINDOWLOG_MAX); DEBUGLOG(5, "ZSTD_compress_frameChunk (blockSize=%u)", (unsigned)blockSize); if (cctx->appliedParams.fParams.checksumFlag && srcSize) @@ -2859,19 +2927,10 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx, "not enough space to store compressed block"); if (remaining < blockSize) blockSize = remaining; - if (ZSTD_window_needOverflowCorrection(ms->window, ip + blockSize)) { - U32 const cycleLog = ZSTD_cycleLog(cctx->appliedParams.cParams.chainLog, cctx->appliedParams.cParams.strategy); - U32 const correction = ZSTD_window_correctOverflow(&ms->window, cycleLog, maxDist, ip); - ZSTD_STATIC_ASSERT(ZSTD_CHAINLOG_MAX <= 30); - ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30); - ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31); - ZSTD_reduceIndex(cctx, correction); - if (ms->nextToUpdate < correction) ms->nextToUpdate = 0; - else ms->nextToUpdate -= correction; - ms->loadedDictEnd = 0; - ms->dictMatchState = NULL; - } - ZSTD_window_enforceMaxDist(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState); + ZSTD_overflowCorrectIfNeeded(ms, &cctx->appliedParams, ip, ip + blockSize); + ZSTD_checkDictValidity(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState); + + /* Ensure hash/chain table insertion resumes no sooner than lowlimit */ if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit; { size_t cSize = ZSTD_compressBlock_internal(cctx, @@ -2899,7 +2958,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx, } } if (lastFrameChunk && (op>ostart)) cctx->stage = ZSTDcs_ending; - return op-ostart; + return (size_t)(op-ostart); } @@ -2991,6 +3050,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx, fhSize = ZSTD_writeFrameHeader(dst, dstCapacity, cctx->appliedParams, cctx->pledgedSrcSizePlusOne-1, cctx->dictID); FORWARD_IF_ERROR(fhSize); + assert(fhSize <= dstCapacity); dstCapacity -= fhSize; dst = (char*)dst + fhSize; cctx->stage = ZSTDcs_ongoing; @@ -3007,18 +3067,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx, if (!frame) { /* overflow check and correction for block mode */ - if (ZSTD_window_needOverflowCorrection(ms->window, (const char*)src + srcSize)) { - U32 const cycleLog = ZSTD_cycleLog(cctx->appliedParams.cParams.chainLog, cctx->appliedParams.cParams.strategy); - U32 const correction = ZSTD_window_correctOverflow(&ms->window, cycleLog, 1 << cctx->appliedParams.cParams.windowLog, src); - ZSTD_STATIC_ASSERT(ZSTD_CHAINLOG_MAX <= 30); - ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30); - ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31); - ZSTD_reduceIndex(cctx, correction); - if (ms->nextToUpdate < correction) ms->nextToUpdate = 0; - else ms->nextToUpdate -= correction; - ms->loadedDictEnd = 0; - ms->dictMatchState = NULL; - } + ZSTD_overflowCorrectIfNeeded(ms, &cctx->appliedParams, src, (BYTE const*)src + srcSize); } DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (unsigned)cctx->blockSize); @@ -3074,7 +3123,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, const void* src, size_t srcSize, ZSTD_dictTableLoadMethod_e dtlm) { - const BYTE* const ip = (const BYTE*) src; + const BYTE* ip = (const BYTE*) src; const BYTE* const iend = ip + srcSize; ZSTD_window_update(&ms->window, src, srcSize); @@ -3085,32 +3134,42 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, if (srcSize <= HASH_READ_SIZE) return 0; - switch(params->cParams.strategy) - { - case ZSTD_fast: - ZSTD_fillHashTable(ms, iend, dtlm); - break; - case ZSTD_dfast: - ZSTD_fillDoubleHashTable(ms, iend, dtlm); - break; + while (iend - ip > HASH_READ_SIZE) { + size_t const remaining = iend - ip; + size_t const chunk = MIN(remaining, ZSTD_CHUNKSIZE_MAX); + const BYTE* const ichunk = ip + chunk; - case ZSTD_greedy: - case ZSTD_lazy: - case ZSTD_lazy2: - if (srcSize >= HASH_READ_SIZE) - ZSTD_insertAndFindFirstIndex(ms, iend-HASH_READ_SIZE); - break; + ZSTD_overflowCorrectIfNeeded(ms, params, ip, ichunk); - case ZSTD_btlazy2: /* we want the dictionary table fully sorted */ - case ZSTD_btopt: - case ZSTD_btultra: - case ZSTD_btultra2: - if (srcSize >= HASH_READ_SIZE) - ZSTD_updateTree(ms, iend-HASH_READ_SIZE, iend); - break; + switch(params->cParams.strategy) + { + case ZSTD_fast: + ZSTD_fillHashTable(ms, ichunk, dtlm); + break; + case ZSTD_dfast: + ZSTD_fillDoubleHashTable(ms, ichunk, dtlm); + break; - default: - assert(0); /* not possible : not a valid strategy id */ + case ZSTD_greedy: + case ZSTD_lazy: + case ZSTD_lazy2: + if (chunk >= HASH_READ_SIZE) + ZSTD_insertAndFindFirstIndex(ms, ichunk-HASH_READ_SIZE); + break; + + case ZSTD_btlazy2: /* we want the dictionary table fully sorted */ + case ZSTD_btopt: + case ZSTD_btultra: + case ZSTD_btultra2: + if (chunk >= HASH_READ_SIZE) + ZSTD_updateTree(ms, ichunk-HASH_READ_SIZE, ichunk); + break; + + default: + assert(0); /* not possible : not a valid strategy id */ + } + + ip = ichunk; } ms->nextToUpdate = (U32)(iend - ms->window.base); @@ -3297,12 +3356,11 @@ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx, FORWARD_IF_ERROR( ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize, ZSTDcrp_continue, zbuff) ); - { - size_t const dictID = ZSTD_compress_insertDictionary( + { size_t const dictID = ZSTD_compress_insertDictionary( cctx->blockState.prevCBlock, &cctx->blockState.matchState, ¶ms, dict, dictSize, dictContentType, dtlm, cctx->entropyWorkspace); FORWARD_IF_ERROR(dictID); - assert(dictID <= (size_t)(U32)-1); + assert(dictID <= UINT_MAX); cctx->dictID = (U32)dictID; } return 0; @@ -3555,10 +3613,10 @@ static size_t ZSTD_initCDict_internal( /* Reset the state to no dictionary */ ZSTD_reset_compressedBlockState(&cdict->cBlockState); - { void* const end = ZSTD_reset_matchState( - &cdict->matchState, - (U32*)cdict->workspace + HUF_WORKSPACE_SIZE_U32, - &cParams, ZSTDcrp_continue, /* forCCtx */ 0); + { void* const end = ZSTD_reset_matchState(&cdict->matchState, + (U32*)cdict->workspace + HUF_WORKSPACE_SIZE_U32, + &cParams, + ZSTDcrp_continue, ZSTD_resetTarget_CDict); assert(end == (char*)cdict->workspace + cdict->workspaceSize); (void)end; } @@ -4068,7 +4126,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, case zcss_flush: DEBUGLOG(5, "flush stage"); { size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize; - size_t const flushed = ZSTD_limitCopy(op, oend-op, + size_t const flushed = ZSTD_limitCopy(op, (size_t)(oend-op), zcs->outBuff + zcs->outBuffFlushedSize, toFlush); DEBUGLOG(5, "toFlush: %u into %u ==> flushed: %u", (unsigned)toFlush, (unsigned)(oend-op), (unsigned)flushed); @@ -4262,7 +4320,7 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */ /* single thread mode : attempt to calculate remaining to flush more precisely */ { size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE; - size_t const checksumSize = zcs->frameEnded ? 0 : zcs->appliedParams.fParams.checksumFlag * 4; + size_t const checksumSize = (size_t)(zcs->frameEnded ? 0 : zcs->appliedParams.fParams.checksumFlag * 4); size_t const toFlush = remainingToFlush + lastBlockSize + checksumSize; DEBUGLOG(4, "ZSTD_endStream : remaining to flush : %u", (unsigned)toFlush); return toFlush; diff --git a/thirdparty/zstd/compress/zstd_compress_internal.h b/thirdparty/zstd/compress/zstd_compress_internal.h index cc3cbb9da9..5495899be3 100644 --- a/thirdparty/zstd/compress/zstd_compress_internal.h +++ b/thirdparty/zstd/compress/zstd_compress_internal.h @@ -33,13 +33,13 @@ extern "C" { ***************************************/ #define kSearchStrength 8 #define HASH_READ_SIZE 8 -#define ZSTD_DUBT_UNSORTED_MARK 1 /* For btlazy2 strategy, index 1 now means "unsorted". +#define ZSTD_DUBT_UNSORTED_MARK 1 /* For btlazy2 strategy, index ZSTD_DUBT_UNSORTED_MARK==1 means "unsorted". It could be confused for a real successor at index "1", if sorted as larger than its predecessor. It's not a big deal though : candidate will just be sorted again. Additionally, candidate position 1 will be lost. But candidate 1 cannot hide a large tree of candidates, so it's a minimal loss. - The benefit is that ZSTD_DUBT_UNSORTED_MARK cannot be mishandled after table re-use with a different strategy - Constant required by ZSTD_compressBlock_btlazy2() and ZSTD_reduceTable_internal() */ + The benefit is that ZSTD_DUBT_UNSORTED_MARK cannot be mishandled after table re-use with a different strategy. + This constant is required by ZSTD_compressBlock_btlazy2() and ZSTD_reduceTable_internal() */ /*-************************************* @@ -128,21 +128,20 @@ typedef struct { BYTE const* base; /* All regular indexes relative to this position */ BYTE const* dictBase; /* extDict indexes relative to this position */ U32 dictLimit; /* below that point, need extDict */ - U32 lowLimit; /* below that point, no more data */ + U32 lowLimit; /* below that point, no more valid data */ } ZSTD_window_t; typedef struct ZSTD_matchState_t ZSTD_matchState_t; struct ZSTD_matchState_t { ZSTD_window_t window; /* State for window round buffer management */ - U32 loadedDictEnd; /* index of end of dictionary */ + U32 loadedDictEnd; /* index of end of dictionary, within context's referential. When dict referential is copied into active context (i.e. not attached), effectively same value as dictSize, since referential starts from zero */ U32 nextToUpdate; /* index from which to continue table update */ - U32 nextToUpdate3; /* index from which to continue table update */ U32 hashLog3; /* dispatch table : larger == faster, more memory */ U32* hashTable; U32* hashTable3; U32* chainTable; optState_t opt; /* optimal parser state */ - const ZSTD_matchState_t * dictMatchState; + const ZSTD_matchState_t* dictMatchState; ZSTD_compressionParameters cParams; }; @@ -195,6 +194,9 @@ struct ZSTD_CCtx_params_s { int compressionLevel; int forceWindow; /* force back-references to respect limit of * 1<<wLog, even for dictionary */ + size_t targetCBlockSize; /* Tries to fit compressed block size to be around targetCBlockSize. + * No target when targetCBlockSize == 0. + * There is no guarantee on compressed block size */ ZSTD_dictAttachPref_e attachDictPref; ZSTD_literalCompressionMode_e literalCompressionMode; @@ -324,7 +326,7 @@ MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const v /* copy Literals */ assert(seqStorePtr->maxNbLit <= 128 KB); assert(seqStorePtr->lit + litLength <= seqStorePtr->litStart + seqStorePtr->maxNbLit); - ZSTD_wildcopy(seqStorePtr->lit, literals, litLength); + ZSTD_wildcopy(seqStorePtr->lit, literals, litLength, ZSTD_no_overlap); seqStorePtr->lit += litLength; /* literal Length */ @@ -564,6 +566,9 @@ MEM_STATIC U64 ZSTD_rollingHash_rotate(U64 hash, BYTE toRemove, BYTE toAdd, U64 /*-************************************* * Round buffer management ***************************************/ +#if (ZSTD_WINDOWLOG_MAX_64 > 31) +# error "ZSTD_WINDOWLOG_MAX is too large : would overflow ZSTD_CURRENT_MAX" +#endif /* Max current allowed */ #define ZSTD_CURRENT_MAX ((3U << 29) + (1U << ZSTD_WINDOWLOG_MAX)) /* Maximum chunk size before overflow correction needs to be called again */ @@ -675,31 +680,49 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog, * Updates lowLimit so that: * (srcEnd - base) - lowLimit == maxDist + loadedDictEnd * - * This allows a simple check that index >= lowLimit to see if index is valid. - * This must be called before a block compression call, with srcEnd as the block - * source end. + * It ensures index is valid as long as index >= lowLimit. + * This must be called before a block compression call. + * + * loadedDictEnd is only defined if a dictionary is in use for current compression. + * As the name implies, loadedDictEnd represents the index at end of dictionary. + * The value lies within context's referential, it can be directly compared to blockEndIdx. * - * If loadedDictEndPtr is not NULL, we set it to zero once we update lowLimit. - * This is because dictionaries are allowed to be referenced as long as the last - * byte of the dictionary is in the window, but once they are out of range, - * they cannot be referenced. If loadedDictEndPtr is NULL, we use - * loadedDictEnd == 0. + * If loadedDictEndPtr is NULL, no dictionary is in use, and we use loadedDictEnd == 0. + * If loadedDictEndPtr is not NULL, we set it to zero after updating lowLimit. + * This is because dictionaries are allowed to be referenced fully + * as long as the last byte of the dictionary is in the window. + * Once input has progressed beyond window size, dictionary cannot be referenced anymore. * - * In normal dict mode, the dict is between lowLimit and dictLimit. In - * dictMatchState mode, lowLimit and dictLimit are the same, and the dictionary - * is below them. forceWindow and dictMatchState are therefore incompatible. + * In normal dict mode, the dictionary lies between lowLimit and dictLimit. + * In dictMatchState mode, lowLimit and dictLimit are the same, + * and the dictionary is below them. + * forceWindow and dictMatchState are therefore incompatible. */ MEM_STATIC void ZSTD_window_enforceMaxDist(ZSTD_window_t* window, - void const* srcEnd, - U32 maxDist, - U32* loadedDictEndPtr, + const void* blockEnd, + U32 maxDist, + U32* loadedDictEndPtr, const ZSTD_matchState_t** dictMatchStatePtr) { - U32 const blockEndIdx = (U32)((BYTE const*)srcEnd - window->base); - U32 loadedDictEnd = (loadedDictEndPtr != NULL) ? *loadedDictEndPtr : 0; - DEBUGLOG(5, "ZSTD_window_enforceMaxDist: blockEndIdx=%u, maxDist=%u", - (unsigned)blockEndIdx, (unsigned)maxDist); + U32 const blockEndIdx = (U32)((BYTE const*)blockEnd - window->base); + U32 const loadedDictEnd = (loadedDictEndPtr != NULL) ? *loadedDictEndPtr : 0; + DEBUGLOG(5, "ZSTD_window_enforceMaxDist: blockEndIdx=%u, maxDist=%u, loadedDictEnd=%u", + (unsigned)blockEndIdx, (unsigned)maxDist, (unsigned)loadedDictEnd); + + /* - When there is no dictionary : loadedDictEnd == 0. + In which case, the test (blockEndIdx > maxDist) is merely to avoid + overflowing next operation `newLowLimit = blockEndIdx - maxDist`. + - When there is a standard dictionary : + Index referential is copied from the dictionary, + which means it starts from 0. + In which case, loadedDictEnd == dictSize, + and it makes sense to compare `blockEndIdx > maxDist + dictSize` + since `blockEndIdx` also starts from zero. + - When there is an attached dictionary : + loadedDictEnd is expressed within the referential of the context, + so it can be directly compared against blockEndIdx. + */ if (blockEndIdx > maxDist + loadedDictEnd) { U32 const newLowLimit = blockEndIdx - maxDist; if (window->lowLimit < newLowLimit) window->lowLimit = newLowLimit; @@ -708,10 +731,31 @@ ZSTD_window_enforceMaxDist(ZSTD_window_t* window, (unsigned)window->dictLimit, (unsigned)window->lowLimit); window->dictLimit = window->lowLimit; } - if (loadedDictEndPtr) - *loadedDictEndPtr = 0; - if (dictMatchStatePtr) - *dictMatchStatePtr = NULL; + /* On reaching window size, dictionaries are invalidated */ + if (loadedDictEndPtr) *loadedDictEndPtr = 0; + if (dictMatchStatePtr) *dictMatchStatePtr = NULL; + } +} + +/* Similar to ZSTD_window_enforceMaxDist(), + * but only invalidates dictionary + * when input progresses beyond window size. */ +MEM_STATIC void +ZSTD_checkDictValidity(ZSTD_window_t* window, + const void* blockEnd, + U32 maxDist, + U32* loadedDictEndPtr, + const ZSTD_matchState_t** dictMatchStatePtr) +{ + U32 const blockEndIdx = (U32)((BYTE const*)blockEnd - window->base); + U32 const loadedDictEnd = (loadedDictEndPtr != NULL) ? *loadedDictEndPtr : 0; + DEBUGLOG(5, "ZSTD_checkDictValidity: blockEndIdx=%u, maxDist=%u, loadedDictEnd=%u", + (unsigned)blockEndIdx, (unsigned)maxDist, (unsigned)loadedDictEnd); + + if (loadedDictEnd && (blockEndIdx > maxDist + loadedDictEnd)) { + /* On reaching window size, dictionaries are invalidated */ + if (loadedDictEndPtr) *loadedDictEndPtr = 0; + if (dictMatchStatePtr) *dictMatchStatePtr = NULL; } } diff --git a/thirdparty/zstd/compress/zstd_double_fast.c b/thirdparty/zstd/compress/zstd_double_fast.c index 47faf6d641..5957255d90 100644 --- a/thirdparty/zstd/compress/zstd_double_fast.c +++ b/thirdparty/zstd/compress/zstd_double_fast.c @@ -43,8 +43,7 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, /* Only load extra positions for ZSTD_dtlm_full */ if (dtlm == ZSTD_dtlm_fast) break; - } - } + } } } @@ -63,7 +62,10 @@ size_t ZSTD_compressBlock_doubleFast_generic( const BYTE* const istart = (const BYTE*)src; const BYTE* ip = istart; const BYTE* anchor = istart; - const U32 prefixLowestIndex = ms->window.dictLimit; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 lowestValid = ms->window.dictLimit; + const U32 maxDistance = 1U << cParams->windowLog; + const U32 prefixLowestIndex = (endIndex - lowestValid > maxDistance) ? endIndex - maxDistance : lowestValid; const BYTE* const prefixLowest = base + prefixLowestIndex; const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - HASH_READ_SIZE; @@ -95,8 +97,15 @@ size_t ZSTD_compressBlock_doubleFast_generic( dictCParams->chainLog : hBitsS; const U32 dictAndPrefixLength = (U32)(ip - prefixLowest + dictEnd - dictStart); + DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_generic"); + assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState); + /* if a dictionary is attached, it must be within window range */ + if (dictMode == ZSTD_dictMatchState) { + assert(lowestValid + maxDistance >= endIndex); + } + /* init */ ip += (dictAndPrefixLength == 0); if (dictMode == ZSTD_noDict) { @@ -138,7 +147,7 @@ size_t ZSTD_compressBlock_doubleFast_generic( const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; ip++; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, 0, mLength-MINMATCH); goto _match_stored; } @@ -147,7 +156,7 @@ size_t ZSTD_compressBlock_doubleFast_generic( && ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1)))) { mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; ip++; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, 0, mLength-MINMATCH); goto _match_stored; } @@ -170,8 +179,7 @@ size_t ZSTD_compressBlock_doubleFast_generic( offset = (U32)(current - dictMatchIndexL - dictIndexDelta); while (((ip>anchor) & (dictMatchL>dictStart)) && (ip[-1] == dictMatchL[-1])) { ip--; dictMatchL--; mLength++; } /* catch up */ goto _match_found; - } - } + } } if (matchIndexS > prefixLowestIndex) { /* check prefix short match */ @@ -186,16 +194,14 @@ size_t ZSTD_compressBlock_doubleFast_generic( if (match > dictStart && MEM_read32(match) == MEM_read32(ip)) { goto _search_next_long; - } - } + } } ip += ((ip-anchor) >> kSearchStrength) + 1; continue; _search_next_long: - { - size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8); + { size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8); size_t const dictHLNext = ZSTD_hashPtr(ip+1, dictHBitsL, 8); U32 const matchIndexL3 = hashLong[hl3]; const BYTE* matchL3 = base + matchIndexL3; @@ -221,9 +227,7 @@ _search_next_long: offset = (U32)(current + 1 - dictMatchIndexL3 - dictIndexDelta); while (((ip>anchor) & (dictMatchL3>dictStart)) && (ip[-1] == dictMatchL3[-1])) { ip--; dictMatchL3--; mLength++; } /* catch up */ goto _match_found; - } - } - } + } } } /* if no long +1 match, explore the short match we found */ if (dictMode == ZSTD_dictMatchState && matchIndexS < prefixLowestIndex) { @@ -242,7 +246,7 @@ _match_found: offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); _match_stored: /* match found */ @@ -250,11 +254,14 @@ _match_stored: anchor = ip; if (ip <= ilimit) { - /* Fill Table */ - hashLong[ZSTD_hashPtr(base+current+2, hBitsL, 8)] = - hashSmall[ZSTD_hashPtr(base+current+2, hBitsS, mls)] = current+2; /* here because current+2 could be > iend-8 */ - hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = - hashSmall[ZSTD_hashPtr(ip-2, hBitsS, mls)] = (U32)(ip-2-base); + /* Complementary insertion */ + /* done after iLimit test, as candidates could be > iend-8 */ + { U32 const indexToInsert = current+2; + hashLong[ZSTD_hashPtr(base+indexToInsert, hBitsL, 8)] = indexToInsert; + hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base); + hashSmall[ZSTD_hashPtr(base+indexToInsert, hBitsS, mls)] = indexToInsert; + hashSmall[ZSTD_hashPtr(ip-1, hBitsS, mls)] = (U32)(ip-1-base); + } /* check immediate repcode */ if (dictMode == ZSTD_dictMatchState) { @@ -278,8 +285,7 @@ _match_stored: continue; } break; - } - } + } } if (dictMode == ZSTD_noDict) { while ( (ip <= ilimit) @@ -294,14 +300,15 @@ _match_stored: ip += rLength; anchor = ip; continue; /* faster when present ... (?) */ - } } } } + } } } + } /* while (ip < ilimit) */ /* save reps for next block */ rep[0] = offset_1 ? offset_1 : offsetSaved; rep[1] = offset_2 ? offset_2 : offsetSaved; /* Return the last literals size */ - return iend - anchor; + return (size_t)(iend - anchor); } @@ -360,10 +367,15 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( const BYTE* anchor = istart; const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - 8; - const U32 prefixStartIndex = ms->window.dictLimit; const BYTE* const base = ms->window.base; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 maxDistance = 1U << cParams->windowLog; + const U32 lowestValid = ms->window.lowLimit; + const U32 lowLimit = (endIndex - lowestValid > maxDistance) ? endIndex - maxDistance : lowestValid; + const U32 dictStartIndex = lowLimit; + const U32 dictLimit = ms->window.dictLimit; + const U32 prefixStartIndex = (dictLimit > lowLimit) ? dictLimit : lowLimit; const BYTE* const prefixStart = base + prefixStartIndex; - const U32 dictStartIndex = ms->window.lowLimit; const BYTE* const dictBase = ms->window.dictBase; const BYTE* const dictStart = dictBase + dictStartIndex; const BYTE* const dictEnd = dictBase + prefixStartIndex; @@ -371,6 +383,10 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_extDict_generic (srcSize=%zu)", srcSize); + /* if extDict is invalidated due to maxDistance, switch to "regular" variant */ + if (prefixStartIndex == dictStartIndex) + return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, mls, ZSTD_noDict); + /* Search Loop */ while (ip < ilimit) { /* < instead of <=, because (ip+1) */ const size_t hSmall = ZSTD_hashPtr(ip, hBitsS, mls); @@ -396,7 +412,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, 0, mLength-MINMATCH); } else { if ((matchLongIndex > dictStartIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) { const BYTE* const matchEnd = matchLongIndex < prefixStartIndex ? dictEnd : iend; @@ -407,7 +423,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( while (((ip>anchor) & (matchLong>lowMatchPtr)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); } else if ((matchIndex > dictStartIndex) && (MEM_read32(match) == MEM_read32(ip))) { size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8); @@ -432,23 +448,27 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( } offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); } else { ip += ((ip-anchor) >> kSearchStrength) + 1; continue; } } - /* found a match : store it */ + /* move to next sequence start */ ip += mLength; anchor = ip; if (ip <= ilimit) { - /* Fill Table */ - hashSmall[ZSTD_hashPtr(base+current+2, hBitsS, mls)] = current+2; - hashLong[ZSTD_hashPtr(base+current+2, hBitsL, 8)] = current+2; - hashSmall[ZSTD_hashPtr(ip-2, hBitsS, mls)] = (U32)(ip-2-base); - hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base); + /* Complementary insertion */ + /* done after iLimit test, as candidates could be > iend-8 */ + { U32 const indexToInsert = current+2; + hashLong[ZSTD_hashPtr(base+indexToInsert, hBitsL, 8)] = indexToInsert; + hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base); + hashSmall[ZSTD_hashPtr(base+indexToInsert, hBitsS, mls)] = indexToInsert; + hashSmall[ZSTD_hashPtr(ip-1, hBitsS, mls)] = (U32)(ip-1-base); + } + /* check immediate repcode */ while (ip <= ilimit) { U32 const current2 = (U32)(ip-base); @@ -475,7 +495,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( rep[1] = offset_2; /* Return the last literals size */ - return iend - anchor; + return (size_t)(iend - anchor); } diff --git a/thirdparty/zstd/compress/zstd_fast.c b/thirdparty/zstd/compress/zstd_fast.c index ed997b441c..a05b8a47f1 100644 --- a/thirdparty/zstd/compress/zstd_fast.c +++ b/thirdparty/zstd/compress/zstd_fast.c @@ -13,7 +13,8 @@ void ZSTD_fillHashTable(ZSTD_matchState_t* ms, - void const* end, ZSTD_dictTableLoadMethod_e dtlm) + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32* const hashTable = ms->hashTable; @@ -41,6 +42,7 @@ void ZSTD_fillHashTable(ZSTD_matchState_t* ms, } } } } } + FORCE_INLINE_TEMPLATE size_t ZSTD_compressBlock_fast_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], @@ -58,7 +60,10 @@ size_t ZSTD_compressBlock_fast_generic( const BYTE* ip0 = istart; const BYTE* ip1; const BYTE* anchor = istart; - const U32 prefixStartIndex = ms->window.dictLimit; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 maxDistance = 1U << cParams->windowLog; + const U32 validStartIndex = ms->window.dictLimit; + const U32 prefixStartIndex = (endIndex - validStartIndex > maxDistance) ? endIndex - maxDistance : validStartIndex; const BYTE* const prefixStart = base + prefixStartIndex; const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - HASH_READ_SIZE; @@ -165,7 +170,7 @@ _match: /* Requires: ip0, match0, offcode */ rep[1] = offset_2 ? offset_2 : offsetSaved; /* Return the last literals size */ - return iend - anchor; + return (size_t)(iend - anchor); } @@ -222,8 +227,15 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const U32 dictAndPrefixLength = (U32)(ip - prefixStart + dictEnd - dictStart); const U32 dictHLog = dictCParams->hashLog; - /* otherwise, we would get index underflow when translating a dict index - * into a local index */ + /* if a dictionary is still attached, it necessarily means that + * it is within window size. So we just check it. */ + const U32 maxDistance = 1U << cParams->windowLog; + const U32 endIndex = (U32)((size_t)(ip - base) + srcSize); + assert(endIndex - prefixStartIndex <= maxDistance); + (void)maxDistance; (void)endIndex; /* these variables are not used when assert() is disabled */ + + /* ensure there will be no no underflow + * when translating a dict index into a local index */ assert(prefixStartIndex >= (U32)(dictEnd - dictBase)); /* init */ @@ -251,7 +263,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, 0, mLength-MINMATCH); } else if ( (matchIndex <= prefixStartIndex) ) { size_t const dictHash = ZSTD_hashPtr(ip, dictHLog, mls); U32 const dictMatchIndex = dictHashTable[dictHash]; @@ -271,7 +283,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); } } else if (MEM_read32(match) != MEM_read32(ip)) { /* it's not a match, and we're not going to check the dictionary */ @@ -286,7 +298,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); } /* match found */ @@ -327,7 +339,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( rep[1] = offset_2 ? offset_2 : offsetSaved; /* Return the last literals size */ - return iend - anchor; + return (size_t)(iend - anchor); } size_t ZSTD_compressBlock_fast_dictMatchState( @@ -366,15 +378,24 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* const istart = (const BYTE*)src; const BYTE* ip = istart; const BYTE* anchor = istart; - const U32 dictStartIndex = ms->window.lowLimit; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 maxDistance = 1U << cParams->windowLog; + const U32 validLow = ms->window.lowLimit; + const U32 lowLimit = (endIndex - validLow > maxDistance) ? endIndex - maxDistance : validLow; + const U32 dictStartIndex = lowLimit; const BYTE* const dictStart = dictBase + dictStartIndex; - const U32 prefixStartIndex = ms->window.dictLimit; + const U32 dictLimit = ms->window.dictLimit; + const U32 prefixStartIndex = dictLimit < lowLimit ? lowLimit : dictLimit; const BYTE* const prefixStart = base + prefixStartIndex; const BYTE* const dictEnd = dictBase + prefixStartIndex; const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - 8; U32 offset_1=rep[0], offset_2=rep[1]; + /* switch to "regular" variant if extDict is invalidated due to maxDistance */ + if (prefixStartIndex == dictStartIndex) + return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, mls); + /* Search Loop */ while (ip < ilimit) { /* < instead of <=, because (ip+1) */ const size_t h = ZSTD_hashPtr(ip, hlog, mls); @@ -394,7 +415,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, 0, mLength-MINMATCH); } else { if ( (matchIndex < dictStartIndex) || (MEM_read32(match) != MEM_read32(ip)) ) { @@ -410,7 +431,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( offset = current - matchIndex; offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH); } } /* found a match : store it */ @@ -445,7 +466,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( rep[1] = offset_2; /* Return the last literals size */ - return iend - anchor; + return (size_t)(iend - anchor); } diff --git a/thirdparty/zstd/compress/zstd_lazy.c b/thirdparty/zstd/compress/zstd_lazy.c index 53f998a437..94d906c01f 100644 --- a/thirdparty/zstd/compress/zstd_lazy.c +++ b/thirdparty/zstd/compress/zstd_lazy.c @@ -83,7 +83,10 @@ ZSTD_insertDUBT1(ZSTD_matchState_t* ms, U32* largerPtr = smallerPtr + 1; U32 matchIndex = *smallerPtr; /* this candidate is unsorted : next sorted candidate is reached through *smallerPtr, while *largerPtr contains previous unsorted candidate (which is already saved and can be overwritten) */ U32 dummy32; /* to be nullified at the end */ - U32 const windowLow = ms->window.lowLimit; + U32 const windowValid = ms->window.lowLimit; + U32 const maxDistance = 1U << cParams->windowLog; + U32 const windowLow = (current - windowValid > maxDistance) ? current - maxDistance : windowValid; + DEBUGLOG(8, "ZSTD_insertDUBT1(%u) (dictLimit=%u, lowLimit=%u)", current, dictLimit, windowLow); @@ -239,7 +242,9 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, const BYTE* const base = ms->window.base; U32 const current = (U32)(ip-base); - U32 const windowLow = ms->window.lowLimit; + U32 const maxDistance = 1U << cParams->windowLog; + U32 const windowValid = ms->window.lowLimit; + U32 const windowLow = (current - windowValid > maxDistance) ? current - maxDistance : windowValid; U32* const bt = ms->chainTable; U32 const btLog = cParams->chainLog - 1; @@ -490,8 +495,10 @@ size_t ZSTD_HcFindBestMatch_generic ( const U32 dictLimit = ms->window.dictLimit; const BYTE* const prefixStart = base + dictLimit; const BYTE* const dictEnd = dictBase + dictLimit; - const U32 lowLimit = ms->window.lowLimit; const U32 current = (U32)(ip-base); + const U32 maxDistance = 1U << cParams->windowLog; + const U32 lowValid = ms->window.lowLimit; + const U32 lowLimit = (current - lowValid > maxDistance) ? current - maxDistance : lowValid; const U32 minChain = current > chainSize ? current - chainSize : 0; U32 nbAttempts = 1U << cParams->searchLog; size_t ml=4-1; @@ -653,7 +660,6 @@ size_t ZSTD_compressBlock_lazy_generic( /* init */ ip += (dictAndPrefixLength == 0); - ms->nextToUpdate3 = ms->nextToUpdate; if (dictMode == ZSTD_noDict) { U32 const maxRep = (U32)(ip - prefixLowest); if (offset_2 > maxRep) savedOffset = offset_2, offset_2 = 0; @@ -933,7 +939,6 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( U32 offset_1 = rep[0], offset_2 = rep[1]; /* init */ - ms->nextToUpdate3 = ms->nextToUpdate; ip += (ip == prefixStart); /* Match Loop */ diff --git a/thirdparty/zstd/compress/zstd_ldm.c b/thirdparty/zstd/compress/zstd_ldm.c index 784d20f3ab..3dcf86e6e8 100644 --- a/thirdparty/zstd/compress/zstd_ldm.c +++ b/thirdparty/zstd/compress/zstd_ldm.c @@ -447,7 +447,7 @@ size_t ZSTD_ldm_generateSequences( if (ZSTD_window_needOverflowCorrection(ldmState->window, chunkEnd)) { U32 const ldmHSize = 1U << params->hashLog; U32 const correction = ZSTD_window_correctOverflow( - &ldmState->window, /* cycleLog */ 0, maxDist, src); + &ldmState->window, /* cycleLog */ 0, maxDist, chunkStart); ZSTD_ldm_reduceTable(ldmState->hashTable, ldmHSize, correction); } /* 2. We enforce the maximum offset allowed. diff --git a/thirdparty/zstd/compress/zstd_opt.c b/thirdparty/zstd/compress/zstd_opt.c index efb69d3267..e32e542e02 100644 --- a/thirdparty/zstd/compress/zstd_opt.c +++ b/thirdparty/zstd/compress/zstd_opt.c @@ -255,13 +255,13 @@ static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optP * to provide a cost which is directly comparable to a match ending at same position */ static int ZSTD_litLengthContribution(U32 const litLength, const optState_t* const optPtr, int optLevel) { - if (optPtr->priceType >= zop_predef) return WEIGHT(litLength, optLevel); + if (optPtr->priceType >= zop_predef) return (int)WEIGHT(litLength, optLevel); /* dynamic statistics */ { U32 const llCode = ZSTD_LLcode(litLength); - int const contribution = (LL_bits[llCode] * BITCOST_MULTIPLIER) - + WEIGHT(optPtr->litLengthFreq[0], optLevel) /* note: log2litLengthSum cancel out */ - - WEIGHT(optPtr->litLengthFreq[llCode], optLevel); + int const contribution = (int)(LL_bits[llCode] * BITCOST_MULTIPLIER) + + (int)WEIGHT(optPtr->litLengthFreq[0], optLevel) /* note: log2litLengthSum cancel out */ + - (int)WEIGHT(optPtr->litLengthFreq[llCode], optLevel); #if 1 return contribution; #else @@ -278,7 +278,7 @@ static int ZSTD_literalsContribution(const BYTE* const literals, U32 const litLe const optState_t* const optPtr, int optLevel) { - int const contribution = ZSTD_rawLiteralsCost(literals, litLength, optPtr, optLevel) + int const contribution = (int)ZSTD_rawLiteralsCost(literals, litLength, optPtr, optLevel) + ZSTD_litLengthContribution(litLength, optPtr, optLevel); return contribution; } @@ -372,13 +372,15 @@ MEM_STATIC U32 ZSTD_readMINMATCH(const void* memPtr, U32 length) /* Update hashTable3 up to ip (excluded) Assumption : always within prefix (i.e. not within extDict) */ -static U32 ZSTD_insertAndFindFirstIndexHash3 (ZSTD_matchState_t* ms, const BYTE* const ip) +static U32 ZSTD_insertAndFindFirstIndexHash3 (ZSTD_matchState_t* ms, + U32* nextToUpdate3, + const BYTE* const ip) { U32* const hashTable3 = ms->hashTable3; U32 const hashLog3 = ms->hashLog3; const BYTE* const base = ms->window.base; - U32 idx = ms->nextToUpdate3; - U32 const target = ms->nextToUpdate3 = (U32)(ip - base); + U32 idx = *nextToUpdate3; + U32 const target = (U32)(ip - base); size_t const hash3 = ZSTD_hash3Ptr(ip, hashLog3); assert(hashLog3 > 0); @@ -387,6 +389,7 @@ static U32 ZSTD_insertAndFindFirstIndexHash3 (ZSTD_matchState_t* ms, const BYTE* idx++; } + *nextToUpdate3 = target; return hashTable3[hash3]; } @@ -503,9 +506,11 @@ static U32 ZSTD_insertBt1( } } *smallerPtr = *largerPtr = 0; - if (bestLength > 384) return MIN(192, (U32)(bestLength - 384)); /* speed optimization */ - assert(matchEndIdx > current + 8); - return matchEndIdx - (current + 8); + { U32 positions = 0; + if (bestLength > 384) positions = MIN(192, (U32)(bestLength - 384)); /* speed optimization */ + assert(matchEndIdx > current + 8); + return MAX(positions, matchEndIdx - (current + 8)); + } } FORCE_INLINE_TEMPLATE @@ -520,8 +525,13 @@ void ZSTD_updateTree_internal( DEBUGLOG(6, "ZSTD_updateTree_internal, from %u to %u (dictMode:%u)", idx, target, dictMode); - while(idx < target) - idx += ZSTD_insertBt1(ms, base+idx, iend, mls, dictMode == ZSTD_extDict); + while(idx < target) { + U32 const forward = ZSTD_insertBt1(ms, base+idx, iend, mls, dictMode == ZSTD_extDict); + assert(idx < (U32)(idx + forward)); + idx += forward; + } + assert((size_t)(ip - base) <= (size_t)(U32)(-1)); + assert((size_t)(iend - base) <= (size_t)(U32)(-1)); ms->nextToUpdate = target; } @@ -531,16 +541,18 @@ void ZSTD_updateTree(ZSTD_matchState_t* ms, const BYTE* ip, const BYTE* iend) { FORCE_INLINE_TEMPLATE U32 ZSTD_insertBtAndGetAllMatches ( + ZSTD_match_t* matches, /* store result (found matches) in this table (presumed large enough) */ ZSTD_matchState_t* ms, + U32* nextToUpdate3, const BYTE* const ip, const BYTE* const iLimit, const ZSTD_dictMode_e dictMode, - U32 rep[ZSTD_REP_NUM], + const U32 rep[ZSTD_REP_NUM], U32 const ll0, /* tells if associated literal length is 0 or not. This value must be 0 or 1 */ - ZSTD_match_t* matches, const U32 lengthToBeat, U32 const mls /* template */) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1); + U32 const maxDistance = 1U << cParams->windowLog; const BYTE* const base = ms->window.base; U32 const current = (U32)(ip-base); U32 const hashLog = cParams->hashLog; @@ -556,8 +568,9 @@ U32 ZSTD_insertBtAndGetAllMatches ( U32 const dictLimit = ms->window.dictLimit; const BYTE* const dictEnd = dictBase + dictLimit; const BYTE* const prefixStart = base + dictLimit; - U32 const btLow = btMask >= current ? 0 : current - btMask; - U32 const windowLow = ms->window.lowLimit; + U32 const btLow = (btMask >= current) ? 0 : current - btMask; + U32 const windowValid = ms->window.lowLimit; + U32 const windowLow = ((current - windowValid) > maxDistance) ? current - maxDistance : windowValid; U32 const matchLow = windowLow ? windowLow : 1; U32* smallerPtr = bt + 2*(current&btMask); U32* largerPtr = bt + 2*(current&btMask) + 1; @@ -627,7 +640,7 @@ U32 ZSTD_insertBtAndGetAllMatches ( /* HC3 match finder */ if ((mls == 3) /*static*/ && (bestLength < mls)) { - U32 const matchIndex3 = ZSTD_insertAndFindFirstIndexHash3(ms, ip); + U32 const matchIndex3 = ZSTD_insertAndFindFirstIndexHash3(ms, nextToUpdate3, ip); if ((matchIndex3 >= matchLow) & (current - matchIndex3 < (1<<18)) /*heuristic : longer distance likely too expensive*/ ) { size_t mlen; @@ -653,9 +666,7 @@ U32 ZSTD_insertBtAndGetAllMatches ( (ip+mlen == iLimit) ) { /* best possible length */ ms->nextToUpdate = current+1; /* skip insertion */ return 1; - } - } - } + } } } /* no dictMatchState lookup: dicts don't have a populated HC3 table */ } @@ -760,10 +771,13 @@ U32 ZSTD_insertBtAndGetAllMatches ( FORCE_INLINE_TEMPLATE U32 ZSTD_BtGetAllMatches ( + ZSTD_match_t* matches, /* store result (match found, increasing size) in this table */ ZSTD_matchState_t* ms, + U32* nextToUpdate3, const BYTE* ip, const BYTE* const iHighLimit, const ZSTD_dictMode_e dictMode, - U32 rep[ZSTD_REP_NUM], U32 const ll0, - ZSTD_match_t* matches, U32 const lengthToBeat) + const U32 rep[ZSTD_REP_NUM], + U32 const ll0, + U32 const lengthToBeat) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32 const matchLengthSearch = cParams->minMatch; @@ -772,12 +786,12 @@ FORCE_INLINE_TEMPLATE U32 ZSTD_BtGetAllMatches ( ZSTD_updateTree_internal(ms, ip, iHighLimit, matchLengthSearch, dictMode); switch(matchLengthSearch) { - case 3 : return ZSTD_insertBtAndGetAllMatches(ms, ip, iHighLimit, dictMode, rep, ll0, matches, lengthToBeat, 3); + case 3 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 3); default : - case 4 : return ZSTD_insertBtAndGetAllMatches(ms, ip, iHighLimit, dictMode, rep, ll0, matches, lengthToBeat, 4); - case 5 : return ZSTD_insertBtAndGetAllMatches(ms, ip, iHighLimit, dictMode, rep, ll0, matches, lengthToBeat, 5); + case 4 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 4); + case 5 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 5); case 7 : - case 6 : return ZSTD_insertBtAndGetAllMatches(ms, ip, iHighLimit, dictMode, rep, ll0, matches, lengthToBeat, 6); + case 6 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 6); } } @@ -853,6 +867,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1); U32 const minMatch = (cParams->minMatch == 3) ? 3 : 4; + U32 nextToUpdate3 = ms->nextToUpdate; ZSTD_optimal_t* const opt = optStatePtr->priceTable; ZSTD_match_t* const matches = optStatePtr->matchTable; @@ -862,7 +877,6 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, DEBUGLOG(5, "ZSTD_compressBlock_opt_generic: current=%u, prefix=%u, nextToUpdate=%u", (U32)(ip - base), ms->window.dictLimit, ms->nextToUpdate); assert(optLevel <= 2); - ms->nextToUpdate3 = ms->nextToUpdate; ZSTD_rescaleFreqs(optStatePtr, (const BYTE*)src, srcSize, optLevel); ip += (ip==prefixStart); @@ -873,7 +887,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, /* find first match */ { U32 const litlen = (U32)(ip - anchor); U32 const ll0 = !litlen; - U32 const nbMatches = ZSTD_BtGetAllMatches(ms, ip, iend, dictMode, rep, ll0, matches, minMatch); + U32 const nbMatches = ZSTD_BtGetAllMatches(matches, ms, &nextToUpdate3, ip, iend, dictMode, rep, ll0, minMatch); if (!nbMatches) { ip++; continue; } /* initialize opt[0] */ @@ -970,7 +984,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, U32 const litlen = (opt[cur].mlen == 0) ? opt[cur].litlen : 0; U32 const previousPrice = opt[cur].price; U32 const basePrice = previousPrice + ZSTD_litLengthPrice(0, optStatePtr, optLevel); - U32 const nbMatches = ZSTD_BtGetAllMatches(ms, inr, iend, dictMode, opt[cur].rep, ll0, matches, minMatch); + U32 const nbMatches = ZSTD_BtGetAllMatches(matches, ms, &nextToUpdate3, inr, iend, dictMode, opt[cur].rep, ll0, minMatch); U32 matchNb; if (!nbMatches) { DEBUGLOG(7, "rPos:%u : no match found", cur); @@ -1094,7 +1108,7 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ } /* while (ip < ilimit) */ /* Return the last literals size */ - return iend - anchor; + return (size_t)(iend - anchor); } @@ -1158,7 +1172,6 @@ ZSTD_initStats_ultra(ZSTD_matchState_t* ms, ms->window.dictLimit += (U32)srcSize; ms->window.lowLimit = ms->window.dictLimit; ms->nextToUpdate = ms->window.dictLimit; - ms->nextToUpdate3 = ms->window.dictLimit; /* re-inforce weight of collected statistics */ ZSTD_upscaleStats(&ms->opt); diff --git a/thirdparty/zstd/compress/zstdmt_compress.c b/thirdparty/zstd/compress/zstdmt_compress.c index 38fbb90768..9e537b8848 100644 --- a/thirdparty/zstd/compress/zstdmt_compress.c +++ b/thirdparty/zstd/compress/zstdmt_compress.c @@ -1129,9 +1129,14 @@ size_t ZSTDMT_toFlushNow(ZSTDMT_CCtx* mtctx) size_t const produced = ZSTD_isError(cResult) ? 0 : cResult; size_t const flushed = ZSTD_isError(cResult) ? 0 : jobPtr->dstFlushed; assert(flushed <= produced); + assert(jobPtr->consumed <= jobPtr->src.size); toFlush = produced - flushed; - if (toFlush==0 && (jobPtr->consumed >= jobPtr->src.size)) { - /* doneJobID is not-fully-flushed, but toFlush==0 : doneJobID should be compressing some more data */ + /* if toFlush==0, nothing is available to flush. + * However, jobID is expected to still be active: + * if jobID was already completed and fully flushed, + * ZSTDMT_flushProduced() should have already moved onto next job. + * Therefore, some input has not yet been consumed. */ + if (toFlush==0) { assert(jobPtr->consumed < jobPtr->src.size); } } @@ -1148,12 +1153,16 @@ size_t ZSTDMT_toFlushNow(ZSTDMT_CCtx* mtctx) static unsigned ZSTDMT_computeTargetJobLog(ZSTD_CCtx_params const params) { - if (params.ldmParams.enableLdm) + unsigned jobLog; + if (params.ldmParams.enableLdm) { /* In Long Range Mode, the windowLog is typically oversized. * In which case, it's preferable to determine the jobSize * based on chainLog instead. */ - return MAX(21, params.cParams.chainLog + 4); - return MAX(20, params.cParams.windowLog + 2); + jobLog = MAX(21, params.cParams.chainLog + 4); + } else { + jobLog = MAX(20, params.cParams.windowLog + 2); + } + return MIN(jobLog, (unsigned)ZSTDMT_JOBLOG_MAX); } static int ZSTDMT_overlapLog_default(ZSTD_strategy strat) @@ -1197,7 +1206,7 @@ static size_t ZSTDMT_computeOverlapSize(ZSTD_CCtx_params const params) ovLog = MIN(params.cParams.windowLog, ZSTDMT_computeTargetJobLog(params) - 2) - overlapRLog; } - assert(0 <= ovLog && ovLog <= 30); + assert(0 <= ovLog && ovLog <= ZSTD_WINDOWLOG_MAX); DEBUGLOG(4, "overlapLog : %i", params.overlapLog); DEBUGLOG(4, "overlap size : %i", 1 << ovLog); return (ovLog==0) ? 0 : (size_t)1 << ovLog; @@ -1391,7 +1400,7 @@ size_t ZSTDMT_initCStream_internal( FORWARD_IF_ERROR( ZSTDMT_resize(mtctx, params.nbWorkers) ); if (params.jobSize != 0 && params.jobSize < ZSTDMT_JOBSIZE_MIN) params.jobSize = ZSTDMT_JOBSIZE_MIN; - if (params.jobSize > (size_t)ZSTDMT_JOBSIZE_MAX) params.jobSize = ZSTDMT_JOBSIZE_MAX; + if (params.jobSize > (size_t)ZSTDMT_JOBSIZE_MAX) params.jobSize = (size_t)ZSTDMT_JOBSIZE_MAX; mtctx->singleBlockingThread = (pledgedSrcSize <= ZSTDMT_JOBSIZE_MIN); /* do not trigger multi-threading when srcSize is too small */ if (mtctx->singleBlockingThread) { @@ -1432,6 +1441,8 @@ size_t ZSTDMT_initCStream_internal( if (mtctx->targetSectionSize == 0) { mtctx->targetSectionSize = 1ULL << ZSTDMT_computeTargetJobLog(params); } + assert(mtctx->targetSectionSize <= (size_t)ZSTDMT_JOBSIZE_MAX); + if (params.rsyncable) { /* Aim for the targetsectionSize as the average job size. */ U32 const jobSizeMB = (U32)(mtctx->targetSectionSize >> 20); diff --git a/thirdparty/zstd/compress/zstdmt_compress.h b/thirdparty/zstd/compress/zstdmt_compress.h index 12e6bcb3a3..12a526087d 100644 --- a/thirdparty/zstd/compress/zstdmt_compress.h +++ b/thirdparty/zstd/compress/zstdmt_compress.h @@ -50,6 +50,7 @@ #ifndef ZSTDMT_JOBSIZE_MIN # define ZSTDMT_JOBSIZE_MIN (1 MB) #endif +#define ZSTDMT_JOBLOG_MAX (MEM_32bits() ? 29 : 30) #define ZSTDMT_JOBSIZE_MAX (MEM_32bits() ? (512 MB) : (1024 MB)) diff --git a/thirdparty/zstd/decompress/zstd_decompress.c b/thirdparty/zstd/decompress/zstd_decompress.c index 675596f5aa..e42872ad96 100644 --- a/thirdparty/zstd/decompress/zstd_decompress.c +++ b/thirdparty/zstd/decompress/zstd_decompress.c @@ -360,8 +360,11 @@ static size_t readSkippableFrameSize(void const* src, size_t srcSize) sizeU32 = MEM_readLE32((BYTE const*)src + ZSTD_FRAMEIDSIZE); RETURN_ERROR_IF((U32)(sizeU32 + ZSTD_SKIPPABLEHEADERSIZE) < sizeU32, frameParameter_unsupported); - - return skippableHeaderSize + sizeU32; + { + size_t const skippableSize = skippableHeaderSize + sizeU32; + RETURN_ERROR_IF(skippableSize > srcSize, srcSize_wrong); + return skippableSize; + } } /** ZSTD_findDecompressedSize() : @@ -378,11 +381,10 @@ unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize) if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { size_t const skippableSize = readSkippableFrameSize(src, srcSize); - if (ZSTD_isError(skippableSize)) - return skippableSize; - if (srcSize < skippableSize) { + if (ZSTD_isError(skippableSize)) { return ZSTD_CONTENTSIZE_ERROR; } + assert(skippableSize <= srcSize); src = (const BYTE *)src + skippableSize; srcSize -= skippableSize; @@ -467,6 +469,8 @@ static ZSTD_frameSizeInfo ZSTD_findFrameSizeInfo(const void* src, size_t srcSize if ((srcSize >= ZSTD_SKIPPABLEHEADERSIZE) && (MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { frameSizeInfo.compressedSize = readSkippableFrameSize(src, srcSize); + assert(ZSTD_isError(frameSizeInfo.compressedSize) || + frameSizeInfo.compressedSize <= srcSize); return frameSizeInfo; } else { const BYTE* ip = (const BYTE*)src; @@ -529,7 +533,6 @@ size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize) return frameSizeInfo.compressedSize; } - /** ZSTD_decompressBound() : * compatible with legacy mode * `src` must point to the start of a ZSTD frame or a skippeable frame @@ -546,6 +549,7 @@ unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize) unsigned long long const decompressedBound = frameSizeInfo.decompressedBound; if (ZSTD_isError(compressedSize) || decompressedBound == ZSTD_CONTENTSIZE_ERROR) return ZSTD_CONTENTSIZE_ERROR; + assert(srcSize >= compressedSize); src = (const BYTE*)src + compressedSize; srcSize -= compressedSize; bound += decompressedBound; @@ -738,9 +742,8 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx, (unsigned)magicNumber, ZSTD_MAGICNUMBER); if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { size_t const skippableSize = readSkippableFrameSize(src, srcSize); - if (ZSTD_isError(skippableSize)) - return skippableSize; - RETURN_ERROR_IF(srcSize < skippableSize, srcSize_wrong); + FORWARD_IF_ERROR(skippableSize); + assert(skippableSize <= srcSize); src = (const BYTE *)src + skippableSize; srcSize -= skippableSize; diff --git a/thirdparty/zstd/decompress/zstd_decompress_block.c b/thirdparty/zstd/decompress/zstd_decompress_block.c index a2a7eedcf2..24f4859c56 100644 --- a/thirdparty/zstd/decompress/zstd_decompress_block.c +++ b/thirdparty/zstd/decompress/zstd_decompress_block.c @@ -505,7 +505,7 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, *nbSeqPtr = nbSeq; /* FSE table descriptors */ - RETURN_ERROR_IF(ip+4 > iend, srcSize_wrong); /* minimum possible size */ + RETURN_ERROR_IF(ip+1 > iend, srcSize_wrong); /* minimum possible size: 1 byte for symbol encoding types */ { symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6); symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3); symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3); @@ -637,9 +637,10 @@ size_t ZSTD_execSequence(BYTE* op, if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); /* copy Literals */ - ZSTD_copy8(op, *litPtr); if (sequence.litLength > 8) - ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ + ZSTD_wildcopy_16min(op, (*litPtr), sequence.litLength, ZSTD_no_overlap); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ + else + ZSTD_copy8(op, *litPtr); op = oLitEnd; *litPtr = iLitEnd; /* update for next sequence */ @@ -686,13 +687,13 @@ size_t ZSTD_execSequence(BYTE* op, if (oMatchEnd > oend-(16-MINMATCH)) { if (op < oend_w) { - ZSTD_wildcopy(op, match, oend_w - op); + ZSTD_wildcopy(op, match, oend_w - op, ZSTD_overlap_src_before_dst); match += oend_w - op; op = oend_w; } while (op < oMatchEnd) *op++ = *match++; } else { - ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8, ZSTD_overlap_src_before_dst); /* works even if matchLength < 8 */ } return sequenceLength; } @@ -717,9 +718,11 @@ size_t ZSTD_execSequenceLong(BYTE* op, if (oLitEnd > oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, dictStart, dictEnd); /* copy Literals */ - ZSTD_copy8(op, *litPtr); /* note : op <= oLitEnd <= oend_w == oend - 8 */ if (sequence.litLength > 8) - ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ + ZSTD_wildcopy_16min(op, *litPtr, sequence.litLength, ZSTD_no_overlap); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ + else + ZSTD_copy8(op, *litPtr); /* note : op <= oLitEnd <= oend_w == oend - 8 */ + op = oLitEnd; *litPtr = iLitEnd; /* update for next sequence */ @@ -766,13 +769,13 @@ size_t ZSTD_execSequenceLong(BYTE* op, if (oMatchEnd > oend-(16-MINMATCH)) { if (op < oend_w) { - ZSTD_wildcopy(op, match, oend_w - op); + ZSTD_wildcopy(op, match, oend_w - op, ZSTD_overlap_src_before_dst); match += oend_w - op; op = oend_w; } while (op < oMatchEnd) *op++ = *match++; } else { - ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8, ZSTD_overlap_src_before_dst); /* works even if matchLength < 8 */ } return sequenceLength; } @@ -889,6 +892,7 @@ ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets) } FORCE_INLINE_TEMPLATE size_t +DONT_VECTORIZE ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* seqStart, size_t seqSize, int nbSeq, @@ -918,6 +922,11 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + ZSTD_STATIC_ASSERT( + BIT_DStream_unfinished < BIT_DStream_completed && + BIT_DStream_endOfBuffer < BIT_DStream_completed && + BIT_DStream_completed < BIT_DStream_overflow); + for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) { nbSeq--; { seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); @@ -930,6 +939,7 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, /* check if reached exact end */ DEBUGLOG(5, "ZSTD_decompressSequences_body: after decode loop, remaining nbSeq : %i", nbSeq); RETURN_ERROR_IF(nbSeq, corruption_detected); + RETURN_ERROR_IF(BIT_reloadDStream(&seqState.DStream) < BIT_DStream_completed, corruption_detected); /* save reps for next block */ { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); } } @@ -1131,6 +1141,7 @@ ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx, #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG static TARGET_ATTRIBUTE("bmi2") size_t +DONT_VECTORIZE ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* seqStart, size_t seqSize, int nbSeq, diff --git a/thirdparty/zstd/zstd.h b/thirdparty/zstd/zstd.h index 53470c18f3..a1910ee223 100644 --- a/thirdparty/zstd/zstd.h +++ b/thirdparty/zstd/zstd.h @@ -71,7 +71,7 @@ extern "C" { /*------ Version ------*/ #define ZSTD_VERSION_MAJOR 1 #define ZSTD_VERSION_MINOR 4 -#define ZSTD_VERSION_RELEASE 0 +#define ZSTD_VERSION_RELEASE 1 #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) ZSTDLIB_API unsigned ZSTD_versionNumber(void); /**< to check runtime library version */ @@ -82,16 +82,16 @@ ZSTDLIB_API unsigned ZSTD_versionNumber(void); /**< to check runtime library v #define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION) ZSTDLIB_API const char* ZSTD_versionString(void); /* requires v1.3.0+ */ -/*************************************** -* Default constant -***************************************/ +/* ************************************* + * Default constant + ***************************************/ #ifndef ZSTD_CLEVEL_DEFAULT # define ZSTD_CLEVEL_DEFAULT 3 #endif -/*************************************** -* Constants -***************************************/ +/* ************************************* + * Constants + ***************************************/ /* All magic numbers are supposed read/written to/from files/memory using little-endian convention */ #define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ @@ -183,9 +183,14 @@ ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compres ***************************************/ /*= Compression context * When compressing many times, - * it is recommended to allocate a context just once, and re-use it for each successive compression operation. + * it is recommended to allocate a context just once, + * and re-use it for each successive compression operation. * This will make workload friendlier for system's memory. - * Use one context per thread for parallel execution in multi-threaded environments. */ + * Note : re-using context is just a speed / resource optimization. + * It doesn't change the compression ratio, which remains identical. + * Note 2 : In multi-threaded environments, + * use one different context per thread for parallel execution. + */ typedef struct ZSTD_CCtx_s ZSTD_CCtx; ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void); ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); @@ -380,6 +385,7 @@ typedef enum { * ZSTD_c_forceMaxWindow * ZSTD_c_forceAttachDict * ZSTD_c_literalCompressionMode + * ZSTD_c_targetCBlockSize * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * note : never ever use experimentalParam? names directly; * also, the enums values themselves are unstable and can still change. @@ -389,6 +395,7 @@ typedef enum { ZSTD_c_experimentalParam3=1000, ZSTD_c_experimentalParam4=1001, ZSTD_c_experimentalParam5=1002, + ZSTD_c_experimentalParam6=1003, } ZSTD_cParameter; typedef struct { @@ -657,17 +664,33 @@ ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, ZSTD_inBuffer* input, ZSTD_EndDirective endOp); + +/* These buffer sizes are softly recommended. + * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output. + * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(), + * reducing the amount of memory shuffling and buffering, resulting in minor performance savings. + * + * However, note that these recommendations are from the perspective of a C caller program. + * If the streaming interface is invoked from some other language, + * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo, + * a major performance rule is to reduce crossing such interface to an absolute minimum. + * It's not rare that performance ends being spent more into the interface, rather than compression itself. + * In which cases, prefer using large buffers, as large as practical, + * for both input and output, to reduce the nb of roundtrips. + */ ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ -ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block in all circumstances. */ +ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */ -/******************************************************************************* - * This is a legacy streaming API, and can be replaced by ZSTD_CCtx_reset() and - * ZSTD_compressStream2(). It is redundant, but is still fully supported. + +/* ***************************************************************************** + * This following is a legacy streaming API. + * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2(). + * It is redundant, but remains fully supported. * Advanced parameters and dictionary compression can only be used through the * new API. ******************************************************************************/ -/** +/*! * Equivalent to: * * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); @@ -675,16 +698,16 @@ ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); */ ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); -/** +/*! * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue). * NOTE: The return value is different. ZSTD_compressStream() returns a hint for * the next read size (if non-zero and not an error). ZSTD_compressStream2() - * returns the number of bytes left to flush (if non-zero and not an error). + * returns the minimum nb of bytes left to flush (if non-zero and not an error). */ ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); -/** Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); -/** Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); @@ -969,7 +992,7 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); #endif /* ZSTD_H_235446 */ -/**************************************************************************************** +/* ************************************************************************************** * ADVANCED AND EXPERIMENTAL FUNCTIONS **************************************************************************************** * The definitions in the following section are considered experimental. @@ -1037,6 +1060,10 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); #define ZSTD_LDM_HASHRATELOG_MIN 0 #define ZSTD_LDM_HASHRATELOG_MAX (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN) +/* Advanced parameter bounds */ +#define ZSTD_TARGETCBLOCKSIZE_MIN 64 +#define ZSTD_TARGETCBLOCKSIZE_MAX ZSTD_BLOCKSIZE_MAX + /* internal */ #define ZSTD_HASHLOG3_MAX 17 @@ -1162,7 +1189,7 @@ typedef enum { * however it does mean that all frame data must be present and valid. */ ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); -/** ZSTD_decompressBound() : +/*! ZSTD_decompressBound() : * `src` should point to the start of a series of ZSTD encoded and/or skippable frames * `srcSize` must be the _exact_ size of this series * (i.e. there should be a frame boundary at `src + srcSize`) @@ -1409,6 +1436,11 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre */ #define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5 +/* Tries to fit compressed block size to be around targetCBlockSize. + * No target when targetCBlockSize == 0. + * There is no guarantee on compressed block size (default:0) */ +#define ZSTD_c_targetCBlockSize ZSTD_c_experimentalParam6 + /*! ZSTD_CCtx_getParameter() : * Get the requested compression parameter value, selected by enum ZSTD_cParameter, * and store it into int* value. @@ -1843,7 +1875,7 @@ typedef struct { unsigned checksumFlag; } ZSTD_frameHeader; -/** ZSTD_getFrameHeader() : +/*! ZSTD_getFrameHeader() : * decode Frame Header, or requires larger `srcSize`. * @return : 0, `zfhPtr` is correctly filled, * >0, `srcSize` is too small, value is wanted `srcSize` amount, |