diff options
286 files changed, 19955 insertions, 14014 deletions
diff --git a/.clang-format b/.clang-format index eba6d586f0..b3f1954545 100644 --- a/.clang-format +++ b/.clang-format @@ -124,4 +124,5 @@ ObjCBlockIndentWidth: 4 ### Java specific config ### Language: Java # BreakAfterJavaFieldAnnotations: false +JavaImportGroups: ['org.godotengine', 'android', 'androidx', 'com.android', 'com.google', 'java', 'javax'] ... diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index cdc59a4596..db85071fa5 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -128,7 +128,7 @@ License: Expat Files: ./thirdparty/enet/ Comment: ENet -Copyright: 2002-2016, Lee Salzman +Copyright: 2002-2020, Lee Salzman License: Expat Files: ./thirdparty/etc2comp/ @@ -246,12 +246,6 @@ Comment: Clipper Copyright: 2010-2017, Angus Johnson License: BSL-1.0 -Files: ./thirdparty/misc/curl_hostcheck.c - ./thirdparty/misc/curl_hostcheck.h -Comment: curl -Copyright: 1998-2012, Daniel Stenberg et al. -License: curl - Files: ./thirdparty/misc/easing_equations.cpp Comment: Robert Penner's Easing Functions Copyright: 2001, Robert Penner @@ -260,7 +254,7 @@ License: BSD-3-clause Files: ./thirdparty/misc/fastlz.c ./thirdparty/misc/fastlz.h Comment: FastLZ -Copyright: 2005-2007, Ariya Hidayat +Copyright: 2005-2020, Ariya Hidayat License: Expat Files: ./thirdparty/misc/hq2x.cpp @@ -857,25 +851,6 @@ License: CC-BY-3.0 . Creative Commons may be contacted at http://creativecommons.org/. -License: curl - All rights reserved. - . - Permission to use, copy, modify, and distribute this software for any purpose - with or without fee is hereby granted, provided that the above copyright - notice and this permission notice appear in all copies. - . - 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 OF THIRD PARTY RIGHTS. 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. - . - Except as contained in this notice, the name of a copyright holder shall not - be used in advertising or otherwise to promote the sale, use or other dealings - in this Software without prior written authorization of the copyright holder. - License: Expat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -25,7 +25,6 @@ generous deed immortalized in the next stable release of Godot Engine. AD Ford Alan Beauchamp Anand Mallik - Andres Hernandez Andrew Dunai Brandon Lamb Christian Baune @@ -36,7 +35,6 @@ generous deed immortalized in the next stable release of Godot Engine. Edward Flick Gamechuck GameDev.net - GameDev.tv Grady Hein-Pieter van Braam Jacob McKenney @@ -60,13 +58,10 @@ generous deed immortalized in the next stable release of Godot Engine. ## Gold donors - Andrei - Dave David Gehrig David Graham David Snopek Ed Morley - Florian Krick Florian Rämisch Jakub Grzesik Manuele Finocchiaro @@ -85,11 +80,9 @@ generous deed immortalized in the next stable release of Godot Engine. David Giardi Default Name eggs - Felix Bohmann Florian Breisch Gamejunkey Javier Roman - Jay Horton Jon Woodward Karl Werf Keinan Powers @@ -100,6 +93,7 @@ generous deed immortalized in the next stable release of Godot Engine. Matthew Hillier Mohamed Ikbel Boulabiar Mored4u + Rene Retro Village Rob Messick Ryan Badour @@ -122,15 +116,10 @@ generous deed immortalized in the next stable release of Godot Engine. Darrian Little Horváth Péter Ivan Trombley - Jakub Dering Joan Fons Joshua Flores - Krzysztof Jankowski - Lord Bloodhound - Pascal Grüter Petr Malac Rami - Reneator Rob Robert Willes Ronnie Ashlock @@ -144,9 +133,9 @@ generous deed immortalized in the next stable release of Godot Engine. Adam Nakonieczny Adam Neumann + Adrian Demetrescu Alexander J Maynard Alexey Dyadchenko - Alex Z Andreas Funke André Frélicot aoshiwik @@ -158,50 +147,42 @@ generous deed immortalized in the next stable release of Godot Engine. Christian Alexander Bjørklund Bøhler Christian Leth Jeppesen Christoph Schröder + Codee Leaf Cody Parker Coldragon Craig Ostrin D - Daniel Eichler - David White - Denis Janßen Easypete Eric Monson - ethan ball Eugenio Hugo Salgüero Jáñez Fain flesk Gary Hulst gavlig GGGames.org - Green Fox Guilherme Felipe de C. G. da Silva Halom Vered Heath Hayes - Idzard Kwadijk Isaac Clausman Jared White Jeff Nyte - Jeremy Sims - Jerry Ling Joe Flood John G Gentzel - Jon Hermansen Jose Malheiro Joshua Lesperance Juan Velandia Juraj Móza Kelteseth + kickmaniac kinfox + Lain Ballard Marcelo Dornbusch Lopes Markus Fehr Markus Wiesner Martin Eigel Matt Eunson - Max Bulai m kaersten MuffinManKen - Nick Nikitin Oliver Dick Oscar Campos Patrick Ting @@ -210,9 +191,8 @@ generous deed immortalized in the next stable release of Godot Engine. Pete Goodwin pl Ranoller - Robert Larnach + Rob McInroy Rocknight Studios - Romildo Franco Ryan Samuel Judd Scott Pilet @@ -221,10 +201,8 @@ generous deed immortalized in the next stable release of Godot Engine. Sindre Sømme SleepCircle spilldata - Steve Hyatt Stoned Xander TheLevelOfDetail . - Thomas Krampl Thomas Kurz Tobias Bocanegra Urho @@ -237,6 +215,7 @@ generous deed immortalized in the next stable release of Godot Engine. 1D_Inc Abraham Haskins + Acheron Adam Adam Brunnmeier Adam Carr @@ -247,7 +226,6 @@ generous deed immortalized in the next stable release of Godot Engine. Adam Smeltzer Adam Szymański Adisibio - Adrian Demetrescu Agustinus Arya Aidan O'Flannagain Aki Mimoto @@ -279,14 +257,13 @@ generous deed immortalized in the next stable release of Godot Engine. B A Balázs Batári Benedikt - Ben G - Ben Phelan Ben Vercammen Bernd Jänichen Bjarne Black Block Blair Allen Bobby CC Wong + Bram brian bugcaptor Burney Waring @@ -294,6 +271,7 @@ generous deed immortalized in the next stable release of Godot Engine. Carlo Sitaro Carl van der Geest Carwyn Edwards + Cas Brugman Cassidy James Chris Brown Chris Chapin @@ -304,17 +282,17 @@ generous deed immortalized in the next stable release of Godot Engine. Christopher Schmitt Christoph Woinke Clay Heaton + Cole Johnson Curt King Daniel Johnson Daniel Kimblad - Daniel Pontillo + Daniel Tebbutt David May David Woodard DiCola Jamn Dominic Cooney Dominik Wetzel Donn Eddy - Donovan Hutcheon Dragontrapper Dr Ewan Murray Duobix @@ -322,9 +300,9 @@ generous deed immortalized in the next stable release of Godot Engine. Dylan Todd Eduardo Teixeira Edward Herbert - Edward Moulsdale Edward Swartz Egon Elbre + Elgenzay Elias Nykrem Elmeri '- Duy Kevin Nguyen Ephemeral @@ -335,20 +313,21 @@ generous deed immortalized in the next stable release of Godot Engine. Evan Rose Fancy Ants Studios Fekinox + Felix Bohmann Felix Kollmann Flaredown Forty Doubleu + fox FuDiggity Gadzhi Kharkharov gamedev by Celio Gary Thomas George Marques - GiulianoB Greg Olson GREGORY C FEIN - Greg P Greyson Richey Grid + Guillaume Audirac Guldoman Hal A Heribert Hirth @@ -358,6 +337,7 @@ generous deed immortalized in the next stable release of Godot Engine. Iiari iKlem IndustrialRobot + Ivan Nikolaev Jacob Jaiden Gerig Jaime Ruiz-Borau Vizárraga @@ -368,26 +348,26 @@ generous deed immortalized in the next stable release of Godot Engine. JARKKO PARVIAINEN Jeff Hungerford Jennifer Graves - Jeremy Kahn Jesse Dubay Joel Fivat Joel Höglund Joel Setterberg - Johannes Wuensch John Gabriel + John Walker Jomei Jackson + Jonas Jonas Bernemann Jonas Rudlang Jonas Yamazaki Jonatan R Jonathan G - Jonathon Jon Bonazza Jon Sully Jorge Caballero Jose Aleman Jose C. Rubio Joseph Catrambone + Josh Mitchell Juanfran Judd Julian Murgia @@ -395,16 +375,16 @@ generous deed immortalized in the next stable release of Godot Engine. Justin Hamilton Justin Spedding KaDokta + Karel Němec Kauzig Keedong Park Keith Bradner + Kent Jofur Kevin McPhillips - kickmaniac Kiri Jolly Kiyohiro Kawamura (kyorohiro) Kjetil Haugland Klagsam - KR McGinley KsyTek Games Kuan Cheang kycho @@ -415,6 +395,7 @@ generous deed immortalized in the next stable release of Godot Engine. Lin Chear Linus Lind Lundgren Lionel Gaillard + Lukáš Rendvanský Luigi Renna LunaticInAHat Lurkars @@ -429,10 +410,10 @@ generous deed immortalized in the next stable release of Godot Engine. Mathieu Rimelen Matt Edwards Matthew Little - Matti Pohjanvirta + Mauro Pellegrini + Max Fiedler Maxime Blade Maxwell - medecau Megasploot Melissa Mears mewin @@ -447,6 +428,7 @@ generous deed immortalized in the next stable release of Godot Engine. Mike Cunningham Mitchell J. Wagner MoM + Mored4u Nathan Fish Natrim nee @@ -456,9 +438,9 @@ generous deed immortalized in the next stable release of Godot Engine. Nicholas Nicholas Girga Nick Macholl + Niclas Eriksen Nicolás Montaña Nicolas SAN AGUSTIN - Nima Farid NZ Oleg Reva Olivier @@ -471,13 +453,11 @@ generous deed immortalized in the next stable release of Godot Engine. Paweł Kowal Pedro Assuncao Penguin - Petrus Prinsloo Philip Cohoe Point08 Rad Cat Rafa Laguna rainerLinux - Raphael Leroux Remi Rampin Rémi Verschelde Ricardo Alcantara @@ -485,7 +465,6 @@ generous deed immortalized in the next stable release of Godot Engine. Richard Ivánek Robert Farr (Larington) Robert Hernandez - Roberto Sánchez Roger Smith Roland Rząsa Roman Tinkov @@ -493,26 +472,28 @@ generous deed immortalized in the next stable release of Godot Engine. Ronan Ryan Groom Ryan Hentz - Sam.C Sam Edson Samuele Zolfanelli - Sasori Olkof Scott D. Yelich Scott Longley + ScottMakesGames Sebastian Michailidis Sebastian Vetter Sergio Mello-Grand - sgnsajgon Shane Shane Sicienski Shane Spoor Siim Raidma + Simon Jonas Larsen Simon Wenner + Sintinium SK smbe19 smo1704 Stefano Caronia + Steve Cloete Svenne Krap + Taylor Fahlman Terry tezuvholovdr thomas @@ -521,10 +502,10 @@ generous deed immortalized in the next stable release of Godot Engine. Thomas Kelly Tim Drumheller Timothy B. MacDonald - tinyBigGames LLC Title Plinsut Tobbun Tom Glenn + Toni Duran Torgeir Lilleskog Torsten Crass Travis O'Brien diff --git a/core/array.cpp b/core/array.cpp index cd4e0fb4c8..7c0129ffde 100644 --- a/core/array.cpp +++ b/core/array.cpp @@ -285,59 +285,49 @@ Array Array::duplicate(bool p_deep) const { return new_arr; } -int Array::_fix_slice_index(int p_index, int p_arr_len, int p_top_mod) { - p_index = CLAMP(p_index, -p_arr_len, p_arr_len + p_top_mod); - if (p_index < 0) { - p_index = (p_index % p_arr_len + p_arr_len) % p_arr_len; // positive modulo - } - return p_index; -} +int Array::_clamp_slice_index(int p_index) const { -int Array::_clamp_index(int p_index) const { - return CLAMP(p_index, -size() + 1, size() - 1); + int arr_size = size(); + int fixed_index = CLAMP(p_index, -arr_size, arr_size - 1); + if (fixed_index < 0) { + fixed_index = arr_size + fixed_index; + } + return fixed_index; } -#define ARRAY_GET_DEEP(idx, is_deep) is_deep ? get(idx).duplicate(is_deep) : get(idx) - Array Array::slice(int p_begin, int p_end, int p_step, bool p_deep) const { // like python, but inclusive on upper bound - Array new_arr; - - if (empty()) // Don't try to slice empty arrays. - return new_arr; - p_begin = Array::_fix_slice_index(p_begin, size(), -1); // can't start out of range - p_end = Array::_fix_slice_index(p_end, size(), 0); + Array new_arr; - int x = p_begin; - int new_arr_i = 0; + ERR_FAIL_COND_V_MSG(p_step == 0, new_arr, "Array slice step size cannot be zero."); - ERR_FAIL_COND_V(p_step == 0, new_arr); - if (Array::_clamp_index(p_begin) == Array::_clamp_index(p_end)) { // don't include element twice - new_arr.resize(1); - // new_arr[0] = 1; - new_arr[0] = ARRAY_GET_DEEP(Array::_clamp_index(p_begin), p_deep); + if (empty()) // Don't try to slice empty arrays. return new_arr; - } else { - int element_count = ceil((int)MAX(0, (p_end - p_begin) / p_step)) + 1; - if (element_count == 1) { // delta going in wrong direction to reach end - new_arr.resize(0); + if (p_step > 0) { + if (p_begin >= size() || p_end < -size()) + return new_arr; + } else { // p_step < 0 + if (p_begin < -size() || p_end >= size()) return new_arr; - } - new_arr.resize(element_count); } - // if going backwards, have to have a different terminating condition - if (p_step < 0) { - while (x >= p_end) { - new_arr[new_arr_i] = ARRAY_GET_DEEP(Array::_clamp_index(x), p_deep); - x += p_step; - new_arr_i += 1; + int begin = _clamp_slice_index(p_begin); + int end = _clamp_slice_index(p_end); + + int new_arr_size = MAX(((end - begin + p_step) / p_step), 0); + new_arr.resize(new_arr_size); + + if (p_step > 0) { + int dest_idx = 0; + for (int idx = begin; idx <= end; idx += p_step) { + ERR_FAIL_COND_V_MSG(dest_idx < 0 || dest_idx >= new_arr_size, Array(), "Bug in Array slice()"); + new_arr[dest_idx++] = p_deep ? get(idx).duplicate(p_deep) : get(idx); } - } else if (p_step > 0) { - while (x <= p_end) { - new_arr[new_arr_i] = ARRAY_GET_DEEP(Array::_clamp_index(x), p_deep); - x += p_step; - new_arr_i += 1; + } else { // p_step < 0 + int dest_idx = 0; + for (int idx = begin; idx >= end; idx += p_step) { + ERR_FAIL_COND_V_MSG(dest_idx < 0 || dest_idx >= new_arr_size, Array(), "Bug in Array slice()"); + new_arr[dest_idx++] = p_deep ? get(idx).duplicate(p_deep) : get(idx); } } diff --git a/core/array.h b/core/array.h index 2840ce199c..14db57f15f 100644 --- a/core/array.h +++ b/core/array.h @@ -44,8 +44,7 @@ class Array { void _ref(const Array &p_from) const; void _unref() const; - int _clamp_index(int p_index) const; - static int _fix_slice_index(int p_index, int p_arr_len, int p_top_mod); + inline int _clamp_slice_index(int p_index) const; protected: Array(const Array &p_base, uint32_t p_type, const StringName &p_class_name, const Variant &p_script); diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index e8955c05df..e2774deb3c 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -237,6 +237,11 @@ String _OS::get_executable_path() const { Error _OS::shell_open(String p_uri) { + if (p_uri.begins_with("res://")) { + WARN_PRINT("Attempting to open an URL with the \"res://\" protocol. Use `ProjectSettings.globalize_path()` to convert a Godot-specific path to a system path before opening it with `OS.shell_open()`."); + } else if (p_uri.begins_with("user://")) { + WARN_PRINT("Attempting to open an URL with the \"user://\" protocol. Use `ProjectSettings.globalize_path()` to convert a Godot-specific path to a system path before opening it with `OS.shell_open()`."); + } return OS::get_singleton()->shell_open(p_uri); }; diff --git a/core/color.h b/core/color.h index 16dc721072..8b689fdde1 100644 --- a/core/color.h +++ b/core/color.h @@ -97,7 +97,7 @@ struct Color { Color inverted() const; Color contrasted() const; - _FORCE_INLINE_ Color linear_interpolate(const Color &p_b, float p_t) const { + _FORCE_INLINE_ Color lerp(const Color &p_b, float p_t) const { Color res = *this; @@ -205,7 +205,7 @@ struct Color { operator String() const; /** - * No construct parameters, r=0, g=0, b=0. a=255 + * No construct parameters, r=0, g=0, b=0. a=1 */ _FORCE_INLINE_ Color() { r = 0; @@ -223,6 +223,16 @@ struct Color { b = p_b; a = p_a; } + + /** + * Construct a Color from another Color, but with the specified alpha value. + */ + _FORCE_INLINE_ Color(const Color &p_c, float p_a) { + r = p_c.r; + g = p_c.g; + b = p_c.b; + a = p_a; + } }; bool Color::operator<(const Color &p_color) const { diff --git a/core/debugger/remote_debugger.cpp b/core/debugger/remote_debugger.cpp index fd109c62b6..97d5c71b6f 100644 --- a/core/debugger/remote_debugger.cpp +++ b/core/debugger/remote_debugger.cpp @@ -466,7 +466,7 @@ void RemoteDebugger::_print_handler(void *p_this, const String &p_string, bool p String s = p_string; int allowed_chars = MIN(MAX(rd->max_chars_per_second - rd->char_count, 0), s.length()); - if (allowed_chars == 0) + if (allowed_chars == 0 && s.length() > 0) return; if (allowed_chars < s.length()) { @@ -480,10 +480,16 @@ void RemoteDebugger::_print_handler(void *p_this, const String &p_string, bool p if (rd->is_peer_connected()) { if (overflowed) s += "[...]"; - rd->output_strings.push_back(s); + + OutputString output_string; + output_string.message = s; + output_string.type = p_error ? MESSAGE_TYPE_ERROR : MESSAGE_TYPE_LOG; + rd->output_strings.push_back(output_string); if (overflowed) { - rd->output_strings.push_back("[output overflow, print less text!]"); + output_string.message = "[output overflow, print less text!]"; + output_string.type = MESSAGE_TYPE_ERROR; + rd->output_strings.push_back(output_string); } } } @@ -517,15 +523,32 @@ void RemoteDebugger::flush_output() { if (output_strings.size()) { // Join output strings so we generate less messages. + Vector<String> joined_log_strings; Vector<String> strings; - strings.resize(output_strings.size()); - String *w = strings.ptrw(); + Vector<int> types; for (int i = 0; i < output_strings.size(); i++) { - w[i] = output_strings[i]; + const OutputString &output_string = output_strings[i]; + if (output_string.type == MESSAGE_TYPE_ERROR) { + if (!joined_log_strings.empty()) { + strings.push_back(String("\n").join(joined_log_strings)); + types.push_back(MESSAGE_TYPE_LOG); + joined_log_strings.clear(); + } + strings.push_back(output_string.message); + types.push_back(MESSAGE_TYPE_ERROR); + } else { + joined_log_strings.push_back(output_string.message); + } + } + + if (!joined_log_strings.empty()) { + strings.push_back(String("\n").join(joined_log_strings)); + types.push_back(MESSAGE_TYPE_LOG); } Array arr; arr.push_back(strings); + arr.push_back(types); _put_msg("output", arr); output_strings.clear(); } diff --git a/core/debugger/remote_debugger.h b/core/debugger/remote_debugger.h index f805eec631..cac0bc3730 100644 --- a/core/debugger/remote_debugger.h +++ b/core/debugger/remote_debugger.h @@ -40,6 +40,11 @@ #include "core/ustring.h" class RemoteDebugger : public EngineDebugger { +public: + enum MessageType { + MESSAGE_TYPE_LOG, + MESSAGE_TYPE_ERROR, + }; private: typedef DebuggerMarshalls::OutputError ErrorMessage; @@ -57,7 +62,11 @@ private: Ref<RemoteDebuggerPeer> peer; - List<String> output_strings; + struct OutputString { + String message; + MessageType type; + }; + List<OutputString> output_strings; List<ErrorMessage> errors; int n_messages_dropped = 0; diff --git a/core/input/input.cpp b/core/input/input.cpp index 5301f5f4ee..357e4c06c1 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -175,7 +175,7 @@ void Input::SpeedTrack::update(const Vector2 &p_delta_p) { accum = accum - slice; accum_t -= min_ref_frame; - speed = (slice / min_ref_frame).linear_interpolate(speed, min_ref_frame / max_ref_frame); + speed = (slice / min_ref_frame).lerp(speed, min_ref_frame / max_ref_frame); } } diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp index d18adb1983..4b8c104f39 100644 --- a/core/input/input_event.cpp +++ b/core/input/input_event.cpp @@ -708,7 +708,7 @@ String InputEventMouseMotion::as_text() const { button_mask_string = itos(get_button_mask()); break; } - return "InputEventMouseMotion : button_mask=" + button_mask_string + ", position=(" + String(get_position()) + "), relative=(" + String(get_relative()) + "), speed=(" + String(get_speed()) + ")"; + return "InputEventMouseMotion : button_mask=" + button_mask_string + ", position=(" + String(get_position()) + "), relative=(" + String(get_relative()) + "), speed=(" + String(get_speed()) + "), pressure=(" + rtos(get_pressure()) + "), tilt=(" + String(get_tilt()) + ")"; } bool InputEventMouseMotion::accumulate(const Ref<InputEvent> &p_event) { diff --git a/core/io/logger.cpp b/core/io/logger.cpp index 48aebeda3d..ad0cc81023 100644 --- a/core/io/logger.cpp +++ b/core/io/logger.cpp @@ -34,17 +34,6 @@ #include "core/os/os.h" #include "core/print_string.h" -// va_copy was defined in the C99, but not in C++ standards before C++11. -// When you compile C++ without --std=c++<XX> option, compilers still define -// va_copy, otherwise you have to use the internal version (__va_copy). -#if !defined(va_copy) -#if defined(__GNUC__) -#define va_copy(d, s) __va_copy((d), (s)) -#else -#define va_copy(d, s) ((d) = (s)) -#endif -#endif - #if defined(MINGW_ENABLED) || defined(_MSC_VER) #define sprintf sprintf_s #endif diff --git a/core/math/aabb.h b/core/math/aabb.h index eca74e6755..7fdad07c89 100644 --- a/core/math/aabb.h +++ b/core/math/aabb.h @@ -76,7 +76,7 @@ public: bool intersects_ray(const Vector3 &p_from, const Vector3 &p_dir, Vector3 *r_clip = nullptr, Vector3 *r_normal = nullptr) const; _FORCE_INLINE_ bool smits_intersect_ray(const Vector3 &p_from, const Vector3 &p_dir, real_t t0, real_t t1) const; - _FORCE_INLINE_ bool intersects_convex_shape(const Plane *p_planes, int p_plane_count) const; + _FORCE_INLINE_ bool intersects_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count) const; _FORCE_INLINE_ bool inside_convex_shape(const Plane *p_planes, int p_plane_count) const; bool intersects_plane(const Plane &p_plane) const; @@ -190,7 +190,7 @@ Vector3 AABB::get_endpoint(int p_point) const { ERR_FAIL_V(Vector3()); } -bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count) const { +bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count) const { Vector3 half_extents = size * 0.5; Vector3 ofs = position + half_extents; @@ -206,6 +206,30 @@ bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count) con return false; } + // Make sure all points in the shape aren't fully separated from the AABB on + // each axis. + int bad_point_counts_positive[3] = { 0 }; + int bad_point_counts_negative[3] = { 0 }; + + for (int k = 0; k < 3; k++) { + + for (int i = 0; i < p_point_count; i++) { + if (p_points[i].coord[k] > ofs.coord[k] + half_extents.coord[k]) { + bad_point_counts_positive[k]++; + } + if (p_points[i].coord[k] < ofs.coord[k] - half_extents.coord[k]) { + bad_point_counts_negative[k]++; + } + } + + if (bad_point_counts_negative[k] == p_point_count) { + return false; + } + if (bad_point_counts_positive[k] == p_point_count) { + return false; + } + } + return true; } diff --git a/core/math/audio_frame.h b/core/math/audio_frame.h index e1dbb385e4..4665311059 100644 --- a/core/math/audio_frame.h +++ b/core/math/audio_frame.h @@ -104,7 +104,7 @@ struct AudioFrame { r = ::undenormalise(r); } - _FORCE_INLINE_ AudioFrame linear_interpolate(const AudioFrame &p_b, float p_t) const { + _FORCE_INLINE_ AudioFrame lerp(const AudioFrame &p_b, float p_t) const { AudioFrame res = *this; diff --git a/core/math/geometry.cpp b/core/math/geometry.cpp index 3e07e9253e..fa96fc4535 100644 --- a/core/math/geometry.cpp +++ b/core/math/geometry.cpp @@ -911,7 +911,7 @@ Vector<Plane> Geometry::build_sphere_planes(real_t p_radius, int p_lats, int p_l for (int j = 1; j <= p_lats; j++) { // FIXME: This is stupid. - Vector3 angle = normal.linear_interpolate(axis, j / (real_t)p_lats).normalized(); + Vector3 angle = normal.lerp(axis, j / (real_t)p_lats).normalized(); Vector3 pos = angle * p_radius; planes.push_back(Plane(pos, angle)); planes.push_back(Plane(pos * axis_neg, angle * axis_neg)); @@ -943,7 +943,7 @@ Vector<Plane> Geometry::build_capsule_planes(real_t p_radius, real_t p_height, i for (int j = 1; j <= p_lats; j++) { - Vector3 angle = normal.linear_interpolate(axis, j / (real_t)p_lats).normalized(); + Vector3 angle = normal.lerp(axis, j / (real_t)p_lats).normalized(); Vector3 pos = axis * p_height * 0.5 + angle * p_radius; planes.push_back(Plane(pos, angle)); planes.push_back(Plane(pos * axis_neg, angle * axis_neg)); @@ -1178,3 +1178,42 @@ Vector<Vector<Point2>> Geometry::_polypath_offset(const Vector<Point2> &p_polypa } return polypaths; } + +Vector<Vector3> Geometry::compute_convex_mesh_points(const Plane *p_planes, int p_plane_count) { + + Vector<Vector3> points; + + // Iterate through every unique combination of any three planes. + for (int i = p_plane_count - 1; i >= 0; i--) { + for (int j = i - 1; j >= 0; j--) { + for (int k = j - 1; k >= 0; k--) { + + // Find the point where these planes all cross over (if they + // do at all). + Vector3 convex_shape_point; + if (p_planes[i].intersect_3(p_planes[j], p_planes[k], &convex_shape_point)) { + + // See if any *other* plane excludes this point because it's + // on the wrong side. + bool excluded = false; + for (int n = 0; n < p_plane_count; n++) { + if (n != i && n != j && n != k) { + real_t dp = p_planes[n].normal.dot(convex_shape_point); + if (dp - p_planes[n].d > CMP_EPSILON) { + excluded = true; + break; + } + } + } + + // Only add the point if it passed all tests. + if (!excluded) { + points.push_back(convex_shape_point); + } + } + } + } + } + + return points; +} diff --git a/core/math/geometry.h b/core/math/geometry.h index e47d18b056..ea063a8a59 100644 --- a/core/math/geometry.h +++ b/core/math/geometry.h @@ -117,8 +117,8 @@ public: if (mub < 0) mub = 0; if (mua > 1) mua = 1; if (mub > 1) mub = 1; - c1 = p1.linear_interpolate(p2, mua); - c2 = q1.linear_interpolate(q2, mub); + c1 = p1.lerp(p2, mua); + c2 = q1.lerp(q2, mub); } static real_t get_closest_distance_between_segments(const Vector3 &p_from_a, const Vector3 &p_to_a, const Vector3 &p_from_b, const Vector3 &p_to_b) { @@ -1014,6 +1014,8 @@ public: static void make_atlas(const Vector<Size2i> &p_rects, Vector<Point2i> &r_result, Size2i &r_size); + static Vector<Vector3> compute_convex_mesh_points(const Plane *p_planes, int p_plane_count); + private: static Vector<Vector<Point2>> _polypaths_do_operation(PolyBooleanOperation p_op, const Vector<Point2> &p_polypath_a, const Vector<Point2> &p_polypath_b, bool is_a_open = false); static Vector<Vector<Point2>> _polypath_offset(const Vector<Point2> &p_polypath, real_t p_delta, PolyJoinType p_join_type, PolyEndType p_end_type); diff --git a/core/math/octree.h b/core/math/octree.h index 5225fbecb4..ffb405bd0f 100644 --- a/core/math/octree.h +++ b/core/math/octree.h @@ -34,6 +34,7 @@ #include "core/list.h" #include "core/map.h" #include "core/math/aabb.h" +#include "core/math/geometry.h" #include "core/math/vector3.h" #include "core/print_string.h" #include "core/variant.h" @@ -341,6 +342,8 @@ private: const Plane *planes; int plane_count; + const Vector3 *points; + int point_count; T **result_array; int *result_idx; int result_max; @@ -1017,8 +1020,7 @@ void Octree<T, use_pairs, AL>::_cull_convex(Octant *p_octant, _CullConvexData *p continue; e->last_pass = pass; - if (e->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count)) { - + if (e->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count, p_cull->points, p_cull->point_count)) { if (*p_cull->result_idx < p_cull->result_max) { p_cull->result_array[*p_cull->result_idx] = e->userdata; (*p_cull->result_idx)++; @@ -1043,7 +1045,7 @@ void Octree<T, use_pairs, AL>::_cull_convex(Octant *p_octant, _CullConvexData *p continue; e->last_pass = pass; - if (e->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count)) { + if (e->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count, p_cull->points, p_cull->point_count)) { if (*p_cull->result_idx < p_cull->result_max) { @@ -1059,7 +1061,7 @@ void Octree<T, use_pairs, AL>::_cull_convex(Octant *p_octant, _CullConvexData *p for (int i = 0; i < 8; i++) { - if (p_octant->children[i] && p_octant->children[i]->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count)) { + if (p_octant->children[i] && p_octant->children[i]->aabb.intersects_convex_shape(p_cull->planes, p_cull->plane_count, p_cull->points, p_cull->point_count)) { _cull_convex(p_octant->children[i], p_cull); } } @@ -1288,7 +1290,11 @@ void Octree<T, use_pairs, AL>::_cull_point(Octant *p_octant, const Vector3 &p_po template <class T, bool use_pairs, class AL> int Octree<T, use_pairs, AL>::cull_convex(const Vector<Plane> &p_convex, T **p_result_array, int p_result_max, uint32_t p_mask) { - if (!root) + if (!root || p_convex.size() == 0) + return 0; + + Vector<Vector3> convex_points = Geometry::compute_convex_mesh_points(&p_convex[0], p_convex.size()); + if (convex_points.size() == 0) return 0; int result_count = 0; @@ -1296,6 +1302,8 @@ int Octree<T, use_pairs, AL>::cull_convex(const Vector<Plane> &p_convex, T **p_r _CullConvexData cdata; cdata.planes = &p_convex[0]; cdata.plane_count = p_convex.size(); + cdata.points = &convex_points[0]; + cdata.point_count = convex_points.size(); cdata.result_array = p_result_array; cdata.result_max = p_result_max; cdata.result_idx = &result_count; diff --git a/core/math/transform.cpp b/core/math/transform.cpp index 9dad3262d2..82e4005d3e 100644 --- a/core/math/transform.cpp +++ b/core/math/transform.cpp @@ -129,8 +129,8 @@ Transform Transform::interpolate_with(const Transform &p_transform, real_t p_c) Vector3 dst_loc = p_transform.origin; Transform interp; - interp.basis.set_quat_scale(src_rot.slerp(dst_rot, p_c).normalized(), src_scale.linear_interpolate(dst_scale, p_c)); - interp.origin = src_loc.linear_interpolate(dst_loc, p_c); + interp.basis.set_quat_scale(src_rot.slerp(dst_rot, p_c).normalized(), src_scale.lerp(dst_scale, p_c)); + interp.origin = src_loc.lerp(dst_loc, p_c); return interp; } diff --git a/core/math/transform_2d.cpp b/core/math/transform_2d.cpp index f28b664e46..ed95baa233 100644 --- a/core/math/transform_2d.cpp +++ b/core/math/transform_2d.cpp @@ -70,6 +70,18 @@ void Transform2D::rotate(real_t p_phi) { *this = Transform2D(p_phi, Vector2()) * (*this); } +real_t Transform2D::get_skew() const { + + real_t det = basis_determinant(); + return Math::acos(elements[0].normalized().dot(SGN(det) * elements[1].normalized())) - Math_PI * 0.5; +} + +void Transform2D::set_skew(float p_angle) { + + real_t det = basis_determinant(); + elements[1] = SGN(det) * elements[0].rotated((Math_PI * 0.5 + p_angle)).normalized() * elements[1].length(); +} + real_t Transform2D::get_rotation() const { real_t det = basis_determinant(); Transform2D m = orthonormalized(); @@ -267,7 +279,7 @@ Transform2D Transform2D::interpolate_with(const Transform2D &p_transform, real_t Vector2 v; if (dot > 0.9995) { - v = Vector2::linear_interpolate(v1, v2, p_c).normalized(); //linearly interpolate to avoid numerical precision issues + v = v1.lerp(v2, p_c).normalized(); //linearly interpolate to avoid numerical precision issues } else { real_t angle = p_c * Math::acos(dot); Vector2 v3 = (v2 - v1 * dot).normalized(); @@ -275,8 +287,8 @@ Transform2D Transform2D::interpolate_with(const Transform2D &p_transform, real_t } //construct matrix - Transform2D res(Math::atan2(v.y, v.x), Vector2::linear_interpolate(p1, p2, p_c)); - res.scale_basis(Vector2::linear_interpolate(s1, s2, p_c)); + Transform2D res(Math::atan2(v.y, v.x), p1.lerp(p2, p_c)); + res.scale_basis(s1.lerp(s2, p_c)); return res; } diff --git a/core/math/transform_2d.h b/core/math/transform_2d.h index fa43762aa4..459ceed7a9 100644 --- a/core/math/transform_2d.h +++ b/core/math/transform_2d.h @@ -70,7 +70,10 @@ struct Transform2D { void set_rotation(real_t p_rot); real_t get_rotation() const; + real_t get_skew() const; + void set_skew(float p_angle); _FORCE_INLINE_ void set_rotation_and_scale(real_t p_rot, const Size2 &p_scale); + _FORCE_INLINE_ void set_rotation_scale_and_skew(real_t p_rot, const Size2 &p_scale, float p_skew); void rotate(real_t p_phi); void scale(const Size2 &p_scale); @@ -184,6 +187,14 @@ void Transform2D::set_rotation_and_scale(real_t p_rot, const Size2 &p_scale) { elements[0][1] = Math::sin(p_rot) * p_scale.x; } +void Transform2D::set_rotation_scale_and_skew(real_t p_rot, const Size2 &p_scale, float p_skew) { + + elements[0][0] = Math::cos(p_rot) * p_scale.x; + elements[1][1] = Math::cos(p_rot + p_skew) * p_scale.y; + elements[1][0] = -Math::sin(p_rot + p_skew) * p_scale.y; + elements[0][1] = Math::sin(p_rot) * p_scale.x; +} + Rect2 Transform2D::xform_inv(const Rect2 &p_rect) const { Vector2 ends[4] = { diff --git a/core/math/triangle_mesh.cpp b/core/math/triangle_mesh.cpp index 01d38cf24e..5c66721b9d 100644 --- a/core/math/triangle_mesh.cpp +++ b/core/math/triangle_mesh.cpp @@ -502,7 +502,7 @@ bool TriangleMesh::intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, V return inters; } -bool TriangleMesh::intersect_convex_shape(const Plane *p_planes, int p_plane_count) const { +bool TriangleMesh::intersect_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count) const { uint32_t *stack = (uint32_t *)alloca(sizeof(int) * max_depth); //p_fully_inside = true; @@ -536,7 +536,7 @@ bool TriangleMesh::intersect_convex_shape(const Plane *p_planes, int p_plane_cou switch (stack[level] >> VISITED_BIT_SHIFT) { case TEST_AABB_BIT: { - bool valid = b.aabb.intersects_convex_shape(p_planes, p_plane_count); + bool valid = b.aabb.intersects_convex_shape(p_planes, p_plane_count, p_points, p_point_count); if (!valid) { stack[level] = (VISIT_DONE_BIT << VISITED_BIT_SHIFT) | node; @@ -617,7 +617,7 @@ bool TriangleMesh::intersect_convex_shape(const Plane *p_planes, int p_plane_cou return false; } -bool TriangleMesh::inside_convex_shape(const Plane *p_planes, int p_plane_count, Vector3 p_scale) const { +bool TriangleMesh::inside_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count, Vector3 p_scale) const { uint32_t *stack = (uint32_t *)alloca(sizeof(int) * max_depth); enum { @@ -651,7 +651,7 @@ bool TriangleMesh::inside_convex_shape(const Plane *p_planes, int p_plane_count, switch (stack[level] >> VISITED_BIT_SHIFT) { case TEST_AABB_BIT: { - bool intersects = scale.xform(b.aabb).intersects_convex_shape(p_planes, p_plane_count); + bool intersects = scale.xform(b.aabb).intersects_convex_shape(p_planes, p_plane_count, p_points, p_point_count); if (!intersects) return false; bool inside = scale.xform(b.aabb).inside_convex_shape(p_planes, p_plane_count); diff --git a/core/math/triangle_mesh.h b/core/math/triangle_mesh.h index fdbfb90465..64704477cc 100644 --- a/core/math/triangle_mesh.h +++ b/core/math/triangle_mesh.h @@ -90,8 +90,8 @@ public: bool is_valid() const; bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal) const; bool intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, Vector3 &r_point, Vector3 &r_normal) const; - bool intersect_convex_shape(const Plane *p_planes, int p_plane_count) const; - bool inside_convex_shape(const Plane *p_planes, int p_plane_count, Vector3 p_scale = Vector3(1, 1, 1)) const; + bool intersect_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count) const; + bool inside_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count, Vector3 p_scale = Vector3(1, 1, 1)) const; Vector3 get_area_normal(const AABB &p_aabb) const; Vector<Face3> get_faces() const; diff --git a/core/math/vector2.h b/core/math/vector2.h index 95d2474838..c0057f2543 100644 --- a/core/math/vector2.h +++ b/core/math/vector2.h @@ -82,8 +82,7 @@ struct Vector2 { Vector2 clamped(real_t p_len) const; - _FORCE_INLINE_ static Vector2 linear_interpolate(const Vector2 &p_a, const Vector2 &p_b, real_t p_t); - _FORCE_INLINE_ Vector2 linear_interpolate(const Vector2 &p_b, real_t p_t) const; + _FORCE_INLINE_ Vector2 lerp(const Vector2 &p_b, real_t p_t) const; _FORCE_INLINE_ Vector2 slerp(const Vector2 &p_b, real_t p_t) const; Vector2 cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_t) const; Vector2 move_toward(const Vector2 &p_to, const real_t p_delta) const; @@ -224,7 +223,7 @@ _FORCE_INLINE_ bool Vector2::operator!=(const Vector2 &p_vec2) const { return x != p_vec2.x || y != p_vec2.y; } -Vector2 Vector2::linear_interpolate(const Vector2 &p_b, real_t p_t) const { +Vector2 Vector2::lerp(const Vector2 &p_b, real_t p_t) const { Vector2 res = *this; @@ -248,16 +247,6 @@ Vector2 Vector2::direction_to(const Vector2 &p_b) const { return ret; } -Vector2 Vector2::linear_interpolate(const Vector2 &p_a, const Vector2 &p_b, real_t p_t) { - - Vector2 res = p_a; - - res.x += (p_t * (p_b.x - p_a.x)); - res.y += (p_t * (p_b.y - p_a.y)); - - return res; -} - typedef Vector2 Size2; typedef Vector2 Point2; diff --git a/core/math/vector3.h b/core/math/vector3.h index 3bf8644af9..a5e9d09208 100644 --- a/core/math/vector3.h +++ b/core/math/vector3.h @@ -89,7 +89,7 @@ struct Vector3 { /* Static Methods between 2 vector3s */ - _FORCE_INLINE_ Vector3 linear_interpolate(const Vector3 &p_b, real_t p_t) const; + _FORCE_INLINE_ Vector3 lerp(const Vector3 &p_b, real_t p_t) const; _FORCE_INLINE_ Vector3 slerp(const Vector3 &p_b, real_t p_t) const; Vector3 cubic_interpolate(const Vector3 &p_b, const Vector3 &p_pre_a, const Vector3 &p_post_b, real_t p_t) const; Vector3 cubic_interpolaten(const Vector3 &p_b, const Vector3 &p_pre_a, const Vector3 &p_post_b, real_t p_t) const; @@ -206,7 +206,7 @@ Vector3 Vector3::round() const { return Vector3(Math::round(x), Math::round(y), Math::round(z)); } -Vector3 Vector3::linear_interpolate(const Vector3 &p_b, real_t p_t) const { +Vector3 Vector3::lerp(const Vector3 &p_b, real_t p_t) const { return Vector3( x + (p_t * (p_b.x - x)), diff --git a/core/os/os.h b/core/os/os.h index 714a10bf76..38114e6814 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -59,6 +59,7 @@ class OS { bool _allow_layered; bool _use_vsync; bool _vsync_via_compositor; + bool _disable_wintab; char *last_error; @@ -148,6 +149,7 @@ public: bool is_layered_allowed() const { return _allow_layered; } bool is_hidpi_allowed() const { return _allow_hidpi; } + bool is_wintab_disabled() const { return _disable_wintab; } void ensure_user_data_dir(); diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 63b52661b4..8829181489 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -362,40 +362,29 @@ Error ProjectSettings::_setup(const String &p_path, const String &p_main_pack, b // We need to test both possibilities as extensions for Linux binaries are optional // (so both 'mygame.bin' and 'mygame' should be able to find 'mygame.pck'). - bool found = false; - String exec_dir = exec_path.get_base_dir(); String exec_filename = exec_path.get_file(); String exec_basename = exec_filename.get_basename(); - // Try to load data pack at the location of the executable - // As mentioned above, we have two potential names to attempt - - if (_load_resource_pack(exec_dir.plus_file(exec_basename + ".pck")) || - _load_resource_pack(exec_dir.plus_file(exec_filename + ".pck"))) { - found = true; - } else { - // If we couldn't find them next to the executable, we attempt - // the current working directory. Same story, two tests. - if (_load_resource_pack(exec_basename + ".pck") || - _load_resource_pack(exec_filename + ".pck")) { - found = true; - } - } + // Attempt with PCK bundled into executable + bool found = _load_resource_pack(exec_path); #ifdef OSX_ENABLED - // Attempt to load PCK from macOS .app bundle resources if (!found) { - if (_load_resource_pack(OS::get_singleton()->get_bundle_resource_dir().plus_file(exec_basename + ".pck"))) { - found = true; - } + // Attempt to load PCK from macOS .app bundle resources + found = _load_resource_pack(OS::get_singleton()->get_bundle_resource_dir().plus_file(exec_basename + ".pck")); } #endif - // Attempt with PCK bundled into executable if (!found) { - if (_load_resource_pack(exec_path)) { - found = true; + // Try to load data pack at the location of the executable + // As mentioned above, we have two potential names to attempt + found = _load_resource_pack(exec_dir.plus_file(exec_basename + ".pck")) || _load_resource_pack(exec_dir.plus_file(exec_filename + ".pck")); + + if (!found) { + // If we couldn't find them next to the executable, we attempt + // the current working directory. Same story, two tests. + found = _load_resource_pack(exec_basename + ".pck") || _load_resource_pack(exec_filename + ".pck"); } } diff --git a/core/variant.cpp b/core/variant.cpp index b3611536b8..a91876dd98 100644 --- a/core/variant.cpp +++ b/core/variant.cpp @@ -102,11 +102,6 @@ String Variant::get_type_name(Variant::Type p_type) { return "Plane"; } break; - /* - case QUAT: { - - - } break;*/ case AABB: { return "AABB"; diff --git a/core/variant.h b/core/variant.h index a832f7ccf8..1ae09ad82f 100644 --- a/core/variant.h +++ b/core/variant.h @@ -67,13 +67,6 @@ typedef Vector<Vector2> PackedVector2Array; typedef Vector<Vector3> PackedVector3Array; typedef Vector<Color> PackedColorArray; -// Temporary workaround until c++11 alignas() -#ifdef __GNUC__ -#define GCC_ALIGNED_8 __attribute__((aligned(8))) -#else -#define GCC_ALIGNED_8 -#endif - class Variant { public: // If this changes the table in variant_op must be updated @@ -211,7 +204,7 @@ private: PackedArrayRefBase *packed_array; void *_ptr; //generic pointer uint8_t _mem[sizeof(ObjData) > (sizeof(real_t) * 4) ? sizeof(ObjData) : (sizeof(real_t) * 4)]; - } _data GCC_ALIGNED_8; + } _data alignas(8); void reference(const Variant &p_variant); void clear(); diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 483565648a..9fffb42ff6 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -362,7 +362,7 @@ struct _VariantCall { VCALL_LOCALMEM1R(Vector2, angle_to); VCALL_LOCALMEM1R(Vector2, angle_to_point); VCALL_LOCALMEM1R(Vector2, direction_to); - VCALL_LOCALMEM2R(Vector2, linear_interpolate); + VCALL_LOCALMEM2R(Vector2, lerp); VCALL_LOCALMEM2R(Vector2, slerp); VCALL_LOCALMEM4R(Vector2, cubic_interpolate); VCALL_LOCALMEM2R(Vector2, move_toward); @@ -426,7 +426,7 @@ struct _VariantCall { VCALL_LOCALMEM0R(Vector3, inverse); VCALL_LOCALMEM1R(Vector3, snapped); VCALL_LOCALMEM2R(Vector3, rotated); - VCALL_LOCALMEM2R(Vector3, linear_interpolate); + VCALL_LOCALMEM2R(Vector3, lerp); VCALL_LOCALMEM2R(Vector3, slerp); VCALL_LOCALMEM4R(Vector3, cubic_interpolate); VCALL_LOCALMEM2R(Vector3, move_toward); @@ -509,7 +509,7 @@ struct _VariantCall { VCALL_LOCALMEM0R(Color, to_rgba64); VCALL_LOCALMEM0R(Color, inverted); VCALL_LOCALMEM0R(Color, contrasted); - VCALL_LOCALMEM2R(Color, linear_interpolate); + VCALL_LOCALMEM2R(Color, lerp); VCALL_LOCALMEM1R(Color, blend); VCALL_LOCALMEM1R(Color, lightened); VCALL_LOCALMEM1R(Color, darkened); @@ -1075,6 +1075,11 @@ struct _VariantCall { r_ret = Color::hex(*p_args[0]); } + static void Color_init5(Variant &r_ret, const Variant **p_args) { + + r_ret = Color(((Color)(*p_args[0])), *p_args[1]); + } + static void AABB_init1(Variant &r_ret, const Variant **p_args) { r_ret = ::AABB(*p_args[0], *p_args[1]); @@ -1353,6 +1358,8 @@ Variant Variant::construct(const Variant::Type p_type, const Variant **p_args, i case RECT2I: return (Rect2i(*p_args[0])); case VECTOR3: return (Vector3(*p_args[0])); case VECTOR3I: return (Vector3i(*p_args[0])); + case TRANSFORM2D: + return (Transform2D(p_args[0]->operator Transform2D())); case PLANE: return (Plane(*p_args[0])); case QUAT: return (p_args[0]->operator Quat()); case AABB: @@ -1801,7 +1808,7 @@ void register_variant_methods() { ADDFUNC1R(VECTOR2, VECTOR2, Vector2, posmod, FLOAT, "mod", varray()); ADDFUNC1R(VECTOR2, VECTOR2, Vector2, posmodv, VECTOR2, "modv", varray()); ADDFUNC1R(VECTOR2, VECTOR2, Vector2, project, VECTOR2, "b", varray()); - ADDFUNC2R(VECTOR2, VECTOR2, Vector2, linear_interpolate, VECTOR2, "b", FLOAT, "t", varray()); + ADDFUNC2R(VECTOR2, VECTOR2, Vector2, lerp, VECTOR2, "b", FLOAT, "t", varray()); ADDFUNC2R(VECTOR2, VECTOR2, Vector2, slerp, VECTOR2, "b", FLOAT, "t", varray()); ADDFUNC4R(VECTOR2, VECTOR2, Vector2, cubic_interpolate, VECTOR2, "b", VECTOR2, "pre_a", VECTOR2, "post_b", FLOAT, "t", varray()); ADDFUNC2R(VECTOR2, VECTOR2, Vector2, move_toward, VECTOR2, "to", FLOAT, "delta", varray()); @@ -1866,7 +1873,7 @@ void register_variant_methods() { ADDFUNC0R(VECTOR3, VECTOR3, Vector3, inverse, varray()); ADDFUNC1R(VECTOR3, VECTOR3, Vector3, snapped, VECTOR3, "by", varray()); ADDFUNC2R(VECTOR3, VECTOR3, Vector3, rotated, VECTOR3, "axis", FLOAT, "phi", varray()); - ADDFUNC2R(VECTOR3, VECTOR3, Vector3, linear_interpolate, VECTOR3, "b", FLOAT, "t", varray()); + ADDFUNC2R(VECTOR3, VECTOR3, Vector3, lerp, VECTOR3, "b", FLOAT, "t", varray()); ADDFUNC2R(VECTOR3, VECTOR3, Vector3, slerp, VECTOR3, "b", FLOAT, "t", varray()); ADDFUNC4R(VECTOR3, VECTOR3, Vector3, cubic_interpolate, VECTOR3, "b", VECTOR3, "pre_a", VECTOR3, "post_b", FLOAT, "t", varray()); ADDFUNC2R(VECTOR3, VECTOR3, Vector3, move_toward, VECTOR3, "to", FLOAT, "delta", varray()); @@ -1925,7 +1932,7 @@ void register_variant_methods() { ADDFUNC0R(COLOR, INT, Color, to_rgba64, varray()); ADDFUNC0R(COLOR, COLOR, Color, inverted, varray()); ADDFUNC0R(COLOR, COLOR, Color, contrasted, varray()); - ADDFUNC2R(COLOR, COLOR, Color, linear_interpolate, COLOR, "b", FLOAT, "t", varray()); + ADDFUNC2R(COLOR, COLOR, Color, lerp, COLOR, "b", FLOAT, "t", varray()); ADDFUNC1R(COLOR, COLOR, Color, blend, COLOR, "over", varray()); ADDFUNC1R(COLOR, COLOR, Color, lightened, FLOAT, "amount", varray()); ADDFUNC1R(COLOR, COLOR, Color, darkened, FLOAT, "amount", varray()); @@ -2209,6 +2216,8 @@ void register_variant_methods() { _VariantCall::add_constructor(_VariantCall::Color_init1, Variant::COLOR, "r", Variant::FLOAT, "g", Variant::FLOAT, "b", Variant::FLOAT, "a", Variant::FLOAT); _VariantCall::add_constructor(_VariantCall::Color_init2, Variant::COLOR, "r", Variant::FLOAT, "g", Variant::FLOAT, "b", Variant::FLOAT); + // init3 and init4 are the constructors for HTML hex strings and integers respectively which don't need binding here, so we skip to init5. + _VariantCall::add_constructor(_VariantCall::Color_init5, Variant::COLOR, "c", Variant::COLOR, "a", Variant::FLOAT); _VariantCall::add_constructor(_VariantCall::AABB_init1, Variant::AABB, "position", Variant::VECTOR3, "size", Variant::VECTOR3); diff --git a/core/variant_op.cpp b/core/variant_op.cpp index f173c88054..27624b81ee 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -4220,7 +4220,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & } return; case VECTOR2: { - r_dst = reinterpret_cast<const Vector2 *>(a._data._mem)->linear_interpolate(*reinterpret_cast<const Vector2 *>(b._data._mem), c); + r_dst = reinterpret_cast<const Vector2 *>(a._data._mem)->lerp(*reinterpret_cast<const Vector2 *>(b._data._mem), c); } return; case VECTOR2I: { @@ -4233,7 +4233,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & return; case RECT2: { - r_dst = Rect2(reinterpret_cast<const Rect2 *>(a._data._mem)->position.linear_interpolate(reinterpret_cast<const Rect2 *>(b._data._mem)->position, c), reinterpret_cast<const Rect2 *>(a._data._mem)->size.linear_interpolate(reinterpret_cast<const Rect2 *>(b._data._mem)->size, c)); + r_dst = Rect2(reinterpret_cast<const Rect2 *>(a._data._mem)->position.lerp(reinterpret_cast<const Rect2 *>(b._data._mem)->position, c), reinterpret_cast<const Rect2 *>(a._data._mem)->size.lerp(reinterpret_cast<const Rect2 *>(b._data._mem)->size, c)); } return; case RECT2I: { @@ -4254,7 +4254,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & return; case VECTOR3: { - r_dst = reinterpret_cast<const Vector3 *>(a._data._mem)->linear_interpolate(*reinterpret_cast<const Vector3 *>(b._data._mem), c); + r_dst = reinterpret_cast<const Vector3 *>(a._data._mem)->lerp(*reinterpret_cast<const Vector3 *>(b._data._mem), c); } return; case VECTOR3I: { @@ -4281,7 +4281,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & } return; case AABB: { - r_dst = ::AABB(a._data._aabb->position.linear_interpolate(b._data._aabb->position, c), a._data._aabb->size.linear_interpolate(b._data._aabb->size, c)); + r_dst = ::AABB(a._data._aabb->position.lerp(b._data._aabb->position, c), a._data._aabb->size.lerp(b._data._aabb->size, c)); } return; case BASIS: { @@ -4293,7 +4293,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & } return; case COLOR: { - r_dst = reinterpret_cast<const Color *>(a._data._mem)->linear_interpolate(*reinterpret_cast<const Color *>(b._data._mem), c); + r_dst = reinterpret_cast<const Color *>(a._data._mem)->lerp(*reinterpret_cast<const Color *>(b._data._mem), c); } return; case STRING_NAME: { @@ -4448,7 +4448,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & const Vector2 *br = arr_b->ptr(); for (int i = 0; i < sz; i++) { - vw[i] = ar[i].linear_interpolate(br[i], c); + vw[i] = ar[i].lerp(br[i], c); } } r_dst = v; @@ -4473,7 +4473,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & const Vector3 *br = arr_b->ptr(); for (int i = 0; i < sz; i++) { - vw[i] = ar[i].linear_interpolate(br[i], c); + vw[i] = ar[i].lerp(br[i], c); } } r_dst = v; @@ -4497,7 +4497,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant & const Color *br = arr_b->ptr(); for (int i = 0; i < sz; i++) { - vw[i] = ar[i].linear_interpolate(br[i], c); + vw[i] = ar[i].lerp(br[i], c); } } r_dst = v; diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index b3cd1c1af7..222b70c9c7 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -77,6 +77,9 @@ <member name="ProjectSettings" type="ProjectSettings" setter="" getter=""> The [ProjectSettings] singleton. </member> + <member name="RenderingDevice" type="RenderingDevice" setter="" getter=""> + The [RenderingDevice] singleton. + </member> <member name="RenderingServer" type="RenderingServer" setter="" getter=""> The [RenderingServer] singleton. </member> @@ -1177,10 +1180,10 @@ [codeblock] var err = method_that_returns_error() if err != OK: - print("Failure!) + print("Failure!") # Or, equivalent: if err: - print("Still failing!) + print("Still failing!") [/codeblock] </constant> <constant name="FAILED" value="1" enum="Error"> diff --git a/doc/classes/AnimatedTexture.xml b/doc/classes/AnimatedTexture.xml index ddd51cc6b3..285e0d5f39 100644 --- a/doc/classes/AnimatedTexture.xml +++ b/doc/classes/AnimatedTexture.xml @@ -75,7 +75,7 @@ If [code]true[/code], the animation will only play once and will not loop back to the first frame after reaching the end. Note that reaching the end will not set [member pause] to [code]true[/code]. </member> <member name="pause" type="bool" setter="set_pause" getter="get_pause" default="false"> - If [code]true[/code], the animation will pause where it currently is (i.e. at [member current_frame]). The animation will continue from where it was paused when changing this property to [code]false[/code]. + If [code]true[/code], the animation will pause where it currently is (i.e. at [member current_frame]). The animation will continue from where it was paused when changing this property to [code]false[/code]. </member> </members> <constants> diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index 76abc31451..1da4e23437 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -159,6 +159,7 @@ </member> <member name="detail_normal" type="Texture2D" setter="set_texture" getter="get_texture"> Texture that specifies the per-pixel normal of the detail overlay. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </member> <member name="detail_uv_layer" type="int" setter="set_detail_uv" getter="get_detail_uv" enum="BaseMaterial3D.DetailUV"> Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail layer. See [enum DetailUV] for options. @@ -250,6 +251,7 @@ </member> <member name="normal_texture" type="Texture2D" setter="set_texture" getter="get_texture"> Texture used to specify the normal at a given pixel. The [code]normal_texture[/code] only uses the red and green channels. The normal read from [code]normal_texture[/code] is oriented around the surface normal provided by the [Mesh]. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </member> <member name="orm_texture" type="Texture2D" setter="set_texture" getter="get_texture"> </member> diff --git a/doc/classes/CPUParticles2D.xml b/doc/classes/CPUParticles2D.xml index c2b821699d..df3ef71a2a 100644 --- a/doc/classes/CPUParticles2D.xml +++ b/doc/classes/CPUParticles2D.xml @@ -240,6 +240,7 @@ </member> <member name="normalmap" type="Texture2D" setter="set_normalmap" getter="get_normalmap"> Normal map to be used for the [member texture] property. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </member> <member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot" default="false"> If [code]true[/code], only one emission cycle occurs. If set [code]true[/code] during a cycle, emission will stop at the cycle's end. diff --git a/doc/classes/Camera3D.xml b/doc/classes/Camera3D.xml index bfba23c7ee..6ff4875364 100644 --- a/doc/classes/Camera3D.xml +++ b/doc/classes/Camera3D.xml @@ -183,8 +183,13 @@ <member name="far" type="float" setter="set_zfar" getter="get_zfar" default="100.0"> The distance to the far culling boundary for this camera relative to its local Z axis. </member> - <member name="fov" type="float" setter="set_fov" getter="get_fov" default="70.0"> + <member name="fov" type="float" setter="set_fov" getter="get_fov" default="75.0"> The camera's field of view angle (in degrees). Only applicable in perspective mode. Since [member keep_aspect] locks one axis, [code]fov[/code] sets the other axis' field of view angle. + For reference, the default vertical field of view value ([code]75.0[/code]) is equivalent to an horizontal FOV of: + - ~91.31 degrees in a 4:3 viewport + - ~101.67 degrees in a 16:10 viewport + - ~107.51 degrees in a 16:9 viewport + - ~121.63 degrees in a 21:9 viewport </member> <member name="frustum_offset" type="Vector2" setter="set_frustum_offset" getter="get_frustum_offset" default="Vector2( 0, 0 )"> The camera's frustum offset. This can be changed from the default to create "tilted frustum" effects such as [url=https://zdoom.org/wiki/Y-shearing]Y-shearing[/url]. diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml index d495be2ffd..b35d4fb36a 100644 --- a/doc/classes/Color.xml +++ b/doc/classes/Color.xml @@ -42,6 +42,20 @@ <method name="Color"> <return type="Color"> </return> + <argument index="0" name="c" type="Color"> + </argument> + <argument index="1" name="a" type="float"> + </argument> + <description> + Constructs a color from an existing color, but with a custom alpha value. + [codeblock] + var red = Color(Color.red, 0.5) # 50% transparent red. + [/codeblock] + </description> + </method> + <method name="Color"> + <return type="Color"> + </return> <argument index="0" name="r" type="float"> </argument> <argument index="1" name="g" type="float"> @@ -149,32 +163,32 @@ Returns [code]true[/code] if this color and [code]color[/code] are approximately equal, by running [method @GDScript.is_equal_approx] on each component. </description> </method> - <method name="lightened"> + <method name="lerp"> <return type="Color"> </return> - <argument index="0" name="amount" type="float"> + <argument index="0" name="b" type="Color"> + </argument> + <argument index="1" name="t" type="float"> </argument> <description> - Returns a new color resulting from making this color lighter by the specified percentage (ratio from 0 to 1). + Returns the linear interpolation with another color. The interpolation factor [code]t[/code] is between 0 and 1. [codeblock] - var green = Color(0.0, 1.0, 0.0) - var lightgreen = green.lightened(0.2) # 20% lighter than regular green + var c1 = Color(1.0, 0.0, 0.0) + var c2 = Color(0.0, 1.0, 0.0) + var li_c = c1.lerp(c2, 0.5) # A color of an RGBA(128, 128, 0, 255) [/codeblock] </description> </method> - <method name="linear_interpolate"> + <method name="lightened"> <return type="Color"> </return> - <argument index="0" name="b" type="Color"> - </argument> - <argument index="1" name="t" type="float"> + <argument index="0" name="amount" type="float"> </argument> <description> - Returns the linear interpolation with another color. The interpolation factor [code]t[/code] is between 0 and 1. + Returns a new color resulting from making this color lighter by the specified percentage (ratio from 0 to 1). [codeblock] - var c1 = Color(1.0, 0.0, 0.0) - var c2 = Color(0.0, 1.0, 0.0) - var li_c = c1.linear_interpolate(c2, 0.5) # A color of an RGBA(128, 128, 0, 255) + var green = Color(0.0, 1.0, 0.0) + var lightgreen = green.lightened(0.2) # 20% lighter than regular green [/codeblock] </description> </method> diff --git a/doc/classes/GPUParticles2D.xml b/doc/classes/GPUParticles2D.xml index 64a2522f2f..ee67b5052c 100644 --- a/doc/classes/GPUParticles2D.xml +++ b/doc/classes/GPUParticles2D.xml @@ -53,6 +53,7 @@ </member> <member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map"> Normal map to be used for the [member texture] property. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </member> <member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot" default="false"> If [code]true[/code], only one emission cycle occurs. If set [code]true[/code] during a cycle, emission will stop at the cycle's end. diff --git a/doc/classes/Generic6DOFJoint3D.xml b/doc/classes/Generic6DOFJoint3D.xml index fae567dc58..ae86ab7365 100644 --- a/doc/classes/Generic6DOFJoint3D.xml +++ b/doc/classes/Generic6DOFJoint3D.xml @@ -373,6 +373,12 @@ <constant name="PARAM_LINEAR_MOTOR_FORCE_LIMIT" value="6" enum="Param"> The maximum force the linear motor will apply while trying to reach the velocity target. </constant> + <constant name="PARAM_LINEAR_SPRING_STIFFNESS" value="7" enum="Param"> + </constant> + <constant name="PARAM_LINEAR_SPRING_DAMPING" value="8" enum="Param"> + </constant> + <constant name="PARAM_LINEAR_SPRING_EQUILIBRIUM_POINT" value="9" enum="Param"> + </constant> <constant name="PARAM_ANGULAR_LOWER_LIMIT" value="10" enum="Param"> The minimum rotation in negative direction to break loose and rotate around the axes. </constant> @@ -400,6 +406,12 @@ <constant name="PARAM_ANGULAR_MOTOR_FORCE_LIMIT" value="18" enum="Param"> Maximum acceleration for the motor at the axes. </constant> + <constant name="PARAM_ANGULAR_SPRING_STIFFNESS" value="19" enum="Param"> + </constant> + <constant name="PARAM_ANGULAR_SPRING_DAMPING" value="20" enum="Param"> + </constant> + <constant name="PARAM_ANGULAR_SPRING_EQUILIBRIUM_POINT" value="21" enum="Param"> + </constant> <constant name="PARAM_MAX" value="22" enum="Param"> Represents the size of the [enum Param] enum. </constant> diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml index 8cffe07fc0..99253e8840 100644 --- a/doc/classes/Image.xml +++ b/doc/classes/Image.xml @@ -350,7 +350,7 @@ <argument index="0" name="path" type="String"> </argument> <description> - Loads an image from file [code]path[/code]. + Loads an image from file [code]path[/code]. See [url=https://docs.godotengine.org/en/latest/getting_started/workflow/assets/importing_images.html#supported-image-formats]Supported image formats[/url] for a list of supported image formats and limitations. </description> </method> <method name="load_jpg_from_buffer"> diff --git a/doc/classes/KinematicBody3D.xml b/doc/classes/KinematicBody3D.xml index 5f9b36f97d..830d63ed11 100644 --- a/doc/classes/KinematicBody3D.xml +++ b/doc/classes/KinematicBody3D.xml @@ -108,7 +108,7 @@ This method should be used in [method Node._physics_process] (or in a method called by [method Node._physics_process]), as it uses the physics step's [code]delta[/code] value automatically in calculations. Otherwise, the simulation will run at an incorrect speed. [code]linear_velocity[/code] is the velocity vector (typically meters per second). Unlike in [method move_and_collide], you should [i]not[/i] multiply it by [code]delta[/code] — the physics engine handles applying the velocity. [code]up_direction[/code] is the up direction, used to determine what is a wall and what is a floor or a ceiling. If set to the default value of [code]Vector3(0, 0, 0)[/code], everything is considered a wall. - If [code]stop_on_slope[/code] is [code]true[/code], body will not slide on slopes if you include gravity in [code]linear_velocity[/code]. + If [code]stop_on_slope[/code] is [code]true[/code], body will not slide on slopes when you include gravity in [code]linear_velocity[/code] and the body is standing still. If the body collides, it will change direction a maximum of [code]max_slides[/code] times before it stops. [code]floor_max_angle[/code] is the maximum angle (in radians) where a slope is still considered a floor (or a ceiling), rather than a wall. The default value equals 45 degrees. If [code]infinite_inertia[/code] is [code]true[/code], body will be able to push [RigidBody3D] nodes, but it won't also detect any collisions with them. If [code]false[/code], it will interact with [RigidBody3D] nodes like with [StaticBody3D]. diff --git a/doc/classes/MeshInstance2D.xml b/doc/classes/MeshInstance2D.xml index 0cfc8deb0a..689f8d83e1 100644 --- a/doc/classes/MeshInstance2D.xml +++ b/doc/classes/MeshInstance2D.xml @@ -17,6 +17,7 @@ </member> <member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map"> The normal map that will be used if using the default [CanvasItemMaterial]. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </member> <member name="texture" type="Texture2D" setter="set_texture" getter="get_texture"> The [Texture2D] that will be used if using the default [CanvasItemMaterial]. Can be accessed as [code]TEXTURE[/code] in CanvasItem shader. diff --git a/doc/classes/MultiMeshInstance2D.xml b/doc/classes/MultiMeshInstance2D.xml index 07f21514ef..a461c8e056 100644 --- a/doc/classes/MultiMeshInstance2D.xml +++ b/doc/classes/MultiMeshInstance2D.xml @@ -17,6 +17,7 @@ </member> <member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map"> The normal map that will be used if using the default [CanvasItemMaterial]. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </member> <member name="texture" type="Texture2D" setter="set_texture" getter="get_texture"> The [Texture2D] that will be used if using the default [CanvasItemMaterial]. Can be accessed as [code]TEXTURE[/code] in CanvasItem shader. diff --git a/doc/classes/Node2D.xml b/doc/classes/Node2D.xml index d4517f0588..d29c556216 100644 --- a/doc/classes/Node2D.xml +++ b/doc/classes/Node2D.xml @@ -142,6 +142,10 @@ <member name="scale" type="Vector2" setter="set_scale" getter="get_scale" default="Vector2( 1, 1 )"> The node's scale. Unscaled value: [code](1, 1)[/code]. </member> + <member name="skew" type="float" setter="set_skew" getter="get_skew" default="0.0"> + </member> + <member name="skew_degrees" type="float" setter="set_skew_degrees" getter="get_skew_degrees" default="0.0"> + </member> <member name="transform" type="Transform2D" setter="set_transform" getter="get_transform"> Local [Transform2D]. </member> diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml index 3e7d4d4c05..05d00b9f31 100644 --- a/doc/classes/Node3D.xml +++ b/doc/classes/Node3D.xml @@ -26,7 +26,7 @@ Returns the parent [Node3D], or an empty [Object] if no parent exists or parent is not of type [Node3D]. </description> </method> - <method name="get_world" qualifiers="const"> + <method name="get_world_3d" qualifiers="const"> <return type="World3D"> </return> <description> diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index db79ee7765..6a70297f40 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -484,6 +484,7 @@ - [code]OS.shell_open("C:\\Users\name\Downloads")[/code] on Windows opens the file explorer at the user's Downloads folder. - [code]OS.shell_open("https://godotengine.org")[/code] opens the default web browser on the official Godot website. - [code]OS.shell_open("mailto:example@example.com")[/code] opens the default email client with the "To" field set to [code]example@example.com[/code]. See [url=https://blog.escapecreative.com/customizing-mailto-links/]Customizing [code]mailto:[/code] Links[/url] for a list of fields that can be added. + Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] or [code]user://[/code] path into a system path for use with this method. [b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS and Windows. </description> </method> diff --git a/doc/classes/Polygon2D.xml b/doc/classes/Polygon2D.xml index 13332ca4f0..335df1ac3f 100644 --- a/doc/classes/Polygon2D.xml +++ b/doc/classes/Polygon2D.xml @@ -102,6 +102,8 @@ If [code]true[/code], polygon will be inverted, containing the area outside the defined points and extending to the [code]invert_border[/code]. </member> <member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map"> + The normal map gives depth to the Polygon2D. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </member> <member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2( 0, 0 )"> The offset applied to each vertex. diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 9e917fb4dd..ded72e796b 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -414,6 +414,9 @@ <member name="display/mouse_cursor/tooltip_position_offset" type="Vector2" setter="" getter="" default="Vector2( 10, 10 )"> Position offset for tooltips, relative to the mouse cursor's hotspot. </member> + <member name="display/window/disable_wintab_api" type="bool" setter="" getter="" default="false"> + Disables WinTab API and always use Windows Ink API for the pen input (Windows only). + </member> <member name="display/window/dpi/allow_hidpi" type="bool" setter="" getter="" default="false"> If [code]true[/code], allows HiDPI display on Windows and macOS. This setting has no effect on desktop Linux, as DPI-awareness fallbacks are not supported there. </member> @@ -469,6 +472,8 @@ <member name="gui/common/swap_ok_cancel" type="bool" setter="" getter="" default="false"> If [code]true[/code], swaps OK and Cancel buttons in dialogs on Windows and UWP to follow interface conventions. </member> + <member name="gui/common/text_edit_undo_stack_max_size" type="int" setter="" getter="" default="1024"> + </member> <member name="gui/theme/custom" type="String" setter="" getter="" default=""""> Path to a custom [Theme] resource file to use for the project ([code]theme[/code] or generic [code]tres[/code]/[code]res[/code] extension). </member> @@ -977,6 +982,8 @@ <member name="rendering/limits/rendering/max_renderable_elements" type="int" setter="" getter="" default="128000"> 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/time/time_rollover_secs" type="float" setter="" getter="" default="3600"> + </member> <member name="rendering/quality/2d/gles2_use_nvidia_rect_flicker_workaround" type="bool" setter="" getter="" default="false"> Some NVIDIA GPU drivers have a bug which produces flickering issues for the [code]draw_rect[/code] method, especially as used in [TileMap]. Refer to [url=https://github.com/godotengine/godot/issues/9913]GitHub issue 9913[/url] for details. If [code]true[/code], this option enables a "safe" code path for such NVIDIA GPUs at the cost of performance. This option only impacts the GLES2 rendering backend, and only desktop platforms. It is not necessary when using the Vulkan backend. diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index 4e0762a68b..648f4d0107 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -9,7 +9,7 @@ The rendering server can be used to bypass the scene system entirely. Resources are created using the [code]*_create[/code] functions. All objects are drawn to a viewport. You can use the [Viewport] attached to the [SceneTree] or you can create one yourself with [method viewport_create]. When using a custom scenario or canvas, the scenario or canvas needs to be attached to the viewport using [method viewport_set_scenario] or [method viewport_attach_canvas]. - In 3D, all visual objects must be associated with a scenario. The scenario is a visual representation of the world. If accessing the rendering server from a running game, the scenario can be accessed from the scene tree from any [Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can be created with [method scenario_create]. + In 3D, all visual objects must be associated with a scenario. The scenario is a visual representation of the world. If accessing the rendering server from a running game, the scenario can be accessed from the scene tree from any [Node3D] node with [method Node3D.get_world_3d]. Otherwise, a scenario can be created with [method scenario_create]. Similarly in 2D, a canvas is needed to draw all canvas items. In 3D, all visible objects are comprised of a resource and an instance. A resource can be a mesh, a particle system, a light, or any other 3D object. In order to be visible resources must be attached to an instance using [method instance_set_base]. The instance must also be attached to the scenario using [method instance_set_scenario] in order to be visible. In 2D, all visible objects are some form of canvas item. In order to be visible, a canvas item needs to be the child of a canvas attached to a viewport, or it needs to be the child of another canvas item that is eventually attached to the canvas. diff --git a/doc/classes/SpinBox.xml b/doc/classes/SpinBox.xml index c8ba8ab697..e674ceb57e 100644 --- a/doc/classes/SpinBox.xml +++ b/doc/classes/SpinBox.xml @@ -45,7 +45,7 @@ Adds the specified [code]prefix[/code] string before the numerical value of the [SpinBox]. </member> <member name="suffix" type="String" setter="set_suffix" getter="get_suffix" default=""""> - Adds the specified [code]prefix[/code] string after the numerical value of the [SpinBox]. + Adds the specified [code]suffix[/code] string after the numerical value of the [SpinBox]. </member> </members> <constants> diff --git a/doc/classes/Sprite2D.xml b/doc/classes/Sprite2D.xml index 950fda4e20..92f561d7b5 100644 --- a/doc/classes/Sprite2D.xml +++ b/doc/classes/Sprite2D.xml @@ -54,6 +54,7 @@ </member> <member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map"> The normal map gives depth to the Sprite2D. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </member> <member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2( 0, 0 )"> The texture's drawing offset. diff --git a/doc/classes/StyleBoxTexture.xml b/doc/classes/StyleBoxTexture.xml index 8ed94c8c26..f8aa14cb2b 100644 --- a/doc/classes/StyleBoxTexture.xml +++ b/doc/classes/StyleBoxTexture.xml @@ -121,6 +121,7 @@ </member> <member name="normal_map" type="Texture2D" setter="set_normal_map" getter="get_normal_map"> The normal map to use when drawing this style box. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </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. diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml index b7cf93d672..bb2d355bf6 100644 --- a/doc/classes/TextEdit.xml +++ b/doc/classes/TextEdit.xml @@ -354,6 +354,17 @@ If [code]true[/code], hides the line of the specified index. </description> </method> + <method name="set_line"> + <return type="void"> + </return> + <argument index="0" name="line" type="int"> + </argument> + <argument index="1" name="new_text" type="String"> + </argument> + <description> + Sets the text for a specific line. + </description> + </method> <method name="toggle_fold_line"> <return type="void"> </return> diff --git a/doc/classes/TileSet.xml b/doc/classes/TileSet.xml index 65988ae2b7..c647f83598 100644 --- a/doc/classes/TileSet.xml +++ b/doc/classes/TileSet.xml @@ -590,6 +590,7 @@ </argument> <description> Sets the tile's normal map texture. + [b]Note:[/b] Godot expects the normal map to use X+, Y-, and Z+ coordinates. See [url=http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates]this page[/url] for a comparison of normal map coordinates expected by popular engines. </description> </method> <method name="tile_set_occluder_offset"> diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml index f9320ac55e..1938a3facb 100644 --- a/doc/classes/Tween.xml +++ b/doc/classes/Tween.xml @@ -16,7 +16,7 @@ [/codeblock] Many methods require a property name, such as [code]"position"[/code] above. You can find the correct property name by hovering over the property in the Inspector. You can also provide the components of a property directly by using [code]"property:component"[/code] (eg. [code]position:x[/code]), where it would only apply to that particular component. Many of the methods accept [code]trans_type[/code] and [code]ease_type[/code]. The first accepts an [enum TransitionType] constant, and refers to the way the timing of the animation is handled (see [url=https://easings.net/]easings.net[/url] for some examples). The second accepts an [enum EaseType] constant, and controls the where [code]trans_type[/code] is applied to the interpolation (in the beginning, the end, or both). If you don't know which transition and easing to pick, you can try different [enum TransitionType] constants with [constant EASE_IN_OUT], and use the one that looks best. - [b][url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url][/b] + [url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url] </description> <tutorials> </tutorials> diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml index 7b02a1a4c9..64ebc1fa09 100644 --- a/doc/classes/Vector2.xml +++ b/doc/classes/Vector2.xml @@ -193,7 +193,7 @@ Returns the vector's length squared. Prefer this method over [method length] if you need to sort vectors or need the squared length for some formula. </description> </method> - <method name="linear_interpolate"> + <method name="lerp"> <return type="Vector2"> </return> <argument index="0" name="b" type="Vector2"> diff --git a/doc/classes/Vector3.xml b/doc/classes/Vector3.xml index 600c03ba7d..8c18ca8cc9 100644 --- a/doc/classes/Vector3.xml +++ b/doc/classes/Vector3.xml @@ -169,7 +169,7 @@ Returns the vector's length squared. Prefer this function over [method length] if you need to sort vectors or need the squared length for some formula. </description> </method> - <method name="linear_interpolate"> + <method name="lerp"> <return type="Vector3"> </return> <argument index="0" name="b" type="Vector3"> diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml index a2d53f8e0c..3b52c80c9a 100644 --- a/doc/classes/Viewport.xml +++ b/doc/classes/Viewport.xml @@ -16,18 +16,18 @@ <link>https://docs.godotengine.org/en/latest/tutorials/viewports/index.html</link> </tutorials> <methods> - <method name="find_world" qualifiers="const"> - <return type="World3D"> + <method name="find_world_2d" qualifiers="const"> + <return type="World2D"> </return> <description> - Returns the 3D world of the viewport, or if none the world of the parent viewport. + Returns the 2D world of the viewport. </description> </method> - <method name="find_world_2d" qualifiers="const"> - <return type="World2D"> + <method name="find_world_3d" qualifiers="const"> + <return type="World3D"> </return> <description> - Returns the 2D world of the viewport. + Returns the 3D world of the viewport, or if none the world of the parent viewport. </description> </method> <method name="get_camera" qualifiers="const"> @@ -219,8 +219,8 @@ <member name="msaa" type="int" setter="set_msaa" getter="get_msaa" enum="Viewport.MSAA" default="0"> The multisample anti-aliasing mode. A higher number results in smoother edges at the cost of significantly worse performance. A value of 4 is best unless targeting very high-end systems. </member> - <member name="own_world" type="bool" setter="set_use_own_world" getter="is_using_own_world" default="false"> - If [code]true[/code], the viewport will use [World3D] defined in [code]world[/code] property. + <member name="own_world_3d" type="bool" setter="set_use_own_world_3d" getter="is_using_own_world_3d" default="false"> + If [code]true[/code], the viewport will use the [World3D] defined in [member world_3d]. </member> <member name="physics_object_picking" type="bool" setter="set_physics_object_picking" getter="get_physics_object_picking" default="false"> If [code]true[/code], the objects rendered by viewport become subjects of mouse picking process. @@ -247,12 +247,12 @@ <member name="transparent_bg" type="bool" setter="set_transparent_background" getter="has_transparent_background" default="false"> If [code]true[/code], the viewport should render its background as transparent. </member> - <member name="world" type="World3D" setter="set_world" getter="get_world"> - The custom [World3D] which can be used as 3D environment source. - </member> <member name="world_2d" type="World2D" setter="set_world_2d" getter="get_world_2d"> The custom [World2D] which can be used as 2D environment source. </member> + <member name="world_3d" type="World3D" setter="set_world_3d" getter="get_world_3d"> + The custom [World3D] which can be used as 3D environment source. + </member> </members> <signals> <signal name="gui_focus_changed"> diff --git a/doc/classes/VisualShaderNodeUniform.xml b/doc/classes/VisualShaderNodeUniform.xml index c4362f6f2a..1225d9c320 100644 --- a/doc/classes/VisualShaderNodeUniform.xml +++ b/doc/classes/VisualShaderNodeUniform.xml @@ -9,9 +9,17 @@ <methods> </methods> <members> + <member name="qualifier" type="int" setter="set_qualifier" getter="get_qualifier" enum="VisualShaderNodeUniform.Qualifier" default="0"> + </member> <member name="uniform_name" type="String" setter="set_uniform_name" getter="get_uniform_name" default=""""> </member> </members> <constants> + <constant name="QUAL_NONE" value="0" enum="Qualifier"> + </constant> + <constant name="QUAL_GLOBAL" value="1" enum="Qualifier"> + </constant> + <constant name="QUAL_INSTANCE" value="2" enum="Qualifier"> + </constant> </constants> </class> diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index 641d80c5ca..d58b9d9472 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -480,7 +480,7 @@ msgid "" "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " "return value will be of the same type ([code]lerp[/code] then calls the " -"vector type's [code]linear_interpolate[/code] method).\n" +"vector type's [code]lerp[/code] method).\n" "[codeblock]\n" "lerp(0, 4, 0.75) # Returns 3.0\n" "lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Returns Vector2(2, 3.5)\n" @@ -1204,19 +1204,19 @@ msgid "" msgstr "" #: doc/classes/@GlobalScope.xml:16 -msgid "The [ARVRServer] singleton." +msgid "The [AudioServer] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:19 -msgid "The [AudioServer] singleton." +msgid "The [CameraServer] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:22 -msgid "The [CameraServer] singleton." +msgid "The [ClassDB] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:25 -msgid "The [ClassDB] singleton." +msgid "The [DisplayServer] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:28 @@ -1228,90 +1228,89 @@ msgid "The [Geometry] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:34 -msgid "" -"The [GodotSharp] singleton. Only available when using Godot's Mono build." +msgid "The [IP] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:37 -msgid "The [IP] singleton." +msgid "The [Input] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:40 -msgid "The [InputFilter] singleton." -msgstr "" - -#: doc/classes/@GlobalScope.xml:43 msgid "The [InputMap] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:46 +#: doc/classes/@GlobalScope.xml:43 msgid "The [JSON] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:49 +#: doc/classes/@GlobalScope.xml:46 msgid "" "The [JavaClassWrapper] singleton.\n" "[b]Note:[/b] Only implemented on Android." msgstr "" -#: doc/classes/@GlobalScope.xml:53 +#: doc/classes/@GlobalScope.xml:50 msgid "" "The [JavaScript] singleton.\n" "[b]Note:[/b] Only implemented on HTML5." msgstr "" -#: doc/classes/@GlobalScope.xml:57 +#: doc/classes/@GlobalScope.xml:54 msgid "The [Marshalls] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:60 +#: doc/classes/@GlobalScope.xml:57 msgid "The [NavigationMeshGenerator] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:63 doc/classes/@GlobalScope.xml:66 +#: doc/classes/@GlobalScope.xml:60 doc/classes/@GlobalScope.xml:63 msgid "The [NavigationServer2D] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:69 +#: doc/classes/@GlobalScope.xml:66 msgid "The [OS] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:72 +#: doc/classes/@GlobalScope.xml:69 msgid "The [Performance] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:75 +#: doc/classes/@GlobalScope.xml:72 msgid "The [PhysicsServer2D] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:78 +#: doc/classes/@GlobalScope.xml:75 msgid "The [PhysicsServer3D] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:81 +#: doc/classes/@GlobalScope.xml:78 msgid "The [ProjectSettings] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:84 +#: doc/classes/@GlobalScope.xml:81 msgid "The [RenderingServer] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:87 +#: doc/classes/@GlobalScope.xml:84 msgid "The [ResourceLoader] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:90 +#: doc/classes/@GlobalScope.xml:87 msgid "The [ResourceSaver] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:93 +#: doc/classes/@GlobalScope.xml:90 msgid "The [TranslationServer] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:96 +#: doc/classes/@GlobalScope.xml:93 msgid "The [VisualScriptEditor] singleton." msgstr "" +#: doc/classes/@GlobalScope.xml:96 +msgid "The [XRServer] singleton." +msgstr "" + #: doc/classes/@GlobalScope.xml:101 msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes." msgstr "" @@ -1394,7 +1393,7 @@ msgid "Tab key." msgstr "" #: doc/classes/@GlobalScope.xml:158 -msgid "Shift+Tab key." +msgid "Shift + Tab key." msgstr "" #: doc/classes/@GlobalScope.xml:161 @@ -3124,305 +3123,311 @@ msgid "Used to categorize properties together in the editor." msgstr "" #: doc/classes/@GlobalScope.xml:1424 -msgid "The property does not save its state in [PackedScene]." +msgid "" +"Used to group properties together in the editor in a subgroup (under a " +"group)." msgstr "" #: doc/classes/@GlobalScope.xml:1427 -msgid "Editing the property prompts the user for restarting the editor." +msgid "The property does not save its state in [PackedScene]." msgstr "" #: doc/classes/@GlobalScope.xml:1430 +msgid "Editing the property prompts the user for restarting the editor." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1433 msgid "" "The property is a script variable which should be serialized and saved in " "the scene file." msgstr "" -#: doc/classes/@GlobalScope.xml:1433 +#: doc/classes/@GlobalScope.xml:1436 msgid "Default usage (storage, editor and network)." msgstr "" -#: doc/classes/@GlobalScope.xml:1436 +#: doc/classes/@GlobalScope.xml:1439 msgid "" "Default usage for translatable strings (storage, editor, network and " "internationalized)." msgstr "" -#: doc/classes/@GlobalScope.xml:1439 +#: doc/classes/@GlobalScope.xml:1442 msgid "" "Default usage but without showing the property in the editor (storage, " "network)." msgstr "" -#: doc/classes/@GlobalScope.xml:1442 +#: doc/classes/@GlobalScope.xml:1445 msgid "Flag for a normal method." msgstr "" -#: doc/classes/@GlobalScope.xml:1445 +#: doc/classes/@GlobalScope.xml:1448 msgid "Flag for an editor method." msgstr "" -#: doc/classes/@GlobalScope.xml:1448 doc/classes/@GlobalScope.xml:1454 -#: doc/classes/@GlobalScope.xml:1460 +#: doc/classes/@GlobalScope.xml:1451 doc/classes/@GlobalScope.xml:1457 +#: doc/classes/@GlobalScope.xml:1463 msgid "Deprecated method flag, unused." msgstr "" -#: doc/classes/@GlobalScope.xml:1451 +#: doc/classes/@GlobalScope.xml:1454 msgid "Flag for a constant method." msgstr "" -#: doc/classes/@GlobalScope.xml:1457 +#: doc/classes/@GlobalScope.xml:1460 msgid "Flag for a virtual method." msgstr "" -#: doc/classes/@GlobalScope.xml:1463 +#: doc/classes/@GlobalScope.xml:1466 msgid "Default method flags." msgstr "" -#: doc/classes/@GlobalScope.xml:1466 +#: doc/classes/@GlobalScope.xml:1469 msgid "Variable is [code]null[/code]." msgstr "" -#: doc/classes/@GlobalScope.xml:1469 +#: doc/classes/@GlobalScope.xml:1472 msgid "Variable is of type [bool]." msgstr "" -#: doc/classes/@GlobalScope.xml:1472 +#: doc/classes/@GlobalScope.xml:1475 msgid "Variable is of type [int]." msgstr "" -#: doc/classes/@GlobalScope.xml:1475 +#: doc/classes/@GlobalScope.xml:1478 msgid "Variable is of type [float] (real)." msgstr "" -#: doc/classes/@GlobalScope.xml:1478 +#: doc/classes/@GlobalScope.xml:1481 msgid "Variable is of type [String]." msgstr "" -#: doc/classes/@GlobalScope.xml:1481 +#: doc/classes/@GlobalScope.xml:1484 msgid "Variable is of type [Vector2]." msgstr "" -#: doc/classes/@GlobalScope.xml:1484 +#: doc/classes/@GlobalScope.xml:1487 msgid "Variable is of type [Vector2i]." msgstr "" -#: doc/classes/@GlobalScope.xml:1487 +#: doc/classes/@GlobalScope.xml:1490 msgid "Variable is of type [Rect2]." msgstr "" -#: doc/classes/@GlobalScope.xml:1490 +#: doc/classes/@GlobalScope.xml:1493 msgid "Variable is of type [Rect2i]." msgstr "" -#: doc/classes/@GlobalScope.xml:1493 +#: doc/classes/@GlobalScope.xml:1496 msgid "Variable is of type [Vector3]." msgstr "" -#: doc/classes/@GlobalScope.xml:1496 +#: doc/classes/@GlobalScope.xml:1499 msgid "Variable is of type [Vector3i]." msgstr "" -#: doc/classes/@GlobalScope.xml:1499 +#: doc/classes/@GlobalScope.xml:1502 msgid "Variable is of type [Transform2D]." msgstr "" -#: doc/classes/@GlobalScope.xml:1502 +#: doc/classes/@GlobalScope.xml:1505 msgid "Variable is of type [Plane]." msgstr "" -#: doc/classes/@GlobalScope.xml:1505 +#: doc/classes/@GlobalScope.xml:1508 msgid "Variable is of type [Quat]." msgstr "" -#: doc/classes/@GlobalScope.xml:1508 +#: doc/classes/@GlobalScope.xml:1511 msgid "Variable is of type [AABB]." msgstr "" -#: doc/classes/@GlobalScope.xml:1511 +#: doc/classes/@GlobalScope.xml:1514 msgid "Variable is of type [Basis]." msgstr "" -#: doc/classes/@GlobalScope.xml:1514 +#: doc/classes/@GlobalScope.xml:1517 msgid "Variable is of type [Transform]." msgstr "" -#: doc/classes/@GlobalScope.xml:1517 +#: doc/classes/@GlobalScope.xml:1520 msgid "Variable is of type [Color]." msgstr "" -#: doc/classes/@GlobalScope.xml:1520 +#: doc/classes/@GlobalScope.xml:1523 msgid "Variable is of type [StringName]." msgstr "" -#: doc/classes/@GlobalScope.xml:1523 +#: doc/classes/@GlobalScope.xml:1526 msgid "Variable is of type [NodePath]." msgstr "" -#: doc/classes/@GlobalScope.xml:1526 +#: doc/classes/@GlobalScope.xml:1529 msgid "Variable is of type [RID]." msgstr "" -#: doc/classes/@GlobalScope.xml:1529 +#: doc/classes/@GlobalScope.xml:1532 msgid "Variable is of type [Object]." msgstr "" -#: doc/classes/@GlobalScope.xml:1532 +#: doc/classes/@GlobalScope.xml:1535 msgid "Variable is of type [Callable]." msgstr "" -#: doc/classes/@GlobalScope.xml:1535 +#: doc/classes/@GlobalScope.xml:1538 msgid "Variable is of type [Signal]." msgstr "" -#: doc/classes/@GlobalScope.xml:1538 +#: doc/classes/@GlobalScope.xml:1541 msgid "Variable is of type [Dictionary]." msgstr "" -#: doc/classes/@GlobalScope.xml:1541 +#: doc/classes/@GlobalScope.xml:1544 msgid "Variable is of type [Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1544 +#: doc/classes/@GlobalScope.xml:1547 msgid "Variable is of type [PackedByteArray]." msgstr "" -#: doc/classes/@GlobalScope.xml:1547 +#: doc/classes/@GlobalScope.xml:1550 msgid "Variable is of type [PackedInt32Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1550 +#: doc/classes/@GlobalScope.xml:1553 msgid "Variable is of type [PackedInt64Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1553 +#: doc/classes/@GlobalScope.xml:1556 msgid "Variable is of type [PackedFloat32Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1556 +#: doc/classes/@GlobalScope.xml:1559 msgid "Variable is of type [PackedFloat64Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1559 +#: doc/classes/@GlobalScope.xml:1562 msgid "Variable is of type [PackedStringArray]." msgstr "" -#: doc/classes/@GlobalScope.xml:1562 +#: doc/classes/@GlobalScope.xml:1565 msgid "Variable is of type [PackedVector2Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1565 +#: doc/classes/@GlobalScope.xml:1568 msgid "Variable is of type [PackedVector3Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1568 +#: doc/classes/@GlobalScope.xml:1571 msgid "Variable is of type [PackedColorArray]." msgstr "" -#: doc/classes/@GlobalScope.xml:1571 +#: doc/classes/@GlobalScope.xml:1574 msgid "Represents the size of the [enum Variant.Type] enum." msgstr "" -#: doc/classes/@GlobalScope.xml:1574 +#: doc/classes/@GlobalScope.xml:1577 msgid "Equality operator ([code]==[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1577 +#: doc/classes/@GlobalScope.xml:1580 msgid "Inequality operator ([code]!=[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1580 +#: doc/classes/@GlobalScope.xml:1583 msgid "Less than operator ([code]<[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1583 +#: doc/classes/@GlobalScope.xml:1586 msgid "Less than or equal operator ([code]<=[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1586 +#: doc/classes/@GlobalScope.xml:1589 msgid "Greater than operator ([code]>[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1589 +#: doc/classes/@GlobalScope.xml:1592 msgid "Greater than or equal operator ([code]>=[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1592 +#: doc/classes/@GlobalScope.xml:1595 msgid "Addition operator ([code]+[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1595 +#: doc/classes/@GlobalScope.xml:1598 msgid "Subtraction operator ([code]-[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1598 +#: doc/classes/@GlobalScope.xml:1601 msgid "Multiplication operator ([code]*[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1601 +#: doc/classes/@GlobalScope.xml:1604 msgid "Division operator ([code]/[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1604 +#: doc/classes/@GlobalScope.xml:1607 msgid "Unary negation operator ([code]-[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1607 +#: doc/classes/@GlobalScope.xml:1610 msgid "Unary plus operator ([code]+[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1610 +#: doc/classes/@GlobalScope.xml:1613 msgid "Remainder/modulo operator ([code]%[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1613 +#: doc/classes/@GlobalScope.xml:1616 msgid "String concatenation operator ([code]+[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1616 +#: doc/classes/@GlobalScope.xml:1619 msgid "Left shift operator ([code]<<[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1619 +#: doc/classes/@GlobalScope.xml:1622 msgid "Right shift operator ([code]>>[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1622 +#: doc/classes/@GlobalScope.xml:1625 msgid "Bitwise AND operator ([code]&[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1625 +#: doc/classes/@GlobalScope.xml:1628 msgid "Bitwise OR operator ([code]|[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1628 +#: doc/classes/@GlobalScope.xml:1631 msgid "Bitwise XOR operator ([code]^[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1631 +#: doc/classes/@GlobalScope.xml:1634 msgid "Bitwise NOT operator ([code]~[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1634 +#: doc/classes/@GlobalScope.xml:1637 msgid "Logical AND operator ([code]and[/code] or [code]&&[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1637 +#: doc/classes/@GlobalScope.xml:1640 msgid "Logical OR operator ([code]or[/code] or [code]||[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1640 +#: doc/classes/@GlobalScope.xml:1643 msgid "Logical XOR operator (not implemented in GDScript)." msgstr "" -#: doc/classes/@GlobalScope.xml:1643 +#: doc/classes/@GlobalScope.xml:1646 msgid "Logical NOT operator ([code]not[/code] or [code]![/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1646 +#: doc/classes/@GlobalScope.xml:1649 msgid "Logical IN operator ([code]in[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1649 +#: doc/classes/@GlobalScope.xml:1652 msgid "Represents the size of the [enum Variant.Operator] enum." msgstr "" @@ -3794,6 +3799,10 @@ msgid "" msgstr "" #: doc/classes/AnimatedTexture.xml:65 +msgid "Sets the currently visible frame of the texture." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:68 msgid "" "Animation speed in frames per second. This value defines the default time " "interval between two frames of the animation, and thus the overall duration " @@ -3804,7 +3813,7 @@ msgid "" "code] value of 2 will run for 4 seconds, with each frame lasting 0.5 seconds." msgstr "" -#: doc/classes/AnimatedTexture.xml:69 +#: doc/classes/AnimatedTexture.xml:72 msgid "" "Number of frames to use in the animation. While you can create the frames " "independently with [method set_frame_texture], you need to set this value " @@ -3812,7 +3821,21 @@ msgid "" "frames is [constant MAX_FRAMES]." msgstr "" -#: doc/classes/AnimatedTexture.xml:74 +#: doc/classes/AnimatedTexture.xml:75 +msgid "" +"If [code]true[/code], the animation will only play once and will not loop " +"back to the first frame after reaching the end. Note that reaching the end " +"will not set [member pause] to [code]true[/code]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:78 +msgid "" +"If [code]true[/code], the animation will pause where it currently is (i.e. " +"at [member current_frame]). The animation will continue from where it was " +"paused when changing this property to [code]false[/code]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:83 msgid "" "The maximum number of frames supported by [AnimatedTexture]. If you need " "more frames in your animation, use [AnimationPlayer] or [AnimatedSprite2D]." @@ -6092,22 +6115,27 @@ msgid "" "var m = MeshInstance3D.new()\n" "m.mesh = arr_mesh\n" "[/codeblock]\n" -"The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown." +"The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown.\n" +"See also [ImmediateGeometry3D], [MeshDataTool] and [SurfaceTool] for " +"procedural geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." msgstr "" -#: doc/classes/ArrayMesh.xml:27 +#: doc/classes/ArrayMesh.xml:29 msgid "" "https://docs.godotengine.org/en/latest/tutorials/content/procedural_geometry/" "arraymesh.html" msgstr "" -#: doc/classes/ArrayMesh.xml:36 +#: doc/classes/ArrayMesh.xml:38 msgid "" "Adds name for a blend shape that will be added with [method " "add_surface_from_arrays]. Must be called before surface is added." msgstr "" -#: doc/classes/ArrayMesh.xml:55 +#: doc/classes/ArrayMesh.xml:57 msgid "" "Creates a new surface.\n" "Surfaces are created to be rendered using a [code]primitive[/code], which " @@ -6125,141 +6153,139 @@ msgid "" "it is used.\n" "Adding an index array puts this function into \"index mode\" where the " "vertex and other arrays become the sources of data, and the index array " -"defines the order of the vertices.\n" -"Godot uses clockwise winding order for front faces of triangle primitive " -"modes." +"defines the order of the vertices." msgstr "" -#: doc/classes/ArrayMesh.xml:66 +#: doc/classes/ArrayMesh.xml:67 msgid "Removes all blend shapes from this [ArrayMesh]." msgstr "" -#: doc/classes/ArrayMesh.xml:73 +#: doc/classes/ArrayMesh.xml:74 msgid "Removes all surfaces from this [ArrayMesh]." msgstr "" -#: doc/classes/ArrayMesh.xml:80 +#: doc/classes/ArrayMesh.xml:81 msgid "Returns the number of blend shapes that the [ArrayMesh] holds." msgstr "" -#: doc/classes/ArrayMesh.xml:89 +#: doc/classes/ArrayMesh.xml:90 msgid "Returns the name of the blend shape at this index." msgstr "" -#: doc/classes/ArrayMesh.xml:100 +#: doc/classes/ArrayMesh.xml:101 msgid "" "Will perform a UV unwrap on the [ArrayMesh] to prepare the mesh for " "lightmapping." msgstr "" -#: doc/classes/ArrayMesh.xml:107 +#: doc/classes/ArrayMesh.xml:108 msgid "Will regenerate normal maps for the [ArrayMesh]." msgstr "" -#: doc/classes/ArrayMesh.xml:116 +#: doc/classes/ArrayMesh.xml:117 msgid "" "Returns the index of the first surface with this name held within this " "[ArrayMesh]. If none are found, -1 is returned." msgstr "" -#: doc/classes/ArrayMesh.xml:125 +#: doc/classes/ArrayMesh.xml:126 msgid "" "Returns the length in indices of the index array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" -#: doc/classes/ArrayMesh.xml:134 +#: doc/classes/ArrayMesh.xml:135 msgid "" "Returns the length in vertices of the vertex array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" -#: doc/classes/ArrayMesh.xml:143 +#: doc/classes/ArrayMesh.xml:144 msgid "" "Returns the format mask of the requested surface (see [method " "add_surface_from_arrays])." msgstr "" -#: doc/classes/ArrayMesh.xml:152 +#: doc/classes/ArrayMesh.xml:153 msgid "Gets the name assigned to this surface." msgstr "" -#: doc/classes/ArrayMesh.xml:161 +#: doc/classes/ArrayMesh.xml:162 msgid "" "Returns the primitive type of the requested surface (see [method " "add_surface_from_arrays])." msgstr "" -#: doc/classes/ArrayMesh.xml:172 +#: doc/classes/ArrayMesh.xml:173 msgid "Sets a name for a given surface." msgstr "" -#: doc/classes/ArrayMesh.xml:185 +#: doc/classes/ArrayMesh.xml:186 msgid "" "Updates a specified region of mesh arrays on the GPU.\n" "[b]Warning:[/b] Only use if you know what you are doing. You can easily " "cause crashes by calling this function with improper arguments." msgstr "" -#: doc/classes/ArrayMesh.xml:192 +#: doc/classes/ArrayMesh.xml:193 msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]." msgstr "" -#: doc/classes/ArrayMesh.xml:195 +#: doc/classes/ArrayMesh.xml:196 msgid "" "Overrides the [AABB] with one defined by user for use with frustum culling. " "Especially useful to avoid unexpected culling when using a shader to offset " "vertices." msgstr "" -#: doc/classes/ArrayMesh.xml:200 +#: doc/classes/ArrayMesh.xml:201 msgid "Default value used for index_array_len when no indices are present." msgstr "" -#: doc/classes/ArrayMesh.xml:203 +#: doc/classes/ArrayMesh.xml:204 msgid "Amount of weights/bone indices per vertex (always 4)." msgstr "" -#: doc/classes/ArrayMesh.xml:206 +#: doc/classes/ArrayMesh.xml:207 msgid "" "[PackedVector3Array], [PackedVector2Array], or [Array] of vertex positions." msgstr "" -#: doc/classes/ArrayMesh.xml:209 +#: doc/classes/ArrayMesh.xml:210 msgid "[PackedVector3Array] of vertex normals." msgstr "" -#: doc/classes/ArrayMesh.xml:212 +#: doc/classes/ArrayMesh.xml:213 msgid "" "[PackedFloat32Array] of vertex tangents. Each element in groups of 4 floats, " "first 3 floats determine the tangent, and the last the binormal direction as " "-1 or 1." msgstr "" -#: doc/classes/ArrayMesh.xml:215 +#: doc/classes/ArrayMesh.xml:216 msgid "[PackedColorArray] of vertex colors." msgstr "" -#: doc/classes/ArrayMesh.xml:218 +#: doc/classes/ArrayMesh.xml:219 msgid "[PackedVector2Array] for UV coordinates." msgstr "" -#: doc/classes/ArrayMesh.xml:221 +#: doc/classes/ArrayMesh.xml:222 msgid "[PackedVector2Array] for second UV coordinates." msgstr "" -#: doc/classes/ArrayMesh.xml:224 +#: doc/classes/ArrayMesh.xml:225 msgid "" "[PackedFloat32Array] or [PackedInt32Array] of bone indices. Each element in " "groups of 4 floats." msgstr "" -#: doc/classes/ArrayMesh.xml:227 +#: doc/classes/ArrayMesh.xml:228 msgid "" "[PackedFloat32Array] of bone weights. Each element in groups of 4 floats." msgstr "" -#: doc/classes/ArrayMesh.xml:230 +#: doc/classes/ArrayMesh.xml:231 msgid "" "[PackedInt32Array] of integers used as indices referencing vertices, colors, " "normals, tangents, and textures. All of those arrays must have the same " @@ -6273,709 +6299,47 @@ msgid "" "the start and end of each line." msgstr "" -#: doc/classes/ArrayMesh.xml:234 doc/classes/Mesh.xml:210 -#: doc/classes/RenderingServer.xml:3180 +#: doc/classes/ArrayMesh.xml:235 doc/classes/Mesh.xml:210 +#: doc/classes/RenderingServer.xml:3232 msgid "Represents the size of the [enum ArrayType] enum." msgstr "" -#: doc/classes/ArrayMesh.xml:237 +#: doc/classes/ArrayMesh.xml:238 msgid "Array format will include vertices (mandatory)." msgstr "" -#: doc/classes/ArrayMesh.xml:240 +#: doc/classes/ArrayMesh.xml:241 msgid "Array format will include normals." msgstr "" -#: doc/classes/ArrayMesh.xml:243 +#: doc/classes/ArrayMesh.xml:244 msgid "Array format will include tangents." msgstr "" -#: doc/classes/ArrayMesh.xml:246 +#: doc/classes/ArrayMesh.xml:247 msgid "Array format will include a color array." msgstr "" -#: doc/classes/ArrayMesh.xml:249 +#: doc/classes/ArrayMesh.xml:250 msgid "Array format will include UVs." msgstr "" -#: doc/classes/ArrayMesh.xml:252 +#: doc/classes/ArrayMesh.xml:253 msgid "Array format will include another set of UVs." msgstr "" -#: doc/classes/ArrayMesh.xml:255 +#: doc/classes/ArrayMesh.xml:256 msgid "Array format will include bone indices." msgstr "" -#: doc/classes/ArrayMesh.xml:258 +#: doc/classes/ArrayMesh.xml:259 msgid "Array format will include bone weights." msgstr "" -#: doc/classes/ArrayMesh.xml:261 +#: doc/classes/ArrayMesh.xml:262 msgid "Index array will be used." msgstr "" -#: doc/classes/ARVRAnchor.xml:4 -msgid "An anchor point in AR space." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:7 -msgid "" -"The [ARVRAnchor] point is a spatial node that maps a real world location " -"identified by the AR platform to a position within the game world. For " -"example, as long as plane detection in ARKit is on, ARKit will identify and " -"update the position of planes (tables, floors, etc) and create anchors for " -"them.\n" -"This node is mapped to one of the anchors through its unique ID. When you " -"receive a signal that a new anchor is available, you should add this node to " -"your scene for that anchor. You can predefine nodes and set the ID; the " -"nodes will simply remain on 0,0,0 until a plane is recognized.\n" -"Keep in mind that, as long as plane detection is enabled, the size, placing " -"and orientation of an anchor will be updated as the detection logic learns " -"more about the real world out there especially if only part of the surface " -"is in view." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:18 -msgid "Returns the name given to this anchor." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:25 -msgid "" -"Returns [code]true[/code] if the anchor is being tracked and [code]false[/" -"code] if no anchor with this ID is currently known." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:32 -msgid "" -"If provided by the [ARVRInterface], this returns a mesh object for the " -"anchor. For an anchor, this can be a shape related to the object being " -"tracked or it can be a mesh that provides topology related to the anchor and " -"can be used to create shadows/reflections on surfaces or for generating " -"collision shapes." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:39 -msgid "" -"Returns a plane aligned with our anchor; handy for intersection testing." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:46 -msgid "" -"Returns the estimated size of the plane that was detected. Say when the " -"anchor relates to a table in the real world, this is the estimated size of " -"the surface of that table." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:52 -msgid "" -"The anchor's ID. You can set this before the anchor itself exists. The first " -"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], " -"etc. When anchors get removed, the engine can then assign the corresponding " -"ID to new anchors. The most common situation where anchors \"disappear\" is " -"when the AR server identifies that two anchors represent different parts of " -"the same plane and merges them." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:60 -msgid "" -"Emitted when the mesh associated with the anchor changes or when one becomes " -"available. This is especially important for topology that is constantly " -"being [code]mesh_updated[/code]." -msgstr "" - -#: doc/classes/ARVRCamera.xml:4 -msgid "" -"A camera node with a few overrules for AR/VR applied, such as location " -"tracking." -msgstr "" - -#: doc/classes/ARVRCamera.xml:7 -msgid "" -"This is a helper spatial node for our camera; note that, if stereoscopic " -"rendering is applicable (VR-HMD), most of the camera properties are ignored, " -"as the HMD information overrides them. The only properties that can be " -"trusted are the near and far planes.\n" -"The position and orientation of this node is automatically updated by the " -"ARVR Server to represent the location of the HMD if such tracking is " -"available and can thus be used by game logic. Note that, in contrast to the " -"ARVR Controller, the render thread has access to the most up-to-date " -"tracking data of the HMD and the location of the ARVRCamera can lag a few " -"milliseconds behind what is used for rendering as a result." -msgstr "" - -#: doc/classes/ARVRCamera.xml:11 doc/classes/ARVRController.xml:12 -#: doc/classes/ARVRInterface.xml:11 doc/classes/ARVROrigin.xml:13 -#: doc/classes/ARVRPositionalTracker.xml:12 doc/classes/ARVRServer.xml:10 -msgid "https://docs.godotengine.org/en/latest/tutorials/vr/index.html" -msgstr "" - -#: doc/classes/ARVRController.xml:4 -msgid "A spatial node representing a spatially-tracked controller." -msgstr "" - -#: doc/classes/ARVRController.xml:7 -msgid "" -"This is a helper spatial node that is linked to the tracking of controllers. " -"It also offers several handy passthroughs to the state of buttons and such " -"on the controllers.\n" -"Controllers are linked by their ID. You can create controller nodes before " -"the controllers are available. If your game always uses two controllers (one " -"for each hand), you can predefine the controllers with ID 1 and 2; they will " -"become active as soon as the controllers are identified. If you expect " -"additional controllers to be used, you should react to the signals and add " -"ARVRController nodes to your scene.\n" -"The position of the controller node is automatically updated by the " -"[ARVRServer]. This makes this node ideal to add child nodes to visualize the " -"controller." -msgstr "" - -#: doc/classes/ARVRController.xml:19 -msgid "" -"If active, returns the name of the associated controller if provided by the " -"AR/VR SDK used." -msgstr "" - -#: doc/classes/ARVRController.xml:26 -msgid "" -"Returns the hand holding this controller, if known. See [enum " -"ARVRPositionalTracker.TrackerHand]." -msgstr "" - -#: doc/classes/ARVRController.xml:33 -msgid "" -"Returns [code]true[/code] if the bound controller is active. ARVR systems " -"attempt to track active controllers." -msgstr "" - -#: doc/classes/ARVRController.xml:42 -msgid "" -"Returns the value of the given axis for things like triggers, touchpads, " -"etc. that are embedded into the controller." -msgstr "" - -#: doc/classes/ARVRController.xml:49 -msgid "" -"Returns the ID of the joystick object bound to this. Every controller " -"tracked by the [ARVRServer] that has buttons and axis will also be " -"registered as a joystick within Godot. This means that all the normal " -"joystick tracking and input mapping will work for buttons and axis found on " -"the AR/VR controllers. This ID is purely offered as information so you can " -"link up the controller with its joystick entry." -msgstr "" - -#: doc/classes/ARVRController.xml:56 -msgid "" -"If provided by the [ARVRInterface], this returns a mesh associated with the " -"controller. This can be used to visualize the controller." -msgstr "" - -#: doc/classes/ARVRController.xml:65 -msgid "" -"Returns [code]true[/code] if the button at index [code]button[/code] is " -"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " -"constants." -msgstr "" - -#: doc/classes/ARVRController.xml:71 -msgid "" -"The controller's ID.\n" -"A controller ID of 0 is unbound and will always result in an inactive node. " -"Controller ID 1 is reserved for the first controller that identifies itself " -"as the left-hand controller and ID 2 is reserved for the first controller " -"that identifies itself as the right-hand controller.\n" -"For any other controller that the [ARVRServer] detects, we continue with " -"controller ID 3.\n" -"When a controller is turned off, its slot is freed. This ensures controllers " -"will keep the same ID even when controllers with lower IDs are turned off." -msgstr "" - -#: doc/classes/ARVRController.xml:77 -msgid "" -"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to " -"[code]1.0[/code] with precision [code].01[/code]. If changed, updates " -"[member ARVRPositionalTracker.rumble] accordingly.\n" -"This is a useful property to animate if you want the controller to vibrate " -"for a limited duration." -msgstr "" - -#: doc/classes/ARVRController.xml:86 -msgid "Emitted when a button on this controller is pressed." -msgstr "" - -#: doc/classes/ARVRController.xml:93 -msgid "Emitted when a button on this controller is released." -msgstr "" - -#: doc/classes/ARVRController.xml:100 -msgid "" -"Emitted when the mesh associated with the controller changes or when one " -"becomes available. Generally speaking this will be a static mesh after " -"becoming available." -msgstr "" - -#: doc/classes/ARVRInterface.xml:4 -msgid "Base class for an AR/VR interface implementation." -msgstr "" - -#: doc/classes/ARVRInterface.xml:7 -msgid "" -"This class needs to be implemented to make an AR or VR platform available to " -"Godot and these should be implemented as C++ modules or GDNative modules " -"(note that for GDNative the subclass ARVRScriptInterface should be used). " -"Part of the interface is exposed to GDScript so you can detect, enable and " -"configure an AR or VR platform.\n" -"Interfaces should be written in such a way that simply enabling them will " -"give us a working setup. You can query the available interfaces through " -"[ARVRServer]." -msgstr "" - -#: doc/classes/ARVRInterface.xml:18 -msgid "" -"If this is an AR interface that requires displaying a camera feed as the " -"background, this method returns the feed ID in the [CameraServer] for this " -"interface." -msgstr "" - -#: doc/classes/ARVRInterface.xml:25 -msgid "" -"Returns a combination of [enum Capabilities] flags providing information " -"about the capabilities of this interface." -msgstr "" - -#: doc/classes/ARVRInterface.xml:32 -msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." -msgstr "" - -#: doc/classes/ARVRInterface.xml:39 -msgid "" -"Returns the resolution at which we should render our intermediate results " -"before things like lens distortion are applied by the VR platform." -msgstr "" - -#: doc/classes/ARVRInterface.xml:46 -msgid "" -"If supported, returns the status of our tracking. This will allow you to " -"provide feedback to the user whether there are issues with positional " -"tracking." -msgstr "" - -#: doc/classes/ARVRInterface.xml:53 -msgid "" -"Call this to initialize this interface. The first interface that is " -"initialized is identified as the primary interface and it will be used for " -"rendering output.\n" -"After initializing the interface you want to use you then need to enable the " -"AR/VR mode of a viewport and rendering should commence.\n" -"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any " -"device that uses the main output of Godot, such as for mobile VR.\n" -"If you do this for a platform that handles its own output (such as OpenVR) " -"Godot will show just one eye without distortion on screen. Alternatively, " -"you can add a separate viewport node to your scene and enable AR/VR on that " -"viewport. It will be used to output to the HMD, leaving you free to do " -"anything you like in the main window, such as using a separate camera as a " -"spectator camera or rendering something completely different.\n" -"While currently not used, you can activate additional interfaces. You may " -"wish to do this if you want to track controllers from other platforms. " -"However, at this point in time only one interface can render to an HMD." -msgstr "" - -#: doc/classes/ARVRInterface.xml:64 -msgid "" -"Returns [code]true[/code] if the current output of this interface is in " -"stereo." -msgstr "" - -#: doc/classes/ARVRInterface.xml:71 -msgid "Turns the interface off." -msgstr "" - -#: doc/classes/ARVRInterface.xml:77 -msgid "On an AR interface, [code]true[/code] if anchor detection is enabled." -msgstr "" - -#: doc/classes/ARVRInterface.xml:80 -msgid "[code]true[/code] if this interface been initialized." -msgstr "" - -#: doc/classes/ARVRInterface.xml:83 -msgid "[code]true[/code] if this is the primary interface." -msgstr "" - -#: doc/classes/ARVRInterface.xml:88 -msgid "No ARVR capabilities." -msgstr "" - -#: doc/classes/ARVRInterface.xml:91 -msgid "" -"This interface can work with normal rendering output (non-HMD based AR)." -msgstr "" - -#: doc/classes/ARVRInterface.xml:94 -msgid "This interface supports stereoscopic rendering." -msgstr "" - -#: doc/classes/ARVRInterface.xml:97 -msgid "This interface supports AR (video background and real world tracking)." -msgstr "" - -#: doc/classes/ARVRInterface.xml:100 -msgid "" -"This interface outputs to an external device. If the main viewport is used, " -"the on screen output is an unmodified buffer of either the left or right eye " -"(stretched if the viewport size is not changed to the same aspect ratio of " -"[method get_render_targetsize]). Using a separate viewport node frees up the " -"main viewport for other purposes." -msgstr "" - -#: doc/classes/ARVRInterface.xml:103 -msgid "" -"Mono output, this is mostly used internally when retrieving positioning " -"information for our camera node or when stereo scopic rendering is not " -"supported." -msgstr "" - -#: doc/classes/ARVRInterface.xml:106 -msgid "" -"Left eye output, this is mostly used internally when rendering the image for " -"the left eye and obtaining positioning and projection information." -msgstr "" - -#: doc/classes/ARVRInterface.xml:109 -msgid "" -"Right eye output, this is mostly used internally when rendering the image " -"for the right eye and obtaining positioning and projection information." -msgstr "" - -#: doc/classes/ARVRInterface.xml:112 -msgid "Tracking is behaving as expected." -msgstr "" - -#: doc/classes/ARVRInterface.xml:115 -msgid "" -"Tracking is hindered by excessive motion (the player is moving faster than " -"tracking can keep up)." -msgstr "" - -#: doc/classes/ARVRInterface.xml:118 -msgid "" -"Tracking is hindered by insufficient features, it's too dark (for camera-" -"based tracking), player is blocked, etc." -msgstr "" - -#: doc/classes/ARVRInterface.xml:121 -msgid "" -"We don't know the status of the tracking or this interface does not provide " -"feedback." -msgstr "" - -#: doc/classes/ARVRInterface.xml:124 -msgid "" -"Tracking is not functional (camera not plugged in or obscured, lighthouses " -"turned off, etc.)." -msgstr "" - -#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml:4 -msgid "GDNative wrapper for an ARVR interface." -msgstr "" - -#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml:7 -msgid "" -"This is a wrapper class for GDNative implementations of the ARVR interface. " -"To use a GDNative ARVR interface, simply instantiate this object and set " -"your GDNative library containing the ARVR interface implementation." -msgstr "" - -#: doc/classes/ARVROrigin.xml:4 -msgid "The origin point in AR/VR." -msgstr "" - -#: doc/classes/ARVROrigin.xml:7 -msgid "" -"This is a special node within the AR/VR system that maps the physical " -"location of the center of our tracking space to the virtual location within " -"our game world.\n" -"There should be only one of these nodes in your scene and you must have one. " -"All the ARVRCamera, ARVRController and ARVRAnchor nodes should be direct " -"children of this node for spatial tracking to work correctly.\n" -"It is the position of this node that you update when your character needs to " -"move through your game world while we're not moving in the real world. " -"Movement in the real world is always in relation to this origin point.\n" -"For example, if your character is driving a car, the ARVROrigin node should " -"be a child node of this car. Or, if you're implementing a teleport system to " -"move your character, you should change the position of this node." -msgstr "" - -#: doc/classes/ARVROrigin.xml:19 -msgid "" -"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.\n" -"[b]Note:[/b] This method is a passthrough to the [ARVRServer] itself." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:4 -msgid "A tracked object." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:7 -msgid "" -"An instance of this object represents a device that is tracked, such as a " -"controller or anchor point. HMDs aren't represented here as they are handled " -"internally.\n" -"As controllers are turned on and the AR/VR interface detects them, instances " -"of this object are automatically added to this list of active tracking " -"objects accessible through the [ARVRServer].\n" -"The [ARVRController] and [ARVRAnchor] both consume objects of this type and " -"should be used in your project. The positional trackers are just under-the-" -"hood objects that make this all work. These are mostly exposed so that " -"GDNative-based interfaces can interact with them." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:19 -msgid "" -"Returns the hand holding this tracker, if known. See [enum TrackerHand] " -"constants." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:26 -msgid "" -"If this is a controller that is being tracked, the controller will also be " -"represented by a joystick entry with this ID." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:33 -msgid "" -"Returns the mesh related to a controller or anchor point if one is available." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:40 -msgid "Returns the controller or anchor point's name if available." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:47 -msgid "Returns the controller's orientation matrix." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:54 -msgid "Returns the world-space controller position." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:61 -msgid "" -"Returns the internal tracker ID. This uniquely identifies the tracker per " -"tracker type and matches the ID you need to specify for nodes such as the " -"[ARVRController] and [ARVRAnchor] nodes." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:68 -msgid "Returns [code]true[/code] if this device tracks orientation." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:75 -msgid "Returns [code]true[/code] if this device tracks position." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:84 -msgid "Returns the transform combining this device's orientation and position." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:91 -msgid "Returns the tracker's type." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:97 -msgid "" -"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to " -"[code]1.0[/code] with precision [code].01[/code]." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:102 -msgid "The hand this tracker is held in is unknown or not applicable." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:105 -msgid "This tracker is the left hand controller." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:108 -msgid "This tracker is the right hand controller." -msgstr "" - -#: doc/classes/ARVRServer.xml:4 -msgid "Server for AR and VR features." -msgstr "" - -#: doc/classes/ARVRServer.xml:7 -msgid "" -"The AR/VR server is the heart of our Advanced and Virtual Reality solution " -"and handles all the processing." -msgstr "" - -#: doc/classes/ARVRServer.xml:21 -msgid "" -"This is an important function to understand correctly. AR and VR platforms " -"all handle positioning slightly differently.\n" -"For platforms that do not offer spatial tracking, our origin point (0,0,0) " -"is the location of our HMD, but you have little control over the direction " -"the player is facing in the real world.\n" -"For platforms that do offer spatial tracking, our origin point depends very " -"much on the system. For OpenVR, our origin point is usually the center of " -"the tracking space, on the ground. For other platforms, it's often the " -"location of the tracking camera.\n" -"This method allows you to center your tracker on the location of the HMD. It " -"will take the current location of the HMD and use that to adjust all your " -"tracking data; in essence, realigning the real world to your player's " -"current position in the game world.\n" -"For this method to produce usable results, tracking information must be " -"available. This often takes a few frames after starting your game.\n" -"You should call this method after a few seconds have passed. For instance, " -"when the user requests a realignment of the display holding a designated " -"button on a controller for a short period of time, or when implementing a " -"teleport mechanism." -msgstr "" - -#: doc/classes/ARVRServer.xml:35 -msgid "" -"Finds an interface by its name. For instance, if your project uses " -"capabilities of an AR/VR platform, you can find the interface for that " -"platform by name and initialize it." -msgstr "" - -#: doc/classes/ARVRServer.xml:42 -msgid "Returns the primary interface's transformation." -msgstr "" - -#: doc/classes/ARVRServer.xml:51 -msgid "" -"Returns the interface registered at a given index in our list of interfaces." -msgstr "" - -#: doc/classes/ARVRServer.xml:58 -msgid "" -"Returns the number of interfaces currently registered with the AR/VR server. " -"If your project supports multiple AR/VR platforms, you can look through the " -"available interface, and either present the user with a selection or simply " -"try to initialize each interface and use the first one that returns " -"[code]true[/code]." -msgstr "" - -#: doc/classes/ARVRServer.xml:65 -msgid "" -"Returns a list of available interfaces the ID and name of each interface." -msgstr "" - -#: doc/classes/ARVRServer.xml:72 -msgid "" -"Returns the absolute timestamp (in μs) of the last [ARVRServer] commit of " -"the AR/VR eyes to [RenderingServer]. The value comes from an internal call " -"to [method OS.get_ticks_usec]." -msgstr "" - -#: doc/classes/ARVRServer.xml:79 -msgid "" -"Returns the duration (in μs) of the last frame. This is computed as the " -"difference between [method get_last_commit_usec] and [method " -"get_last_process_usec] when committing." -msgstr "" - -#: doc/classes/ARVRServer.xml:86 -msgid "" -"Returns the absolute timestamp (in μs) of the last [ARVRServer] process " -"callback. The value comes from an internal call to [method OS." -"get_ticks_usec]." -msgstr "" - -#: doc/classes/ARVRServer.xml:93 -msgid "" -"Returns the reference frame transform. Mostly used internally and exposed " -"for GDNative build interfaces." -msgstr "" - -#: doc/classes/ARVRServer.xml:102 -msgid "Returns the positional tracker at the given ID." -msgstr "" - -#: doc/classes/ARVRServer.xml:109 -msgid "Returns the number of trackers currently registered." -msgstr "" - -#: doc/classes/ARVRServer.xml:115 -msgid "The primary [ARVRInterface] currently bound to the [ARVRServer]." -msgstr "" - -#: doc/classes/ARVRServer.xml:118 -msgid "" -"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." -msgstr "" - -#: doc/classes/ARVRServer.xml:126 -msgid "Emitted when a new interface has been added." -msgstr "" - -#: doc/classes/ARVRServer.xml:133 -msgid "Emitted when an interface is removed." -msgstr "" - -#: doc/classes/ARVRServer.xml:144 -msgid "" -"Emitted when a new tracker has been added. If you don't use a fixed number " -"of controllers or if you're using [ARVRAnchor]s for an AR solution, it is " -"important to react to this signal to add the appropriate [ARVRController] or " -"[ARVRAnchor] nodes related to this new tracker." -msgstr "" - -#: doc/classes/ARVRServer.xml:155 -msgid "" -"Emitted when a tracker is removed. You should remove any [ARVRController] or " -"[ARVRAnchor] points if applicable. This is not mandatory, the nodes simply " -"become inactive and will be made active again when a new tracker becomes " -"available (i.e. a new controller is switched on that takes the place of the " -"previous one)." -msgstr "" - -#: doc/classes/ARVRServer.xml:161 -msgid "The tracker tracks the location of a controller." -msgstr "" - -#: doc/classes/ARVRServer.xml:164 -msgid "The tracker tracks the location of a base station." -msgstr "" - -#: doc/classes/ARVRServer.xml:167 -msgid "The tracker tracks the location and size of an AR anchor." -msgstr "" - -#: doc/classes/ARVRServer.xml:170 -msgid "Used internally to filter trackers of any known type." -msgstr "" - -#: doc/classes/ARVRServer.xml:173 -msgid "Used internally if we haven't set the tracker type yet." -msgstr "" - -#: doc/classes/ARVRServer.xml:176 -msgid "Used internally to select all trackers." -msgstr "" - -#: doc/classes/ARVRServer.xml:179 -msgid "" -"Fully reset the orientation of the HMD. Regardless of what direction the " -"user is looking to in the real world. The user will look dead ahead in the " -"virtual world." -msgstr "" - -#: doc/classes/ARVRServer.xml:182 -msgid "" -"Resets the orientation but keeps the tilt of the device. So if we're looking " -"down, we keep looking down but heading will be reset." -msgstr "" - -#: doc/classes/ARVRServer.xml:185 -msgid "" -"Does not reset the orientation of the HMD, only the position of the player " -"gets centered." -msgstr "" - #: doc/classes/AStar.xml:4 msgid "" "An implementation of A* to find shortest paths among connected points in " @@ -8377,7 +7741,9 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml:64 doc/classes/AudioStreamPlayer2D.xml:70 #: doc/classes/AudioStreamPlayer3D.xml:94 -msgid "Changes the pitch and the tempo of the audio." +msgid "" +"The pitch and the tempo of the audio, as a multiplier of the audio sample's " +"sample rate." msgstr "" #: doc/classes/AudioStreamPlayer.xml:67 doc/classes/AudioStreamPlayer2D.xml:73 @@ -8622,15 +7988,23 @@ msgid "Audio format. See [enum Format] constants for values." msgstr "" #: doc/classes/AudioStreamSample.xml:33 -msgid "Loop start in bytes." +msgid "" +"The loop start point (in number of samples, relative to the beginning of the " +"sample). This information will be imported automatically from the WAV file " +"if present." msgstr "" #: doc/classes/AudioStreamSample.xml:36 -msgid "Loop end in bytes." +msgid "" +"The loop end point (in number of samples, relative to the beginning of the " +"sample). This information will be imported automatically from the WAV file " +"if present." msgstr "" #: doc/classes/AudioStreamSample.xml:39 -msgid "Loop mode. See [enum LoopMode] constants for values." +msgid "" +"The loop mode. This information will be imported automatically from the WAV " +"file if present. See [enum LoopMode] constants for values." msgstr "" #: doc/classes/AudioStreamSample.xml:42 @@ -8659,19 +8033,19 @@ msgstr "" #: doc/classes/AudioStreamSample.xml:62 msgid "" -"Audio loops the data between [member loop_begin] and [member loop_end] " +"Audio loops the data between [member loop_begin] and [member loop_end], " "playing forward only." msgstr "" #: doc/classes/AudioStreamSample.xml:65 msgid "" -"Audio loops the data between [member loop_begin] and [member loop_end] " +"Audio loops the data between [member loop_begin] and [member loop_end], " "playing back and forth." msgstr "" #: doc/classes/AudioStreamSample.xml:68 msgid "" -"Audio loops the data between [member loop_begin] and [member loop_end] " +"Audio loops the data between [member loop_begin] and [member loop_end], " "playing backward only." msgstr "" @@ -8688,30 +8062,35 @@ msgid "" "in the BackBufferCopy node is bufferized with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " -"access the buffer." +"access the buffer.\n" +"[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " +"anchors and margins won't apply to child [Control]-derived nodes. This can " +"be problematic when resizing the window. To avoid this, add [Control]-" +"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"adding them as children." msgstr "" -#: doc/classes/BackBufferCopy.xml:15 +#: doc/classes/BackBufferCopy.xml:16 msgid "Buffer mode. See [enum CopyMode] constants." msgstr "" -#: doc/classes/BackBufferCopy.xml:18 +#: doc/classes/BackBufferCopy.xml:19 msgid "" "The area covered by the BackBufferCopy. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" -#: doc/classes/BackBufferCopy.xml:23 +#: doc/classes/BackBufferCopy.xml:24 msgid "" "Disables the buffering mode. This means the BackBufferCopy node will " "directly use the portion of screen it covers." msgstr "" -#: doc/classes/BackBufferCopy.xml:26 +#: doc/classes/BackBufferCopy.xml:27 msgid "BackBufferCopy buffers a rectangular region." msgstr "" -#: doc/classes/BackBufferCopy.xml:29 +#: doc/classes/BackBufferCopy.xml:30 msgid "BackBufferCopy buffers the entire screen." msgstr "" @@ -8781,80 +8160,83 @@ msgstr "" #: doc/classes/BaseButton.xml:62 msgid "" "If [code]true[/code], the button stays pressed when moving the cursor " -"outside the button while pressing it." +"outside the button while pressing it.\n" +"[b]Note:[/b] This property only affects the button's visual appearance. " +"Signals will be emitted at the same moment regardless of this property's " +"value." msgstr "" -#: doc/classes/BaseButton.xml:65 +#: doc/classes/BaseButton.xml:66 msgid "" "If [code]true[/code], the button's state is pressed. Means the button is " "pressed down or toggled (if [member toggle_mode] is active)." msgstr "" -#: doc/classes/BaseButton.xml:68 +#: doc/classes/BaseButton.xml:69 msgid "[ShortCut] associated to the button." msgstr "" -#: doc/classes/BaseButton.xml:71 +#: doc/classes/BaseButton.xml:72 msgid "" "If [code]true[/code], the button will add information about its shortcut in " "the tooltip." msgstr "" -#: doc/classes/BaseButton.xml:74 +#: doc/classes/BaseButton.xml:75 msgid "" "If [code]true[/code], the button is in toggle mode. Makes the button flip " "state between pressed and unpressed each time its area is clicked." msgstr "" -#: doc/classes/BaseButton.xml:80 +#: doc/classes/BaseButton.xml:81 msgid "Emitted when the button starts being held down." msgstr "" -#: doc/classes/BaseButton.xml:85 +#: doc/classes/BaseButton.xml:86 msgid "Emitted when the button stops being held down." msgstr "" -#: doc/classes/BaseButton.xml:90 +#: doc/classes/BaseButton.xml:91 msgid "" "Emitted when the button is toggled or pressed. This is on [signal " "button_down] if [member action_mode] is [constant ACTION_MODE_BUTTON_PRESS] " "and on [signal button_up] otherwise." msgstr "" -#: doc/classes/BaseButton.xml:97 +#: doc/classes/BaseButton.xml:98 msgid "" "Emitted when the button was just toggled between pressed and normal states " "(only if [member toggle_mode] is active). The new state is contained in the " "[code]button_pressed[/code] argument." msgstr "" -#: doc/classes/BaseButton.xml:103 +#: doc/classes/BaseButton.xml:104 msgid "" "The normal state (i.e. not pressed, not hovered, not toggled and enabled) of " "buttons." msgstr "" -#: doc/classes/BaseButton.xml:106 +#: doc/classes/BaseButton.xml:107 msgid "The state of buttons are pressed." msgstr "" -#: doc/classes/BaseButton.xml:109 +#: doc/classes/BaseButton.xml:110 msgid "The state of buttons are hovered." msgstr "" -#: doc/classes/BaseButton.xml:112 +#: doc/classes/BaseButton.xml:113 msgid "The state of buttons are disabled." msgstr "" -#: doc/classes/BaseButton.xml:115 +#: doc/classes/BaseButton.xml:116 msgid "The state of buttons are both hovered and pressed." msgstr "" -#: doc/classes/BaseButton.xml:118 +#: doc/classes/BaseButton.xml:119 msgid "Require just a press to consider the button clicked." msgstr "" -#: doc/classes/BaseButton.xml:121 +#: doc/classes/BaseButton.xml:122 msgid "" "Require a press and a subsequent release before considering the button " "clicked." @@ -8978,8 +8360,8 @@ msgid "" "the object." msgstr "" -#: doc/classes/BaseMaterial3D.xml:109 doc/classes/BaseMaterial3D.xml:275 -#: doc/classes/BaseMaterial3D.xml:296 +#: doc/classes/BaseMaterial3D.xml:109 doc/classes/BaseMaterial3D.xml:284 +#: doc/classes/BaseMaterial3D.xml:305 msgid "" "Specifies the channel of the [member ao_texture] in which the ambient " "occlusion information is stored. This is useful when you store the " @@ -8990,29 +8372,45 @@ msgstr "" #: doc/classes/BaseMaterial3D.xml:112 msgid "" +"The color used by the backlight effect. Represents the light passing through " +"an object." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:115 +msgid "If [code]true[/code], the backlight effect is enabled." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:118 +msgid "" +"Texture used to control the backlight effect per-pixel. Added to [member " +"backlight]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:121 +msgid "" "If [code]true[/code], the shader will keep the scale set for the mesh. " "Otherwise the scale is lost when billboarding. Only applies when [member " "billboard_mode] is [constant BILLBOARD_ENABLED]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:115 +#: doc/classes/BaseMaterial3D.xml:124 msgid "Controls how the object faces the camera. See [enum BillboardMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:118 +#: doc/classes/BaseMaterial3D.xml:127 msgid "" "The material's blend mode.\n" "[b]Note:[/b] Values other than [code]Mix[/code] force the object into the " "transparent pipeline. See [enum BlendMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:122 +#: doc/classes/BaseMaterial3D.xml:131 msgid "" "Sets the strength of the clearcoat effect. Setting to [code]0[/code] looks " "the same as disabling the clearcoat effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:125 +#: doc/classes/BaseMaterial3D.xml:134 msgid "" "If [code]true[/code], clearcoat rendering is enabled. Adds a secondary " "transparent pass to the lighting calculation resulting in an added specular " @@ -9020,42 +8418,42 @@ msgid "" "can be either glossy or rough." msgstr "" -#: doc/classes/BaseMaterial3D.xml:128 +#: doc/classes/BaseMaterial3D.xml:137 msgid "" "Sets the roughness of the clearcoat pass. A higher value results in a " "smoother clearcoat while a lower value results in a rougher clearcoat." msgstr "" -#: doc/classes/BaseMaterial3D.xml:131 +#: doc/classes/BaseMaterial3D.xml:140 msgid "" "Texture that defines the strength of the clearcoat effect and the glossiness " "of the clearcoat. Strength is specified in the red channel while glossiness " "is specified in the green channel." msgstr "" -#: doc/classes/BaseMaterial3D.xml:134 +#: doc/classes/BaseMaterial3D.xml:143 msgid "" "Which side of the object is not drawn when backfaces are rendered. See [enum " "CullMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:137 +#: doc/classes/BaseMaterial3D.xml:146 msgid "" "Determines when depth rendering takes place. See [enum DepthDrawMode]. See " "also [member transparency]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:140 +#: doc/classes/BaseMaterial3D.xml:149 msgid "Texture that specifies the color of the detail overlay." msgstr "" -#: doc/classes/BaseMaterial3D.xml:143 +#: doc/classes/BaseMaterial3D.xml:152 msgid "" "Specifies how the [member detail_albedo] should blend with the current " "[code]ALBEDO[/code]. See [enum BlendMode] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:146 +#: doc/classes/BaseMaterial3D.xml:155 msgid "" "If [code]true[/code], enables the detail overlay. Detail is a second texture " "that gets mixed over the surface of the object based on [member " @@ -9063,99 +8461,99 @@ msgid "" "between two different albedo/normal textures." msgstr "" -#: doc/classes/BaseMaterial3D.xml:149 +#: doc/classes/BaseMaterial3D.xml:158 msgid "" "Texture used to specify how the detail textures get blended with the base " "textures." msgstr "" -#: doc/classes/BaseMaterial3D.xml:152 +#: doc/classes/BaseMaterial3D.xml:161 msgid "Texture that specifies the per-pixel normal of the detail overlay." msgstr "" -#: doc/classes/BaseMaterial3D.xml:155 +#: doc/classes/BaseMaterial3D.xml:164 msgid "" "Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail " "layer. See [enum DetailUV] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:158 +#: doc/classes/BaseMaterial3D.xml:167 msgid "" "The algorithm used for diffuse light scattering. See [enum DiffuseMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:161 +#: doc/classes/BaseMaterial3D.xml:170 msgid "If [code]true[/code], the object receives no ambient light." msgstr "" -#: doc/classes/BaseMaterial3D.xml:164 +#: doc/classes/BaseMaterial3D.xml:173 msgid "" "If [code]true[/code], the object receives no shadow that would otherwise be " "cast onto it." msgstr "" -#: doc/classes/BaseMaterial3D.xml:167 +#: doc/classes/BaseMaterial3D.xml:176 msgid "Distance at which the object fades fully and is no longer visible." msgstr "" -#: doc/classes/BaseMaterial3D.xml:170 +#: doc/classes/BaseMaterial3D.xml:179 msgid "" "Distance at which the object starts to fade. If the object is less than this " "distance away it will appear normal." msgstr "" -#: doc/classes/BaseMaterial3D.xml:173 +#: doc/classes/BaseMaterial3D.xml:182 msgid "" "Specifies which type of fade to use. Can be any of the [enum " "DistanceFadeMode]s." msgstr "" -#: doc/classes/BaseMaterial3D.xml:176 +#: doc/classes/BaseMaterial3D.xml:185 msgid "The emitted light's color. See [member emission_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:179 +#: doc/classes/BaseMaterial3D.xml:188 msgid "" "If [code]true[/code], the body emits light. Emitting light makes the object " "appear brighter. The object can also cast light on other objects if a " "[GIProbe] is used and this object is used in baked lighting." msgstr "" -#: doc/classes/BaseMaterial3D.xml:182 +#: doc/classes/BaseMaterial3D.xml:191 msgid "The emitted light's strength. See [member emission_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:185 +#: doc/classes/BaseMaterial3D.xml:194 msgid "Use [code]UV2[/code] to read from the [member emission_texture]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:188 +#: doc/classes/BaseMaterial3D.xml:197 msgid "" "Sets how [member emission] interacts with [member emission_texture]. Can " "either add or multiply. See [enum EmissionOperator] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:191 +#: doc/classes/BaseMaterial3D.xml:200 msgid "Texture that specifies how much surface emits light at a given point." msgstr "" -#: doc/classes/BaseMaterial3D.xml:194 +#: doc/classes/BaseMaterial3D.xml:203 msgid "" "If [code]true[/code], the object is rendered at the same size regardless of " "distance." msgstr "" -#: doc/classes/BaseMaterial3D.xml:197 +#: doc/classes/BaseMaterial3D.xml:206 msgid "" "If [code]true[/code], enables the vertex grow setting. See [member " "grow_amount]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:200 +#: doc/classes/BaseMaterial3D.xml:209 msgid "Grows object vertices in the direction of their normals." msgstr "" -#: doc/classes/BaseMaterial3D.xml:221 +#: doc/classes/BaseMaterial3D.xml:230 msgid "" "A high value makes the material appear more like a metal. Non-metals use " "their albedo as the diffuse color and add diffuse to the specular " @@ -9168,7 +8566,7 @@ msgid "" "roughness]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:224 +#: doc/classes/BaseMaterial3D.xml:233 msgid "" "Sets the size of the specular lobe. The specular lobe is the bright spot " "that is reflected from light sources.\n" @@ -9177,13 +8575,13 @@ msgid "" "roughness]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:228 +#: doc/classes/BaseMaterial3D.xml:237 msgid "" "Texture used to specify metallic for an object. This is multiplied by " "[member metallic]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:231 +#: doc/classes/BaseMaterial3D.xml:240 msgid "" "Specifies the channel of the [member metallic_texture] in which the metallic " "information is stored. This is useful when you store the information for " @@ -9192,21 +8590,21 @@ msgid "" "you could reduce the number of textures you use." msgstr "" -#: doc/classes/BaseMaterial3D.xml:234 +#: doc/classes/BaseMaterial3D.xml:243 msgid "" "If [code]true[/code], depth testing is disabled and the object will be drawn " "in render order." msgstr "" -#: doc/classes/BaseMaterial3D.xml:237 +#: doc/classes/BaseMaterial3D.xml:246 msgid "If [code]true[/code], normal mapping is enabled." msgstr "" -#: doc/classes/BaseMaterial3D.xml:240 +#: doc/classes/BaseMaterial3D.xml:249 msgid "The strength of the normal map's effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:243 +#: doc/classes/BaseMaterial3D.xml:252 msgid "" "Texture used to specify the normal at a given pixel. The " "[code]normal_texture[/code] only uses the red and green channels. The normal " @@ -9214,93 +8612,100 @@ msgid "" "provided by the [Mesh]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:248 +#: doc/classes/BaseMaterial3D.xml:257 msgid "" "The number of horizontal frames in the particle sprite sheet. Only enabled " "when using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:251 +#: doc/classes/BaseMaterial3D.xml:260 msgid "" "If [code]true[/code], particle animations are looped. Only enabled when " "using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:254 +#: doc/classes/BaseMaterial3D.xml:263 msgid "" "The number of vertical frames in the particle sprite sheet. Only enabled " "when using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:257 +#: doc/classes/BaseMaterial3D.xml:266 msgid "The point size in pixels. See [member use_point_size]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:260 +#: doc/classes/BaseMaterial3D.xml:269 msgid "" "Distance over which the fade effect takes place. The larger the distance the " "longer it takes for an object to fade." msgstr "" -#: doc/classes/BaseMaterial3D.xml:263 +#: doc/classes/BaseMaterial3D.xml:272 msgid "" "If [code]true[/code], the proximity fade effect is enabled. The proximity " "fade effect fades out each pixel based on its distance to another object." msgstr "" -#: doc/classes/BaseMaterial3D.xml:266 +#: doc/classes/BaseMaterial3D.xml:275 msgid "" "If [code]true[/code], the refraction effect is enabled. Distorts " "transparency based on light from behind the object." msgstr "" -#: doc/classes/BaseMaterial3D.xml:269 +#: doc/classes/BaseMaterial3D.xml:278 msgid "The strength of the refraction effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:272 +#: doc/classes/BaseMaterial3D.xml:281 msgid "" "Texture that controls the strength of the refraction per-pixel. Multiplied " "by [member refraction_scale]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:278 +#: doc/classes/BaseMaterial3D.xml:287 msgid "Sets the strength of the rim lighting effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:281 +#: doc/classes/BaseMaterial3D.xml:290 msgid "" "If [code]true[/code], rim effect is enabled. Rim lighting increases the " "brightness at glancing angles on an object." msgstr "" -#: doc/classes/BaseMaterial3D.xml:284 +#: doc/classes/BaseMaterial3D.xml:293 msgid "" "Texture used to set the strength of the rim lighting effect per-pixel. " "Multiplied by [member rim]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:287 +#: doc/classes/BaseMaterial3D.xml:296 msgid "" "The amount of to blend light and albedo color when rendering rim effect. If " "[code]0[/code] the light color is used, while [code]1[/code] means albedo " "color is used. An intermediate value generally works best." msgstr "" -#: doc/classes/BaseMaterial3D.xml:290 +#: doc/classes/BaseMaterial3D.xml:299 msgid "" "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]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:293 +#: doc/classes/BaseMaterial3D.xml:302 msgid "" "Texture used to control the roughness per-pixel. Multiplied by [member " "roughness]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:301 +#: doc/classes/BaseMaterial3D.xml:308 +msgid "" +"Sets whether the shading takes place per-pixel or per-vertex. Per-vertex " +"lighting is faster, making it the best choice for mobile applications, " +"however it looks considerably worse than per-pixel." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:311 msgid "" "If [code]true[/code], enables the \"shadow to opacity\" render mode where " "lighting modifies the alpha so shadowed areas are opaque and non-shadowed " @@ -9308,77 +8713,67 @@ msgid "" "AR." msgstr "" -#: doc/classes/BaseMaterial3D.xml:304 +#: doc/classes/BaseMaterial3D.xml:314 msgid "The method for rendering the specular blob. See [enum SpecularMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:307 +#: doc/classes/BaseMaterial3D.xml:317 msgid "" "If [code]true[/code], subsurface scattering is enabled. Emulates light that " "penetrates an object's surface, is scattered, and then emerges." msgstr "" -#: doc/classes/BaseMaterial3D.xml:312 +#: doc/classes/BaseMaterial3D.xml:320 +msgid "" +"If [code]true[/code], subsurface scattering will use a special mode " +"optimized for the color and density of human skin." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:323 msgid "The strength of the subsurface scattering effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:315 +#: doc/classes/BaseMaterial3D.xml:326 msgid "" "Texture used to control the subsurface scattering strength. Stored in the " "red texture channel. Multiplied by [member subsurf_scatter_strength]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:318 +#: doc/classes/BaseMaterial3D.xml:341 msgid "Filter flags for the texture. See [enum TextureFilter] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:321 +#: doc/classes/BaseMaterial3D.xml:344 msgid "Repeat flags for the texture. See [enum TextureFilter] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:324 -msgid "" -"The color used by the transmission effect. Represents the light passing " -"through an object." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:327 -msgid "If [code]true[/code], the transmission effect is enabled." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:330 -msgid "" -"Texture used to control the transmission effect per-pixel. Added to [member " -"transmission]." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:333 +#: doc/classes/BaseMaterial3D.xml:347 msgid "" "If [code]true[/code], transparency is enabled on the body. See also [member " "blend_mode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:336 +#: doc/classes/BaseMaterial3D.xml:350 msgid "" "If [code]true[/code], render point size can be changed.\n" "[b]Note:[/b] this is only effective for objects whose geometry is point-" "based rather than triangle-based. See also [member point_size]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:340 +#: doc/classes/BaseMaterial3D.xml:354 msgid "" "How much to offset the [code]UV[/code] coordinates. This amount will be " "added to [code]UV[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:343 +#: doc/classes/BaseMaterial3D.xml:357 msgid "" "How much to scale the [code]UV[/code] coordinates. This is multiplied by " "[code]UV[/code] in the vertex function." msgstr "" -#: doc/classes/BaseMaterial3D.xml:346 +#: doc/classes/BaseMaterial3D.xml:360 msgid "" "If [code]true[/code], instead of using [code]UV[/code] textures will use a " "triplanar texture lookup to determine how to apply textures. Triplanar uses " @@ -9392,32 +8787,32 @@ msgid "" "when you are trying to achieve crisp texturing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:349 doc/classes/BaseMaterial3D.xml:364 +#: doc/classes/BaseMaterial3D.xml:363 doc/classes/BaseMaterial3D.xml:378 msgid "" "A lower number blends the texture more softly while a higher number blends " "the texture more sharply." msgstr "" -#: doc/classes/BaseMaterial3D.xml:352 +#: doc/classes/BaseMaterial3D.xml:366 msgid "" "If [code]true[/code], triplanar mapping for [code]UV[/code] is calculated in " "world space rather than object local space. See also [member uv1_triplanar]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:355 +#: doc/classes/BaseMaterial3D.xml:369 msgid "" "How much to offset the [code]UV2[/code] coordinates. This amount will be " "added to [code]UV2[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:358 +#: doc/classes/BaseMaterial3D.xml:372 msgid "" "How much to scale the [code]UV2[/code] coordinates. This is multiplied by " "[code]UV2[/code] in the vertex function." msgstr "" -#: doc/classes/BaseMaterial3D.xml:361 +#: doc/classes/BaseMaterial3D.xml:375 msgid "" "If [code]true[/code], instead of using [code]UV2[/code] textures will use a " "triplanar texture lookup to determine how to apply textures. Triplanar uses " @@ -9431,368 +8826,443 @@ msgid "" "when you are trying to achieve crisp texturing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:367 +#: doc/classes/BaseMaterial3D.xml:381 msgid "" "If [code]true[/code], triplanar mapping for [code]UV2[/code] is calculated " "in world space rather than object local space. See also [member " "uv2_triplanar]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:370 +#: doc/classes/BaseMaterial3D.xml:384 msgid "" "If [code]true[/code], the model's vertex colors are processed as sRGB mode." msgstr "" -#: doc/classes/BaseMaterial3D.xml:373 +#: doc/classes/BaseMaterial3D.xml:387 msgid "If [code]true[/code], the vertex color is used as albedo color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:378 +#: doc/classes/BaseMaterial3D.xml:392 msgid "Texture specifying per-pixel color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:381 +#: doc/classes/BaseMaterial3D.xml:395 msgid "Texture specifying per-pixel metallic value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:384 +#: doc/classes/BaseMaterial3D.xml:398 msgid "Texture specifying per-pixel roughness value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:387 +#: doc/classes/BaseMaterial3D.xml:401 msgid "Texture specifying per-pixel emission color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:390 +#: doc/classes/BaseMaterial3D.xml:404 msgid "Texture specifying per-pixel normal vector." msgstr "" -#: doc/classes/BaseMaterial3D.xml:393 +#: doc/classes/BaseMaterial3D.xml:407 msgid "Texture specifying per-pixel rim value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:396 +#: doc/classes/BaseMaterial3D.xml:410 msgid "Texture specifying per-pixel clearcoat value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:399 +#: doc/classes/BaseMaterial3D.xml:413 msgid "" "Texture specifying per-pixel flowmap direction for use with [member " "anisotropy]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:402 +#: doc/classes/BaseMaterial3D.xml:416 msgid "Texture specifying per-pixel ambient occlusion value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:405 +#: doc/classes/BaseMaterial3D.xml:419 msgid "Texture specifying per-pixel height." msgstr "" -#: doc/classes/BaseMaterial3D.xml:408 +#: doc/classes/BaseMaterial3D.xml:422 msgid "Texture specifying per-pixel subsurface scattering." msgstr "" -#: doc/classes/BaseMaterial3D.xml:411 -msgid "Texture specifying per-pixel transmission color." +#: doc/classes/BaseMaterial3D.xml:425 +msgid "Texture specifying per-pixel transmittance for subsurface scattering." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:428 +msgid "Texture specifying per-pixel backlight color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:414 +#: doc/classes/BaseMaterial3D.xml:431 msgid "Texture specifying per-pixel refraction strength." msgstr "" -#: doc/classes/BaseMaterial3D.xml:417 +#: doc/classes/BaseMaterial3D.xml:434 msgid "Texture specifying per-pixel detail mask blending value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:420 +#: doc/classes/BaseMaterial3D.xml:437 msgid "Texture specifying per-pixel detail color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:423 +#: doc/classes/BaseMaterial3D.xml:440 msgid "Texture specifying per-pixel detail normal." msgstr "" -#: doc/classes/BaseMaterial3D.xml:428 +#: doc/classes/BaseMaterial3D.xml:443 +msgid "Texture holding ambient occlusion, roughness, and metallic." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:446 msgid "Represents the size of the [enum TextureParam] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:431 +#: doc/classes/BaseMaterial3D.xml:449 doc/classes/RenderingServer.xml:3774 +#: doc/classes/Viewport.xml:390 msgid "" "The texture filter reads from the nearest pixel only. The simplest and " "fastest method of filtering, but the texture will look pixelized." msgstr "" -#: doc/classes/BaseMaterial3D.xml:434 doc/classes/CanvasItem.xml:665 +#: doc/classes/BaseMaterial3D.xml:452 doc/classes/RenderingServer.xml:3777 +#: doc/classes/Viewport.xml:393 msgid "" -"The texture filter blends between the nearest four pixels. Use this for most " -"cases where you want to avoid a pixelated style." +"The texture filter blends between the nearest 4 pixels. Use this when you " +"want to avoid a pixelated style, but do not want mipmaps." msgstr "" -#: doc/classes/BaseMaterial3D.xml:445 doc/classes/CanvasItem.xml:676 +#: doc/classes/BaseMaterial3D.xml:455 doc/classes/RenderingServer.xml:3780 +#: doc/classes/Viewport.xml:396 +msgid "" +"The texture filter reads from the nearest pixel in the nearest mipmap. The " +"fastest way to read from textures with mipmaps." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:458 +msgid "" +"The texture filter blends between the nearest 4 pixels and between the " +"nearest 2 mipmaps. Use this for most cases as mipmaps are important to " +"smooth out pixels that are far from the camera." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:461 doc/classes/RenderingServer.xml:3786 +msgid "" +"The texture filter reads from the nearest pixel, but selects a mipmap based " +"on the angle between the surface and the camera view. This reduces artifacts " +"on surfaces that are almost in line with the camera." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:464 doc/classes/RenderingServer.xml:3789 +msgid "" +"The texture filter blends between the nearest 4 pixels and selects a mipmap " +"based on the angle between the surface and the camera view. This reduces " +"artifacts on surfaces that are almost in line with the camera. This is the " +"slowest of the filtering options, but results in the highest quality " +"texturing." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:467 doc/classes/CanvasItem.xml:677 msgid "Represents the size of the [enum TextureFilter] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:448 +#: doc/classes/BaseMaterial3D.xml:470 msgid "Use [code]UV[/code] with the detail texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:451 +#: doc/classes/BaseMaterial3D.xml:473 msgid "Use [code]UV2[/code] with the detail texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:454 +#: doc/classes/BaseMaterial3D.xml:476 msgid "The material will not use transparency." msgstr "" -#: doc/classes/BaseMaterial3D.xml:457 +#: doc/classes/BaseMaterial3D.xml:479 msgid "The material will use the texture's alpha values for transparency." msgstr "" -#: doc/classes/BaseMaterial3D.xml:464 +#: doc/classes/BaseMaterial3D.xml:482 +msgid "" +"The material will cut off all values below a threshold, the rest will remain " +"opaque." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:485 +msgid "" +"The material will use the texture's alpha value for transparency, but will " +"still be rendered in the pre-pass." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:488 msgid "Represents the size of the [enum Transparency] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:467 +#: doc/classes/BaseMaterial3D.xml:491 msgid "The object will not receive shadows." msgstr "" -#: doc/classes/BaseMaterial3D.xml:470 +#: doc/classes/BaseMaterial3D.xml:494 msgid "" "The object will be shaded per pixel. Useful for realistic shading effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:473 +#: doc/classes/BaseMaterial3D.xml:497 msgid "" "The object will be shaded per vertex. Useful when you want cheaper shaders " "and do not care about visual quality." msgstr "" -#: doc/classes/BaseMaterial3D.xml:476 +#: doc/classes/BaseMaterial3D.xml:500 msgid "Represents the size of the [enum ShadingMode] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:479 +#: doc/classes/BaseMaterial3D.xml:503 msgid "Constant for setting [member emission_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:482 +#: doc/classes/BaseMaterial3D.xml:506 msgid "Constant for setting [member normal_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:485 +#: doc/classes/BaseMaterial3D.xml:509 msgid "Constant for setting [member rim_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:488 +#: doc/classes/BaseMaterial3D.xml:512 msgid "Constant for setting [member clearcoat_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:491 +#: doc/classes/BaseMaterial3D.xml:515 msgid "Constant for setting [member anisotropy_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:494 +#: doc/classes/BaseMaterial3D.xml:518 msgid "Constant for setting [member ao_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:499 +#: doc/classes/BaseMaterial3D.xml:521 +msgid "Constant for setting [member heightmap_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:524 msgid "Constant for setting [member subsurf_scatter_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:502 -msgid "Constant for setting [member transmission_enabled]." +#: doc/classes/BaseMaterial3D.xml:527 +msgid "Constant for setting [member subsurf_scatter_transmittance_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:530 +msgid "Constant for setting [member backlight_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:505 +#: doc/classes/BaseMaterial3D.xml:533 msgid "Constant for setting [member refraction_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:508 +#: doc/classes/BaseMaterial3D.xml:536 msgid "Constant for setting [member detail_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:511 doc/classes/EditorFeatureProfile.xml:148 +#: doc/classes/BaseMaterial3D.xml:539 doc/classes/EditorFeatureProfile.xml:148 msgid "Represents the size of the [enum Feature] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:514 +#: doc/classes/BaseMaterial3D.xml:542 msgid "" "Default blend mode. The color of the object is blended over the background " "based on the object's alpha value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:517 +#: doc/classes/BaseMaterial3D.xml:545 msgid "The color of the object is added to the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:520 +#: doc/classes/BaseMaterial3D.xml:548 msgid "The color of the object is subtracted from the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:523 +#: doc/classes/BaseMaterial3D.xml:551 msgid "The color of the object is multiplied by the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:526 +#: doc/classes/BaseMaterial3D.xml:554 msgid "Default depth draw mode. Depth is drawn only for opaque objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:529 +#: doc/classes/BaseMaterial3D.xml:557 msgid "Depth draw is calculated for both opaque and transparent objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:532 +#: doc/classes/BaseMaterial3D.xml:560 msgid "No depth draw." msgstr "" -#: doc/classes/BaseMaterial3D.xml:535 +#: doc/classes/BaseMaterial3D.xml:563 msgid "Default cull mode. The back of the object is culled when not visible." msgstr "" -#: doc/classes/BaseMaterial3D.xml:538 +#: doc/classes/BaseMaterial3D.xml:566 msgid "The front of the object is culled when not visible." msgstr "" -#: doc/classes/BaseMaterial3D.xml:541 +#: doc/classes/BaseMaterial3D.xml:569 msgid "No culling is performed." msgstr "" -#: doc/classes/BaseMaterial3D.xml:544 +#: doc/classes/BaseMaterial3D.xml:572 msgid "" "Disables the depth test, so this object is drawn on top of all others. " "However, objects drawn after it in the draw order may cover it." msgstr "" -#: doc/classes/BaseMaterial3D.xml:547 +#: doc/classes/BaseMaterial3D.xml:575 msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh." msgstr "" -#: doc/classes/BaseMaterial3D.xml:550 +#: doc/classes/BaseMaterial3D.xml:578 msgid "" "Vertex color is in sRGB space and needs to be converted to linear. Only " "applies in the Vulkan renderer." msgstr "" -#: doc/classes/BaseMaterial3D.xml:553 +#: doc/classes/BaseMaterial3D.xml:581 msgid "" "Uses point size to alter the size of primitive points. Also changes the " "albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/" "code]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:556 +#: doc/classes/BaseMaterial3D.xml:584 msgid "" "Object is scaled by depth so that it always appears the same size on screen." msgstr "" -#: doc/classes/BaseMaterial3D.xml:559 +#: doc/classes/BaseMaterial3D.xml:587 msgid "" "Shader will keep the scale set for the mesh. Otherwise the scale is lost " "when billboarding. Only applies when [member billboard_mode] is [constant " "BILLBOARD_ENABLED]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:562 doc/classes/BaseMaterial3D.xml:568 +#: doc/classes/BaseMaterial3D.xml:590 doc/classes/BaseMaterial3D.xml:596 msgid "" "Use triplanar texture lookup for all texture lookups that would normally use " "[code]UV[/code]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:565 doc/classes/BaseMaterial3D.xml:571 +#: doc/classes/BaseMaterial3D.xml:593 doc/classes/BaseMaterial3D.xml:599 msgid "" "Use triplanar texture lookup for all texture lookups that would normally use " "[code]UV2[/code]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:574 +#: doc/classes/BaseMaterial3D.xml:602 msgid "" "Use [code]UV2[/code] coordinates to look up from the [member ao_texture]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:577 +#: doc/classes/BaseMaterial3D.xml:605 msgid "" "Use [code]UV2[/code] coordinates to look up from the [member " "emission_texture]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:580 +#: doc/classes/BaseMaterial3D.xml:608 msgid "Forces the shader to convert albedo from sRGB space to linear space." msgstr "" -#: doc/classes/BaseMaterial3D.xml:583 +#: doc/classes/BaseMaterial3D.xml:611 msgid "Disables receiving shadows from other objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:586 +#: doc/classes/BaseMaterial3D.xml:614 msgid "Disables receiving ambient light." msgstr "" -#: doc/classes/BaseMaterial3D.xml:589 +#: doc/classes/BaseMaterial3D.xml:617 msgid "Enables the shadow to opacity feature." msgstr "" -#: doc/classes/BaseMaterial3D.xml:594 +#: doc/classes/BaseMaterial3D.xml:620 doc/classes/RenderingServer.xml:3801 +#: doc/classes/Viewport.xml:408 +msgid "" +"Enables the texture to repeat when UV coordinates are outside the 0-1 range. " +"If using one of the linear filtering modes, this can result in artifacts at " +"the edges of a texture when the sampler filters across the edges of the " +"texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:623 msgid "" "Invert values read from a depth texture to convert them to height values " "(heightmap)." msgstr "" -#: doc/classes/BaseMaterial3D.xml:599 doc/classes/CPUParticles2D.xml:355 -#: doc/classes/CPUParticles3D.xml:364 doc/classes/GeometryInstance3D.xml:100 +#: doc/classes/BaseMaterial3D.xml:626 +msgid "" +"Enables the skin mode for subsurface scattering which is used to improve the " +"look of subsurface scattering when used for human skin." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:629 doc/classes/CPUParticles2D.xml:355 +#: doc/classes/CPUParticles3D.xml:364 doc/classes/GeometryInstance3D.xml:118 #: doc/classes/ParticlesMaterial.xml:315 msgid "Represents the size of the [enum Flags] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:602 +#: doc/classes/BaseMaterial3D.xml:632 msgid "Default diffuse scattering algorithm." msgstr "" -#: doc/classes/BaseMaterial3D.xml:605 +#: doc/classes/BaseMaterial3D.xml:635 msgid "Diffuse scattering ignores roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:608 +#: doc/classes/BaseMaterial3D.xml:638 msgid "Extends Lambert to cover more than 90 degrees when roughness increases." msgstr "" -#: doc/classes/BaseMaterial3D.xml:611 +#: doc/classes/BaseMaterial3D.xml:641 msgid "Attempts to use roughness to emulate microsurfacing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:614 +#: doc/classes/BaseMaterial3D.xml:644 msgid "Uses a hard cut for lighting, with smoothing affected by roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:617 +#: doc/classes/BaseMaterial3D.xml:647 msgid "Default specular blob." msgstr "" -#: doc/classes/BaseMaterial3D.xml:620 doc/classes/BaseMaterial3D.xml:623 +#: doc/classes/BaseMaterial3D.xml:650 doc/classes/BaseMaterial3D.xml:653 msgid "Older specular algorithm, included for compatibility." msgstr "" -#: doc/classes/BaseMaterial3D.xml:626 +#: doc/classes/BaseMaterial3D.xml:656 msgid "Toon blob which changes size based on roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:629 +#: doc/classes/BaseMaterial3D.xml:659 msgid "No specular blob." msgstr "" -#: doc/classes/BaseMaterial3D.xml:632 +#: doc/classes/BaseMaterial3D.xml:662 msgid "Billboard mode is disabled." msgstr "" -#: doc/classes/BaseMaterial3D.xml:635 +#: doc/classes/BaseMaterial3D.xml:665 msgid "The object's Z axis will always face the camera." msgstr "" -#: doc/classes/BaseMaterial3D.xml:638 +#: doc/classes/BaseMaterial3D.xml:668 msgid "The object's X axis will always face the camera." msgstr "" -#: doc/classes/BaseMaterial3D.xml:641 +#: doc/classes/BaseMaterial3D.xml:671 msgid "" "Used for particle systems when assigned to [GPUParticles3D] and " "[CPUParticles3D] nodes. Enables [code]particles_anim_*[/code] properties.\n" @@ -9800,45 +9270,45 @@ msgid "" "anim_speed] should also be set to a positive value for the animation to play." msgstr "" -#: doc/classes/BaseMaterial3D.xml:645 +#: doc/classes/BaseMaterial3D.xml:675 msgid "Used to read from the red channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:648 +#: doc/classes/BaseMaterial3D.xml:678 msgid "Used to read from the green channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:651 +#: doc/classes/BaseMaterial3D.xml:681 msgid "Used to read from the blue channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:654 +#: doc/classes/BaseMaterial3D.xml:684 msgid "Used to read from the alpha channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:657 +#: doc/classes/BaseMaterial3D.xml:687 msgid "Currently unused." msgstr "" -#: doc/classes/BaseMaterial3D.xml:660 +#: doc/classes/BaseMaterial3D.xml:690 msgid "Adds the emission color to the color from the emission texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:663 +#: doc/classes/BaseMaterial3D.xml:693 msgid "Multiplies the emission color by the color from the emission texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:666 +#: doc/classes/BaseMaterial3D.xml:696 msgid "Do not use distance fade." msgstr "" -#: doc/classes/BaseMaterial3D.xml:669 +#: doc/classes/BaseMaterial3D.xml:699 msgid "" "Smoothly fades the object out based on each pixel's distance from the camera " "using the alpha channel." msgstr "" -#: doc/classes/BaseMaterial3D.xml:672 +#: doc/classes/BaseMaterial3D.xml:702 msgid "" "Smoothly fades the object out based on each pixel's distance from the camera " "using a dither approach. Dithering discards pixels based on a set pattern to " @@ -9846,7 +9316,7 @@ msgid "" "faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:675 +#: doc/classes/BaseMaterial3D.xml:705 msgid "" "Smoothly fades the object out based on the object's distance from the camera " "using a dither approach. Dithering discards pixels based on a set pattern to " @@ -10520,176 +9990,181 @@ msgid "" "scenes than manually changing the position of [CanvasItem]-based nodes.\n" "This node is intended to be a simple helper to get things going quickly and " "it may happen that more functionality is desired to change how the camera " -"works. To make your own custom camera node, simply inherit from [Node2D] and " -"change the transform of the canvas by calling get_viewport()." -"set_canvas_transform(m) in [Viewport]." +"works. To make your own custom camera node, inherit from [Node2D] and change " +"the transform of the canvas by setting [member Viewport.canvas_transform] in " +"[Viewport] (you can obtain the current [Viewport] by using [method Node." +"get_viewport]).\n" +"Note that the [Camera2D] node's [code]position[/code] doesn't represent the " +"actual position of the screen, which may differ due to applied smoothing or " +"limits. You can use [method get_camera_screen_center] to get the real " +"position." msgstr "" -#: doc/classes/Camera2D.xml:17 +#: doc/classes/Camera2D.xml:18 msgid "Aligns the camera to the tracked node." msgstr "" -#: doc/classes/Camera2D.xml:24 +#: doc/classes/Camera2D.xml:25 msgid "" "Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-" "assigned camera." msgstr "" -#: doc/classes/Camera2D.xml:31 +#: doc/classes/Camera2D.xml:32 msgid "Forces the camera to update scroll immediately." msgstr "" -#: doc/classes/Camera2D.xml:38 +#: doc/classes/Camera2D.xml:39 msgid "Returns the camera position." msgstr "" -#: doc/classes/Camera2D.xml:45 +#: doc/classes/Camera2D.xml:46 msgid "" "Returns the location of the [Camera2D]'s screen-center, relative to the " "origin." msgstr "" -#: doc/classes/Camera2D.xml:54 +#: doc/classes/Camera2D.xml:55 msgid "" "Returns the specified margin. See also [member drag_margin_bottom], [member " "drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." msgstr "" -#: doc/classes/Camera2D.xml:63 +#: doc/classes/Camera2D.xml:64 msgid "" "Returns the specified camera limit. See also [member limit_bottom], [member " "limit_top], [member limit_left], and [member limit_right]." msgstr "" -#: doc/classes/Camera2D.xml:70 +#: doc/classes/Camera2D.xml:71 msgid "" "Make this the current 2D camera for the scene (viewport and layer), in case " "there are many cameras in the scene." msgstr "" -#: doc/classes/Camera2D.xml:77 +#: doc/classes/Camera2D.xml:78 msgid "" "Sets the camera's position immediately to its current smoothing " "destination.\n" "This has no effect if smoothing is disabled." msgstr "" -#: doc/classes/Camera2D.xml:89 +#: doc/classes/Camera2D.xml:90 msgid "" "Sets the specified margin. See also [member drag_margin_bottom], [member " "drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." msgstr "" -#: doc/classes/Camera2D.xml:100 +#: doc/classes/Camera2D.xml:101 msgid "" "Sets the specified camera limit. See also [member limit_bottom], [member " "limit_top], [member limit_left], and [member limit_right]." msgstr "" -#: doc/classes/Camera2D.xml:106 +#: doc/classes/Camera2D.xml:107 msgid "The Camera2D's anchor point. See [enum AnchorMode] constants." msgstr "" -#: doc/classes/Camera2D.xml:109 +#: doc/classes/Camera2D.xml:110 msgid "" "If [code]true[/code], the camera is the active camera for the current scene. " "Only one camera can be current, so setting a different camera [code]current[/" "code] will disable this one." msgstr "" -#: doc/classes/Camera2D.xml:112 +#: doc/classes/Camera2D.xml:113 msgid "" "The custom [Viewport] node attached to the [Camera2D]. If [code]null[/code] " "or not a [Viewport], uses the default viewport instead." msgstr "" -#: doc/classes/Camera2D.xml:115 +#: doc/classes/Camera2D.xml:116 msgid "" "Bottom margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -#: doc/classes/Camera2D.xml:118 +#: doc/classes/Camera2D.xml:119 msgid "" "If [code]true[/code], the camera only moves when reaching the horizontal " "drag margins. If [code]false[/code], the camera moves horizontally " "regardless of margins." msgstr "" -#: doc/classes/Camera2D.xml:121 +#: doc/classes/Camera2D.xml:122 msgid "" "Left margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -#: doc/classes/Camera2D.xml:124 +#: doc/classes/Camera2D.xml:125 msgid "" "Right margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -#: doc/classes/Camera2D.xml:127 +#: doc/classes/Camera2D.xml:128 msgid "" "Top margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -#: doc/classes/Camera2D.xml:130 +#: doc/classes/Camera2D.xml:131 msgid "" "If [code]true[/code], the camera only moves when reaching the vertical drag " "margins. If [code]false[/code], the camera moves vertically regardless of " "margins." msgstr "" -#: doc/classes/Camera2D.xml:133 +#: doc/classes/Camera2D.xml:134 msgid "" "If [code]true[/code], draws the camera's drag margin rectangle in the editor." msgstr "" -#: doc/classes/Camera2D.xml:136 +#: doc/classes/Camera2D.xml:137 msgid "" "If [code]true[/code], draws the camera's limits rectangle in the editor." msgstr "" -#: doc/classes/Camera2D.xml:139 +#: doc/classes/Camera2D.xml:140 msgid "" "If [code]true[/code], draws the camera's screen rectangle in the editor." msgstr "" -#: doc/classes/Camera2D.xml:142 +#: doc/classes/Camera2D.xml:143 msgid "" "Bottom scroll limit in pixels. The camera stops moving when reaching this " "value." msgstr "" -#: doc/classes/Camera2D.xml:145 +#: doc/classes/Camera2D.xml:146 msgid "" "Left scroll limit in pixels. The camera stops moving when reaching this " "value." msgstr "" -#: doc/classes/Camera2D.xml:148 +#: doc/classes/Camera2D.xml:149 msgid "" "Right scroll limit in pixels. The camera stops moving when reaching this " "value." msgstr "" -#: doc/classes/Camera2D.xml:151 +#: doc/classes/Camera2D.xml:152 msgid "" "If [code]true[/code], the camera smoothly stops when reaches its limits." msgstr "" -#: doc/classes/Camera2D.xml:154 +#: doc/classes/Camera2D.xml:155 msgid "" "Top scroll limit in pixels. The camera stops moving when reaching this value." msgstr "" -#: doc/classes/Camera2D.xml:157 +#: doc/classes/Camera2D.xml:158 msgid "" "The camera's offset, useful for looking around or camera shake animations." msgstr "" -#: doc/classes/Camera2D.xml:160 +#: doc/classes/Camera2D.xml:161 msgid "" "The horizontal offset of the camera, relative to the drag margins.\n" "[b]Note:[/b] Offset H is used only to force offset relative to margins. It's " @@ -10697,33 +10172,33 @@ msgid "" "initial offset." msgstr "" -#: doc/classes/Camera2D.xml:164 +#: doc/classes/Camera2D.xml:165 msgid "" "The vertical offset of the camera, relative to the drag margins.\n" "[b]Note:[/b] Used the same as [member offset_h]." msgstr "" -#: doc/classes/Camera2D.xml:168 +#: doc/classes/Camera2D.xml:169 msgid "The camera's process callback. See [enum Camera2DProcessMode]." msgstr "" -#: doc/classes/Camera2D.xml:171 +#: doc/classes/Camera2D.xml:172 msgid "If [code]true[/code], the camera rotates with the target." msgstr "" -#: doc/classes/Camera2D.xml:174 +#: doc/classes/Camera2D.xml:175 msgid "" "If [code]true[/code], the camera smoothly moves towards the target at " "[member smoothing_speed]." msgstr "" -#: doc/classes/Camera2D.xml:177 +#: doc/classes/Camera2D.xml:178 msgid "" "Speed in pixels per second of the camera's smoothing effect when [member " "smoothing_enabled] is [code]true[/code]." msgstr "" -#: doc/classes/Camera2D.xml:180 +#: doc/classes/Camera2D.xml:181 msgid "" "The camera's zoom relative to the viewport. Values larger than " "[code]Vector2(1, 1)[/code] zoom out and smaller values zoom in. For an " @@ -10731,23 +10206,23 @@ msgid "" "[code]Vector2(4, 4)[/code] for a 4× zoom-out." msgstr "" -#: doc/classes/Camera2D.xml:185 +#: doc/classes/Camera2D.xml:186 msgid "" "The camera's position is fixed so that the top-left corner is always at the " "origin." msgstr "" -#: doc/classes/Camera2D.xml:188 +#: doc/classes/Camera2D.xml:189 msgid "" "The camera's position takes into account vertical/horizontal offsets and the " "screen size." msgstr "" -#: doc/classes/Camera2D.xml:191 doc/classes/ClippedCamera3D.xml:104 +#: doc/classes/Camera2D.xml:192 doc/classes/ClippedCamera3D.xml:104 msgid "The camera updates with the [code]_physics_process[/code] callback." msgstr "" -#: doc/classes/Camera2D.xml:194 doc/classes/ClippedCamera3D.xml:107 +#: doc/classes/Camera2D.xml:195 doc/classes/ClippedCamera3D.xml:107 msgid "The camera updates with the [code]_process[/code] callback." msgstr "" @@ -11009,6 +10484,72 @@ msgid "" "Audio's [code]pitch shift[/code])." msgstr "" +#: doc/classes/CameraEffects.xml:4 +msgid "" +"Contains camera-specific effects such as depth of field and exposure " +"override." +msgstr "" + +#: doc/classes/CameraEffects.xml:7 +msgid "" +"Contains camera-specific effects such as depth of field and exposure " +"override.\n" +"See also [Environment] for general 3D environment settings." +msgstr "" + +#: doc/classes/CameraEffects.xml:16 +msgid "" +"The amount of blur for both near and far depth-of-field effects. The amount " +"of blur increases the radius of the blur effect, making the affected area " +"blurrier. However, If the amount is too high, you might start to see lines " +"appearing, especially when using a low quality blur." +msgstr "" + +#: doc/classes/CameraEffects.xml:19 +msgid "" +"The distance from the camera where the far blur effect affects the rendering." +msgstr "" + +#: doc/classes/CameraEffects.xml:22 +msgid "" +"If [code]true[/code], enables the depth-of-field far blur effect. This has a " +"significant performance cost. Consider disabling it in scenes where there " +"are no far away objects." +msgstr "" + +#: doc/classes/CameraEffects.xml:25 +msgid "The length of the transition between the no-blur area and far blur." +msgstr "" + +#: doc/classes/CameraEffects.xml:28 +msgid "" +"Distance from the camera where the near blur effect affects the rendering." +msgstr "" + +#: doc/classes/CameraEffects.xml:31 +msgid "" +"If [code]true[/code], enables the depth-of-field near blur effect. This has " +"a significant performance cost. Consider disabling it in scenes where there " +"are no nearby objects." +msgstr "" + +#: doc/classes/CameraEffects.xml:34 +msgid "The length of the transition between the near blur and no-blur area." +msgstr "" + +#: doc/classes/CameraEffects.xml:37 +msgid "" +"The exposure override value to use. Higher values will result in a brighter " +"scene. Only effective if [member override_exposure_enable] is [code]true[/" +"code]." +msgstr "" + +#: doc/classes/CameraEffects.xml:40 +msgid "" +"If [code]true[/code], overrides the manual or automatic exposure defined in " +"the [Environment] with the value in [member override_exposure]." +msgstr "" + #: doc/classes/CameraFeed.xml:4 msgid "" "A camera feed gives you access to a single physical camera attached to your " @@ -11019,7 +10560,7 @@ msgstr "" msgid "" "A camera feed gives you access to a single physical camera attached to your " "device. When enabled, Godot will start capturing frames from the camera " -"which can then be used.\n" +"which can then be used. See also [CameraServer].\n" "[b]Note:[/b] Many cameras will return YCbCr images which are split into two " "textures and need to be combined in a shader. Godot does this automatically " "for you if you set the environment to show the camera image in the " @@ -11034,50 +10575,54 @@ msgstr "" msgid "" "The [CameraServer] keeps track of different cameras accessible in Godot. " "These are external cameras such as webcams or the cameras on your phone.\n" -"It is notably used to provide AR modules with a video feed from the camera." +"It is notably used to provide AR modules with a video feed from the camera.\n" +"[b]Note:[/b] This class is currently only implemented on macOS and iOS. On " +"other platforms, no [CameraFeed]s will be available." msgstr "" -#: doc/classes/CameraServer.xml:19 -msgid "Adds a camera feed to the camera server." +#: doc/classes/CameraServer.xml:20 +msgid "Adds the camera [code]feed[/code] to the camera server." msgstr "" -#: doc/classes/CameraServer.xml:26 +#: doc/classes/CameraServer.xml:27 msgid "Returns an array of [CameraFeed]s." msgstr "" -#: doc/classes/CameraServer.xml:35 -msgid "Returns the [CameraFeed] with this id." +#: doc/classes/CameraServer.xml:36 +msgid "" +"Returns the [CameraFeed] corresponding to the camera with the given " +"[code]index[/code]." msgstr "" -#: doc/classes/CameraServer.xml:42 +#: doc/classes/CameraServer.xml:43 msgid "Returns the number of [CameraFeed]s registered." msgstr "" -#: doc/classes/CameraServer.xml:51 -msgid "Removes a [CameraFeed]." +#: doc/classes/CameraServer.xml:52 +msgid "Removes the specified camera [code]feed[/code]." msgstr "" -#: doc/classes/CameraServer.xml:60 -msgid "Emitted when a [CameraFeed] is added (e.g. webcam is plugged in)." +#: doc/classes/CameraServer.xml:61 +msgid "Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in)." msgstr "" -#: doc/classes/CameraServer.xml:67 -msgid "Emitted when a [CameraFeed] is removed (e.g. webcam is unplugged)." +#: doc/classes/CameraServer.xml:68 +msgid "Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged)." msgstr "" -#: doc/classes/CameraServer.xml:73 +#: doc/classes/CameraServer.xml:74 msgid "The RGBA camera image." msgstr "" -#: doc/classes/CameraServer.xml:76 -msgid "The YCbCr camera image." +#: doc/classes/CameraServer.xml:77 +msgid "The [url=https://en.wikipedia.org/wiki/YCbCr]YCbCr[/url] camera image." msgstr "" -#: doc/classes/CameraServer.xml:79 +#: doc/classes/CameraServer.xml:80 msgid "The Y component camera image." msgstr "" -#: doc/classes/CameraServer.xml:82 +#: doc/classes/CameraServer.xml:83 msgid "The CbCr component camera image." msgstr "" @@ -11133,97 +10678,100 @@ msgid "" "its children) and self modulation (only for itself), as well as its blend " "mode.\n" "Ultimately, a transform notification can be requested, which will notify the " -"node that its global position changed in case the parent tree changed." +"node that its global position changed in case the parent tree changed.\n" +"[b]Note:[/b] Unless otherwise specified, all methods that have angle " +"parameters must have angles specified as [i]radians[/i]. To convert degrees " +"to radians, use [method @GDScript.deg2rad]." msgstr "" -#: doc/classes/CanvasItem.xml:14 doc/classes/CanvasLayer.xml:10 +#: doc/classes/CanvasItem.xml:15 doc/classes/CanvasLayer.xml:10 #: doc/classes/InputEvent.xml:11 doc/classes/Viewport.xml:15 msgid "https://docs.godotengine.org/en/latest/tutorials/2d/2d_transforms.html" msgstr "" -#: doc/classes/CanvasItem.xml:15 doc/classes/Control.xml:19 +#: doc/classes/CanvasItem.xml:16 doc/classes/Control.xml:19 #: doc/classes/Node2D.xml:10 msgid "" "https://docs.godotengine.org/en/latest/tutorials/2d/custom_drawing_in_2d.html" msgstr "" -#: doc/classes/CanvasItem.xml:22 +#: doc/classes/CanvasItem.xml:23 msgid "" "Overridable function called by the engine (if defined) to draw the canvas " "item." msgstr "" -#: doc/classes/CanvasItem.xml:43 +#: doc/classes/CanvasItem.xml:44 msgid "" "Draws an arc between the given angles. The larger the value of " "[code]point_count[/code], the smoother the curve." msgstr "" -#: doc/classes/CanvasItem.xml:60 +#: doc/classes/CanvasItem.xml:61 msgid "" "Draws a string character using a custom font. Returns the advance, depending " "on the character width and kerning with an optional next character." msgstr "" -#: doc/classes/CanvasItem.xml:73 +#: doc/classes/CanvasItem.xml:74 msgid "Draws a colored circle." msgstr "" -#: doc/classes/CanvasItem.xml:98 +#: doc/classes/CanvasItem.xml:99 msgid "Draws a colored polygon of any amount of points, convex or concave." msgstr "" -#: doc/classes/CanvasItem.xml:113 +#: doc/classes/CanvasItem.xml:114 msgid "Draws a line from a 2D point to another, with a given color and width." msgstr "" -#: doc/classes/CanvasItem.xml:138 +#: doc/classes/CanvasItem.xml:139 msgid "" "Draws a [Mesh] in 2D, using the provided texture. See [MeshInstance2D] for " "related documentation." msgstr "" -#: doc/classes/CanvasItem.xml:151 +#: doc/classes/CanvasItem.xml:152 msgid "Draws multiple, parallel lines with a uniform [code]color[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:164 +#: doc/classes/CanvasItem.xml:165 msgid "" "Draws multiple, parallel lines with a uniform [code]width[/code] and segment-" "by-segment coloring. Colors assigned to line segments match by index between " "[code]points[/code] and [code]colors[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:185 +#: doc/classes/CanvasItem.xml:186 msgid "" "Draws a [MultiMesh] in 2D with the provided texture. See " "[MultiMeshInstance2D] for related documentation." msgstr "" -#: doc/classes/CanvasItem.xml:210 +#: doc/classes/CanvasItem.xml:211 msgid "Draws a polygon of any amount of points, convex or concave." msgstr "" -#: doc/classes/CanvasItem.xml:223 +#: doc/classes/CanvasItem.xml:224 msgid "" "Draws interconnected line segments with a uniform [code]color[/code] and " "[code]width[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:236 +#: doc/classes/CanvasItem.xml:237 msgid "" "Draws interconnected line segments with a uniform [code]width[/code] and " "segment-by-segment coloring. Colors assigned to line segments match by index " "between [code]points[/code] and [code]colors[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:263 +#: doc/classes/CanvasItem.xml:264 msgid "" "Draws a custom primitive. 1 point for a point, 2 points for a line, 3 points " "for a triangle, and 4 points for a quad." msgstr "" -#: doc/classes/CanvasItem.xml:278 +#: doc/classes/CanvasItem.xml:279 msgid "" "Draws a rectangle. If [code]filled[/code] is [code]true[/code], the " "rectangle will be filled with the [code]color[/code] specified. If " @@ -11233,272 +10781,278 @@ msgid "" "[code]false[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:292 +#: doc/classes/CanvasItem.xml:293 msgid "" "Sets a custom transform for drawing via components. Anything drawn " "afterwards will be transformed by this." msgstr "" -#: doc/classes/CanvasItem.xml:301 +#: doc/classes/CanvasItem.xml:302 msgid "" "Sets a custom transform for drawing via matrix. Anything drawn afterwards " "will be transformed by this." msgstr "" -#: doc/classes/CanvasItem.xml:318 +#: doc/classes/CanvasItem.xml:319 msgid "Draws a string using a custom font." msgstr "" -#: doc/classes/CanvasItem.xml:329 +#: doc/classes/CanvasItem.xml:330 msgid "Draws a styled rectangle." msgstr "" -#: doc/classes/CanvasItem.xml:352 +#: doc/classes/CanvasItem.xml:353 msgid "Draws a texture at a given position." msgstr "" -#: doc/classes/CanvasItem.xml:379 +#: doc/classes/CanvasItem.xml:380 msgid "" "Draws a textured rectangle at a given position, optionally modulated by a " "color. If [code]transpose[/code] is [code]true[/code], the texture will have " "its X and Y coordinates swapped." msgstr "" -#: doc/classes/CanvasItem.xml:408 +#: doc/classes/CanvasItem.xml:409 msgid "" "Draws a textured rectangle region at a given position, optionally modulated " "by a color. If [code]transpose[/code] is [code]true[/code], the texture will " "have its X and Y coordinates swapped." msgstr "" -#: doc/classes/CanvasItem.xml:415 doc/classes/Node3D.xml:18 +#: doc/classes/CanvasItem.xml:416 doc/classes/Node3D.xml:19 msgid "" "Forces the transform to update. Transform changes in physics are not instant " "for performance reasons. Transforms are accumulated and then set. Use this " "if you need an up-to-date transform when doing physics operations." msgstr "" -#: doc/classes/CanvasItem.xml:422 +#: doc/classes/CanvasItem.xml:423 msgid "Returns the [RID] of the [World2D] canvas where this item is in." msgstr "" -#: doc/classes/CanvasItem.xml:429 +#: doc/classes/CanvasItem.xml:430 msgid "Returns the canvas item RID used by [RenderingServer] for this item." msgstr "" -#: doc/classes/CanvasItem.xml:436 +#: doc/classes/CanvasItem.xml:437 msgid "Returns the transform matrix of this item's canvas." msgstr "" -#: doc/classes/CanvasItem.xml:443 +#: doc/classes/CanvasItem.xml:444 msgid "Returns the global position of the mouse." msgstr "" -#: doc/classes/CanvasItem.xml:450 +#: doc/classes/CanvasItem.xml:451 msgid "Returns the global transform matrix of this item." msgstr "" -#: doc/classes/CanvasItem.xml:457 +#: doc/classes/CanvasItem.xml:458 msgid "" "Returns the global transform matrix of this item in relation to the canvas." msgstr "" -#: doc/classes/CanvasItem.xml:464 +#: doc/classes/CanvasItem.xml:465 msgid "Returns the mouse position relative to this item's position." msgstr "" -#: doc/classes/CanvasItem.xml:471 +#: doc/classes/CanvasItem.xml:472 msgid "Returns the transform matrix of this item." msgstr "" -#: doc/classes/CanvasItem.xml:478 +#: doc/classes/CanvasItem.xml:479 msgid "Returns the viewport's boundaries as a [Rect2]." msgstr "" -#: doc/classes/CanvasItem.xml:485 +#: doc/classes/CanvasItem.xml:486 msgid "Returns this item's transform in relation to the viewport." msgstr "" -#: doc/classes/CanvasItem.xml:492 +#: doc/classes/CanvasItem.xml:493 msgid "Returns the [World2D] where this item is in." msgstr "" -#: doc/classes/CanvasItem.xml:499 +#: doc/classes/CanvasItem.xml:500 msgid "Hide the [CanvasItem] if it's currently visible." msgstr "" -#: doc/classes/CanvasItem.xml:506 +#: doc/classes/CanvasItem.xml:507 msgid "" "Returns [code]true[/code] if local transform notifications are communicated " "to children." msgstr "" -#: doc/classes/CanvasItem.xml:513 +#: doc/classes/CanvasItem.xml:514 msgid "" "Returns [code]true[/code] if the node is set as top-level. See [method " "set_as_toplevel]." msgstr "" -#: doc/classes/CanvasItem.xml:520 +#: doc/classes/CanvasItem.xml:521 msgid "" "Returns [code]true[/code] if global transform notifications are communicated " "to children." msgstr "" -#: doc/classes/CanvasItem.xml:527 +#: doc/classes/CanvasItem.xml:528 msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and its inherited visibility " "is also [code]true[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:536 +#: doc/classes/CanvasItem.xml:537 msgid "Assigns [code]screen_point[/code] as this node's new local transform." msgstr "" -#: doc/classes/CanvasItem.xml:545 +#: doc/classes/CanvasItem.xml:546 msgid "" "Transformations issued by [code]event[/code]'s inputs are applied in local " "space instead of global space." msgstr "" -#: doc/classes/CanvasItem.xml:554 +#: doc/classes/CanvasItem.xml:555 msgid "" "If [code]enable[/code] is [code]true[/code], the node won't inherit its " "transform from parent canvas items." msgstr "" -#: doc/classes/CanvasItem.xml:563 +#: doc/classes/CanvasItem.xml:564 msgid "" "If [code]enable[/code] is [code]true[/code], children will be updated with " "local transform data." msgstr "" -#: doc/classes/CanvasItem.xml:572 +#: doc/classes/CanvasItem.xml:573 msgid "" "If [code]enable[/code] is [code]true[/code], children will be updated with " "global transform data." msgstr "" -#: doc/classes/CanvasItem.xml:579 +#: doc/classes/CanvasItem.xml:580 msgid "" "Show the [CanvasItem] if it's currently hidden. For controls that inherit " "[Popup], the correct way to make them visible is to call one of the multiple " "[code]popup*()[/code] functions instead." msgstr "" -#: doc/classes/CanvasItem.xml:586 +#: doc/classes/CanvasItem.xml:587 msgid "" "Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " "called on idle time to request redraw." msgstr "" -#: doc/classes/CanvasItem.xml:592 +#: doc/classes/CanvasItem.xml:593 msgid "" "The rendering layers in which this [CanvasItem] responds to [Light2D] nodes." msgstr "" -#: doc/classes/CanvasItem.xml:595 +#: doc/classes/CanvasItem.xml:596 msgid "The material applied to textures on this [CanvasItem]." msgstr "" -#: doc/classes/CanvasItem.xml:598 +#: doc/classes/CanvasItem.xml:599 msgid "The color applied to textures on this [CanvasItem]." msgstr "" -#: doc/classes/CanvasItem.xml:601 +#: doc/classes/CanvasItem.xml:602 msgid "" "The color applied to textures on this [CanvasItem]. This is not inherited by " "children [CanvasItem]s." msgstr "" -#: doc/classes/CanvasItem.xml:604 +#: doc/classes/CanvasItem.xml:605 msgid "If [code]true[/code], the object draws behind its parent." msgstr "" -#: doc/classes/CanvasItem.xml:607 +#: doc/classes/CanvasItem.xml:608 msgid "If [code]true[/code], the object draws on top of its parent." msgstr "" -#: doc/classes/CanvasItem.xml:614 +#: doc/classes/CanvasItem.xml:615 msgid "" "If [code]true[/code], the parent [CanvasItem]'s [member material] property " "is used as this one's material." msgstr "" -#: doc/classes/CanvasItem.xml:617 +#: doc/classes/CanvasItem.xml:618 msgid "" "If [code]true[/code], this [CanvasItem] is drawn. For controls that inherit " "[Popup], the correct way to make them visible is to call one of the multiple " "[code]popup*()[/code] functions instead." msgstr "" -#: doc/classes/CanvasItem.xml:623 +#: doc/classes/CanvasItem.xml:624 msgid "" "Emitted when the [CanvasItem] must redraw. This can only be connected " "realtime, as deferred will not allow drawing." msgstr "" -#: doc/classes/CanvasItem.xml:628 +#: doc/classes/CanvasItem.xml:629 msgid "Emitted when becoming hidden." msgstr "" -#: doc/classes/CanvasItem.xml:633 +#: doc/classes/CanvasItem.xml:634 msgid "Emitted when the item rect has changed." msgstr "" -#: doc/classes/CanvasItem.xml:638 +#: doc/classes/CanvasItem.xml:639 msgid "Emitted when the visibility (hidden/visible) changes." msgstr "" -#: doc/classes/CanvasItem.xml:644 +#: doc/classes/CanvasItem.xml:645 msgid "" "The [CanvasItem]'s transform has changed. This notification is only received " "if enabled by [method set_notify_transform] or [method " "set_notify_local_transform]." msgstr "" -#: doc/classes/CanvasItem.xml:647 +#: doc/classes/CanvasItem.xml:648 msgid "The [CanvasItem] is requested to draw." msgstr "" -#: doc/classes/CanvasItem.xml:650 +#: doc/classes/CanvasItem.xml:651 msgid "The [CanvasItem]'s visibility has changed." msgstr "" -#: doc/classes/CanvasItem.xml:653 +#: doc/classes/CanvasItem.xml:654 msgid "The [CanvasItem] has entered the canvas." msgstr "" -#: doc/classes/CanvasItem.xml:656 +#: doc/classes/CanvasItem.xml:657 msgid "The [CanvasItem] has exited the canvas." msgstr "" -#: doc/classes/CanvasItem.xml:659 doc/classes/CanvasItem.xml:679 +#: doc/classes/CanvasItem.xml:660 doc/classes/CanvasItem.xml:680 msgid "The [CanvasItem] will inherit the filter from its parent." msgstr "" -#: doc/classes/CanvasItem.xml:662 +#: doc/classes/CanvasItem.xml:663 msgid "" "The texture filter reads from the nearest pixel only. The simplest and " "fastest method of filtering. Useful for pixel art." msgstr "" -#: doc/classes/CanvasItem.xml:682 +#: doc/classes/CanvasItem.xml:666 +msgid "" +"The texture filter blends between the nearest four pixels. Use this for most " +"cases where you want to avoid a pixelated style." +msgstr "" + +#: doc/classes/CanvasItem.xml:683 msgid "Texture will not repeat." msgstr "" -#: doc/classes/CanvasItem.xml:685 +#: doc/classes/CanvasItem.xml:686 msgid "Texture will repeat normally." msgstr "" -#: doc/classes/CanvasItem.xml:688 +#: doc/classes/CanvasItem.xml:689 msgid "" "Texture will repeat in a 2x2 tiled mode, where elements at even positions " "are mirrored." msgstr "" -#: doc/classes/CanvasItem.xml:691 +#: doc/classes/CanvasItem.xml:692 msgid "Represents the size of the [enum TextureRepeat] enum." msgstr "" @@ -12686,25 +12240,24 @@ msgid "" "component." msgstr "" -#: doc/classes/Color.xml:158 +#: doc/classes/Color.xml:160 msgid "" -"Returns a new color resulting from making this color lighter by the " -"specified percentage (ratio from 0 to 1).\n" +"Returns the linear interpolation with another color. The interpolation " +"factor [code]t[/code] is between 0 and 1.\n" "[codeblock]\n" -"var green = Color(0.0, 1.0, 0.0)\n" -"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n" +"var c1 = Color(1.0, 0.0, 0.0)\n" +"var c2 = Color(0.0, 1.0, 0.0)\n" +"var li_c = c1.lerp(c2, 0.5) # A color of an RGBA(128, 128, 0, 255)\n" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:173 +#: doc/classes/Color.xml:174 msgid "" -"Returns the linear interpolation with another color. The interpolation " -"factor [code]t[/code] is between 0 and 1.\n" +"Returns a new color resulting from making this color lighter by the " +"specified percentage (ratio from 0 to 1).\n" "[codeblock]\n" -"var c1 = Color(1.0, 0.0, 0.0)\n" -"var c2 = Color(0.0, 1.0, 0.0)\n" -"var li_c = c1.linear_interpolate(c2, 0.5) # A color of an RGBA(128, 128, 0, " -"255)\n" +"var green = Color(0.0, 1.0, 0.0)\n" +"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n" "[/codeblock]" msgstr "" @@ -13726,7 +13279,7 @@ msgid "" msgstr "" #: doc/classes/ConeTwistJoint3D.xml:77 doc/classes/Generic6DOFJoint3D.xml:404 -#: doc/classes/HingeJoint3D.xml:109 doc/classes/Light3D.xml:124 +#: doc/classes/HingeJoint3D.xml:109 doc/classes/Light3D.xml:145 #: doc/classes/SliderJoint3D.xml:170 msgid "Represents the size of the [enum Param] enum." msgstr "" @@ -14610,8 +14163,8 @@ msgstr "" #: doc/classes/Control.xml:801 msgid "" "Tells Godot which node it should give keyboard focus to if the user presses " -"Tab on a keyboard by default. You can change the key by editing the " -"[code]ui_focus_next[/code] input action.\n" +"[kbd]Tab[/kbd] on a keyboard by default. You can change the key by editing " +"the [code]ui_focus_next[/code] input action.\n" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" @@ -14619,8 +14172,8 @@ msgstr "" #: doc/classes/Control.xml:805 msgid "" "Tells Godot which node it should give keyboard focus to if the user presses " -"Shift+Tab on a keyboard by default. You can change the key by editing the " -"[code]ui_focus_prev[/code] input action.\n" +"[kbd]Shift + Tab[/kbd] on a keyboard by default. You can change the key by " +"editing the [code]ui_focus_prev[/code] input action.\n" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" @@ -14702,9 +14255,9 @@ msgstr "" #: doc/classes/Control.xml:841 msgid "" -"Enables whether rendering of children should be clipped to this control's " -"rectangle. If [code]true[/code], parts of a child which would be visibly " -"outside of this control's rectangle will not be rendered." +"Enables whether rendering of [CanvasItem] based children should be clipped " +"to this control's rectangle. If [code]true[/code], parts of a child which " +"would be visibly outside of this control's rectangle will not be rendered." msgstr "" #: doc/classes/Control.xml:844 @@ -16860,6 +16413,172 @@ msgid "" "stiffness multiplied by the size difference from its resting length." msgstr "" +#: doc/classes/Decal.xml:4 +msgid "Node that projects a texture onto a [MeshInstance3D]." +msgstr "" + +#: doc/classes/Decal.xml:7 +msgid "" +"[Decal]s are used to project a texture onto a [Mesh] in the scene. Use " +"Decals to add detail to a scene without affecting the underlying [Mesh]. " +"They are often used to add weathering to building, add dirt or mud to the " +"ground, or add variety to props. Decals can be moved at any time, making " +"them suitable for things like blob shadows or laser sight dots.\n" +"They are made of an [AABB] and a group of [Texture2D]s specifying [Color], " +"normal, ORM (ambient occlusion, roughness, metallic), and emission. Decals " +"are projected within their [AABB] so altering the orientation of the Decal " +"affects the direction in which they are projected. By default, Decals are " +"projected down (i.e. from positive Y to negative Y).\n" +"The [Texture2D]s associated with the Decal are automatically stored in a " +"texture atlas which is used for drawing the decals so all decals can be " +"drawn at once. Godot uses clustered decals, meaning they are stored in " +"cluster data and drawn when the mesh is drawn, they are not drawn as a " +"postprocessing effect after." +msgstr "" + +#: doc/classes/Decal.xml:20 +msgid "" +"Returns the [Texture2D] associated with the specified [enum DecalTexture]. " +"This is a convenience method, in most cases you should access the texture " +"directly. \n" +"For example, instead of [code]albedo_tex = $Decal.get_texture(Decal." +"TEXTURE_ALBEDO)[/code], use [code]albedo_tex = $Decal.texture_albedo[/" +"code].\n" +"One case where this is better than accessing the texture directly is when " +"you want to copy one Decal's textures to another. For example:\n" +"[codeblock]\n" +"for i in Decal.TEXTURE_MAX:\n" +" $NewDecal.set_texture(i, $OldDecal.get_texture(i))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Decal.xml:37 +msgid "" +"Sets the [Texture2D] associated with the specified [enum DecalTexture]. This " +"is a convenience method, in most cases you should access the texture " +"directly. \n" +"For example, instead of [code]$Decal.set_texture(Decal.TEXTURE_ALBEDO, " +"albedo_tex)[/code], use [code]$Decal.texture_albedo = albedo_tex[/code].\n" +"One case where this is better than accessing the texture directly is when " +"you want to copy one Decal's textures to another. For example:\n" +"[codeblock]\n" +"for i in Decal.TEXTURE_MAX:\n" +" $NewDecal.set_texture(i, $OldDecal.get_texture(i))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Decal.xml:49 +msgid "" +"Blends the albedo [Color] of the decal with albedo [Color] of the underlying " +"mesh." +msgstr "" + +#: doc/classes/Decal.xml:52 +msgid "" +"Specifies which [member VisualInstance3D.layers] this decal will project on. " +"By default, Decals affect all layers. This is used so you can specify which " +"types of objects receive the Decal and which do not. This is especially " +"useful so you an ensure that dynamic objects don't accidentally receive a " +"Decal intended for the terrain under them." +msgstr "" + +#: doc/classes/Decal.xml:55 +msgid "Distance from the camera at which the Decal begins to fade away." +msgstr "" + +#: doc/classes/Decal.xml:58 +msgid "" +"If [code]true[/code], decals will smoothly fade away when far from the " +"active [Camera3D] starting at [member distance_fade_begin]. The Decal will " +"fade out over [member distance_fade_length], after which it will be culled " +"and not sent to the shader at all. Use this to reduce the number of active " +"Decals in a scene and thus improve performance." +msgstr "" + +#: doc/classes/Decal.xml:61 +msgid "" +"Distance over which the Decal fades. The Decal becomes slowly more " +"transparent over this distance and is completely invisible at the end." +msgstr "" + +#: doc/classes/Decal.xml:64 +msgid "" +"Energy multiplier for the emission texture. This will make the decal emit " +"light at a higher intensity." +msgstr "" + +#: doc/classes/Decal.xml:67 +msgid "" +"Sets the size of the [AABB] used by the decal. The AABB goes from [code]-" +"extents[/code] to [code]extents[/code]." +msgstr "" + +#: doc/classes/Decal.xml:70 doc/classes/Decal.xml:91 +msgid "" +"Sets the curve over which the decal will fade as the surface gets further " +"from the center of the [AABB]." +msgstr "" + +#: doc/classes/Decal.xml:73 +msgid "Changes the [Color] of the Decal by multiplying it with this value." +msgstr "" + +#: doc/classes/Decal.xml:76 +msgid "" +"Fades the Decal if the angle between the Decal's [AABB] and the target " +"surface becomes too large. A value of [code]0[/code] projects the Decal " +"regardless of angle, a value of [code]1[/code] limits the Decal to surfaces " +"that are nearly perpendicular." +msgstr "" + +#: doc/classes/Decal.xml:79 +msgid "" +"[Texture2D] with the base [Color] of the Decal. Either this or the [member " +"texture_emission] must be set for the Decal to be visible. Use the alpha " +"channel like a mask to smoothly blend the edges of the decal with the " +"underlying object." +msgstr "" + +#: doc/classes/Decal.xml:82 +msgid "" +"[Texture2D] with the emission [Color] of the Decal. Either this or the " +"[member texture_emission] must be set for the Decal to be visible. Use the " +"alpha channel like a mask to smoothly blend the edges of the decal with the " +"underlying object." +msgstr "" + +#: doc/classes/Decal.xml:85 +msgid "" +"[Texture2D] with the per-pixel normalmap for the decal. Use this to add " +"extra detail to decals." +msgstr "" + +#: doc/classes/Decal.xml:88 +msgid "" +"[Texture2D] storing ambient occlusion, roughness, and metallic for the " +"decal. Use this to add extra detail to decals." +msgstr "" + +#: doc/classes/Decal.xml:96 +msgid "[Texture2D] corresponding to [member texture_albedo]." +msgstr "" + +#: doc/classes/Decal.xml:99 +msgid "[Texture2D] corresponding to [member texture_normal]." +msgstr "" + +#: doc/classes/Decal.xml:102 +msgid "[Texture2D] corresponding to [member texture_orm]." +msgstr "" + +#: doc/classes/Decal.xml:105 +msgid "[Texture2D] corresponding to [member texture_emission]." +msgstr "" + +#: doc/classes/Decal.xml:108 +msgid "Max size of [enum DecalTexture] enum." +msgstr "" + #: doc/classes/Dictionary.xml:4 msgid "Dictionary type." msgstr "" @@ -16867,30 +16586,40 @@ msgstr "" #: doc/classes/Dictionary.xml:7 msgid "" "Dictionary type. Associative container which contains values referenced by " -"unique keys. Dictionary are composed of pairs of keys (which must be unique) " -"and values. You can define a dictionary by placing a comma separated list of " -"[code]key: value[/code] pairs in curly braces [code]{}[/code].\n" -"Erasing elements while iterating over them [b]is not supported[/b].\n" +"unique keys. Dictionaries are composed of pairs of keys (which must be " +"unique) and values. Dictionaries will preserve the insertion order when " +"adding elements, even though this may not be reflected when printing the " +"dictionary. In other programming languages, this data structure is sometimes " +"referred to as an hash map or associative array.\n" +"You can define a dictionary by placing a comma-separated list of [code]key: " +"value[/code] pairs in curly braces [code]{}[/code].\n" +"Erasing elements while iterating over them [b]is not supported[/b] and will " +"result in undefined behavior.\n" "Creating a dictionary:\n" "[codeblock]\n" "var my_dir = {} # Creates an empty dictionary.\n" "var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" -"var my_dir = {\n" +"var another_dir = {\n" " key1: value1,\n" " key2: value2,\n" " key3: value3,\n" "}\n" "[/codeblock]\n" -"You can access values of a dictionary by referencing appropriate key in " -"above example [code]points_dir[\"White\"][/code] would return value of 50.\n" +"You can access a dictionary's values by referencing the appropriate key. In " +"the above example, [code]points_dir[\"White\"][/code] will return [code]50[/" +"code]. You can also write [code]points_dir.White[/code], which is " +"equivalent. However, you'll have to use the bracket syntax if the key you're " +"accessing the dictionary with isn't a fixed string (such as a number or " +"variable).\n" "[codeblock]\n" "export(String, \"White\", \"Yellow\", \"Orange\") var my_color\n" "var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" "\n" "func _ready():\n" +" # We can't use dot syntax here as `my_color` is a variable.\n" " var points = points_dir[my_color]\n" "[/codeblock]\n" -"In the above code [code]points[/code] will be assigned the value that is " +"In the above code, [code]points[/code] will be assigned the value that is " "paired with the appropriate color selected in [code]my_color[/code].\n" "Dictionaries can contain more complex data:\n" "[codeblock]\n" @@ -16901,16 +16630,24 @@ msgid "" "assign to it:\n" "[codeblock]\n" "var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" -"var points_dir[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its " +"points_dir[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its " "value.\n" "[/codeblock]\n" "Finally, dictionaries can contain different types of keys and values in the " "same dictionary:\n" "[codeblock]\n" -"var my_dir = {\"String Key\": 5, 4: [1, 2, 3], 7: \"Hello\"} # This is a " -"valid dictionary.\n" +"# This is a valid dictionary.\n" +"# To access the string \"Nested value\" below, use `my_dir.sub_dir.sub_key` " +"or `my_dir[\"sub_dir\"][\"sub_key\"]`.\n" +"# Indexing styles can be mixed and matched depending on your needs.\n" +"var my_dir = {\n" +" \"String Key\": 5,\n" +" 4: [1, 2, 3],\n" +" 7: \"Hello\",\n" +" \"sub_dir\": {\"sub_key\": \"Nested value\"},\n" +"}\n" "[/codeblock]\n" -"[b]Note:[/b] Unlike [Array]s you can't compare dictionaries directly:\n" +"[b]Note:[/b] Unlike [Array]s, you can't compare dictionaries directly:\n" "[codeblock]\n" "array1 = [1, 2, 3]\n" "array2 = [1, 2, 3]\n" @@ -16935,49 +16672,52 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Dictionary.xml:65 +#: doc/classes/Dictionary.xml:75 msgid "" "https://docs.godotengine.org/en/latest/getting_started/scripting/gdscript/" "gdscript_basics.html#dictionary" msgstr "" -#: doc/classes/Dictionary.xml:72 +#: doc/classes/Dictionary.xml:82 msgid "Clear the dictionary, removing all key/value pairs." msgstr "" -#: doc/classes/Dictionary.xml:81 -msgid "Creates a copy of the dictionary, and returns it." +#: doc/classes/Dictionary.xml:91 +msgid "" +"Creates a copy of the dictionary, and returns it. The [code]deep[/code] " +"parameter causes inner dictionaries and arrays to be copied recursively, but " +"does not apply to objects." msgstr "" -#: doc/classes/Dictionary.xml:88 +#: doc/classes/Dictionary.xml:98 msgid "Returns [code]true[/code] if the dictionary is empty." msgstr "" -#: doc/classes/Dictionary.xml:97 +#: doc/classes/Dictionary.xml:107 msgid "" "Erase a dictionary key/value pair by key. Returns [code]true[/code] if the " "given key was present in the dictionary, [code]false[/code] otherwise. Does " "not erase elements while iterating over the dictionary." msgstr "" -#: doc/classes/Dictionary.xml:108 +#: doc/classes/Dictionary.xml:118 msgid "" "Returns the current value for the specified key in the [Dictionary]. If the " "key does not exist, the method returns the value of the optional default " "argument, or [code]null[/code] if it is omitted." msgstr "" -#: doc/classes/Dictionary.xml:117 +#: doc/classes/Dictionary.xml:127 msgid "Returns [code]true[/code] if the dictionary has a given key." msgstr "" -#: doc/classes/Dictionary.xml:126 +#: doc/classes/Dictionary.xml:136 msgid "" "Returns [code]true[/code] if the dictionary has all of the keys in the given " "array." msgstr "" -#: doc/classes/Dictionary.xml:133 +#: doc/classes/Dictionary.xml:143 msgid "" "Returns a hashed integer value representing the dictionary contents. This " "can be used to compare dictionaries by value:\n" @@ -16990,15 +16730,15 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Dictionary.xml:146 +#: doc/classes/Dictionary.xml:156 msgid "Returns the list of keys in the [Dictionary]." msgstr "" -#: doc/classes/Dictionary.xml:153 +#: doc/classes/Dictionary.xml:163 msgid "Returns the size of the dictionary (in pairs)." msgstr "" -#: doc/classes/Dictionary.xml:160 +#: doc/classes/Dictionary.xml:170 msgid "Returns the list of values in the [Dictionary]." msgstr "" @@ -17024,37 +16764,42 @@ msgstr "" #: doc/classes/DirectionalLight3D.xml:16 msgid "" -"Amount of extra bias for shadow splits that are far away. If self-shadowing " -"occurs only on the splits far away, increasing this value can fix them." +"If [code]true[/code], shadow detail is sacrificed in exchange for smoother " +"transitions between splits." msgstr "" #: doc/classes/DirectionalLight3D.xml:19 msgid "" -"If [code]true[/code], shadow detail is sacrificed in exchange for smoother " -"transitions between splits." +"Optimizes shadow rendering for detail versus movement. See [enum " +"ShadowDepthRange]." msgstr "" #: doc/classes/DirectionalLight3D.xml:22 msgid "" -"Optimizes shadow rendering for detail versus movement. See [enum " -"ShadowDepthRange]." +"Proportion of [member directional_shadow_max_distance] at which point the " +"shadow starts to fade. At [member directional_shadow_max_distance] the " +"shadow will disappear." msgstr "" -#: doc/classes/DirectionalLight3D.xml:27 +#: doc/classes/DirectionalLight3D.xml:25 msgid "The maximum distance for shadow splits." msgstr "" -#: doc/classes/DirectionalLight3D.xml:30 +#: doc/classes/DirectionalLight3D.xml:28 msgid "The light's shadow rendering algorithm. See [enum ShadowMode]." msgstr "" -#: doc/classes/DirectionalLight3D.xml:33 +#: doc/classes/DirectionalLight3D.xml:31 doc/classes/RenderingServer.xml:3371 msgid "" -"Can be used to fix special cases of self shadowing when objects are " -"perpendicular to the light." +"Sets the size of the directional shadow pancake. The pancake offsets the " +"start of the shadow's camera frustum to provide a higher effective depth " +"resolution for the shadow. However, a high pancake size can cause artifacts " +"in the shadows of large objects that are close to the edge of the frustum. " +"Reducing the pancake size can help. Setting the size to [code]0[/code] turns " +"off the pancaking effect." msgstr "" -#: doc/classes/DirectionalLight3D.xml:36 +#: doc/classes/DirectionalLight3D.xml:34 msgid "" "The distance from camera to shadow split 1. Relative to [member " "directional_shadow_max_distance]. Only used when [member " @@ -17062,7 +16807,7 @@ msgid "" "[code]SHADOW_PARALLEL_4_SPLITS[/code]." msgstr "" -#: doc/classes/DirectionalLight3D.xml:39 +#: doc/classes/DirectionalLight3D.xml:37 msgid "" "The distance from shadow split 1 to split 2. Relative to [member " "directional_shadow_max_distance]. Only used when [member " @@ -17070,34 +16815,34 @@ msgid "" "[code]SHADOW_PARALLEL_4_SPLITS[/code]." msgstr "" -#: doc/classes/DirectionalLight3D.xml:42 +#: doc/classes/DirectionalLight3D.xml:40 msgid "" "The distance from shadow split 2 to split 3. Relative to [member " "directional_shadow_max_distance]. Only used when [member " "directional_shadow_mode] is [code]SHADOW_PARALLEL_4_SPLITS[/code]." msgstr "" -#: doc/classes/DirectionalLight3D.xml:48 +#: doc/classes/DirectionalLight3D.xml:45 msgid "" "Renders the entire scene's shadow map from an orthogonal point of view. May " "result in blockier shadows on close objects." msgstr "" -#: doc/classes/DirectionalLight3D.xml:51 +#: doc/classes/DirectionalLight3D.xml:48 msgid "Splits the view frustum in 2 areas, each with its own shadow map." msgstr "" -#: doc/classes/DirectionalLight3D.xml:54 +#: doc/classes/DirectionalLight3D.xml:51 msgid "Splits the view frustum in 4 areas, each with its own shadow map." msgstr "" -#: doc/classes/DirectionalLight3D.xml:57 +#: doc/classes/DirectionalLight3D.xml:54 msgid "" "Keeps the shadow stable when the camera moves, at the cost of lower " "effective shadow resolution." msgstr "" -#: doc/classes/DirectionalLight3D.xml:60 +#: doc/classes/DirectionalLight3D.xml:57 msgid "" "Tries to achieve maximum shadow resolution. May result in saw effect on " "shadow edges." @@ -17387,61 +17132,67 @@ msgid "" "dynamic_font.font_data = load(\"res://BarlowCondensed-Bold.ttf\")\n" "dynamic_font.size = 64\n" "$\"Label\".set(\"custom_fonts/font\", dynamic_font)\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] DynamicFont doesn't support features such as right-to-left " +"typesetting, ligatures, text shaping, variable fonts and optional font " +"features yet. If you wish to \"bake\" an optional font feature into a TTF " +"font file, you can use [url=https://fontforge.org/]FontForge[/url] to do so. " +"In FontForge, use [b]File > Generate Fonts[/b], click [b]Options[/b], choose " +"the desired features then generate the font." msgstr "" -#: doc/classes/DynamicFont.xml:25 +#: doc/classes/DynamicFont.xml:26 msgid "Adds a fallback font." msgstr "" -#: doc/classes/DynamicFont.xml:34 +#: doc/classes/DynamicFont.xml:35 msgid "Returns the fallback font at index [code]idx[/code]." msgstr "" -#: doc/classes/DynamicFont.xml:41 +#: doc/classes/DynamicFont.xml:42 msgid "Returns the number of fallback fonts." msgstr "" -#: doc/classes/DynamicFont.xml:50 +#: doc/classes/DynamicFont.xml:51 msgid "" "Returns the spacing for the given [code]type[/code] (see [enum SpacingType])." msgstr "" -#: doc/classes/DynamicFont.xml:59 +#: doc/classes/DynamicFont.xml:60 msgid "Removes the fallback font at index [code]idx[/code]." msgstr "" -#: doc/classes/DynamicFont.xml:70 +#: doc/classes/DynamicFont.xml:71 msgid "Sets the fallback font at index [code]idx[/code]." msgstr "" -#: doc/classes/DynamicFont.xml:81 +#: doc/classes/DynamicFont.xml:82 msgid "" "Sets the spacing for [code]type[/code] (see [enum SpacingType]) to " "[code]value[/code] in pixels (not relative to the font size)." msgstr "" -#: doc/classes/DynamicFont.xml:87 +#: doc/classes/DynamicFont.xml:88 msgid "Extra spacing at the bottom in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:90 +#: doc/classes/DynamicFont.xml:91 msgid "Extra character spacing in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:93 +#: doc/classes/DynamicFont.xml:94 msgid "Extra space spacing in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:96 +#: doc/classes/DynamicFont.xml:97 msgid "Extra spacing at the top in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:99 +#: doc/classes/DynamicFont.xml:100 msgid "The font data." msgstr "" -#: doc/classes/DynamicFont.xml:102 +#: doc/classes/DynamicFont.xml:103 msgid "" "The font outline's color.\n" "[b]Note:[/b] It's recommended to leave this at the default value so that you " @@ -17450,27 +17201,27 @@ msgid "" "outline modulate theme item." msgstr "" -#: doc/classes/DynamicFont.xml:106 +#: doc/classes/DynamicFont.xml:107 msgid "The font outline's thickness in pixels (not relative to the font size)." msgstr "" -#: doc/classes/DynamicFont.xml:109 +#: doc/classes/DynamicFont.xml:110 msgid "The font size in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:114 +#: doc/classes/DynamicFont.xml:115 msgid "Spacing at the top." msgstr "" -#: doc/classes/DynamicFont.xml:117 +#: doc/classes/DynamicFont.xml:118 msgid "Spacing at the bottom." msgstr "" -#: doc/classes/DynamicFont.xml:120 +#: doc/classes/DynamicFont.xml:121 msgid "Character spacing." msgstr "" -#: doc/classes/DynamicFont.xml:123 +#: doc/classes/DynamicFont.xml:124 msgid "Space spacing." msgstr "" @@ -17585,7 +17336,7 @@ msgstr "" msgid "" "Saves the editor feature profile to a file in JSON format. It can then be " "imported using the feature profile manager's [b]Import[/b] button or the " -"[method load_from_file] button." +"[method load_from_file] button." msgstr "" #: doc/classes/EditorFeatureProfile.xml:86 @@ -17799,56 +17550,58 @@ msgstr "" #: doc/classes/EditorFileSystem.xml:7 msgid "" "This object holds information of all resources in the filesystem, their " -"types, etc." +"types, etc.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_resource_filesystem]." msgstr "" -#: doc/classes/EditorFileSystem.xml:18 +#: doc/classes/EditorFileSystem.xml:19 msgid "Gets the type of the file, given the full path." msgstr "" -#: doc/classes/EditorFileSystem.xml:25 +#: doc/classes/EditorFileSystem.xml:26 msgid "Gets the root directory object." msgstr "" -#: doc/classes/EditorFileSystem.xml:34 +#: doc/classes/EditorFileSystem.xml:35 msgid "Returns a view into the filesystem at [code]path[/code]." msgstr "" -#: doc/classes/EditorFileSystem.xml:41 +#: doc/classes/EditorFileSystem.xml:42 msgid "Returns the scan progress for 0 to 1 if the FS is being scanned." msgstr "" -#: doc/classes/EditorFileSystem.xml:48 +#: doc/classes/EditorFileSystem.xml:49 msgid "Returns [code]true[/code] of the filesystem is being scanned." msgstr "" -#: doc/classes/EditorFileSystem.xml:55 +#: doc/classes/EditorFileSystem.xml:56 msgid "Scan the filesystem for changes." msgstr "" -#: doc/classes/EditorFileSystem.xml:62 +#: doc/classes/EditorFileSystem.xml:63 msgid "Check if the source of any imported resource changed." msgstr "" -#: doc/classes/EditorFileSystem.xml:71 +#: doc/classes/EditorFileSystem.xml:72 msgid "" "Update a file information. Call this if an external program (not Godot) " "modified the file." msgstr "" -#: doc/classes/EditorFileSystem.xml:78 +#: doc/classes/EditorFileSystem.xml:79 msgid "Scans the script files and updates the list of custom class names." msgstr "" -#: doc/classes/EditorFileSystem.xml:85 +#: doc/classes/EditorFileSystem.xml:86 msgid "Emitted if the filesystem changed." msgstr "" -#: doc/classes/EditorFileSystem.xml:92 +#: doc/classes/EditorFileSystem.xml:93 msgid "Remitted if a resource is reimported." msgstr "" -#: doc/classes/EditorFileSystem.xml:105 +#: doc/classes/EditorFileSystem.xml:106 msgid "Emitted if the source of any imported file changed." msgstr "" @@ -18052,7 +17805,9 @@ msgid "" "editor. It's used to edit the properties of the selected node. For example, " "you can select a node such as the Sprite2D then edit its transform through " "the inspector tool. The editor inspector is an essential tool in the game " -"development workflow." +"development workflow.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_inspector]." msgstr "" #: doc/classes/EditorInspectorPlugin.xml:4 @@ -18122,95 +17877,97 @@ msgid "" "customizing the window, saving and (re-)loading scenes, rendering mesh " "previews, inspecting and editing resources and objects, and provides access " "to [EditorSettings], [EditorFileSystem], [EditorResourcePreview], " -"[ScriptEditor], the editor viewport, and information about scenes." +"[ScriptEditor], the editor viewport, and information about scenes.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorPlugin.get_editor_interface]." msgstr "" -#: doc/classes/EditorInterface.xml:18 +#: doc/classes/EditorInterface.xml:19 msgid "Edits the given [Resource]." msgstr "" -#: doc/classes/EditorInterface.xml:25 +#: doc/classes/EditorInterface.xml:26 msgid "" "Returns the main container of Godot editor's window. You can use it, for " "example, to retrieve the size of the container and place your controls " "accordingly." msgstr "" -#: doc/classes/EditorInterface.xml:38 +#: doc/classes/EditorInterface.xml:39 msgid "Returns the edited (current) scene's root [Node]." msgstr "" -#: doc/classes/EditorInterface.xml:45 +#: doc/classes/EditorInterface.xml:46 msgid "Returns the [EditorSettings]." msgstr "" -#: doc/classes/EditorInterface.xml:52 +#: doc/classes/EditorInterface.xml:53 msgid "Returns the editor [Viewport]." msgstr "" -#: doc/classes/EditorInterface.xml:71 +#: doc/classes/EditorInterface.xml:72 msgid "Returns an [Array] with the file paths of the currently opened scenes." msgstr "" -#: doc/classes/EditorInterface.xml:78 +#: doc/classes/EditorInterface.xml:79 msgid "Returns the [EditorFileSystem]." msgstr "" -#: doc/classes/EditorInterface.xml:85 +#: doc/classes/EditorInterface.xml:86 msgid "Returns the [EditorResourcePreview]." msgstr "" -#: doc/classes/EditorInterface.xml:92 +#: doc/classes/EditorInterface.xml:93 msgid "Returns the [ScriptEditor]." msgstr "" -#: doc/classes/EditorInterface.xml:105 +#: doc/classes/EditorInterface.xml:106 msgid "Returns the [EditorSelection]." msgstr "" -#: doc/classes/EditorInterface.xml:116 +#: doc/classes/EditorInterface.xml:117 msgid "" "Shows the given property on the given [code]object[/code] in the Editor's " "Inspector dock." msgstr "" -#: doc/classes/EditorInterface.xml:125 +#: doc/classes/EditorInterface.xml:126 msgid "" "Returns the enabled status of a plugin. The plugin name is the same as its " "directory name." msgstr "" -#: doc/classes/EditorInterface.xml:136 +#: doc/classes/EditorInterface.xml:137 msgid "" "Returns mesh previews rendered at the given size as an [Array] of " "[Texture2D]s." msgstr "" -#: doc/classes/EditorInterface.xml:145 +#: doc/classes/EditorInterface.xml:146 msgid "Opens the scene at the given path." msgstr "" -#: doc/classes/EditorInterface.xml:154 +#: doc/classes/EditorInterface.xml:155 msgid "Reloads the scene at the given path." msgstr "" -#: doc/classes/EditorInterface.xml:161 +#: doc/classes/EditorInterface.xml:162 msgid "" "Saves the scene. Returns either [code]OK[/code] or [code]ERR_CANT_CREATE[/" "code] (see [@GlobalScope] constants)." msgstr "" -#: doc/classes/EditorInterface.xml:172 +#: doc/classes/EditorInterface.xml:173 msgid "Saves the scene as a file at [code]path[/code]." msgstr "" -#: doc/classes/EditorInterface.xml:181 +#: doc/classes/EditorInterface.xml:182 msgid "" "Selects the file, with the path provided by [code]file[/code], in the " "FileSystem dock." msgstr "" -#: doc/classes/EditorInterface.xml:208 +#: doc/classes/EditorInterface.xml:209 msgid "" "Sets the enabled status of a plugin. The plugin name is the same as its " "directory name." @@ -18823,57 +18580,57 @@ msgstr "" msgid "Used by the inspector, when the property is checked." msgstr "" -#: doc/classes/EditorProperty.xml:82 +#: doc/classes/EditorProperty.xml:84 msgid "Used by the inspector, when the property must draw with error color." msgstr "" -#: doc/classes/EditorProperty.xml:85 +#: doc/classes/EditorProperty.xml:87 msgid "Used by the inspector, when the property can add keys for animation." msgstr "" -#: doc/classes/EditorProperty.xml:88 +#: doc/classes/EditorProperty.xml:90 msgid "Sets this property to change the label (if you want to show one)." msgstr "" -#: doc/classes/EditorProperty.xml:91 +#: doc/classes/EditorProperty.xml:93 msgid "Used by the inspector, when the property is read-only." msgstr "" -#: doc/classes/EditorProperty.xml:101 +#: doc/classes/EditorProperty.xml:103 msgid "" "Emit it if you want multiple properties modified at the same time. Do not " "use if added via [method EditorInspectorPlugin.parse_property]." msgstr "" -#: doc/classes/EditorProperty.xml:110 +#: doc/classes/EditorProperty.xml:112 msgid "Used by sub-inspectors. Emit it if what was selected was an Object ID." msgstr "" -#: doc/classes/EditorProperty.xml:119 +#: doc/classes/EditorProperty.xml:121 msgid "" "Do not emit this manually, use the [method emit_changed] method instead." msgstr "" -#: doc/classes/EditorProperty.xml:128 +#: doc/classes/EditorProperty.xml:130 msgid "Emitted when a property was checked. Used internally." msgstr "" -#: doc/classes/EditorProperty.xml:135 +#: doc/classes/EditorProperty.xml:143 msgid "" "Emit it if you want to add this value as an animation key (check for keying " "being enabled first)." msgstr "" -#: doc/classes/EditorProperty.xml:144 +#: doc/classes/EditorProperty.xml:152 msgid "Emit it if you want to key a property with a single value." msgstr "" -#: doc/classes/EditorProperty.xml:153 +#: doc/classes/EditorProperty.xml:161 msgid "" "If you want a sub-resource to be edited, emit this signal with the resource." msgstr "" -#: doc/classes/EditorProperty.xml:162 +#: doc/classes/EditorProperty.xml:170 msgid "Emitted when selected. Used internally." msgstr "" @@ -18882,20 +18639,23 @@ msgid "Helper to generate previews of resources or files." msgstr "" #: doc/classes/EditorResourcePreview.xml:7 -msgid "This object is used to generate previews for resources of files." +msgid "" +"This object is used to generate previews for resources of files.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_resource_previewer]." msgstr "" -#: doc/classes/EditorResourcePreview.xml:18 +#: doc/classes/EditorResourcePreview.xml:19 msgid "Create an own, custom preview generator." msgstr "" -#: doc/classes/EditorResourcePreview.xml:27 +#: doc/classes/EditorResourcePreview.xml:28 msgid "" "Check if the resource changed, if so, it will be invalidated and the " "corresponding signal emitted." msgstr "" -#: doc/classes/EditorResourcePreview.xml:42 +#: doc/classes/EditorResourcePreview.xml:43 msgid "" "Queue a resource being edited for preview (using an instance). Once the " "preview is ready, your receiver.receiver_func will be called either " @@ -18904,7 +18664,7 @@ msgid "" "can be anything." msgstr "" -#: doc/classes/EditorResourcePreview.xml:57 +#: doc/classes/EditorResourcePreview.xml:58 msgid "" "Queue a resource file for preview (using a path). Once the preview is ready, " "your receiver.receiver_func will be called either containing the preview " @@ -18912,11 +18672,11 @@ msgid "" "the format: (path,texture,userdata). Userdata can be anything." msgstr "" -#: doc/classes/EditorResourcePreview.xml:66 +#: doc/classes/EditorResourcePreview.xml:67 msgid "Removes a custom preview generator." msgstr "" -#: doc/classes/EditorResourcePreview.xml:75 +#: doc/classes/EditorResourcePreview.xml:76 msgid "" "Emitted if a preview was invalidated (changed). [code]path[/code] " "corresponds to the path of the preview." @@ -19074,7 +18834,7 @@ msgstr "" msgid "" "Scripts extending this class and implementing its [method _run] method can " "be executed from the Script Editor's [b]File > Run[/b] menu option (or by " -"pressing [code]Ctrl+Shift+X[/code]) while the editor is running. This is " +"pressing [kbd]Ctrl + Shift + X[/kbd]) while the editor is running. This is " "useful for adding custom in-editor functionality to Godot. For more complex " "additions, consider using [EditorPlugin]s instead.\n" "[b]Note:[/b] Extending scripts need to have [code]tool[/code] mode enabled.\n" @@ -19114,33 +18874,36 @@ msgid "Manages the SceneTree selection in the editor." msgstr "" #: doc/classes/EditorSelection.xml:7 -msgid "This object manages the SceneTree selection in the editor." +msgid "" +"This object manages the SceneTree selection in the editor.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_selection]." msgstr "" -#: doc/classes/EditorSelection.xml:18 +#: doc/classes/EditorSelection.xml:19 msgid "Adds a node to the selection." msgstr "" -#: doc/classes/EditorSelection.xml:25 +#: doc/classes/EditorSelection.xml:26 msgid "Clear the selection." msgstr "" -#: doc/classes/EditorSelection.xml:32 +#: doc/classes/EditorSelection.xml:33 msgid "Gets the list of selected nodes." msgstr "" -#: doc/classes/EditorSelection.xml:39 +#: doc/classes/EditorSelection.xml:40 msgid "" "Gets the list of selected nodes, optimized for transform operations (i.e. " "moving them, rotating, etc). This list avoids situations where a node is " "selected and also child/grandchild." msgstr "" -#: doc/classes/EditorSelection.xml:48 +#: doc/classes/EditorSelection.xml:49 msgid "Removes a node from the selection." msgstr "" -#: doc/classes/EditorSelection.xml:55 +#: doc/classes/EditorSelection.xml:56 msgid "Emitted when the selection changes." msgstr "" @@ -19157,10 +18920,12 @@ msgid "" "settings.set(prop,value)\n" "settings.get(prop)\n" "list_of_settings = settings.get_property_list()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_editor_settings]." msgstr "" -#: doc/classes/EditorSettings.xml:24 +#: doc/classes/EditorSettings.xml:25 msgid "" "Adds a custom property info to a property. The dictionary must contain:\n" "- [code]name[/code]: [String] (the name of the property)\n" @@ -19182,27 +18947,27 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/EditorSettings.xml:49 +#: doc/classes/EditorSettings.xml:50 msgid "Erase a given setting (pass full property path)." msgstr "" -#: doc/classes/EditorSettings.xml:56 +#: doc/classes/EditorSettings.xml:57 msgid "Gets the list of favorite files and directories for this project." msgstr "" -#: doc/classes/EditorSettings.xml:75 +#: doc/classes/EditorSettings.xml:76 msgid "" "Gets the specific project settings path. Projects all have a unique sub-" "directory inside the settings path where project specific settings are saved." msgstr "" -#: doc/classes/EditorSettings.xml:82 +#: doc/classes/EditorSettings.xml:83 msgid "" "Gets the list of recently visited folders in the file dialog for this " "project." msgstr "" -#: doc/classes/EditorSettings.xml:97 +#: doc/classes/EditorSettings.xml:98 msgid "" "Gets the global settings path for the engine. Inside this path, you can find " "some standard paths such as:\n" @@ -19210,21 +18975,21 @@ msgid "" "[code]settings/templates[/code] - Where export templates are located" msgstr "" -#: doc/classes/EditorSettings.xml:132 +#: doc/classes/EditorSettings.xml:133 msgid "Sets the list of favorite files and directories for this project." msgstr "" -#: doc/classes/EditorSettings.xml:165 +#: doc/classes/EditorSettings.xml:166 msgid "" "Sets the list of recently visited folders in the file dialog for this " "project." msgstr "" -#: doc/classes/EditorSettings.xml:182 +#: doc/classes/EditorSettings.xml:183 msgid "Emitted when editor settings change." msgstr "" -#: doc/classes/EditorSettings.xml:188 +#: doc/classes/EditorSettings.xml:189 msgid "" "Emitted when editor settings change. It used by various editor plugins to " "update their visuals on theme changes or logic on configuration changes." @@ -19967,7 +19732,7 @@ msgid "" "is visible, \"ghost trail\" artifacts will be visible when moving the camera." msgstr "" -#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3476 +#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3563 msgid "Displays a camera feed in the background." msgstr "" @@ -19975,64 +19740,103 @@ msgstr "" msgid "Represents the size of the [enum BGMode] enum." msgstr "" -#: doc/classes/Environment.xml:282 +#: doc/classes/Environment.xml:268 doc/classes/RenderingServer.xml:3569 +msgid "" +"Gather ambient light from whichever source is specified as the background." +msgstr "" + +#: doc/classes/Environment.xml:271 doc/classes/RenderingServer.xml:3572 +msgid "Disable ambient light." +msgstr "" + +#: doc/classes/Environment.xml:274 doc/classes/RenderingServer.xml:3575 +msgid "Specify a specific [Color] for ambient light." +msgstr "" + +#: doc/classes/Environment.xml:277 doc/classes/RenderingServer.xml:3578 +msgid "" +"Gather ambient light from the [Sky] regardless of what the background is." +msgstr "" + +#: doc/classes/Environment.xml:280 doc/classes/RenderingServer.xml:3581 +msgid "Use the background for reflections." +msgstr "" + +#: doc/classes/Environment.xml:283 doc/classes/RenderingServer.xml:3584 +msgid "Disable reflections." +msgstr "" + +#: doc/classes/Environment.xml:286 doc/classes/RenderingServer.xml:3587 +msgid "Use the [Sky] for reflections regardless of what the background is." +msgstr "" + +#: doc/classes/Environment.xml:289 doc/classes/RenderingServer.xml:3590 msgid "" "Additive glow blending mode. Mostly used for particles, glows (bloom), lens " "flare, bright sources." msgstr "" -#: doc/classes/Environment.xml:285 +#: doc/classes/Environment.xml:292 doc/classes/RenderingServer.xml:3593 msgid "" "Screen glow blending mode. Increases brightness, used frequently with bloom." msgstr "" -#: doc/classes/Environment.xml:288 +#: doc/classes/Environment.xml:295 doc/classes/RenderingServer.xml:3596 msgid "" "Soft light glow blending mode. Modifies contrast, exposes shadows and " "highlights (vivid bloom)." msgstr "" -#: doc/classes/Environment.xml:291 +#: doc/classes/Environment.xml:298 doc/classes/RenderingServer.xml:3599 msgid "" "Replace glow blending mode. Replaces all pixels' color by the glow value. " "This can be used to simulate a full-screen blur effect by tweaking the glow " "parameters to match the original image's brightness." msgstr "" -#: doc/classes/Environment.xml:296 +#: doc/classes/Environment.xml:301 doc/classes/RenderingServer.xml:3602 +msgid "" +"Mixes the glow with the underlying color to avoid increasing brightness as " +"much while still maintaining a glow effect." +msgstr "" + +#: doc/classes/Environment.xml:304 msgid "" "Linear tonemapper operator. Reads the linear data and passes it on " "unmodified." msgstr "" -#: doc/classes/Environment.xml:299 +#: doc/classes/Environment.xml:307 msgid "" "Reinhardt tonemapper operator. Performs a variation on rendered pixels' " "colors by this formula: [code]color = color / (1 + color)[/code]." msgstr "" -#: doc/classes/Environment.xml:302 +#: doc/classes/Environment.xml:310 msgid "Filmic tonemapper operator." msgstr "" -#: doc/classes/Environment.xml:305 +#: doc/classes/Environment.xml:313 msgid "Academy Color Encoding System tonemapper operator." msgstr "" -#: doc/classes/Environment.xml:308 +#: doc/classes/Environment.xml:316 msgid "No blur for the screen-space ambient occlusion effect (fastest)." msgstr "" -#: doc/classes/Environment.xml:311 +#: doc/classes/Environment.xml:319 msgid "1×1 blur for the screen-space ambient occlusion effect." msgstr "" -#: doc/classes/Environment.xml:314 +#: doc/classes/Environment.xml:322 msgid "2×2 blur for the screen-space ambient occlusion effect." msgstr "" -#: doc/classes/Environment.xml:317 -msgid "3×3 blur for the screen-space ambient occlusion effect (slowest)." +#: doc/classes/Environment.xml:325 +msgid "" +"3×3 blur for the screen-space ambient occlusion effect. Increases the radius " +"of the blur for a smoother look, but can result in checkerboard-like " +"artifacts." msgstr "" #: doc/classes/Expression.xml:4 @@ -20293,26 +20097,38 @@ msgid "" msgstr "" #: doc/classes/File.xml:299 -msgid "Stores an integer as 16 bits in the file." +msgid "" +"Stores an integer as 16 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, " +"2^16 - 1][/code]." msgstr "" -#: doc/classes/File.xml:308 -msgid "Stores an integer as 32 bits in the file." +#: doc/classes/File.xml:309 +msgid "" +"Stores an integer as 32 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, " +"2^32 - 1][/code]." msgstr "" -#: doc/classes/File.xml:317 -msgid "Stores an integer as 64 bits in the file." +#: doc/classes/File.xml:319 +msgid "" +"Stores an integer as 64 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] must lie in the interval [code][-2^63, " +"2^63 - 1][/code] (i.e. be a valid [int] value)." msgstr "" -#: doc/classes/File.xml:326 -msgid "Stores an integer as 8 bits in the file." +#: doc/classes/File.xml:329 +msgid "" +"Stores an integer as 8 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, 255]" +"[/code]." msgstr "" -#: doc/classes/File.xml:335 +#: doc/classes/File.xml:339 msgid "Stores the given array of bytes in the file." msgstr "" -#: doc/classes/File.xml:346 +#: doc/classes/File.xml:350 msgid "" "Store the given [PackedStringArray] in the file as a line formatted in the " "CSV (Comma-Separated Values) format. You can pass a different delimiter " @@ -20321,45 +20137,45 @@ msgid "" "Text will be encoded as UTF-8." msgstr "" -#: doc/classes/File.xml:356 +#: doc/classes/File.xml:360 msgid "Stores a floating-point number as 64 bits in the file." msgstr "" -#: doc/classes/File.xml:365 +#: doc/classes/File.xml:369 msgid "Stores a floating-point number as 32 bits in the file." msgstr "" -#: doc/classes/File.xml:374 +#: doc/classes/File.xml:378 msgid "" "Stores the given [String] as a line in the file.\n" "Text will be encoded as UTF-8." msgstr "" -#: doc/classes/File.xml:384 +#: doc/classes/File.xml:388 msgid "" "Stores the given [String] as a line in the file in Pascal format (i.e. also " "store the length of the string).\n" "Text will be encoded as UTF-8." msgstr "" -#: doc/classes/File.xml:394 +#: doc/classes/File.xml:398 msgid "Stores a floating-point number in the file." msgstr "" -#: doc/classes/File.xml:403 +#: doc/classes/File.xml:407 msgid "" "Stores the given [String] in the file.\n" "Text will be encoded as UTF-8." msgstr "" -#: doc/classes/File.xml:415 +#: doc/classes/File.xml:419 msgid "" "Stores any Variant value in the file. If [code]full_objects[/code] is " "[code]true[/code], encoding objects is allowed (and can potentially include " "code)." msgstr "" -#: doc/classes/File.xml:421 +#: doc/classes/File.xml:425 msgid "" "If [code]true[/code], the file's endianness is swapped. Use this if you're " "dealing with files written on big-endian machines.\n" @@ -20367,44 +20183,44 @@ msgid "" "reset to [code]false[/code] whenever you open the file." msgstr "" -#: doc/classes/File.xml:427 +#: doc/classes/File.xml:431 msgid "Opens the file for read operations." msgstr "" -#: doc/classes/File.xml:430 +#: doc/classes/File.xml:434 msgid "" "Opens the file for write operations. Create it if the file does not exist " "and truncate if it exists." msgstr "" -#: doc/classes/File.xml:433 +#: doc/classes/File.xml:437 msgid "" "Opens the file for read and write operations. Does not truncate the file." msgstr "" -#: doc/classes/File.xml:436 +#: doc/classes/File.xml:440 msgid "" "Opens the file for read and write operations. Create it if the file does not " "exist and truncate if it exists." msgstr "" -#: doc/classes/File.xml:439 +#: doc/classes/File.xml:443 msgid "Uses the [url=http://fastlz.org/]FastLZ[/url] compression method." msgstr "" -#: doc/classes/File.xml:442 +#: doc/classes/File.xml:446 msgid "" "Uses the [url=https://en.wikipedia.org/wiki/DEFLATE]DEFLATE[/url] " "compression method." msgstr "" -#: doc/classes/File.xml:445 +#: doc/classes/File.xml:449 msgid "" "Uses the [url=https://facebook.github.io/zstd/]Zstandard[/url] compression " "method." msgstr "" -#: doc/classes/File.xml:448 +#: doc/classes/File.xml:452 msgid "Uses the [url=https://www.gzip.org/]gzip[/url] compression method." msgstr "" @@ -20708,7 +20524,7 @@ msgstr "" msgid "" "A GDNative library can implement [NativeScript]s, global functions to call " "with the [GDNative] class, or low-level engine extensions through interfaces " -"such as [ARVRInterfaceGDNative]. The library must be compiled for each " +"such as [XRInterfaceGDNative]. The library must be compiled for each " "platform and architecture that the project will run on." msgstr "" @@ -21663,99 +21479,99 @@ msgid "" "object." msgstr "" -#: doc/classes/GeometryInstance3D.xml:27 +#: doc/classes/GeometryInstance3D.xml:35 msgid "" "Overrides the bounding box of this node with a custom one. To remove it, set " "an [AABB] with all fields set to zero." msgstr "" -#: doc/classes/GeometryInstance3D.xml:38 +#: doc/classes/GeometryInstance3D.xml:46 msgid "" "Sets the [enum GeometryInstance3D.Flags] specified. See [enum " "GeometryInstance3D.Flags] for options." msgstr "" -#: doc/classes/GeometryInstance3D.xml:44 +#: doc/classes/GeometryInstance3D.xml:62 msgid "" "The selected shadow casting flag. See [enum ShadowCastingSetting] for " "possible values." msgstr "" -#: doc/classes/GeometryInstance3D.xml:47 +#: doc/classes/GeometryInstance3D.xml:65 msgid "" "The extra distance added to the GeometryInstance3D's bounding box ([AABB]) " "to increase its cull box." msgstr "" -#: doc/classes/GeometryInstance3D.xml:50 +#: doc/classes/GeometryInstance3D.xml:68 msgid "" "The GeometryInstance3D's max LOD distance.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance3D.xml:54 +#: doc/classes/GeometryInstance3D.xml:72 msgid "" "The GeometryInstance3D's max LOD margin.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance3D.xml:58 +#: doc/classes/GeometryInstance3D.xml:76 msgid "" "The GeometryInstance3D's min LOD distance.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance3D.xml:62 +#: doc/classes/GeometryInstance3D.xml:80 msgid "" "The GeometryInstance3D's min LOD margin.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance3D.xml:66 +#: doc/classes/GeometryInstance3D.xml:84 msgid "" "The material override for the whole geometry.\n" "If a material is assigned to this property, it will be used instead of any " "material set in any material slot of the mesh." msgstr "" -#: doc/classes/GeometryInstance3D.xml:72 +#: doc/classes/GeometryInstance3D.xml:90 msgid "" "If [code]true[/code], this GeometryInstance3D will be used when baking " "lights using a [GIProbe]." msgstr "" -#: doc/classes/GeometryInstance3D.xml:77 +#: doc/classes/GeometryInstance3D.xml:95 msgid "Will not cast any shadows." msgstr "" -#: doc/classes/GeometryInstance3D.xml:80 +#: doc/classes/GeometryInstance3D.xml:98 msgid "" "Will cast shadows from all visible faces in the GeometryInstance3D.\n" "Will take culling into account, so faces not being rendered will not be " "taken into account when shadow casting." msgstr "" -#: doc/classes/GeometryInstance3D.xml:84 +#: doc/classes/GeometryInstance3D.xml:102 msgid "" "Will cast shadows from all visible faces in the GeometryInstance3D.\n" "Will not take culling into account, so all faces will be taken into account " "when shadow casting." msgstr "" -#: doc/classes/GeometryInstance3D.xml:88 +#: doc/classes/GeometryInstance3D.xml:106 msgid "" "Will only show the shadows casted from this object.\n" "In other words, the actual mesh will not be visible, only the shadows casted " "from the mesh will be." msgstr "" -#: doc/classes/GeometryInstance3D.xml:92 +#: doc/classes/GeometryInstance3D.xml:110 msgid "" "Will allow the GeometryInstance3D to be used when baking lights using a " "[GIProbe]." msgstr "" -#: doc/classes/GeometryInstance3D.xml:97 +#: doc/classes/GeometryInstance3D.xml:115 msgid "" "Unused in this class, exposed for consistency with [enum RenderingServer." "InstanceFlags]." @@ -22225,7 +22041,7 @@ msgid "" msgstr "" #: doc/classes/GraphEdit.xml:243 -msgid "Emitted when the user presses [code]Ctrl + C[/code]." +msgid "Emitted when the user presses [kbd]Ctrl + C[/kbd]." msgstr "" #: doc/classes/GraphEdit.xml:248 @@ -22248,65 +22064,65 @@ msgstr "" msgid "Emitted when a GraphNode is selected." msgstr "" -#: doc/classes/GraphEdit.xml:278 -msgid "Emitted when the user presses [code]Ctrl + V[/code]." +#: doc/classes/GraphEdit.xml:284 +msgid "Emitted when the user presses [kbd]Ctrl + V[/kbd]." msgstr "" -#: doc/classes/GraphEdit.xml:285 +#: doc/classes/GraphEdit.xml:291 msgid "" "Emitted when a popup is requested. Happens on right-clicking in the " "GraphEdit. [code]position[/code] is the position of the mouse pointer when " "the signal is sent." msgstr "" -#: doc/classes/GraphEdit.xml:292 +#: doc/classes/GraphEdit.xml:298 msgid "" "Emitted when the scroll offset is changed by the user. It will not be " "emitted when changed in code." msgstr "" -#: doc/classes/GraphEdit.xml:306 +#: doc/classes/GraphEdit.xml:312 msgid "The background drawn under the grid." msgstr "" -#: doc/classes/GraphEdit.xml:309 +#: doc/classes/GraphEdit.xml:315 msgid "Color of major grid lines." msgstr "" -#: doc/classes/GraphEdit.xml:312 +#: doc/classes/GraphEdit.xml:318 msgid "Color of minor grid lines." msgstr "" -#: doc/classes/GraphEdit.xml:315 +#: doc/classes/GraphEdit.xml:321 msgid "The icon for the zoom out button." msgstr "" -#: doc/classes/GraphEdit.xml:318 +#: doc/classes/GraphEdit.xml:324 msgid "The icon for the zoom in button." msgstr "" -#: doc/classes/GraphEdit.xml:321 +#: doc/classes/GraphEdit.xml:327 msgid "" "The horizontal range within which a port can be grabbed (on both sides)." msgstr "" -#: doc/classes/GraphEdit.xml:324 +#: doc/classes/GraphEdit.xml:330 msgid "The vertical range within which a port can be grabbed (on both sides)." msgstr "" -#: doc/classes/GraphEdit.xml:327 +#: doc/classes/GraphEdit.xml:333 msgid "The icon for the zoom reset button." msgstr "" -#: doc/classes/GraphEdit.xml:330 +#: doc/classes/GraphEdit.xml:336 msgid "The fill color of the selection rectangle." msgstr "" -#: doc/classes/GraphEdit.xml:333 +#: doc/classes/GraphEdit.xml:339 msgid "The outline color of the selection rectangle." msgstr "" -#: doc/classes/GraphEdit.xml:336 +#: doc/classes/GraphEdit.xml:342 msgid "The icon for the snap toggle button." msgstr "" @@ -23039,21 +22855,21 @@ msgstr "" msgid "The background of the area to the left of the grabber." msgstr "" -#: doc/classes/HSlider.xml:23 doc/classes/VSlider.xml:27 +#: doc/classes/HSlider.xml:25 doc/classes/VSlider.xml:29 msgid "The texture for the grabber when it's disabled." msgstr "" -#: doc/classes/HSlider.xml:26 doc/classes/VSlider.xml:30 +#: doc/classes/HSlider.xml:28 doc/classes/VSlider.xml:32 msgid "The texture for the grabber when it's focused." msgstr "" -#: doc/classes/HSlider.xml:29 +#: doc/classes/HSlider.xml:31 msgid "" "The background for the whole slider. Determines the height of the " "[code]grabber_area[/code]." msgstr "" -#: doc/classes/HSlider.xml:32 doc/classes/VSlider.xml:36 +#: doc/classes/HSlider.xml:34 doc/classes/VSlider.xml:38 msgid "" "The texture for the ticks, visible when [member Slider.tick_count] is " "greater than 0." @@ -23996,16 +23812,19 @@ msgstr "" msgid "" "Native image datatype. Contains image data, which can be converted to a " "[Texture2D], and several functions to interact with it. The maximum width " -"and height for an [Image] are [constant MAX_WIDTH] and [constant MAX_HEIGHT]." +"and height for an [Image] are [constant MAX_WIDTH] and [constant " +"MAX_HEIGHT].\n" +"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics " +"hardware limitations. Larger images will fail to import." msgstr "" -#: doc/classes/Image.xml:22 +#: doc/classes/Image.xml:23 msgid "" "Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image " "at coordinates [code]dest[/code]." msgstr "" -#: doc/classes/Image.xml:37 +#: doc/classes/Image.xml:38 msgid "" "Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image " "using [code]mask[/code] image at coordinates [code]dst[/code]. Alpha " @@ -24016,13 +23835,13 @@ msgid "" "but they can have different formats." msgstr "" -#: doc/classes/Image.xml:50 +#: doc/classes/Image.xml:51 msgid "" "Copies [code]src_rect[/code] from [code]src[/code] image to this image at " "coordinates [code]dst[/code]." msgstr "" -#: doc/classes/Image.xml:65 +#: doc/classes/Image.xml:66 msgid "" "Blits [code]src_rect[/code] area from [code]src[/code] image to this image " "at the coordinates given by [code]dst[/code]. [code]src[/code] pixel is " @@ -24032,17 +23851,17 @@ msgid "" "different formats." msgstr "" -#: doc/classes/Image.xml:74 +#: doc/classes/Image.xml:75 msgid "" "Converts a bumpmap to a normalmap. A bumpmap provides a height offset per-" "pixel, while a normalmap provides a normal direction per pixel." msgstr "" -#: doc/classes/Image.xml:81 +#: doc/classes/Image.xml:82 msgid "Removes the image's mipmaps." msgstr "" -#: doc/classes/Image.xml:94 +#: doc/classes/Image.xml:95 msgid "" "Compresses the image to use less memory. Can not directly access pixel data " "while the image is compressed. Returns error if the chosen compression mode " @@ -24050,22 +23869,22 @@ msgid "" "constants." msgstr "" -#: doc/classes/Image.xml:115 +#: doc/classes/Image.xml:116 msgid "Converts the image's format. See [enum Format] constants." msgstr "" -#: doc/classes/Image.xml:124 +#: doc/classes/Image.xml:125 msgid "Copies [code]src[/code] image to this image." msgstr "" -#: doc/classes/Image.xml:139 +#: doc/classes/Image.xml:140 msgid "" "Creates an empty image of given size and format. See [enum Format] " "constants. If [code]use_mipmaps[/code] is [code]true[/code] then generate " "mipmaps for this image. See the [method generate_mipmaps]." msgstr "" -#: doc/classes/Image.xml:156 +#: doc/classes/Image.xml:157 msgid "" "Creates a new image of given size and format. See [enum Format] constants. " "Fills the image with the given raw data. If [code]use_mipmaps[/code] is " @@ -24073,49 +23892,49 @@ msgid "" "generate_mipmaps]." msgstr "" -#: doc/classes/Image.xml:167 +#: doc/classes/Image.xml:168 msgid "" "Crops the image to the given [code]width[/code] and [code]height[/code]. If " "the specified size is larger than the current size, the extra area is filled " "with black pixels." msgstr "" -#: doc/classes/Image.xml:174 +#: doc/classes/Image.xml:175 msgid "" "Decompresses the image if it is compressed. Returns an error if decompress " "function is not available." msgstr "" -#: doc/classes/Image.xml:181 +#: doc/classes/Image.xml:182 msgid "" "Returns [constant ALPHA_BLEND] if the image has data for alpha values. " "Returns [constant ALPHA_BIT] if all the alpha values are stored in a single " "bit. Returns [constant ALPHA_NONE] if no data for alpha values is found." msgstr "" -#: doc/classes/Image.xml:196 +#: doc/classes/Image.xml:197 msgid "" "Stretches the image and enlarges it by a factor of 2. No interpolation is " "done." msgstr "" -#: doc/classes/Image.xml:205 +#: doc/classes/Image.xml:206 msgid "Fills the image with a given [Color]." msgstr "" -#: doc/classes/Image.xml:212 +#: doc/classes/Image.xml:213 msgid "Blends low-alpha pixels with nearby pixels." msgstr "" -#: doc/classes/Image.xml:219 +#: doc/classes/Image.xml:220 msgid "Flips the image horizontally." msgstr "" -#: doc/classes/Image.xml:226 +#: doc/classes/Image.xml:227 msgid "Flips the image vertically." msgstr "" -#: doc/classes/Image.xml:235 +#: doc/classes/Image.xml:236 msgid "" "Generates mipmaps for the image. Mipmaps are pre-calculated and lower " "resolution copies of the image. Mipmaps are automatically used if the image " @@ -24124,125 +23943,129 @@ msgid "" "in a custom format or if the image's width/height is 0." msgstr "" -#: doc/classes/Image.xml:242 +#: doc/classes/Image.xml:243 msgid "Returns the image's raw data." msgstr "" -#: doc/classes/Image.xml:249 +#: doc/classes/Image.xml:250 msgid "Returns the image's format. See [enum Format] constants." msgstr "" -#: doc/classes/Image.xml:256 +#: doc/classes/Image.xml:257 msgid "Returns the image's height." msgstr "" -#: doc/classes/Image.xml:265 +#: doc/classes/Image.xml:266 msgid "" "Returns the offset where the image's mipmap with index [code]mipmap[/code] " "is stored in the [code]data[/code] dictionary." msgstr "" -#: doc/classes/Image.xml:276 +#: doc/classes/Image.xml:277 msgid "" "Returns the color of the pixel at [code](x, y)[/code]. This is the same as " "[method get_pixelv], but with two integer arguments instead of a [Vector2] " "argument." msgstr "" -#: doc/classes/Image.xml:285 +#: doc/classes/Image.xml:286 msgid "" "Returns the color of the pixel at [code]src[/code]. This is the same as " "[method get_pixel], but with a [Vector2] argument instead of two integer " "arguments." msgstr "" -#: doc/classes/Image.xml:294 +#: doc/classes/Image.xml:295 msgid "" "Returns a new image that is a copy of the image's area specified with " "[code]rect[/code]." msgstr "" -#: doc/classes/Image.xml:301 +#: doc/classes/Image.xml:302 msgid "Returns the image's size (width and height)." msgstr "" -#: doc/classes/Image.xml:308 +#: doc/classes/Image.xml:309 msgid "" "Returns a [Rect2] enclosing the visible portion of the image, considering " "each pixel with a non-zero alpha channel as visible." msgstr "" -#: doc/classes/Image.xml:315 +#: doc/classes/Image.xml:316 msgid "Returns the image's width." msgstr "" -#: doc/classes/Image.xml:322 +#: doc/classes/Image.xml:323 msgid "Returns [code]true[/code] if the image has generated mipmaps." msgstr "" -#: doc/classes/Image.xml:329 +#: doc/classes/Image.xml:330 msgid "Returns [code]true[/code] if the image is compressed." msgstr "" -#: doc/classes/Image.xml:336 +#: doc/classes/Image.xml:337 msgid "Returns [code]true[/code] if the image has no data." msgstr "" -#: doc/classes/Image.xml:343 +#: doc/classes/Image.xml:344 msgid "" "Returns [code]true[/code] if all the image's pixels have an alpha value of " "0. Returns [code]false[/code] if any pixel has an alpha value higher than 0." msgstr "" -#: doc/classes/Image.xml:352 -msgid "Loads an image from file [code]path[/code]." +#: doc/classes/Image.xml:353 +msgid "" +"Loads an image from file [code]path[/code]. See [url=https://docs." +"godotengine.org/en/latest/getting_started/workflow/assets/importing_images." +"html#supported-image-formats]Supported image formats[/url] for a list of " +"supported image formats and limitations." msgstr "" -#: doc/classes/Image.xml:361 +#: doc/classes/Image.xml:362 msgid "Loads an image from the binary contents of a JPEG file." msgstr "" -#: doc/classes/Image.xml:370 +#: doc/classes/Image.xml:371 msgid "Loads an image from the binary contents of a PNG file." msgstr "" -#: doc/classes/Image.xml:379 +#: doc/classes/Image.xml:380 msgid "Loads an image from the binary contents of a WebP file." msgstr "" -#: doc/classes/Image.xml:386 +#: doc/classes/Image.xml:387 msgid "" "Converts the image's data to represent coordinates on a 3D plane. This is " "used when the image represents a normalmap. A normalmap can add lots of " "detail to a 3D surface without increasing the polygon count." msgstr "" -#: doc/classes/Image.xml:393 +#: doc/classes/Image.xml:394 msgid "" "Multiplies color values with alpha values. Resulting color values for a " "pixel are [code](color * alpha)/256[/code]." msgstr "" -#: doc/classes/Image.xml:406 +#: doc/classes/Image.xml:407 msgid "" "Resizes the image to the given [code]width[/code] and [code]height[/code]. " "New pixels are calculated using [code]interpolation[/code]. See " "[code]interpolation[/code] constants." msgstr "" -#: doc/classes/Image.xml:415 +#: doc/classes/Image.xml:416 msgid "" "Resizes the image to the nearest power of 2 for the width and height. If " "[code]square[/code] is [code]true[/code] then set width and height to be the " "same." msgstr "" -#: doc/classes/Image.xml:422 +#: doc/classes/Image.xml:423 msgid "" "Converts a standard RGBE (Red Green Blue Exponent) image to an sRGB image." msgstr "" -#: doc/classes/Image.xml:433 +#: doc/classes/Image.xml:434 msgid "" "Saves the image as an EXR file to [code]path[/code]. If [code]grayscale[/" "code] is [code]true[/code] and the image has only one channel, it will be " @@ -24251,11 +24074,11 @@ msgid "" "TinyEXR module." msgstr "" -#: doc/classes/Image.xml:442 +#: doc/classes/Image.xml:443 msgid "Saves the image as a PNG file to [code]path[/code]." msgstr "" -#: doc/classes/Image.xml:455 +#: doc/classes/Image.xml:456 msgid "" "Sets the [Color] of the pixel at [code](x, y)[/code]. Example:\n" "[codeblock]\n" @@ -24265,7 +24088,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Image.xml:471 +#: doc/classes/Image.xml:472 msgid "" "Sets the [Color] of the pixel at [code](dst.x, dst.y)[/code]. Note that the " "[code]dst[/code] values must be integers. Example:\n" @@ -24276,51 +24099,51 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Image.xml:483 +#: doc/classes/Image.xml:484 msgid "Shrinks the image by a factor of 2." msgstr "" -#: doc/classes/Image.xml:490 +#: doc/classes/Image.xml:491 msgid "Converts the raw data from the sRGB colorspace to a linear scale." msgstr "" -#: doc/classes/Image.xml:496 +#: doc/classes/Image.xml:497 msgid "" "Holds all of the image's color data in a given format. See [enum Format] " "constants." msgstr "" -#: doc/classes/Image.xml:501 +#: doc/classes/Image.xml:502 msgid "The maximal width allowed for [Image] resources." msgstr "" -#: doc/classes/Image.xml:504 +#: doc/classes/Image.xml:505 msgid "The maximal height allowed for [Image] resources." msgstr "" -#: doc/classes/Image.xml:507 +#: doc/classes/Image.xml:508 msgid "Texture format with a single 8-bit depth representing luminance." msgstr "" -#: doc/classes/Image.xml:510 +#: doc/classes/Image.xml:511 msgid "" "OpenGL texture format with two values, luminance and alpha each stored with " "8 bits." msgstr "" -#: doc/classes/Image.xml:513 +#: doc/classes/Image.xml:514 msgid "" "OpenGL texture format [code]RED[/code] with a single component and a " "bitdepth of 8." msgstr "" -#: doc/classes/Image.xml:516 +#: doc/classes/Image.xml:517 msgid "" "OpenGL texture format [code]RG[/code] with two components and a bitdepth of " "8 for each." msgstr "" -#: doc/classes/Image.xml:519 +#: doc/classes/Image.xml:520 msgid "" "OpenGL texture format [code]RGB[/code] with three components, each with a " "bitdepth of 8.\n" @@ -24328,7 +24151,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:523 +#: doc/classes/Image.xml:524 msgid "" "OpenGL texture format [code]RGBA[/code] with four components, each with a " "bitdepth of 8.\n" @@ -24336,67 +24159,67 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:527 +#: doc/classes/Image.xml:528 msgid "" "OpenGL texture format [code]RGBA[/code] with four components, each with a " "bitdepth of 4." msgstr "" -#: doc/classes/Image.xml:532 +#: doc/classes/Image.xml:533 msgid "" "OpenGL texture format [code]GL_R32F[/code] where there's one component, a 32-" "bit floating-point value." msgstr "" -#: doc/classes/Image.xml:535 +#: doc/classes/Image.xml:536 msgid "" "OpenGL texture format [code]GL_RG32F[/code] where there are two components, " "each a 32-bit floating-point values." msgstr "" -#: doc/classes/Image.xml:538 +#: doc/classes/Image.xml:539 msgid "" "OpenGL texture format [code]GL_RGB32F[/code] where there are three " "components, each a 32-bit floating-point values." msgstr "" -#: doc/classes/Image.xml:541 +#: doc/classes/Image.xml:542 msgid "" "OpenGL texture format [code]GL_RGBA32F[/code] where there are four " "components, each a 32-bit floating-point values." msgstr "" -#: doc/classes/Image.xml:544 +#: doc/classes/Image.xml:545 msgid "" "OpenGL texture format [code]GL_R32F[/code] where there's one component, a 16-" "bit \"half-precision\" floating-point value." msgstr "" -#: doc/classes/Image.xml:547 +#: doc/classes/Image.xml:548 msgid "" "OpenGL texture format [code]GL_RG32F[/code] where there are two components, " "each a 16-bit \"half-precision\" floating-point value." msgstr "" -#: doc/classes/Image.xml:550 +#: doc/classes/Image.xml:551 msgid "" "OpenGL texture format [code]GL_RGB32F[/code] where there are three " "components, each a 16-bit \"half-precision\" floating-point value." msgstr "" -#: doc/classes/Image.xml:553 +#: doc/classes/Image.xml:554 msgid "" "OpenGL texture format [code]GL_RGBA32F[/code] where there are four " "components, each a 16-bit \"half-precision\" floating-point value." msgstr "" -#: doc/classes/Image.xml:556 +#: doc/classes/Image.xml:557 msgid "" "A special OpenGL texture format where the three color components have 9 bits " "of precision and all three share a single 5-bit exponent." msgstr "" -#: doc/classes/Image.xml:559 +#: doc/classes/Image.xml:560 msgid "" "The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " "texture format that uses Block Compression 1, and is the smallest variation " @@ -24406,7 +24229,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:563 +#: doc/classes/Image.xml:564 msgid "" "The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " "texture format that uses Block Compression 2, and color data is interpreted " @@ -24416,7 +24239,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:567 +#: doc/classes/Image.xml:568 msgid "" "The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " "texture format also known as Block Compression 3 or BC3 that contains 64 " @@ -24427,7 +24250,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:571 +#: doc/classes/Image.xml:572 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "Red_Green_Texture_Compression]Red Green Texture Compression[/url], " @@ -24435,7 +24258,7 @@ msgid "" "DXT5 uses for the alpha channel." msgstr "" -#: doc/classes/Image.xml:574 +#: doc/classes/Image.xml:575 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "Red_Green_Texture_Compression]Red Green Texture Compression[/url], " @@ -24443,7 +24266,7 @@ msgid "" "algorithm that DXT5 uses for the alpha channel." msgstr "" -#: doc/classes/Image.xml:577 +#: doc/classes/Image.xml:578 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "BPTC_Texture_Compression]BPTC[/url] compression with unsigned normalized " @@ -24452,21 +24275,21 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:581 +#: doc/classes/Image.xml:582 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "BPTC_Texture_Compression]BPTC[/url] compression with signed floating-point " "RGB components." msgstr "" -#: doc/classes/Image.xml:584 +#: doc/classes/Image.xml:585 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "BPTC_Texture_Compression]BPTC[/url] compression with unsigned floating-point " "RGB components." msgstr "" -#: doc/classes/Image.xml:587 +#: doc/classes/Image.xml:588 msgid "" "Texture format used on PowerVR-supported mobile platforms, uses 2-bit color " "depth with no alpha. More information can be found [url=https://en.wikipedia." @@ -24475,25 +24298,25 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:591 +#: doc/classes/Image.xml:592 msgid "" "Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with an " "alpha component." msgstr "" -#: doc/classes/Image.xml:594 +#: doc/classes/Image.xml:595 msgid "" "Similar to [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with 4-" "bit color depth and no alpha." msgstr "" -#: doc/classes/Image.xml:597 +#: doc/classes/Image.xml:598 msgid "" "Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC4[/url], but with an " "alpha component." msgstr "" -#: doc/classes/Image.xml:600 +#: doc/classes/Image.xml:601 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC1]Ericsson Texture Compression format 1[/" @@ -24501,7 +24324,7 @@ msgid "" "standard. This format cannot store an alpha channel." msgstr "" -#: doc/classes/Image.xml:603 +#: doc/classes/Image.xml:604 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24509,7 +24332,7 @@ msgid "" "unsigned data." msgstr "" -#: doc/classes/Image.xml:606 +#: doc/classes/Image.xml:607 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24517,7 +24340,7 @@ msgid "" "channel of signed data." msgstr "" -#: doc/classes/Image.xml:609 +#: doc/classes/Image.xml:610 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24525,7 +24348,7 @@ msgid "" "of unsigned data." msgstr "" -#: doc/classes/Image.xml:612 +#: doc/classes/Image.xml:613 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24533,7 +24356,7 @@ msgid "" "channels of signed data." msgstr "" -#: doc/classes/Image.xml:615 +#: doc/classes/Image.xml:616 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24543,7 +24366,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:619 +#: doc/classes/Image.xml:620 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24553,7 +24376,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:623 +#: doc/classes/Image.xml:624 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24564,31 +24387,31 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:631 +#: doc/classes/Image.xml:632 msgid "Represents the size of the [enum Format] enum." msgstr "" -#: doc/classes/Image.xml:634 +#: doc/classes/Image.xml:635 msgid "" "Performs nearest-neighbor interpolation. If the image is resized, it will be " "pixelated." msgstr "" -#: doc/classes/Image.xml:637 +#: doc/classes/Image.xml:638 msgid "" "Performs bilinear interpolation. If the image is resized, it will be blurry. " "This mode is faster than [constant INTERPOLATE_CUBIC], but it results in " "lower quality." msgstr "" -#: doc/classes/Image.xml:640 +#: doc/classes/Image.xml:641 msgid "" "Performs cubic interpolation. If the image is resized, it will be blurry. " "This mode often gives better results compared to [constant " "INTERPOLATE_BILINEAR], at the cost of being slower." msgstr "" -#: doc/classes/Image.xml:643 +#: doc/classes/Image.xml:644 msgid "" "Performs bilinear separately on the two most-suited mipmap levels, then " "linearly interpolates between them.\n" @@ -24603,55 +24426,55 @@ msgid "" "a new set will be generated for the resulting image." msgstr "" -#: doc/classes/Image.xml:650 +#: doc/classes/Image.xml:651 msgid "" "Performs Lanczos interpolation. This is the slowest image resizing mode, but " "it typically gives the best results, especially when downscalng images." msgstr "" -#: doc/classes/Image.xml:653 +#: doc/classes/Image.xml:654 msgid "Image does not have alpha." msgstr "" -#: doc/classes/Image.xml:656 +#: doc/classes/Image.xml:657 msgid "Image stores alpha in a single bit." msgstr "" -#: doc/classes/Image.xml:659 +#: doc/classes/Image.xml:660 msgid "Image uses alpha." msgstr "" -#: doc/classes/Image.xml:662 +#: doc/classes/Image.xml:663 msgid "Use S3TC compression." msgstr "" -#: doc/classes/Image.xml:665 +#: doc/classes/Image.xml:666 msgid "Use PVRTC2 compression." msgstr "" -#: doc/classes/Image.xml:668 +#: doc/classes/Image.xml:669 msgid "Use PVRTC4 compression." msgstr "" -#: doc/classes/Image.xml:671 +#: doc/classes/Image.xml:672 msgid "Use ETC compression." msgstr "" -#: doc/classes/Image.xml:674 +#: doc/classes/Image.xml:675 msgid "Use ETC2 compression." msgstr "" -#: doc/classes/Image.xml:689 +#: doc/classes/Image.xml:690 msgid "" "Source texture (before compression) is a regular texture. Default for all " "textures." msgstr "" -#: doc/classes/Image.xml:692 +#: doc/classes/Image.xml:693 msgid "Source texture (before compression) is in sRGB space." msgstr "" -#: doc/classes/Image.xml:695 +#: doc/classes/Image.xml:696 msgid "" "Source texture (before compression) is a normal texture (e.g. it can be " "compressed into two channels)." @@ -24664,22 +24487,24 @@ msgstr "" #: doc/classes/ImageTexture.xml:7 msgid "" "A [Texture2D] based on an [Image]. Can be created from an [Image] with " -"[method create_from_image]." +"[method create_from_image].\n" +"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics " +"hardware limitations. Larger images will fail to import." msgstr "" -#: doc/classes/ImageTexture.xml:18 +#: doc/classes/ImageTexture.xml:19 msgid "Create a new [ImageTexture] from an [Image]." msgstr "" -#: doc/classes/ImageTexture.xml:25 +#: doc/classes/ImageTexture.xml:26 msgid "Returns the format of the [ImageTexture], one of [enum Image.Format]." msgstr "" -#: doc/classes/ImageTexture.xml:34 +#: doc/classes/ImageTexture.xml:35 msgid "Resizes the [ImageTexture] to the specified dimensions." msgstr "" -#: doc/classes/ImageTexture.xml:45 +#: doc/classes/ImageTexture.xml:46 msgid "" "Replaces the texture's data with a new [code]image[/code]. If " "[code]immediate[/code] is [code]true[/code], it will take effect immediately " @@ -24692,20 +24517,29 @@ msgstr "" #: doc/classes/ImmediateGeometry3D.xml:7 msgid "" -"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x." +"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x.\n" +"See also [ArrayMesh], [MeshDataTool] and [SurfaceTool] for procedural " +"geometry generation.\n" +"[b]Note:[/b] ImmediateGeometry3D is best suited to small amounts of mesh " +"data that change every frame. It will be slow when handling large amounts of " +"mesh data. If mesh data doesn't change often, use [ArrayMesh], " +"[MeshDataTool] or [SurfaceTool] instead.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:24 +#: doc/classes/ImmediateGeometry3D.xml:27 msgid "" "Simple helper to draw an UV sphere with given latitude, longitude and radius." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:33 +#: doc/classes/ImmediateGeometry3D.xml:36 msgid "" "Adds a vertex in local coordinate space with the currently set color/uv/etc." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:44 +#: doc/classes/ImmediateGeometry3D.xml:47 msgid "" "Begin drawing (and optionally pass a texture override). When done call " "[method end]. For more information on how this works, search for " @@ -24713,34 +24547,454 @@ msgid "" "For the type of primitive, see the [enum Mesh.PrimitiveType] enum." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:52 +#: doc/classes/ImmediateGeometry3D.xml:55 msgid "Clears everything that was drawn using begin/end." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:59 +#: doc/classes/ImmediateGeometry3D.xml:62 msgid "Ends a drawing context and displays the results." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:68 +#: doc/classes/ImmediateGeometry3D.xml:71 msgid "The current drawing color." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:77 +#: doc/classes/ImmediateGeometry3D.xml:80 msgid "The next vertex's normal." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:86 +#: doc/classes/ImmediateGeometry3D.xml:89 msgid "The next vertex's tangent (and binormal facing)." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:95 +#: doc/classes/ImmediateGeometry3D.xml:98 msgid "The next vertex's UV." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:104 +#: doc/classes/ImmediateGeometry3D.xml:107 msgid "The next vertex's second layer UV." msgstr "" +#: doc/classes/Input.xml:4 +msgid "A singleton that deals with inputs." +msgstr "" + +#: doc/classes/Input.xml:7 +msgid "" +"A singleton that deals with inputs. This includes key presses, mouse buttons " +"and movement, joypads, and input actions. Actions and their events can be " +"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or " +"with the [InputMap] class." +msgstr "" + +#: doc/classes/Input.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/index.html" +msgstr "" + +#: doc/classes/Input.xml:21 +msgid "" +"This will simulate pressing the specified action.\n" +"The strength can be used for non-boolean actions, it's ranged between 0 and " +"1 representing the intensity of the given action.\n" +"[b]Note:[/b] This method will not cause any [method Node._input] calls. It " +"is intended to be used with [method is_action_pressed] and [method " +"is_action_just_pressed]. If you want to simulate [code]_input[/code], use " +"[method parse_input_event] instead." +msgstr "" + +#: doc/classes/Input.xml:32 +msgid "If the specified action is already pressed, this will release it." +msgstr "" + +#: doc/classes/Input.xml:43 +msgid "" +"Adds a new mapping entry (in SDL2 format) to the mapping database. " +"Optionally update already connected devices." +msgstr "" + +#: doc/classes/Input.xml:50 +msgid "" +"If the device has an accelerometer, this will return the acceleration. " +"Otherwise, it returns an empty [Vector3].\n" +"Note this method returns an empty [Vector3] when running from the editor " +"even when your device has an accelerometer. You must export your project to " +"a supported device to read values from the accelerometer." +msgstr "" + +#: doc/classes/Input.xml:60 +msgid "" +"Returns a value between 0 and 1 representing the intensity of the given " +"action. In a joypad, for example, the further away the axis (analog sticks " +"or L2, R2 triggers) is from the dead zone, the closer the value will be to " +"1. If the action is mapped to a control that has no axis as the keyboard, " +"the value returned will be 0 or 1." +msgstr "" + +#: doc/classes/Input.xml:67 +msgid "" +"Returns an [Array] containing the device IDs of all currently connected " +"joypads." +msgstr "" + +#: doc/classes/Input.xml:74 +msgid "Returns the currently assigned cursor shape (see [enum CursorShape])." +msgstr "" + +#: doc/classes/Input.xml:81 +msgid "" +"If the device has an accelerometer, this will return the gravity. Otherwise, " +"it returns an empty [Vector3]." +msgstr "" + +#: doc/classes/Input.xml:88 +msgid "" +"If the device has a gyroscope, this will return the rate of rotation in rad/" +"s around a device's X, Y, and Z axes. Otherwise, it returns an empty " +"[Vector3]." +msgstr "" + +#: doc/classes/Input.xml:99 +msgid "" +"Returns the current value of the joypad axis at given index (see [enum " +"JoystickList])." +msgstr "" + +#: doc/classes/Input.xml:108 +msgid "Returns the index of the provided axis name." +msgstr "" + +#: doc/classes/Input.xml:117 +msgid "" +"Receives a [enum JoystickList] axis and returns its equivalent name as a " +"string." +msgstr "" + +#: doc/classes/Input.xml:126 +msgid "Returns the index of the provided button name." +msgstr "" + +#: doc/classes/Input.xml:135 +msgid "" +"Receives a gamepad button from [enum JoystickList] and returns its " +"equivalent name as a string." +msgstr "" + +#: doc/classes/Input.xml:144 +msgid "" +"Returns a SDL2-compatible device GUID on platforms that use gamepad " +"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise." +msgstr "" + +#: doc/classes/Input.xml:153 +msgid "Returns the name of the joypad at the specified device index." +msgstr "" + +#: doc/classes/Input.xml:162 +msgid "Returns the duration of the current vibration effect in seconds." +msgstr "" + +#: doc/classes/Input.xml:171 +msgid "" +"Returns the strength of the joypad vibration: x is the strength of the weak " +"motor, and y is the strength of the strong motor." +msgstr "" + +#: doc/classes/Input.xml:178 +msgid "" +"Returns the mouse speed for the last time the cursor was moved, and this " +"until the next frame where the mouse moves. This means that even if the " +"mouse is not moving, this function will still return the value of the last " +"motion." +msgstr "" + +#: doc/classes/Input.xml:185 +msgid "" +"If the device has a magnetometer, this will return the magnetic field " +"strength in micro-Tesla for all axes." +msgstr "" + +#: doc/classes/Input.xml:192 +msgid "" +"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at " +"the same time, the bits are added together." +msgstr "" + +#: doc/classes/Input.xml:199 +msgid "Returns the mouse mode. See the constants for more information." +msgstr "" + +#: doc/classes/Input.xml:208 +msgid "" +"Returns [code]true[/code] when the user starts pressing the action event, " +"meaning it's [code]true[/code] only on the frame that the user pressed down " +"the button.\n" +"This is useful for code that needs to run only once when an action is " +"pressed, instead of every frame while it's pressed." +msgstr "" + +#: doc/classes/Input.xml:218 +msgid "" +"Returns [code]true[/code] when the user stops pressing the action event, " +"meaning it's [code]true[/code] only on the frame that the user released the " +"button." +msgstr "" + +#: doc/classes/Input.xml:227 +msgid "" +"Returns [code]true[/code] if you are pressing the action event. Note that if " +"an action has multiple buttons assigned 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." +msgstr "" + +#: doc/classes/Input.xml:238 +msgid "" +"Returns [code]true[/code] if you are pressing the joypad button (see [enum " +"JoystickList])." +msgstr "" + +#: doc/classes/Input.xml:247 +msgid "" +"Returns [code]true[/code] if the system knows the specified device. This " +"means that it sets all button and axis indices exactly as defined in [enum " +"JoystickList]. Unknown joypads are not expected to match these constants, " +"but you can still retrieve events from them." +msgstr "" + +#: doc/classes/Input.xml:256 +msgid "" +"Returns [code]true[/code] if you are pressing the key in the current " +"keyboard layout. You can pass a [enum KeyList] constant." +msgstr "" + +#: doc/classes/Input.xml:265 +msgid "" +"Returns [code]true[/code] if you are pressing the mouse button specified " +"with [enum ButtonList]." +msgstr "" + +#: doc/classes/Input.xml:280 +msgid "" +"Notifies the [Input] singleton that a connection has changed, to update the " +"state for the [code]device[/code] index.\n" +"This is used internally and should not have to be called from user scripts. " +"See [signal joy_connection_changed] for the signal emitted when this is " +"triggered internally." +msgstr "" + +#: doc/classes/Input.xml:290 +msgid "" +"Feeds an [InputEvent] to the game. Can be used to artificially trigger input " +"events from code. Also generates [method Node._input] calls.\n" +"Example:\n" +"[codeblock]\n" +"var a = InputEventAction.new()\n" +"a.action = \"ui_cancel\"\n" +"a.pressed = true\n" +"Input.parse_input_event(a)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Input.xml:306 +msgid "" +"Removes all mappings from the internal database that match the given GUID." +msgstr "" + +#: doc/classes/Input.xml:319 +msgid "" +"Sets a custom mouse cursor image, which is only visible inside the game " +"window. The hotspot can also be specified. Passing [code]null[/code] to the " +"image parameter resets to the system cursor. See [enum CursorShape] for the " +"list of shapes.\n" +"[code]image[/code]'s size must be lower than 256×256.\n" +"[code]hotspot[/code] must be within [code]image[/code]'s size.\n" +"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If " +"using an [AnimatedTexture], only the first frame will be displayed.\n" +"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or " +"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] " +"compression mode can't be used for custom cursors." +msgstr "" + +#: doc/classes/Input.xml:332 +msgid "" +"Sets the default cursor shape to be used in the viewport instead of " +"[constant CURSOR_ARROW].\n" +"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s " +"nodes, use [member Control.mouse_default_cursor_shape] instead.\n" +"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update " +"cursor immediately." +msgstr "" + +#: doc/classes/Input.xml:343 +msgid "Sets the mouse mode. See the constants for more information." +msgstr "" + +#: doc/classes/Input.xml:352 +msgid "" +"Enables or disables the accumulation of similar input events sent by the " +"operating system. When input accumulation is enabled, all input events " +"generated during a frame will be merged and emitted when the frame is done " +"rendering. Therefore, this limits the number of input method calls per " +"second to the rendering FPS.\n" +"Input accumulation is enabled by default. It can be disabled to get slightly " +"more precise/reactive input at the cost of increased CPU usage. In " +"applications where drawing freehand lines is required, input accumulation " +"should generally be disabled while the user is drawing the line to get " +"results that closely follow the actual input." +msgstr "" + +#: doc/classes/Input.xml:368 +msgid "" +"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a " +"strong and a weak one. [code]weak_magnitude[/code] is the strength of the " +"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the " +"strength of the strong motor (between 0 and 1). [code]duration[/code] is the " +"duration of the effect in seconds (a duration of 0 will try to play the " +"vibration indefinitely).\n" +"[b]Note:[/b] Not every hardware is compatible with long effect durations; it " +"is recommended to restart an effect if it has to be played for more than a " +"few seconds." +msgstr "" + +#: doc/classes/Input.xml:378 +msgid "Stops the vibration of the joypad." +msgstr "" + +#: doc/classes/Input.xml:387 +msgid "" +"Vibrate Android and iOS devices.\n" +"[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS " +"does not support duration." +msgstr "" + +#: doc/classes/Input.xml:397 +msgid "Sets the mouse position to the specified vector." +msgstr "" + +#: doc/classes/Input.xml:408 +msgid "Emitted when a joypad device has been connected or disconnected." +msgstr "" + +#: doc/classes/Input.xml:414 +msgid "Makes the mouse cursor visible if it is hidden." +msgstr "" + +#: doc/classes/Input.xml:417 +msgid "Makes the mouse cursor hidden if it is visible." +msgstr "" + +#: doc/classes/Input.xml:420 +msgid "" +"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." +msgstr "" + +#: doc/classes/Input.xml:423 +msgid "Makes the mouse cursor visible but confines it to the game window." +msgstr "" + +#: doc/classes/Input.xml:426 +msgid "Arrow cursor. Standard, default pointing cursor." +msgstr "" + +#: doc/classes/Input.xml:429 +msgid "" +"I-beam cursor. Usually used to show where the text cursor will appear when " +"the mouse is clicked." +msgstr "" + +#: doc/classes/Input.xml:432 +msgid "" +"Pointing hand cursor. Usually used to indicate the pointer is over a link or " +"other interactable item." +msgstr "" + +#: doc/classes/Input.xml:435 +msgid "" +"Cross cursor. Typically appears over regions in which a drawing operation " +"can be performed or for selections." +msgstr "" + +#: doc/classes/Input.xml:438 +msgid "" +"Wait cursor. Indicates that the application is busy performing an operation. " +"This cursor shape denotes that the application is still usable during the " +"operation." +msgstr "" + +#: doc/classes/Input.xml:441 +msgid "" +"Busy cursor. Indicates that the application is busy performing an operation. " +"This cursor shape denotes that the application isn't usable during the " +"operation (e.g. something is blocking its main thread)." +msgstr "" + +#: doc/classes/Input.xml:444 +msgid "Drag cursor. Usually displayed when dragging something." +msgstr "" + +#: doc/classes/Input.xml:447 +msgid "" +"Can drop cursor. Usually displayed when dragging something to indicate that " +"it can be dropped at the current position." +msgstr "" + +#: doc/classes/Input.xml:450 +msgid "" +"Forbidden cursor. Indicates that the current action is forbidden (for " +"example, when dragging something) or that the control at a position is " +"disabled." +msgstr "" + +#: doc/classes/Input.xml:453 +msgid "" +"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the " +"user they can resize the window or the panel vertically." +msgstr "" + +#: doc/classes/Input.xml:456 +msgid "" +"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells " +"the user they can resize the window or the panel horizontally." +msgstr "" + +#: doc/classes/Input.xml:459 +msgid "" +"Window resize mouse cursor. The cursor is a double-headed arrow that goes " +"from the bottom left to the top right. It tells the user they can resize the " +"window or the panel both horizontally and vertically." +msgstr "" + +#: doc/classes/Input.xml:462 +msgid "" +"Window resize mouse cursor. The cursor is a double-headed arrow that goes " +"from the top left to the bottom right, the opposite of [constant " +"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel " +"both horizontally and vertically." +msgstr "" + +#: doc/classes/Input.xml:465 +msgid "Move cursor. Indicates that something can be moved." +msgstr "" + +#: doc/classes/Input.xml:468 +msgid "" +"Vertical split mouse cursor. On Windows, it's the same as [constant " +"CURSOR_VSIZE]." +msgstr "" + +#: doc/classes/Input.xml:471 +msgid "" +"Horizontal split mouse cursor. On Windows, it's the same as [constant " +"CURSOR_HSIZE]." +msgstr "" + +#: doc/classes/Input.xml:474 +msgid "Help cursor. Usually a question mark." +msgstr "" + #: doc/classes/InputEvent.xml:4 msgid "Generic input event." msgstr "" @@ -24946,8 +25200,8 @@ msgstr "" #: doc/classes/InputEventKey.xml:17 msgid "" -"Returns the keycode combined with modifier keys such as [code]Shift[/code] " -"or [code]Alt[/code]. See also [InputEventWithModifiers].\n" +"Returns the keycode combined with modifier keys such as [kbd]Shift[/kbd] or " +"[kbd]Alt[/kbd]. See also [InputEventWithModifiers].\n" "To get a human-readable representation of the [InputEventKey] with " "modifiers, use [code]OS.get_keycode_string(event." "get_keycode_with_modifiers())[/code] where [code]event[/code] is the " @@ -24956,8 +25210,8 @@ msgstr "" #: doc/classes/InputEventKey.xml:25 msgid "" -"Returns the physical keycode combined with modifier keys such as " -"[code]Shift[/code] or [code]Alt[/code]. See also [InputEventWithModifiers].\n" +"Returns the physical keycode combined with modifier keys such as [kbd]Shift[/" +"kbd] or [kbd]Alt[/kbd]. See also [InputEventWithModifiers].\n" "To get a human-readable representation of the [InputEventKey] with " "modifiers, use [code]OS.get_keycode_string(event." "get_physical_keycode_with_modifiers())[/code] where [code]event[/code] is " @@ -25164,448 +25418,28 @@ msgstr "" #: doc/classes/InputEventWithModifiers.xml:7 msgid "" -"Contains keys events information with modifiers support like [code]Shift[/" -"code] or [code]Alt[/code]. See [method Node._input]." +"Contains keys events information with modifiers support like [kbd]Shift[/" +"kbd] or [kbd]Alt[/kbd]. See [method Node._input]." msgstr "" #: doc/classes/InputEventWithModifiers.xml:16 -msgid "State of the [code]Alt[/code] modifier." +msgid "State of the [kbd]Alt[/kbd] modifier." msgstr "" #: doc/classes/InputEventWithModifiers.xml:19 -msgid "State of the [code]Command[/code] modifier." +msgid "State of the [kbd]Cmd[/kbd] modifier." msgstr "" #: doc/classes/InputEventWithModifiers.xml:22 -msgid "State of the [code]Ctrl[/code] modifier." +msgid "State of the [kbd]Ctrl[/kbd] modifier." msgstr "" #: doc/classes/InputEventWithModifiers.xml:25 -msgid "State of the [code]Meta[/code] modifier." +msgid "State of the [kbd]Meta[/kbd] modifier." msgstr "" #: doc/classes/InputEventWithModifiers.xml:28 -msgid "State of the [code]Shift[/code] modifier." -msgstr "" - -#: doc/classes/InputFilter.xml:4 -msgid "A singleton that deals with inputs." -msgstr "" - -#: doc/classes/InputFilter.xml:7 -msgid "" -"A singleton that deals with inputs. This includes key presses, mouse buttons " -"and movement, joypads, and input actions. Actions and their events can be " -"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or " -"with the [InputMap] class." -msgstr "" - -#: doc/classes/InputFilter.xml:10 -msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/index.html" -msgstr "" - -#: doc/classes/InputFilter.xml:21 -msgid "" -"This will simulate pressing the specified action.\n" -"The strength can be used for non-boolean actions, it's ranged between 0 and " -"1 representing the intensity of the given action.\n" -"[b]Note:[/b] This method will not cause any [method Node._input] calls. It " -"is intended to be used with [method is_action_pressed] and [method " -"is_action_just_pressed]. If you want to simulate [code]_input[/code], use " -"[method parse_input_event] instead." -msgstr "" - -#: doc/classes/InputFilter.xml:32 -msgid "If the specified action is already pressed, this will release it." -msgstr "" - -#: doc/classes/InputFilter.xml:43 -msgid "" -"Adds a new mapping entry (in SDL2 format) to the mapping database. " -"Optionally update already connected devices." -msgstr "" - -#: doc/classes/InputFilter.xml:50 -msgid "" -"If the device has an accelerometer, this will return the acceleration. " -"Otherwise, it returns an empty [Vector3].\n" -"Note this method returns an empty [Vector3] when running from the editor " -"even when your device has an accelerometer. You must export your project to " -"a supported device to read values from the accelerometer." -msgstr "" - -#: doc/classes/InputFilter.xml:60 -msgid "" -"Returns a value between 0 and 1 representing the intensity of the given " -"action. In a joypad, for example, the further away the axis (analog sticks " -"or L2, R2 triggers) is from the dead zone, the closer the value will be to " -"1. If the action is mapped to a control that has no axis as the keyboard, " -"the value returned will be 0 or 1." -msgstr "" - -#: doc/classes/InputFilter.xml:67 -msgid "" -"Returns an [Array] containing the device IDs of all currently connected " -"joypads." -msgstr "" - -#: doc/classes/InputFilter.xml:74 -msgid "Returns the currently assigned cursor shape (see [enum CursorShape])." -msgstr "" - -#: doc/classes/InputFilter.xml:81 -msgid "" -"If the device has an accelerometer, this will return the gravity. Otherwise, " -"it returns an empty [Vector3]." -msgstr "" - -#: doc/classes/InputFilter.xml:88 -msgid "" -"If the device has a gyroscope, this will return the rate of rotation in rad/" -"s around a device's X, Y, and Z axes. Otherwise, it returns an empty " -"[Vector3]." -msgstr "" - -#: doc/classes/InputFilter.xml:99 -msgid "" -"Returns the current value of the joypad axis at given index (see [enum " -"JoystickList])." -msgstr "" - -#: doc/classes/InputFilter.xml:108 -msgid "Returns the index of the provided axis name." -msgstr "" - -#: doc/classes/InputFilter.xml:117 -msgid "" -"Receives a [enum JoystickList] axis and returns its equivalent name as a " -"string." -msgstr "" - -#: doc/classes/InputFilter.xml:126 -msgid "Returns the index of the provided button name." -msgstr "" - -#: doc/classes/InputFilter.xml:135 -msgid "" -"Receives a gamepad button from [enum JoystickList] and returns its " -"equivalent name as a string." -msgstr "" - -#: doc/classes/InputFilter.xml:144 -msgid "" -"Returns a SDL2-compatible device GUID on platforms that use gamepad " -"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise." -msgstr "" - -#: doc/classes/InputFilter.xml:153 -msgid "Returns the name of the joypad at the specified device index." -msgstr "" - -#: doc/classes/InputFilter.xml:162 -msgid "Returns the duration of the current vibration effect in seconds." -msgstr "" - -#: doc/classes/InputFilter.xml:171 -msgid "" -"Returns the strength of the joypad vibration: x is the strength of the weak " -"motor, and y is the strength of the strong motor." -msgstr "" - -#: doc/classes/InputFilter.xml:178 -msgid "" -"Returns the mouse speed for the last time the cursor was moved, and this " -"until the next frame where the mouse moves. This means that even if the " -"mouse is not moving, this function will still return the value of the last " -"motion." -msgstr "" - -#: doc/classes/InputFilter.xml:185 -msgid "" -"If the device has a magnetometer, this will return the magnetic field " -"strength in micro-Tesla for all axes." -msgstr "" - -#: doc/classes/InputFilter.xml:192 -msgid "" -"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at " -"the same time, the bits are added together." -msgstr "" - -#: doc/classes/InputFilter.xml:199 -msgid "Returns the mouse mode. See the constants for more information." -msgstr "" - -#: doc/classes/InputFilter.xml:208 -msgid "" -"Returns [code]true[/code] when the user starts pressing the action event, " -"meaning it's [code]true[/code] only on the frame that the user pressed down " -"the button.\n" -"This is useful for code that needs to run only once when an action is " -"pressed, instead of every frame while it's pressed." -msgstr "" - -#: doc/classes/InputFilter.xml:218 -msgid "" -"Returns [code]true[/code] when the user stops pressing the action event, " -"meaning it's [code]true[/code] only on the frame that the user released the " -"button." -msgstr "" - -#: doc/classes/InputFilter.xml:227 -msgid "" -"Returns [code]true[/code] if you are pressing the action event. Note that if " -"an action has multiple buttons assigned 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." -msgstr "" - -#: doc/classes/InputFilter.xml:238 -msgid "" -"Returns [code]true[/code] if you are pressing the joypad button (see [enum " -"JoystickList])." -msgstr "" - -#: doc/classes/InputFilter.xml:247 -msgid "" -"Returns [code]true[/code] if the system knows the specified device. This " -"means that it sets all button and axis indices exactly as defined in [enum " -"JoystickList]. Unknown joypads are not expected to match these constants, " -"but you can still retrieve events from them." -msgstr "" - -#: doc/classes/InputFilter.xml:256 -msgid "" -"Returns [code]true[/code] if you are pressing the key in the current " -"keyboard layout. You can pass a [enum KeyList] constant." -msgstr "" - -#: doc/classes/InputFilter.xml:265 -msgid "" -"Returns [code]true[/code] if you are pressing the mouse button specified " -"with [enum ButtonList]." -msgstr "" - -#: doc/classes/InputFilter.xml:280 -msgid "" -"Notifies the [InputFilter] singleton that a connection has changed, to " -"update the state for the [code]device[/code] index.\n" -"This is used internally and should not have to be called from user scripts. " -"See [signal joy_connection_changed] for the signal emitted when this is " -"triggered internally." -msgstr "" - -#: doc/classes/InputFilter.xml:290 -msgid "" -"Feeds an [InputEvent] to the game. Can be used to artificially trigger input " -"events from code. Also generates [method Node._input] calls.\n" -"Example:\n" -"[codeblock]\n" -"var a = InputEventAction.new()\n" -"a.action = \"ui_cancel\"\n" -"a.pressed = true\n" -"InputFilter.parse_input_event(a)\n" -"[/codeblock]" -msgstr "" - -#: doc/classes/InputFilter.xml:306 -msgid "" -"Removes all mappings from the internal database that match the given GUID." -msgstr "" - -#: doc/classes/InputFilter.xml:319 -msgid "" -"Sets a custom mouse cursor image, which is only visible inside the game " -"window. The hotspot can also be specified. Passing [code]null[/code] to the " -"image parameter resets to the system cursor. See [enum CursorShape] for the " -"list of shapes.\n" -"[code]image[/code]'s size must be lower than 256×256.\n" -"[code]hotspot[/code] must be within [code]image[/code]'s size.\n" -"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If " -"using an [AnimatedTexture], only the first frame will be displayed.\n" -"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or " -"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] " -"compression mode can't be used for custom cursors." -msgstr "" - -#: doc/classes/InputFilter.xml:332 -msgid "" -"Sets the default cursor shape to be used in the viewport instead of " -"[constant CURSOR_ARROW].\n" -"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s " -"nodes, use [member Control.mouse_default_cursor_shape] instead.\n" -"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update " -"cursor immediately." -msgstr "" - -#: doc/classes/InputFilter.xml:343 -msgid "Sets the mouse mode. See the constants for more information." -msgstr "" - -#: doc/classes/InputFilter.xml:352 -msgid "" -"Enables or disables the accumulation of similar input events sent by the " -"operating system. When input accumulation is enabled, all input events " -"generated during a frame will be merged and emitted when the frame is done " -"rendering. Therefore, this limits the number of input method calls per " -"second to the rendering FPS.\n" -"Input accumulation is enabled by default. It can be disabled to get slightly " -"more precise/reactive input at the cost of increased CPU usage. In " -"applications where drawing freehand lines is required, input accumulation " -"should generally be disabled while the user is drawing the line to get " -"results that closely follow the actual input." -msgstr "" - -#: doc/classes/InputFilter.xml:368 -msgid "" -"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a " -"strong and a weak one. [code]weak_magnitude[/code] is the strength of the " -"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the " -"strength of the strong motor (between 0 and 1). [code]duration[/code] is the " -"duration of the effect in seconds (a duration of 0 will try to play the " -"vibration indefinitely).\n" -"[b]Note:[/b] Not every hardware is compatible with long effect durations; it " -"is recommended to restart an effect if it has to be played for more than a " -"few seconds." -msgstr "" - -#: doc/classes/InputFilter.xml:378 -msgid "Stops the vibration of the joypad." -msgstr "" - -#: doc/classes/InputFilter.xml:387 -msgid "" -"Vibrate Android and iOS devices.\n" -"[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS " -"does not support duration." -msgstr "" - -#: doc/classes/InputFilter.xml:397 -msgid "Sets the mouse position to the specified vector." -msgstr "" - -#: doc/classes/InputFilter.xml:408 -msgid "Emitted when a joypad device has been connected or disconnected." -msgstr "" - -#: doc/classes/InputFilter.xml:414 -msgid "Makes the mouse cursor visible if it is hidden." -msgstr "" - -#: doc/classes/InputFilter.xml:417 -msgid "Makes the mouse cursor hidden if it is visible." -msgstr "" - -#: doc/classes/InputFilter.xml:420 -msgid "" -"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." -msgstr "" - -#: doc/classes/InputFilter.xml:423 -msgid "Makes the mouse cursor visible but confines it to the game window." -msgstr "" - -#: doc/classes/InputFilter.xml:426 -msgid "Arrow cursor. Standard, default pointing cursor." -msgstr "" - -#: doc/classes/InputFilter.xml:429 -msgid "" -"I-beam cursor. Usually used to show where the text cursor will appear when " -"the mouse is clicked." -msgstr "" - -#: doc/classes/InputFilter.xml:432 -msgid "" -"Pointing hand cursor. Usually used to indicate the pointer is over a link or " -"other interactable item." -msgstr "" - -#: doc/classes/InputFilter.xml:435 -msgid "" -"Cross cursor. Typically appears over regions in which a drawing operation " -"can be performed or for selections." -msgstr "" - -#: doc/classes/InputFilter.xml:438 -msgid "" -"Wait cursor. Indicates that the application is busy performing an operation. " -"This cursor shape denotes that the application is still usable during the " -"operation." -msgstr "" - -#: doc/classes/InputFilter.xml:441 -msgid "" -"Busy cursor. Indicates that the application is busy performing an operation. " -"This cursor shape denotes that the application isn't usable during the " -"operation (e.g. something is blocking its main thread)." -msgstr "" - -#: doc/classes/InputFilter.xml:444 -msgid "Drag cursor. Usually displayed when dragging something." -msgstr "" - -#: doc/classes/InputFilter.xml:447 -msgid "" -"Can drop cursor. Usually displayed when dragging something to indicate that " -"it can be dropped at the current position." -msgstr "" - -#: doc/classes/InputFilter.xml:450 -msgid "" -"Forbidden cursor. Indicates that the current action is forbidden (for " -"example, when dragging something) or that the control at a position is " -"disabled." -msgstr "" - -#: doc/classes/InputFilter.xml:453 -msgid "" -"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the " -"user they can resize the window or the panel vertically." -msgstr "" - -#: doc/classes/InputFilter.xml:456 -msgid "" -"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells " -"the user they can resize the window or the panel horizontally." -msgstr "" - -#: doc/classes/InputFilter.xml:459 -msgid "" -"Window resize mouse cursor. The cursor is a double-headed arrow that goes " -"from the bottom left to the top right. It tells the user they can resize the " -"window or the panel both horizontally and vertically." -msgstr "" - -#: doc/classes/InputFilter.xml:462 -msgid "" -"Window resize mouse cursor. The cursor is a double-headed arrow that goes " -"from the top left to the bottom right, the opposite of [constant " -"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel " -"both horizontally and vertically." -msgstr "" - -#: doc/classes/InputFilter.xml:465 -msgid "Move cursor. Indicates that something can be moved." -msgstr "" - -#: doc/classes/InputFilter.xml:468 -msgid "" -"Vertical split mouse cursor. On Windows, it's the same as [constant " -"CURSOR_VSIZE]." -msgstr "" - -#: doc/classes/InputFilter.xml:471 -msgid "" -"Horizontal split mouse cursor. On Windows, it's the same as [constant " -"CURSOR_HSIZE]." -msgstr "" - -#: doc/classes/InputFilter.xml:474 -msgid "Help cursor. Usually a question mark." +msgid "State of the [kbd]Shift[/kbd] modifier." msgstr "" #: doc/classes/InputMap.xml:4 @@ -25876,14 +25710,6 @@ msgstr "" msgid "Address type: Any." msgstr "" -#: doc/classes/IP_Unix.xml:4 -msgid "UNIX IP support. See [IP]." -msgstr "" - -#: doc/classes/IP_Unix.xml:7 -msgid "UNIX-specific implementation of IP support functions. See [IP]." -msgstr "" - #: doc/classes/ItemList.xml:4 msgid "" "Control that provides a list of selectable items (and/or icons) in a single " @@ -25898,7 +25724,7 @@ msgid "" "Selectable items in the list may be selected or deselected and multiple " "selection may be enabled. Selection with right mouse button may also be " "enabled to allow use of popup context menus. Items may also be \"activated\" " -"by double-clicking them or by pressing Enter.\n" +"by double-clicking them or by pressing [kbd]Enter[/kbd].\n" "Item text only supports single-line strings, newline characters (e.g. " "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " @@ -26057,7 +25883,7 @@ msgstr "" msgid "" "Disables (or enables) the item at the specified index.\n" "Disabled items cannot be selected and do not trigger activation signals " -"(when double-clicking or pressing Enter)." +"(when double-clicking or pressing [kbd]Enter[/kbd])." msgstr "" #: doc/classes/ItemList.xml:292 @@ -26192,7 +26018,7 @@ msgstr "" #: doc/classes/ItemList.xml:455 msgid "" "Triggered when specified list item is activated via double-clicking or by " -"pressing Enter." +"pressing [kbd]Enter[/kbd]." msgstr "" #: doc/classes/ItemList.xml:464 @@ -26242,7 +26068,9 @@ msgid "Only allow selecting a single item." msgstr "" #: doc/classes/ItemList.xml:511 -msgid "Allows selecting multiple items by holding Ctrl or Shift." +msgid "" +"Allows selecting multiple items by holding [kbd]Ctrl[/kbd] or [kbd]Shift[/" +"kbd]." msgstr "" #: doc/classes/ItemList.xml:516 @@ -27233,59 +27061,91 @@ msgid "" msgstr "" #: doc/classes/Light3D.xml:39 -msgid "The light's bake mode. See [enum BakeMode]." +msgid "" +"Angular size of the light in degrees. Only available for " +"[DirectionalLight3D]s. For reference, the sun from earth is approximately " +"[code]0.5[/code]." msgstr "" #: doc/classes/Light3D.xml:42 -msgid "The light's color." +msgid "The light's bake mode. See [enum BakeMode]." msgstr "" #: doc/classes/Light3D.xml:45 -msgid "The light will affect objects in the selected layers." +msgid "The light's color." msgstr "" #: doc/classes/Light3D.xml:48 -msgid "The light's strength multiplier." +msgid "The light will affect objects in the selected layers." msgstr "" #: doc/classes/Light3D.xml:51 +msgid "The light's strength multiplier." +msgstr "" + +#: doc/classes/Light3D.xml:54 msgid "" "Secondary multiplier used with indirect light (light bounces). Used with " "[GIProbe]." msgstr "" -#: doc/classes/Light3D.xml:54 +#: doc/classes/Light3D.xml:57 msgid "" "If [code]true[/code], the light's effect is reversed, darkening areas and " "casting bright shadows." msgstr "" -#: doc/classes/Light3D.xml:57 +#: doc/classes/Light3D.xml:60 +msgid "" +"[Texture2D] projected by light. [member shadow_enabled] must be on for the " +"projector to work. Light projectors make the light appear as if it is " +"shining through a colored but transparent object, almost like light shining " +"through stained glass." +msgstr "" + +#: doc/classes/Light3D.xml:63 +msgid "" +"The size of the light in Godot units. Only available for [OmniLight3D]s and " +"[SpotLight3D]s." +msgstr "" + +#: doc/classes/Light3D.xml:66 msgid "" "The intensity of the specular blob in objects affected by the light. At " "[code]0[/code] the light becomes a pure diffuse light." msgstr "" -#: doc/classes/Light3D.xml:60 +#: doc/classes/Light3D.xml:69 msgid "" "Used to adjust shadow appearance. Too small a value results in self-" "shadowing, while too large a value causes shadows to separate from casters. " "Adjust as needed." msgstr "" -#: doc/classes/Light3D.xml:63 -msgid "The color of shadows cast by this light." +#: doc/classes/Light3D.xml:72 doc/classes/RenderingServer.xml:3374 +msgid "" +"Blurs the edges of the shadow. Can be used to hide pixel artifacts in low " +"resolution shadow maps. A high value can make shadows appear grainy and can " +"cause other unwanted artifacts. Try to keep as near default as possible." msgstr "" -#: doc/classes/Light3D.xml:66 -msgid "Attempts to reduce [member shadow_bias] gap." +#: doc/classes/Light3D.xml:75 +msgid "The color of shadows cast by this light." msgstr "" -#: doc/classes/Light3D.xml:69 +#: doc/classes/Light3D.xml:78 msgid "If [code]true[/code], the light will cast shadows." msgstr "" -#: doc/classes/Light3D.xml:72 +#: doc/classes/Light3D.xml:81 +msgid "" +"Offsets the lookup into the shadow map by the objects normal. This can be " +"used reduce self-shadowing artifacts without using [member shadow_bias]. In " +"practice, this value should be tweaked along with [member shadow_bias] to " +"reduce artifacts as much as possible." +msgstr "" + +#: doc/classes/Light3D.xml:84 msgid "" "If [code]true[/code], reverses the backface culling of the mesh. This can be " "useful when you have a flat mesh that has a light behind it. If you need to " @@ -27294,93 +27154,105 @@ msgid "" "SHADOW_CASTING_SETTING_DOUBLE_SIDED]." msgstr "" -#: doc/classes/Light3D.xml:77 +#: doc/classes/Light3D.xml:91 msgid "Constant for accessing [member light_energy]." msgstr "" -#: doc/classes/Light3D.xml:80 +#: doc/classes/Light3D.xml:94 msgid "Constant for accessing [member light_indirect_energy]." msgstr "" -#: doc/classes/Light3D.xml:83 +#: doc/classes/Light3D.xml:97 msgid "Constant for accessing [member light_specular]." msgstr "" -#: doc/classes/Light3D.xml:86 +#: doc/classes/Light3D.xml:100 msgid "" "Constant for accessing [member OmniLight3D.omni_range] or [member " "SpotLight3D.spot_range]." msgstr "" -#: doc/classes/Light3D.xml:89 +#: doc/classes/Light3D.xml:103 +msgid "Constant for accessing [member light_size]." +msgstr "" + +#: doc/classes/Light3D.xml:106 msgid "" "Constant for accessing [member OmniLight3D.omni_attenuation] or [member " "SpotLight3D.spot_attenuation]." msgstr "" -#: doc/classes/Light3D.xml:92 +#: doc/classes/Light3D.xml:109 msgid "Constant for accessing [member SpotLight3D.spot_angle]." msgstr "" -#: doc/classes/Light3D.xml:95 +#: doc/classes/Light3D.xml:112 msgid "Constant for accessing [member SpotLight3D.spot_angle_attenuation]." msgstr "" -#: doc/classes/Light3D.xml:98 -msgid "Constant for accessing [member shadow_contact]." -msgstr "" - -#: doc/classes/Light3D.xml:101 +#: doc/classes/Light3D.xml:115 msgid "" "Constant for accessing [member DirectionalLight3D." "directional_shadow_max_distance]." msgstr "" -#: doc/classes/Light3D.xml:104 +#: doc/classes/Light3D.xml:118 msgid "" "Constant for accessing [member DirectionalLight3D." "directional_shadow_split_1]." msgstr "" -#: doc/classes/Light3D.xml:107 +#: doc/classes/Light3D.xml:121 msgid "" "Constant for accessing [member DirectionalLight3D." "directional_shadow_split_2]." msgstr "" -#: doc/classes/Light3D.xml:110 +#: doc/classes/Light3D.xml:124 msgid "" "Constant for accessing [member DirectionalLight3D." "directional_shadow_split_3]." msgstr "" -#: doc/classes/Light3D.xml:115 +#: doc/classes/Light3D.xml:127 msgid "" "Constant for accessing [member DirectionalLight3D." -"directional_shadow_normal_bias]." +"directional_shadow_fade_start]." msgstr "" -#: doc/classes/Light3D.xml:118 +#: doc/classes/Light3D.xml:130 +msgid "Constant for accessing [member shadow_normal_bias]." +msgstr "" + +#: doc/classes/Light3D.xml:133 msgid "Constant for accessing [member shadow_bias]." msgstr "" -#: doc/classes/Light3D.xml:121 +#: doc/classes/Light3D.xml:136 msgid "" "Constant for accessing [member DirectionalLight3D." -"directional_shadow_bias_split_scale]." +"directional_shadow_pancake_size]." msgstr "" -#: doc/classes/Light3D.xml:127 +#: doc/classes/Light3D.xml:139 +msgid "Constant for accessing [member shadow_blur]." +msgstr "" + +#: doc/classes/Light3D.xml:142 +msgid "Constant for accessing [member shadow_transmittance_bias]." +msgstr "" + +#: doc/classes/Light3D.xml:148 msgid "" "Light is ignored when baking.\n" "[b]Note:[/b] Hiding a light does [i]not[/i] affect baking." msgstr "" -#: doc/classes/Light3D.xml:131 +#: doc/classes/Light3D.xml:152 msgid "Only indirect lighting will be baked (default)." msgstr "" -#: doc/classes/Light3D.xml:134 +#: doc/classes/Light3D.xml:155 msgid "" "Both direct and indirect light will be baked.\n" "[b]Note:[/b] You should hide the light if you don't want it to appear twice " @@ -27571,32 +27443,40 @@ msgstr "" msgid "" "LineEdit provides a single-line string editor, used for text fields.\n" "It features many built-in shortcuts which will always be available " -"([code]Ctrl[/code] here maps to [code]Command[/code] on macOS):\n" -"- Ctrl + C: Copy\n" -"- Ctrl + X: Cut\n" -"- Ctrl + V or Ctrl + Y: Paste/\"yank\"\n" -"- Ctrl + Z: Undo\n" -"- Ctrl + Shift + Z: Redo\n" -"- Ctrl + U: Delete text from the cursor position to the beginning of the " -"line\n" -"- Ctrl + K: Delete text from the cursor position to the end of the line\n" -"- Ctrl + A: Select all text\n" -"- Up/Down arrow: Move the cursor to the beginning/end of the line\n" -"On macOS, some extra keyboard shortcuts are available:\n" -"- Ctrl + F: Like the right arrow key, move the cursor one character right\n" -"- Ctrl + B: Like the left arrow key, move the cursor one character left\n" -"- Ctrl + P: Like the up arrow key, move the cursor to the previous line\n" -"- Ctrl + N: Like the down arrow key, move the cursor to the next line\n" -"- Ctrl + D: Like the Delete key, delete the character on the right side of " -"cursor\n" -"- Ctrl + H: Like the Backspace key, delete the character on the left side of " -"the cursor\n" -"- Ctrl + A: Like the Home key, move the cursor to the beginning of the line\n" -"- Ctrl + E: Like the End key, move the cursor to the end of the line\n" -"- Command + Left arrow: Like the Home key, move the cursor to the beginning " +"([kbd]Ctrl[/kbd] here maps to [kbd]Cmd[/kbd] on macOS):\n" +"- [kbd]Ctrl + C[/kbd]: Copy\n" +"- [kbd]Ctrl + X[/kbd]: Cut\n" +"- [kbd]Ctrl + V[/kbd] or [kbd]Ctrl + Y[/kbd]: Paste/\"yank\"\n" +"- [kbd]Ctrl + Z[/kbd]: Undo\n" +"- [kbd]Ctrl + Shift + Z[/kbd]: Redo\n" +"- [kbd]Ctrl + U[/kbd]: Delete text from the cursor position to the beginning " "of the line\n" -"- Command + Right arrow: Like the End key, move the cursor to the end of the " -"line" +"- [kbd]Ctrl + K[/kbd]: Delete text from the cursor position to the end of " +"the line\n" +"- [kbd]Ctrl + A[/kbd]: Select all text\n" +"- [kbd]Up Arrow[/kbd]/[kbd]Down Arrow[/kbd]: Move the cursor to the " +"beginning/end of the line\n" +"On macOS, some extra keyboard shortcuts are available:\n" +"- [kbd]Ctrl + F[/kbd]: Same as [kbd]Right Arrow[/kbd], move the cursor one " +"character right\n" +"- [kbd]Ctrl + B[/kbd]: Same as [kbd]Left Arrow[/kbd], move the cursor one " +"character left\n" +"- [kbd]Ctrl + P[/kbd]: Same as [kbd]Up Arrow[/kbd], move the cursor to the " +"previous line\n" +"- [kbd]Ctrl + N[/kbd]: Same as [kbd]Down Arrow[/kbd], move the cursor to the " +"next line\n" +"- [kbd]Ctrl + D[/kbd]: Same as [kbd]Delete[/kbd], delete the character on " +"the right side of cursor\n" +"- [kbd]Ctrl + H[/kbd]: Same as [kbd]Backspace[/kbd], delete the character on " +"the left side of the cursor\n" +"- [kbd]Ctrl + A[/kbd]: Same as [kbd]Home[/kbd], move the cursor to the " +"beginning of the line\n" +"- [kbd]Ctrl + E[/kbd]: Same as [kbd]End[/kbd], move the cursor to the end of " +"the line\n" +"- [kbd]Cmd + Left Arrow[/kbd]: Same as [kbd]Home[/kbd], move the cursor to " +"the beginning of the line\n" +"- [kbd]Cmd + Right Arrow[/kbd]: Same as [kbd]End[/kbd], move the cursor to " +"the end of the line" msgstr "" #: doc/classes/LineEdit.xml:39 @@ -27741,7 +27621,7 @@ msgid "" "max_length]." msgstr "" -#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:513 +#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:514 msgid "Emitted when the text changes." msgstr "" @@ -27765,11 +27645,11 @@ msgstr "" msgid "Stretches whitespaces to fit the [LineEdit]'s width." msgstr "" -#: doc/classes/LineEdit.xml:188 doc/classes/TextEdit.xml:534 +#: doc/classes/LineEdit.xml:188 doc/classes/TextEdit.xml:535 msgid "Cuts (copies and clears) the selected text." msgstr "" -#: doc/classes/LineEdit.xml:191 doc/classes/TextEdit.xml:537 +#: doc/classes/LineEdit.xml:191 doc/classes/TextEdit.xml:538 msgid "Copies the selected text." msgstr "" @@ -27789,7 +27669,7 @@ msgstr "" msgid "Selects the whole [LineEdit] text." msgstr "" -#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:549 +#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:550 msgid "Undoes the previous action." msgstr "" @@ -27797,7 +27677,7 @@ msgstr "" msgid "Reverse the last undo action." msgstr "" -#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:555 +#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:556 msgid "Represents the size of the [enum MenuItems] enum." msgstr "" @@ -28427,11 +28307,11 @@ msgstr "" msgid "Render array as triangle strips." msgstr "" -#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3254 +#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3306 msgid "Blend shapes are normalized." msgstr "" -#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3257 +#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3309 msgid "Blend shapes are relative to base weight." msgstr "" @@ -28473,37 +28353,37 @@ msgstr "" msgid "Mesh array uses indices." msgstr "" -#: doc/classes/Mesh.xml:159 doc/classes/RenderingServer.xml:3210 +#: doc/classes/Mesh.xml:159 doc/classes/RenderingServer.xml:3262 msgid "Flag used to mark a compressed (half float) normal array." msgstr "" -#: doc/classes/Mesh.xml:162 doc/classes/RenderingServer.xml:3213 +#: doc/classes/Mesh.xml:162 doc/classes/RenderingServer.xml:3265 msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml:165 doc/classes/RenderingServer.xml:3216 +#: doc/classes/Mesh.xml:165 doc/classes/RenderingServer.xml:3268 msgid "Flag used to mark a compressed (half float) color array." msgstr "" -#: doc/classes/Mesh.xml:168 doc/classes/RenderingServer.xml:3219 +#: doc/classes/Mesh.xml:168 doc/classes/RenderingServer.xml:3271 msgid "Flag used to mark a compressed (half float) UV coordinates array." msgstr "" -#: doc/classes/Mesh.xml:171 doc/classes/RenderingServer.xml:3222 +#: doc/classes/Mesh.xml:171 doc/classes/RenderingServer.xml:3274 msgid "" "Flag used to mark a compressed (half float) UV coordinates array for the " "second UV coordinates." msgstr "" -#: doc/classes/Mesh.xml:174 doc/classes/RenderingServer.xml:3225 +#: doc/classes/Mesh.xml:174 doc/classes/RenderingServer.xml:3277 msgid "Flag used to mark a compressed index array." msgstr "" -#: doc/classes/Mesh.xml:177 doc/classes/RenderingServer.xml:3228 +#: doc/classes/Mesh.xml:177 doc/classes/RenderingServer.xml:3283 msgid "Flag used to mark that the array contains 2D vertices." msgstr "" -#: doc/classes/Mesh.xml:180 doc/classes/RenderingServer.xml:3233 +#: doc/classes/Mesh.xml:180 doc/classes/RenderingServer.xml:3280 msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -28568,67 +28448,72 @@ msgid "" " mdt.set_vertex(i, vertex)\n" "mesh.surface_remove(0)\n" "mdt.commit_to_surface(mesh)\n" -"[/codeblock]" +"[/codeblock]\n" +"See also [ArrayMesh], [ImmediateGeometry3D] and [SurfaceTool] for procedural " +"geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." msgstr "" -#: doc/classes/MeshDataTool.xml:28 +#: doc/classes/MeshDataTool.xml:30 msgid "Clears all data currently in MeshDataTool." msgstr "" -#: doc/classes/MeshDataTool.xml:37 +#: doc/classes/MeshDataTool.xml:39 msgid "Adds a new surface to specified [Mesh] with edited data." msgstr "" -#: doc/classes/MeshDataTool.xml:48 +#: doc/classes/MeshDataTool.xml:50 msgid "" "Uses specified surface of given [Mesh] to populate data for MeshDataTool.\n" "Requires [Mesh] with primitive type [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" -#: doc/classes/MeshDataTool.xml:56 +#: doc/classes/MeshDataTool.xml:58 msgid "Returns the number of edges in this [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:65 +#: doc/classes/MeshDataTool.xml:67 msgid "Returns array of faces that touch given edge." msgstr "" -#: doc/classes/MeshDataTool.xml:74 +#: doc/classes/MeshDataTool.xml:76 msgid "Returns meta information assigned to given edge." msgstr "" -#: doc/classes/MeshDataTool.xml:85 +#: doc/classes/MeshDataTool.xml:87 msgid "" "Returns index of specified vertex connected to given edge.\n" "Vertex argument can only be 0 or 1 because edges are comprised of two " "vertices." msgstr "" -#: doc/classes/MeshDataTool.xml:93 +#: doc/classes/MeshDataTool.xml:95 msgid "Returns the number of faces in this [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:104 +#: doc/classes/MeshDataTool.xml:106 msgid "" "Returns specified edge associated with given face.\n" "Edge argument must 2 or less because a face only has three edges." msgstr "" -#: doc/classes/MeshDataTool.xml:114 +#: doc/classes/MeshDataTool.xml:116 msgid "Returns the metadata associated with the given face." msgstr "" -#: doc/classes/MeshDataTool.xml:123 +#: doc/classes/MeshDataTool.xml:125 msgid "Calculates and returns the face normal of the given face." msgstr "" -#: doc/classes/MeshDataTool.xml:134 +#: doc/classes/MeshDataTool.xml:136 msgid "" "Returns the specified vertex of the given face.\n" "Vertex argument must be 2 or less because faces contain three vertices." msgstr "" -#: doc/classes/MeshDataTool.xml:142 +#: doc/classes/MeshDataTool.xml:144 msgid "" "Returns the [Mesh]'s format. Format is an integer made up of [Mesh] format " "flags combined together. For example, a mesh containing both vertices and " @@ -28638,103 +28523,103 @@ msgid "" "See [enum ArrayMesh.ArrayFormat] for a list of format flags." msgstr "" -#: doc/classes/MeshDataTool.xml:150 +#: doc/classes/MeshDataTool.xml:152 msgid "Returns the material assigned to the [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:159 +#: doc/classes/MeshDataTool.xml:161 msgid "Returns the vertex at given index." msgstr "" -#: doc/classes/MeshDataTool.xml:168 +#: doc/classes/MeshDataTool.xml:170 msgid "Returns the bones of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:177 +#: doc/classes/MeshDataTool.xml:179 msgid "Returns the color of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:184 +#: doc/classes/MeshDataTool.xml:186 msgid "Returns the total number of vertices in [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:193 +#: doc/classes/MeshDataTool.xml:195 msgid "Returns an array of edges that share the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:202 +#: doc/classes/MeshDataTool.xml:204 msgid "Returns an array of faces that share the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:211 +#: doc/classes/MeshDataTool.xml:213 msgid "Returns the metadata associated with the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:220 +#: doc/classes/MeshDataTool.xml:222 msgid "Returns the normal of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:229 +#: doc/classes/MeshDataTool.xml:231 msgid "Returns the tangent of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:238 +#: doc/classes/MeshDataTool.xml:240 msgid "Returns the UV of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:247 +#: doc/classes/MeshDataTool.xml:249 msgid "Returns the UV2 of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:256 +#: doc/classes/MeshDataTool.xml:258 msgid "Returns bone weights of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:267 +#: doc/classes/MeshDataTool.xml:269 msgid "Sets the metadata of the given edge." msgstr "" -#: doc/classes/MeshDataTool.xml:278 +#: doc/classes/MeshDataTool.xml:280 msgid "Sets the metadata of the given face." msgstr "" -#: doc/classes/MeshDataTool.xml:287 +#: doc/classes/MeshDataTool.xml:289 msgid "Sets the material to be used by newly-constructed [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:298 +#: doc/classes/MeshDataTool.xml:300 msgid "Sets the position of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:309 +#: doc/classes/MeshDataTool.xml:311 msgid "Sets the bones of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:320 +#: doc/classes/MeshDataTool.xml:322 msgid "Sets the color of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:331 +#: doc/classes/MeshDataTool.xml:333 msgid "Sets the metadata associated with the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:342 +#: doc/classes/MeshDataTool.xml:344 msgid "Sets the normal of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:353 +#: doc/classes/MeshDataTool.xml:355 msgid "Sets the tangent of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:364 +#: doc/classes/MeshDataTool.xml:366 msgid "Sets the UV of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:375 +#: doc/classes/MeshDataTool.xml:377 msgid "Sets the UV2 of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:386 +#: doc/classes/MeshDataTool.xml:388 msgid "Sets the bone weights of the given vertex." msgstr "" @@ -28980,9 +28865,9 @@ msgid "" "setting [member eye_height].\n" "You can initialise this interface as follows:\n" "[codeblock]\n" -"var interface = ARVRServer.find_interface(\"Native mobile\")\n" +"var interface = XRServer.find_interface(\"Native mobile\")\n" "if interface and interface.initialize():\n" -" get_viewport().arvr = true\n" +" get_viewport().xr = true\n" "[/codeblock]" msgstr "" @@ -28999,7 +28884,7 @@ msgstr "" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml:28 msgid "" "The height at which the camera is placed in relation to the ground (i.e. " -"[ARVROrigin] node)." +"[XROrigin3D] node)." msgstr "" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml:31 @@ -31479,7 +31364,7 @@ msgstr "" #: doc/classes/Node.xml:935 msgid "" "Notification received from the OS when a close request is sent (e.g. closing " -"the window with a \"Close\" button or Alt+F4).\n" +"the window with a \"Close\" button or [kbd]Alt + F4[/kbd]).\n" "Implemented on desktop platforms." msgstr "" @@ -31581,11 +31466,21 @@ msgid "" msgstr "" #: doc/classes/Node2D.xml:95 -msgid "Converts a local point's coordinates to global coordinates." +msgid "" +"Transforms the provided local position into a position in global coordinate " +"space. The input is expected to be local relative to the [Node2D] it is " +"called on. e.g. Applying this method to the positions of child nodes will " +"correctly transform their positions into the global coordinate space, but " +"applying it to a node's own position will give an incorrect result, as it " +"will incorporate the node's own transformation into its global position." msgstr "" #: doc/classes/Node2D.xml:104 -msgid "Converts a global point's coordinates to local coordinates." +msgid "" +"Transforms the provided global position into a position in local coordinate " +"space. The output will be local relative to the [Node2D] it is called on. e." +"g. It is appropriate for determining the positions of child nodes, but it is " +"not appropriate for determining its own position relative to its parent." msgstr "" #: doc/classes/Node2D.xml:113 @@ -31660,80 +31555,83 @@ msgid "" "operations in this coordinate system correspond to direct affine operations " "on the [Node3D]'s transform. The word local below refers to this coordinate " "system. The coordinate system that is attached to the [Node3D] object itself " -"is referred to as object-local coordinate system." +"is referred to as object-local coordinate system.\n" +"[b]Note:[/b] Unless otherwise specified, all methods that have angle " +"parameters must have angles specified as [i]radians[/i]. To convert degrees " +"to radians, use [method @GDScript.deg2rad]." msgstr "" -#: doc/classes/Node3D.xml:11 +#: doc/classes/Node3D.xml:12 msgid "" "https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html" msgstr "" -#: doc/classes/Node3D.xml:25 +#: doc/classes/Node3D.xml:26 msgid "" "Returns the parent [Node3D], or an empty [Object] if no parent exists or " "parent is not of type [Node3D]." msgstr "" -#: doc/classes/Node3D.xml:32 +#: doc/classes/Node3D.xml:33 msgid "" "Returns the current [World3D] resource this [Node3D] node is registered to." msgstr "" -#: doc/classes/Node3D.xml:43 +#: doc/classes/Node3D.xml:44 msgid "" "Rotates the global (world) transformation around axis, a unit [Vector3], by " "specified angle in radians. The rotation axis is in global coordinate system." msgstr "" -#: doc/classes/Node3D.xml:52 +#: doc/classes/Node3D.xml:53 msgid "" "Scales the global (world) transformation by the given [Vector3] scale " "factors." msgstr "" -#: doc/classes/Node3D.xml:61 +#: doc/classes/Node3D.xml:62 msgid "" "Moves the global (world) transformation by [Vector3] offset. The offset is " "in global coordinate system." msgstr "" -#: doc/classes/Node3D.xml:68 +#: doc/classes/Node3D.xml:69 msgid "" "Disables rendering of this node. Changes [member visible] to [code]false[/" "code]." msgstr "" -#: doc/classes/Node3D.xml:75 +#: doc/classes/Node3D.xml:76 msgid "" "Returns whether node notifies about its local transformation changes. " "[Node3D] will not propagate this by default." msgstr "" -#: doc/classes/Node3D.xml:82 +#: doc/classes/Node3D.xml:83 msgid "" "Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its " "local transformation scale." msgstr "" -#: doc/classes/Node3D.xml:89 +#: doc/classes/Node3D.xml:90 msgid "" "Returns whether this node is set as Toplevel, that is whether it ignores its " "parent nodes transformations." msgstr "" -#: doc/classes/Node3D.xml:96 +#: doc/classes/Node3D.xml:97 msgid "" "Returns whether the node notifies about its global and local transformation " "changes. [Node3D] will not propagate this by default." msgstr "" -#: doc/classes/Node3D.xml:103 +#: doc/classes/Node3D.xml:104 msgid "" "Returns whether the node is visible, taking into consideration that its " "parents visibility." msgstr "" -#: doc/classes/Node3D.xml:114 +#: doc/classes/Node3D.xml:115 msgid "" "Rotates itself so that the local -Z axis points towards the [code]target[/" "code] position.\n" @@ -31743,106 +31641,106 @@ msgid "" "Operations take place in global space." msgstr "" -#: doc/classes/Node3D.xml:129 +#: doc/classes/Node3D.xml:130 msgid "" "Moves the node to the specified [code]position[/code], and then rotates " "itself to point toward the [code]target[/code] as per [method look_at]. " "Operations take place in global space." msgstr "" -#: doc/classes/Node3D.xml:136 +#: doc/classes/Node3D.xml:137 msgid "" "Resets this node's transformations (like scale, skew and taper) preserving " "its rotation and translation by performing Gram-Schmidt orthonormalization " "on this node's [Transform]." msgstr "" -#: doc/classes/Node3D.xml:147 +#: doc/classes/Node3D.xml:148 msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians." msgstr "" -#: doc/classes/Node3D.xml:158 +#: doc/classes/Node3D.xml:159 msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians. The rotation axis is in object-local coordinate system." msgstr "" -#: doc/classes/Node3D.xml:167 +#: doc/classes/Node3D.xml:168 msgid "Rotates the local transformation around the X axis by angle in radians." msgstr "" -#: doc/classes/Node3D.xml:176 +#: doc/classes/Node3D.xml:177 msgid "Rotates the local transformation around the Y axis by angle in radians." msgstr "" -#: doc/classes/Node3D.xml:185 +#: doc/classes/Node3D.xml:186 msgid "Rotates the local transformation around the Z axis by angle in radians." msgstr "" -#: doc/classes/Node3D.xml:194 +#: doc/classes/Node3D.xml:195 msgid "" "Scales the local transformation by given 3D scale factors in object-local " "coordinate system." msgstr "" -#: doc/classes/Node3D.xml:203 +#: doc/classes/Node3D.xml:204 msgid "" "Makes the node ignore its parents transformations. Node transformations are " "only in global space." msgstr "" -#: doc/classes/Node3D.xml:212 +#: doc/classes/Node3D.xml:213 msgid "" "Sets whether the node uses a scale of [code](1, 1, 1)[/code] or its local " "transformation scale. Changes to the local transformation scale are " "preserved." msgstr "" -#: doc/classes/Node3D.xml:219 +#: doc/classes/Node3D.xml:220 msgid "" "Reset all transformations for this node (sets its [Transform] to the " "identity matrix)." msgstr "" -#: doc/classes/Node3D.xml:228 +#: doc/classes/Node3D.xml:229 msgid "" "Sets whether the node ignores notification that its transformation (global " "or local) changed." msgstr "" -#: doc/classes/Node3D.xml:237 +#: doc/classes/Node3D.xml:238 msgid "" "Sets whether the node notifies about its local transformation changes. " "[Node3D] will not propagate this by default." msgstr "" -#: doc/classes/Node3D.xml:246 +#: doc/classes/Node3D.xml:247 msgid "" "Sets whether the node notifies about its global and local transformation " "changes. [Node3D] will not propagate this by default." msgstr "" -#: doc/classes/Node3D.xml:253 +#: doc/classes/Node3D.xml:254 msgid "" "Enables rendering of this node. Changes [member visible] to [code]true[/" "code]." msgstr "" -#: doc/classes/Node3D.xml:262 +#: doc/classes/Node3D.xml:263 msgid "" "Transforms [code]local_point[/code] from this node's local space to world " "space." msgstr "" -#: doc/classes/Node3D.xml:271 +#: doc/classes/Node3D.xml:272 msgid "" "Transforms [code]global_point[/code] from world space to this node's local " "space." msgstr "" -#: doc/classes/Node3D.xml:280 +#: doc/classes/Node3D.xml:281 msgid "" "Changes the node's position by the given offset [Vector3].\n" "Note that the translation [code]offset[/code] is affected by the node's " @@ -31851,26 +31749,26 @@ msgid "" "to the X coordinate." msgstr "" -#: doc/classes/Node3D.xml:290 +#: doc/classes/Node3D.xml:291 msgid "" "Changes the node's position by the given offset [Vector3] in local space." msgstr "" -#: doc/classes/Node3D.xml:297 +#: doc/classes/Node3D.xml:298 msgid "Updates the [Node3DGizmo] of this node." msgstr "" -#: doc/classes/Node3D.xml:303 +#: doc/classes/Node3D.xml:304 msgid "" "The [Node3DGizmo] for this node. Used for example in [EditorNode3DGizmo] as " "custom visualization and editing handles in Editor." msgstr "" -#: doc/classes/Node3D.xml:306 +#: doc/classes/Node3D.xml:307 msgid "World3D space (global) [Transform] of this node." msgstr "" -#: doc/classes/Node3D.xml:309 +#: doc/classes/Node3D.xml:310 msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" @@ -31883,33 +31781,33 @@ msgid "" "\" is not meaningful." msgstr "" -#: doc/classes/Node3D.xml:313 +#: doc/classes/Node3D.xml:314 msgid "" "Rotation part of the local transformation in degrees, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle)." msgstr "" -#: doc/classes/Node3D.xml:316 +#: doc/classes/Node3D.xml:317 msgid "Scale part of the local transformation." msgstr "" -#: doc/classes/Node3D.xml:319 +#: doc/classes/Node3D.xml:320 msgid "Local space [Transform] of this node, with respect to the parent node." msgstr "" -#: doc/classes/Node3D.xml:322 +#: doc/classes/Node3D.xml:323 msgid "Local translation of this node." msgstr "" -#: doc/classes/Node3D.xml:325 +#: doc/classes/Node3D.xml:326 msgid "If [code]true[/code], this node is drawn." msgstr "" -#: doc/classes/Node3D.xml:331 +#: doc/classes/Node3D.xml:332 msgid "Emitted when node visibility changes." msgstr "" -#: doc/classes/Node3D.xml:337 +#: doc/classes/Node3D.xml:338 msgid "" "Node3D nodes receives this notification when their global transform changes. " "This means that either the current or a parent node changed its transform.\n" @@ -31917,19 +31815,19 @@ msgid "" "need to ask for it, with [method set_notify_transform]." msgstr "" -#: doc/classes/Node3D.xml:341 +#: doc/classes/Node3D.xml:342 msgid "" "Node3D nodes receives this notification when they are registered to new " "[World3D] resource." msgstr "" -#: doc/classes/Node3D.xml:344 +#: doc/classes/Node3D.xml:345 msgid "" "Node3D nodes receives this notification when they are unregistered from " "current [World3D] resource." msgstr "" -#: doc/classes/Node3D.xml:347 +#: doc/classes/Node3D.xml:348 msgid "Node3D nodes receives this notification when their visibility changes." msgstr "" @@ -33305,11 +33203,13 @@ msgid "" "code]. See [url=https://blog.escapecreative.com/customizing-mailto-" "links/]Customizing [code]mailto:[/code] Links[/url] for a list of fields " "that can be added.\n" +"Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] " +"or [code]user://[/code] path into a system path for use with this method.\n" "[b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS " "and Windows." msgstr "" -#: doc/classes/OS.xml:493 +#: doc/classes/OS.xml:494 msgid "" "The exit code passed to the OS when the main loop exits. By convention, an " "exit code of [code]0[/code] indicates success whereas a non-zero exit code " @@ -33319,133 +33219,133 @@ msgid "" "with an [code]exit_code[/code] argument passed." msgstr "" -#: doc/classes/OS.xml:497 +#: doc/classes/OS.xml:498 msgid "" "If [code]true[/code], the engine optimizes for low processor usage by only " "refreshing the screen if needed. Can improve battery consumption on mobile." msgstr "" -#: doc/classes/OS.xml:500 +#: doc/classes/OS.xml:501 msgid "" "The amount of sleeping between frames when the low-processor usage mode is " "enabled (in microseconds). Higher values will result in lower CPU usage." msgstr "" -#: doc/classes/OS.xml:505 +#: doc/classes/OS.xml:506 msgid "" "The GLES2 rendering backend. It uses OpenGL ES 2.0 on mobile devices, OpenGL " "2.1 on desktop platforms and WebGL 1.0 on the web." msgstr "" -#: doc/classes/OS.xml:508 +#: doc/classes/OS.xml:509 msgid "The Vulkan rendering backend." msgstr "" -#: doc/classes/OS.xml:511 +#: doc/classes/OS.xml:512 msgid "Sunday." msgstr "" -#: doc/classes/OS.xml:514 +#: doc/classes/OS.xml:515 msgid "Monday." msgstr "" -#: doc/classes/OS.xml:517 +#: doc/classes/OS.xml:518 msgid "Tuesday." msgstr "" -#: doc/classes/OS.xml:520 +#: doc/classes/OS.xml:521 msgid "Wednesday." msgstr "" -#: doc/classes/OS.xml:523 +#: doc/classes/OS.xml:524 msgid "Thursday." msgstr "" -#: doc/classes/OS.xml:526 +#: doc/classes/OS.xml:527 msgid "Friday." msgstr "" -#: doc/classes/OS.xml:529 +#: doc/classes/OS.xml:530 msgid "Saturday." msgstr "" -#: doc/classes/OS.xml:532 +#: doc/classes/OS.xml:533 msgid "January." msgstr "" -#: doc/classes/OS.xml:535 +#: doc/classes/OS.xml:536 msgid "February." msgstr "" -#: doc/classes/OS.xml:538 +#: doc/classes/OS.xml:539 msgid "March." msgstr "" -#: doc/classes/OS.xml:541 +#: doc/classes/OS.xml:542 msgid "April." msgstr "" -#: doc/classes/OS.xml:544 +#: doc/classes/OS.xml:545 msgid "May." msgstr "" -#: doc/classes/OS.xml:547 +#: doc/classes/OS.xml:548 msgid "June." msgstr "" -#: doc/classes/OS.xml:550 +#: doc/classes/OS.xml:551 msgid "July." msgstr "" -#: doc/classes/OS.xml:553 +#: doc/classes/OS.xml:554 msgid "August." msgstr "" -#: doc/classes/OS.xml:556 +#: doc/classes/OS.xml:557 msgid "September." msgstr "" -#: doc/classes/OS.xml:559 +#: doc/classes/OS.xml:560 msgid "October." msgstr "" -#: doc/classes/OS.xml:562 +#: doc/classes/OS.xml:563 msgid "November." msgstr "" -#: doc/classes/OS.xml:565 +#: doc/classes/OS.xml:566 msgid "December." msgstr "" -#: doc/classes/OS.xml:568 +#: doc/classes/OS.xml:569 msgid "Desktop directory path." msgstr "" -#: doc/classes/OS.xml:571 +#: doc/classes/OS.xml:572 msgid "DCIM (Digital Camera Images) directory path." msgstr "" -#: doc/classes/OS.xml:574 +#: doc/classes/OS.xml:575 msgid "Documents directory path." msgstr "" -#: doc/classes/OS.xml:577 +#: doc/classes/OS.xml:578 msgid "Downloads directory path." msgstr "" -#: doc/classes/OS.xml:580 +#: doc/classes/OS.xml:581 msgid "Movies directory path." msgstr "" -#: doc/classes/OS.xml:583 +#: doc/classes/OS.xml:584 msgid "Music directory path." msgstr "" -#: doc/classes/OS.xml:586 +#: doc/classes/OS.xml:587 msgid "Pictures directory path." msgstr "" -#: doc/classes/OS.xml:589 +#: doc/classes/OS.xml:590 msgid "Ringtones directory path." msgstr "" @@ -33717,49 +33617,52 @@ msgid "" "code] is owned by [code]node[/code] and [code]pack[/code] will therefore " "only save those two nodes, but not [code]collision[/code].\n" "[codeblock]\n" -"# Create the objects\n" +"# Create the objects.\n" "var node = Node2D.new()\n" "var rigid = RigidBody2D.new()\n" "var collision = CollisionShape2D.new()\n" "\n" -"# Create the object hierarchy\n" +"# Create the object hierarchy.\n" "rigid.add_child(collision)\n" "node.add_child(rigid)\n" "\n" -"# Change owner of rigid, but not of collision\n" +"# Change owner of `rigid`, but not of `collision`.\n" "rigid.owner = node\n" "\n" "var scene = PackedScene.new()\n" -"# Only node and rigid are now packed\n" +"# Only `node` and `rigid` are now packed.\n" "var result = scene.pack(node)\n" "if result == OK:\n" -" ResourceSaver.save(\"res://path/name.scn\", scene) # Or \"user://...\"\n" +" var error = ResourceSaver.save(\"res://path/name.scn\", scene) # Or " +"\"user://...\"\n" +" if error != OK:\n" +" push_error(\"An error occurred while saving the scene to disk.\")\n" "[/codeblock]" msgstr "" -#: doc/classes/PackedScene.xml:38 +#: doc/classes/PackedScene.xml:40 msgid "Returns [code]true[/code] if the scene file has nodes." msgstr "" -#: doc/classes/PackedScene.xml:45 +#: doc/classes/PackedScene.xml:47 msgid "" "Returns the [code]SceneState[/code] representing the scene file contents." msgstr "" -#: doc/classes/PackedScene.xml:54 +#: doc/classes/PackedScene.xml:56 msgid "" "Instantiates the scene's node hierarchy. Triggers child scene " "instantiation(s). Triggers a [constant Node.NOTIFICATION_INSTANCED] " "notification on the root node." msgstr "" -#: doc/classes/PackedScene.xml:63 +#: doc/classes/PackedScene.xml:65 msgid "" "Pack will ignore any sub-nodes not owned by given node. See [member Node." "owner]." msgstr "" -#: doc/classes/PackedScene.xml:69 +#: doc/classes/PackedScene.xml:71 msgid "" "A dictionary representation of the scene contents.\n" "Available keys include \"rnames\" and \"variants\" for resources, " @@ -33768,18 +33671,18 @@ msgid "" "connections, and \"version\" for the format style of the PackedScene." msgstr "" -#: doc/classes/PackedScene.xml:75 +#: doc/classes/PackedScene.xml:77 msgid "If passed to [method instance], blocks edits to the scene state." msgstr "" -#: doc/classes/PackedScene.xml:78 +#: doc/classes/PackedScene.xml:80 msgid "" "If passed to [method instance], provides local scene resources to the local " "scene.\n" "[b]Note:[/b] Only available in editor builds." msgstr "" -#: doc/classes/PackedScene.xml:82 +#: doc/classes/PackedScene.xml:84 msgid "" "If passed to [method instance], provides local scene resources to the local " "scene. Only the main scene should receive the main edit state.\n" @@ -34847,20 +34750,20 @@ msgstr "" msgid "Draw calls per frame. 3D only." msgstr "" -#: doc/classes/Performance.xml:77 doc/classes/RenderingServer.xml:3711 +#: doc/classes/Performance.xml:77 doc/classes/RenderingServer.xml:3922 msgid "" "The amount of video memory used, i.e. texture and vertex memory combined." msgstr "" -#: doc/classes/Performance.xml:80 doc/classes/RenderingServer.xml:3714 +#: doc/classes/Performance.xml:80 doc/classes/RenderingServer.xml:3925 msgid "The amount of texture memory used." msgstr "" -#: doc/classes/Performance.xml:83 doc/classes/RenderingServer.xml:3717 +#: doc/classes/Performance.xml:83 doc/classes/RenderingServer.xml:3928 msgid "The amount of vertex memory used." msgstr "" -#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3708 +#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3919 msgid "Unimplemented in the GLES2 rendering backend, always returns 0." msgstr "" @@ -34912,6 +34815,96 @@ msgid "" "resource." msgstr "" +#: doc/classes/PhysicalBone3D.xml:67 +msgid "Damps the body's rotation if greater than [code]0[/code]." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:70 doc/classes/RigidBody3D.xml:132 +msgid "Lock the body's rotation in the X axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:73 doc/classes/RigidBody3D.xml:135 +msgid "Lock the body's rotation in the Y axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:76 doc/classes/RigidBody3D.xml:138 +msgid "Lock the body's rotation in the Z axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:79 doc/classes/RigidBody3D.xml:141 +msgid "Lock the body's movement in the X axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:82 doc/classes/RigidBody3D.xml:144 +msgid "Lock the body's movement in the Y axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:85 doc/classes/RigidBody3D.xml:147 +msgid "Lock the body's movement in the Z axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:88 +msgid "Sets the body's transform." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:91 doc/classes/PhysicsMaterial.xml:17 +msgid "" +"The body's bounciness. Values range from [code]0[/code] (no bounce) to " +"[code]1[/code] (full bounciness)." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:94 doc/classes/RigidBody3D.xml:150 +msgid "" +"If [code]true[/code], the body is deactivated when there is no movement, so " +"it will not take part in the simulation until it is awaken by an external " +"force." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:97 +msgid "" +"The body's friction, from [code]0[/code] (frictionless) to [code]1[/code] " +"(max friction)." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:100 +msgid "" +"This is multiplied by the global 3D gravity setting found in [b]Project > " +"Project Settings > Physics > 3d[/b] to produce the body's gravity. For " +"example, a value of 1 will be normal gravity, 2 will apply double gravity, " +"and 0.5 will apply half gravity to this object." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:103 +msgid "Sets the joint's transform." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:106 +msgid "Sets the joint's rotation in radians." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:109 +msgid "Sets the joint's rotation in degrees." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:112 +msgid "Sets the joint type. See [enum JointType] for possible values." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:115 +msgid "Damps the body's movement if greater than [code]0[/code]." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:118 doc/classes/RigidBody2D.xml:158 +#: doc/classes/RigidBody3D.xml:175 +msgid "The body's mass." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:121 doc/classes/RigidBody3D.xml:188 +msgid "" +"The body's weight based on its mass and the global 3D gravity. Global values " +"are set in [b]Project > Project Settings > Physics > 3d[/b]." +msgstr "" + #: doc/classes/PhysicalSkyMaterial.xml:4 msgid "[Sky] [Material] used for a physically based sky." msgstr "" @@ -35245,17 +35238,6 @@ msgstr "" msgid "The body's transformation matrix." msgstr "" -#: doc/classes/PhysicsDirectBodyState2DSW.xml:4 -msgid "Software implementation of [PhysicsDirectBodyState2D]." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState2DSW.xml:7 -msgid "" -"Software implementation of [PhysicsDirectBodyState2D]. This object exposes " -"no new methods or properties and should not be used, as " -"[PhysicsDirectBodyState2D] selects the best implementation available." -msgstr "" - #: doc/classes/PhysicsDirectBodyState3D.xml:4 msgid "Direct access object to a physics body in the [PhysicsServer3D]." msgstr "" @@ -35268,7 +35250,7 @@ msgid "" "direct state of that body. See [method RigidBody3D._integrate_forces]." msgstr "" -#: doc/classes/PhysicsDirectBodyState3D.xml:18 doc/classes/RigidBody3D.xml:31 +#: doc/classes/PhysicsDirectBodyState3D.xml:18 msgid "" "Adds a constant directional force without affecting rotation.\n" "This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." @@ -35445,7 +35427,7 @@ msgid "" "will occur. If no collision is detected, the returned array will be [code]" "[1, 1][/code].\n" "If the shape can not move, the returned array will be [code][0, 0][/code] " -"under Bullet, and empty under GodotPhysics." +"under Bullet, and empty under GodotPhysics3D." msgstr "" #: doc/classes/PhysicsDirectSpaceState3D.xml:33 @@ -35516,12 +35498,6 @@ msgid "" "Provides a means of modifying the collision properties of a [PhysicsBody3D]." msgstr "" -#: doc/classes/PhysicsMaterial.xml:17 -msgid "" -"The body's bounciness. Values range from [code]0[/code] (no bounce) to " -"[code]1[/code] (full bounciness)." -msgstr "" - #: doc/classes/PhysicsMaterial.xml:20 msgid "" "The body's friction. Values range from [code]0[/code] (frictionless) to " @@ -35762,7 +35738,7 @@ msgid "" msgstr "" #: doc/classes/PhysicsServer2D.xml:620 doc/classes/PhysicsServer3D.xml:637 -#: doc/classes/RigidBody3D.xml:119 +#: doc/classes/RigidBody3D.xml:120 msgid "" "Sets an axis velocity. The velocity in the given vector axis will be set as " "the given vector length. This is useful for jumping behavior." @@ -36278,16 +36254,6 @@ msgid "" "Constant to get the number of space regions where a collision could occur." msgstr "" -#: doc/classes/PhysicsServer2DSW.xml:4 -msgid "Software implementation of [PhysicsServer2D]." -msgstr "" - -#: doc/classes/PhysicsServer2DSW.xml:7 -msgid "" -"This class exposes no new methods or properties and should not be used, as " -"[PhysicsServer2D] automatically selects the best implementation available." -msgstr "" - #: doc/classes/PhysicsServer3D.xml:4 msgid "Server interface for low-level physics access." msgstr "" @@ -37949,12 +37915,8 @@ msgid "Distance from center of sun where it fades out completely." msgstr "" #: doc/classes/ProceduralSkyMaterial.xml:44 -msgid "Distance from sun where it goes from solid to starting to fade." -msgstr "" - -#: doc/classes/ProceduralSkyMaterial.xml:47 msgid "" -"How quickly the sun fades away between [member sun_angle_min] and [member " +"How quickly the sun fades away between the edge of the sun disk and [member " "sun_angle_max]." msgstr "" @@ -38289,28 +38251,42 @@ msgstr "" #: doc/classes/ProjectSettings.xml:263 msgid "" -"Default compression level for gzip. Affects compressed scenes and resources." +"The default compression level for gzip. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level. " +"[code]-1[/code] uses the default gzip compression level, which is identical " +"to [code]6[/code] but could change in the future due to underlying zlib " +"updates." msgstr "" #: doc/classes/ProjectSettings.xml:266 msgid "" -"Default compression level for Zlib. Affects compressed scenes and resources." +"The default compression level for Zlib. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level. " +"[code]-1[/code] uses the default gzip compression level, which is identical " +"to [code]6[/code] but could change in the future due to underlying zlib " +"updates." msgstr "" #: doc/classes/ProjectSettings.xml:269 msgid "" -"Default compression level for Zstandard. Affects compressed scenes and " -"resources." +"The default compression level for Zstandard. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level." msgstr "" #: doc/classes/ProjectSettings.xml:272 -msgid "Enables long-distance matching in Zstandard." +msgid "" +"Enables [url=https://github.com/facebook/zstd/releases/tag/v1.3.2]long-" +"distance matching[/url] in Zstandard." msgstr "" #: doc/classes/ProjectSettings.xml:275 msgid "" "Largest size limit (in power of 2) allowed when compressing using long-" -"distance matching with Zstandard." +"distance matching with Zstandard. Higher values can result in better " +"compression, but will require more memory when compressing and decompressing." msgstr "" #: doc/classes/ProjectSettings.xml:278 @@ -38691,37 +38667,37 @@ msgid "" "UWP to follow interface conventions." msgstr "" -#: doc/classes/ProjectSettings.xml:473 +#: doc/classes/ProjectSettings.xml:475 msgid "" "Path to a custom [Theme] resource file to use for the project ([code]theme[/" "code] or generic [code]tres[/code]/[code]res[/code] extension)." msgstr "" -#: doc/classes/ProjectSettings.xml:476 +#: doc/classes/ProjectSettings.xml:478 msgid "" "Path to a custom [Font] resource to use as default for all GUI elements of " "the project." msgstr "" -#: doc/classes/ProjectSettings.xml:479 +#: doc/classes/ProjectSettings.xml:481 msgid "If [code]true[/code], makes sure the theme used works with HiDPI." msgstr "" -#: doc/classes/ProjectSettings.xml:482 +#: doc/classes/ProjectSettings.xml:484 msgid "" "Timer setting for incremental search in [Tree], [ItemList], etc. controls " "(in milliseconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:485 +#: doc/classes/ProjectSettings.xml:487 msgid "Timer for detecting idle in [TextEdit] (in seconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:488 +#: doc/classes/ProjectSettings.xml:490 msgid "Default delay for tooltips (in seconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:491 +#: doc/classes/ProjectSettings.xml:493 msgid "" "Default [InputEventAction] to confirm a focused button, menu or list item, " "or validate input.\n" @@ -38730,7 +38706,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:495 +#: doc/classes/ProjectSettings.xml:497 msgid "" "Default [InputEventAction] to discard a modal or pending input.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38738,7 +38714,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:499 +#: doc/classes/ProjectSettings.xml:501 msgid "" "Default [InputEventAction] to move down in the UI.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38746,7 +38722,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:503 +#: doc/classes/ProjectSettings.xml:505 msgid "" "Default [InputEventAction] to go to the end position of a [Control] (e.g. " "last item in an [ItemList] or a [Tree]), matching the behavior of [constant " @@ -38756,7 +38732,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:507 +#: doc/classes/ProjectSettings.xml:509 msgid "" "Default [InputEventAction] to focus the next [Control] in the scene. The " "focus behavior can be configured via [member Control.focus_next].\n" @@ -38765,7 +38741,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:511 +#: doc/classes/ProjectSettings.xml:513 msgid "" "Default [InputEventAction] to focus the previous [Control] in the scene. The " "focus behavior can be configured via [member Control.focus_previous].\n" @@ -38774,7 +38750,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:515 +#: doc/classes/ProjectSettings.xml:517 msgid "" "Default [InputEventAction] to go to the start position of a [Control] (e.g. " "first item in an [ItemList] or a [Tree]), matching the behavior of [constant " @@ -38784,7 +38760,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:519 +#: doc/classes/ProjectSettings.xml:521 msgid "" "Default [InputEventAction] to move left in the UI.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38792,7 +38768,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:523 +#: doc/classes/ProjectSettings.xml:525 msgid "" "Default [InputEventAction] to go down a page in a [Control] (e.g. in an " "[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEDOWN] on " @@ -38802,7 +38778,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:527 +#: doc/classes/ProjectSettings.xml:529 msgid "" "Default [InputEventAction] to go up a page in a [Control] (e.g. in an " "[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEUP] on " @@ -38812,7 +38788,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:531 +#: doc/classes/ProjectSettings.xml:533 msgid "" "Default [InputEventAction] to move right in the UI.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38820,7 +38796,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:535 +#: doc/classes/ProjectSettings.xml:537 msgid "" "Default [InputEventAction] to select an item in a [Control] (e.g. in an " "[ItemList] or a [Tree]).\n" @@ -38829,7 +38805,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:539 +#: doc/classes/ProjectSettings.xml:541 msgid "" "Default [InputEventAction] to move up in the UI.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38837,371 +38813,371 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:543 +#: doc/classes/ProjectSettings.xml:545 msgid "" "If [code]true[/code], sends mouse input events when tapping or swiping on " "the touchscreen." msgstr "" -#: doc/classes/ProjectSettings.xml:546 +#: doc/classes/ProjectSettings.xml:548 msgid "" "If [code]true[/code], sends touch input events when clicking or dragging the " "mouse." msgstr "" -#: doc/classes/ProjectSettings.xml:549 +#: doc/classes/ProjectSettings.xml:551 msgid "Optional name for the 2D physics layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:552 +#: doc/classes/ProjectSettings.xml:554 msgid "Optional name for the 2D physics layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:555 +#: doc/classes/ProjectSettings.xml:557 msgid "Optional name for the 2D physics layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:558 +#: doc/classes/ProjectSettings.xml:560 msgid "Optional name for the 2D physics layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:561 +#: doc/classes/ProjectSettings.xml:563 msgid "Optional name for the 2D physics layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:564 +#: doc/classes/ProjectSettings.xml:566 msgid "Optional name for the 2D physics layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:567 +#: doc/classes/ProjectSettings.xml:569 msgid "Optional name for the 2D physics layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:570 +#: doc/classes/ProjectSettings.xml:572 msgid "Optional name for the 2D physics layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:573 +#: doc/classes/ProjectSettings.xml:575 msgid "Optional name for the 2D physics layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:576 +#: doc/classes/ProjectSettings.xml:578 msgid "Optional name for the 2D physics layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:579 +#: doc/classes/ProjectSettings.xml:581 msgid "Optional name for the 2D physics layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:582 +#: doc/classes/ProjectSettings.xml:584 msgid "Optional name for the 2D physics layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:585 +#: doc/classes/ProjectSettings.xml:587 msgid "Optional name for the 2D physics layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:588 +#: doc/classes/ProjectSettings.xml:590 msgid "Optional name for the 2D physics layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:591 +#: doc/classes/ProjectSettings.xml:593 msgid "Optional name for the 2D physics layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:594 +#: doc/classes/ProjectSettings.xml:596 msgid "Optional name for the 2D physics layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:597 +#: doc/classes/ProjectSettings.xml:599 msgid "Optional name for the 2D physics layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:600 +#: doc/classes/ProjectSettings.xml:602 msgid "Optional name for the 2D physics layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:603 +#: doc/classes/ProjectSettings.xml:605 msgid "Optional name for the 2D physics layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:606 +#: doc/classes/ProjectSettings.xml:608 msgid "Optional name for the 2D physics layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:609 +#: doc/classes/ProjectSettings.xml:611 msgid "Optional name for the 2D render layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:612 +#: doc/classes/ProjectSettings.xml:614 msgid "Optional name for the 2D render layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:615 +#: doc/classes/ProjectSettings.xml:617 msgid "Optional name for the 2D render layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:618 +#: doc/classes/ProjectSettings.xml:620 msgid "Optional name for the 2D render layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:621 +#: doc/classes/ProjectSettings.xml:623 msgid "Optional name for the 2D render layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:624 +#: doc/classes/ProjectSettings.xml:626 msgid "Optional name for the 2D render layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:627 +#: doc/classes/ProjectSettings.xml:629 msgid "Optional name for the 2D render layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:630 +#: doc/classes/ProjectSettings.xml:632 msgid "Optional name for the 2D render layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:633 +#: doc/classes/ProjectSettings.xml:635 msgid "Optional name for the 2D render layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:636 +#: doc/classes/ProjectSettings.xml:638 msgid "Optional name for the 2D render layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:639 +#: doc/classes/ProjectSettings.xml:641 msgid "Optional name for the 2D render layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:642 +#: doc/classes/ProjectSettings.xml:644 msgid "Optional name for the 2D render layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:645 +#: doc/classes/ProjectSettings.xml:647 msgid "Optional name for the 2D render layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:648 +#: doc/classes/ProjectSettings.xml:650 msgid "Optional name for the 2D render layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:651 +#: doc/classes/ProjectSettings.xml:653 msgid "Optional name for the 2D render layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:654 +#: doc/classes/ProjectSettings.xml:656 msgid "Optional name for the 2D render layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:657 +#: doc/classes/ProjectSettings.xml:659 msgid "Optional name for the 2D render layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:660 +#: doc/classes/ProjectSettings.xml:662 msgid "Optional name for the 2D render layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:663 +#: doc/classes/ProjectSettings.xml:665 msgid "Optional name for the 2D render layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:666 +#: doc/classes/ProjectSettings.xml:668 msgid "Optional name for the 2D render layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:669 +#: doc/classes/ProjectSettings.xml:671 msgid "Optional name for the 3D physics layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:672 +#: doc/classes/ProjectSettings.xml:674 msgid "Optional name for the 3D physics layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:675 +#: doc/classes/ProjectSettings.xml:677 msgid "Optional name for the 3D physics layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:678 +#: doc/classes/ProjectSettings.xml:680 msgid "Optional name for the 3D physics layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:681 +#: doc/classes/ProjectSettings.xml:683 msgid "Optional name for the 3D physics layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:684 +#: doc/classes/ProjectSettings.xml:686 msgid "Optional name for the 3D physics layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:687 +#: doc/classes/ProjectSettings.xml:689 msgid "Optional name for the 3D physics layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:690 +#: doc/classes/ProjectSettings.xml:692 msgid "Optional name for the 3D physics layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:693 +#: doc/classes/ProjectSettings.xml:695 msgid "Optional name for the 3D physics layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:696 +#: doc/classes/ProjectSettings.xml:698 msgid "Optional name for the 3D physics layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:699 +#: doc/classes/ProjectSettings.xml:701 msgid "Optional name for the 3D physics layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:702 +#: doc/classes/ProjectSettings.xml:704 msgid "Optional name for the 3D physics layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:705 +#: doc/classes/ProjectSettings.xml:707 msgid "Optional name for the 3D physics layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:708 +#: doc/classes/ProjectSettings.xml:710 msgid "Optional name for the 3D physics layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:711 +#: doc/classes/ProjectSettings.xml:713 msgid "Optional name for the 3D physics layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:714 +#: doc/classes/ProjectSettings.xml:716 msgid "Optional name for the 3D physics layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:717 +#: doc/classes/ProjectSettings.xml:719 msgid "Optional name for the 3D physics layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:720 +#: doc/classes/ProjectSettings.xml:722 msgid "Optional name for the 3D physics layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:723 +#: doc/classes/ProjectSettings.xml:725 msgid "Optional name for the 3D physics layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:726 +#: doc/classes/ProjectSettings.xml:728 msgid "Optional name for the 3D physics layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:729 +#: doc/classes/ProjectSettings.xml:731 msgid "Optional name for the 3D render layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:732 +#: doc/classes/ProjectSettings.xml:734 msgid "Optional name for the 3D render layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:735 +#: doc/classes/ProjectSettings.xml:737 msgid "Optional name for the 3D render layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:738 +#: doc/classes/ProjectSettings.xml:740 msgid "Optional name for the 3D render layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:741 +#: doc/classes/ProjectSettings.xml:743 msgid "Optional name for the 3D render layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:744 +#: doc/classes/ProjectSettings.xml:746 msgid "Optional name for the 3D render layer 14" msgstr "" -#: doc/classes/ProjectSettings.xml:747 +#: doc/classes/ProjectSettings.xml:749 msgid "Optional name for the 3D render layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:750 +#: doc/classes/ProjectSettings.xml:752 msgid "Optional name for the 3D render layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:753 +#: doc/classes/ProjectSettings.xml:755 msgid "Optional name for the 3D render layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:756 +#: doc/classes/ProjectSettings.xml:758 msgid "Optional name for the 3D render layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:759 +#: doc/classes/ProjectSettings.xml:761 msgid "Optional name for the 3D render layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:762 +#: doc/classes/ProjectSettings.xml:764 msgid "Optional name for the 3D render layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:765 +#: doc/classes/ProjectSettings.xml:767 msgid "Optional name for the 3D render layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:768 +#: doc/classes/ProjectSettings.xml:770 msgid "Optional name for the 3D render layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:771 +#: doc/classes/ProjectSettings.xml:773 msgid "Optional name for the 3D render layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:774 +#: doc/classes/ProjectSettings.xml:776 msgid "Optional name for the 3D render layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:777 +#: doc/classes/ProjectSettings.xml:779 msgid "Optional name for the 3D render layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:780 +#: doc/classes/ProjectSettings.xml:782 msgid "Optional name for the 3D render layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:783 +#: doc/classes/ProjectSettings.xml:785 msgid "Optional name for the 3D render layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:786 +#: doc/classes/ProjectSettings.xml:788 msgid "Optional name for the 3D render layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:789 +#: doc/classes/ProjectSettings.xml:791 msgid "" "The locale to fall back to if a translation isn't available in a given " "language. If left empty, [code]en[/code] (English) will be used." msgstr "" -#: doc/classes/ProjectSettings.xml:792 +#: doc/classes/ProjectSettings.xml:794 msgid "" "If non-empty, this locale will be used when running the project from the " "editor." msgstr "" -#: doc/classes/ProjectSettings.xml:795 +#: doc/classes/ProjectSettings.xml:797 msgid "If [code]true[/code], logs all output to files." msgstr "" -#: doc/classes/ProjectSettings.xml:798 +#: doc/classes/ProjectSettings.xml:800 msgid "" "Path to logs within the project. Using an [code]user://[/code] path is " "recommended." msgstr "" -#: doc/classes/ProjectSettings.xml:801 +#: doc/classes/ProjectSettings.xml:803 msgid "Specifies the maximum amount of log files allowed (used for rotation)." msgstr "" -#: doc/classes/ProjectSettings.xml:804 +#: doc/classes/ProjectSettings.xml:806 msgid "" "Godot uses a message queue to defer some function calls. If you run out of " "space on it (you will see an error), you can increase the size here." msgstr "" -#: doc/classes/ProjectSettings.xml:807 +#: doc/classes/ProjectSettings.xml:809 msgid "" "This is used by servers when used in multi-threading mode (servers and " "visual). RIDs are preallocated to avoid stalling the server requesting them " @@ -39209,118 +39185,118 @@ msgid "" "thread, increase this number." msgstr "" -#: doc/classes/ProjectSettings.xml:822 +#: doc/classes/ProjectSettings.xml:824 msgid "" "Maximum amount of characters allowed to send as output from the debugger. " "Over this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" -#: doc/classes/ProjectSettings.xml:825 +#: doc/classes/ProjectSettings.xml:827 msgid "" "Maximum number of errors allowed to be sent from the debugger. Over this " "value, content is dropped. This helps not to stall the debugger connection." msgstr "" -#: doc/classes/ProjectSettings.xml:828 +#: doc/classes/ProjectSettings.xml:830 msgid "" "Maximum amount of messages in the debugger queue. Over this value, content " "is dropped. This helps to limit the debugger memory usage." msgstr "" -#: doc/classes/ProjectSettings.xml:831 +#: doc/classes/ProjectSettings.xml:833 msgid "" "Maximum number of warnings allowed to be sent from the debugger. Over this " "value, content is dropped. This helps not to stall the debugger connection." msgstr "" -#: doc/classes/ProjectSettings.xml:834 +#: doc/classes/ProjectSettings.xml:836 msgid "" "Default size of packet peer stream for deserializing Godot data. Over this " "size, data is dropped." msgstr "" -#: doc/classes/ProjectSettings.xml:837 +#: doc/classes/ProjectSettings.xml:839 msgid "Timeout (in seconds) for connection attempts using TCP." msgstr "" -#: doc/classes/ProjectSettings.xml:840 +#: doc/classes/ProjectSettings.xml:842 msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:843 +#: doc/classes/ProjectSettings.xml:845 msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:846 +#: doc/classes/ProjectSettings.xml:848 msgid "Maximum number of concurrent input packets for [WebSocketClient]." msgstr "" -#: doc/classes/ProjectSettings.xml:849 +#: doc/classes/ProjectSettings.xml:851 msgid "Maximum size (in kiB) for the [WebSocketClient] output buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:852 +#: doc/classes/ProjectSettings.xml:854 msgid "Maximum number of concurrent output packets for [WebSocketClient]." msgstr "" -#: doc/classes/ProjectSettings.xml:855 +#: doc/classes/ProjectSettings.xml:857 msgid "Maximum size (in kiB) for the [WebSocketServer] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:858 +#: doc/classes/ProjectSettings.xml:860 msgid "Maximum number of concurrent input packets for [WebSocketServer]." msgstr "" -#: doc/classes/ProjectSettings.xml:861 +#: doc/classes/ProjectSettings.xml:863 msgid "Maximum size (in kiB) for the [WebSocketServer] output buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:864 +#: doc/classes/ProjectSettings.xml:866 msgid "Maximum number of concurrent output packets for [WebSocketServer]." msgstr "" -#: doc/classes/ProjectSettings.xml:867 +#: doc/classes/ProjectSettings.xml:869 msgid "" "Amount of read ahead used by remote filesystem. Higher values decrease the " "effects of latency at the cost of higher bandwidth usage." msgstr "" -#: doc/classes/ProjectSettings.xml:870 +#: doc/classes/ProjectSettings.xml:872 msgid "Page size used by remote filesystem (in bytes)." msgstr "" -#: doc/classes/ProjectSettings.xml:873 +#: doc/classes/ProjectSettings.xml:875 msgid "" "CA certificates bundle to use for SSL connections. If not defined, Godot's " "internal CA certificates are used." msgstr "" -#: doc/classes/ProjectSettings.xml:876 +#: doc/classes/ProjectSettings.xml:878 msgid "" "When creating node names automatically, set the type of casing in this " "project. This is mostly an editor setting." msgstr "" -#: doc/classes/ProjectSettings.xml:879 +#: doc/classes/ProjectSettings.xml:881 msgid "" "What to use to separate node name from number. This is mostly an editor " "setting." msgstr "" -#: doc/classes/ProjectSettings.xml:882 +#: doc/classes/ProjectSettings.xml:884 msgid "Size of the hash table used for the broad-phase 2D hash grid algorithm." msgstr "" -#: doc/classes/ProjectSettings.xml:885 +#: doc/classes/ProjectSettings.xml:887 msgid "Cell size used for the broad-phase 2D hash grid algorithm." msgstr "" -#: doc/classes/ProjectSettings.xml:888 +#: doc/classes/ProjectSettings.xml:890 msgid "The default angular damp in 2D." msgstr "" -#: doc/classes/ProjectSettings.xml:891 +#: doc/classes/ProjectSettings.xml:893 msgid "" "The default gravity strength in 2D.\n" "[b]Note:[/b] This property is only read when the project starts. To change " @@ -39332,7 +39308,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:899 +#: doc/classes/ProjectSettings.xml:901 msgid "" "The default gravity direction in 2D.\n" "[b]Note:[/b] This property is only read when the project starts. To change " @@ -39344,38 +39320,38 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:907 +#: doc/classes/ProjectSettings.xml:909 msgid "The default linear damp in 2D." msgstr "" -#: doc/classes/ProjectSettings.xml:910 +#: doc/classes/ProjectSettings.xml:912 msgid "" "Threshold defining the surface size that constitutes a large object with " "regard to cells in the broad-phase 2D hash grid algorithm." msgstr "" -#: doc/classes/ProjectSettings.xml:913 +#: doc/classes/ProjectSettings.xml:915 msgid "" "Sets which physics engine to use for 2D physics.\n" -"\"DEFAULT\" and \"GodotPhysics\" are the same, as there is currently no " +"\"DEFAULT\" and \"GodotPhysics2D\" are the same, as there is currently no " "alternative 2D physics server implemented." msgstr "" -#: doc/classes/ProjectSettings.xml:917 +#: doc/classes/ProjectSettings.xml:919 msgid "" "Threshold angular velocity under which a 2D physics body will be considered " "inactive. See [constant PhysicsServer2D." "SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD]." msgstr "" -#: doc/classes/ProjectSettings.xml:920 +#: doc/classes/ProjectSettings.xml:922 msgid "" "Threshold linear velocity under which a 2D physics body will be considered " "inactive. See [constant PhysicsServer2D." "SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD]." msgstr "" -#: doc/classes/ProjectSettings.xml:923 +#: doc/classes/ProjectSettings.xml:925 msgid "" "Sets whether physics is run on the main thread or a separate one. Running " "the server on a thread increases performance, but restricts API access to " @@ -39385,23 +39361,23 @@ msgid "" "give you extra performance and no regressions when using it." msgstr "" -#: doc/classes/ProjectSettings.xml:927 +#: doc/classes/ProjectSettings.xml:929 msgid "" "Time (in seconds) of inactivity before which a 2D physics body will put to " "sleep. See [constant PhysicsServer2D.SPACE_PARAM_BODY_TIME_TO_SLEEP]." msgstr "" -#: doc/classes/ProjectSettings.xml:930 +#: doc/classes/ProjectSettings.xml:932 msgid "" "Sets whether the 3D physics world will be created with support for " "[SoftBody3D] physics. Only applies to the Bullet physics engine." msgstr "" -#: doc/classes/ProjectSettings.xml:933 +#: doc/classes/ProjectSettings.xml:935 msgid "The default angular damp in 3D." msgstr "" -#: doc/classes/ProjectSettings.xml:936 +#: doc/classes/ProjectSettings.xml:938 msgid "" "The default gravity strength in 3D.\n" "[b]Note:[/b] This property is only read when the project starts. To change " @@ -39413,7 +39389,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:944 +#: doc/classes/ProjectSettings.xml:946 msgid "" "The default gravity direction in 3D.\n" "[b]Note:[/b] This property is only read when the project starts. To change " @@ -39425,23 +39401,23 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:952 +#: doc/classes/ProjectSettings.xml:954 msgid "The default linear damp in 3D." msgstr "" -#: doc/classes/ProjectSettings.xml:955 +#: doc/classes/ProjectSettings.xml:957 msgid "" "Sets which physics engine to use for 3D physics.\n" "\"DEFAULT\" is currently the [url=https://bulletphysics.org]Bullet[/url] " -"physics engine. The \"GodotPhysics\" engine is still supported as an " +"physics engine. The \"GodotPhysics3D\" engine is still supported as an " "alternative." msgstr "" -#: doc/classes/ProjectSettings.xml:959 +#: doc/classes/ProjectSettings.xml:961 msgid "Enables [member Viewport.physics_object_picking] on the root viewport." msgstr "" -#: doc/classes/ProjectSettings.xml:962 +#: doc/classes/ProjectSettings.xml:964 msgid "" "The number of fixed iterations per second. This controls how often physics " "simulation and [method Node._physics_process] methods are run.\n" @@ -39450,7 +39426,7 @@ msgid "" "instead." msgstr "" -#: doc/classes/ProjectSettings.xml:966 +#: doc/classes/ProjectSettings.xml:968 msgid "" "Fix to improve physics jitter, specially on monitors where refresh rate is " "different than the physics FPS.\n" @@ -39458,7 +39434,7 @@ msgid "" "the physics FPS at runtime, set [member Engine.physics_jitter_fix] instead." msgstr "" -#: doc/classes/ProjectSettings.xml:970 +#: doc/classes/ProjectSettings.xml:972 msgid "" "Default background clear color. Overridable per [Viewport] using its " "[Environment]. See [member Environment.background_mode] and [member " @@ -39466,7 +39442,7 @@ msgid "" "programmatically, use [method RenderingServer.set_default_clear_color]." msgstr "" -#: doc/classes/ProjectSettings.xml:973 +#: doc/classes/ProjectSettings.xml:975 msgid "" "[Environment] that will be used as a fallback environment in case a scene " "does not specify its own environment. The default environment is loaded in " @@ -39476,14 +39452,14 @@ msgid "" "here." msgstr "" -#: doc/classes/ProjectSettings.xml:976 +#: doc/classes/ProjectSettings.xml:980 msgid "" "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." msgstr "" -#: doc/classes/ProjectSettings.xml:979 +#: doc/classes/ProjectSettings.xml:985 msgid "" "Some NVIDIA GPU drivers have a bug which produces flickering issues for the " "[code]draw_rect[/code] method, especially as used in [TileMap]. Refer to " @@ -39495,39 +39471,73 @@ msgid "" "using the Vulkan backend." msgstr "" -#: doc/classes/ProjectSettings.xml:983 +#: doc/classes/ProjectSettings.xml:989 msgid "" "If [code]true[/code], forces snapping of polygons to pixels in 2D rendering. " "May help in some pixel art styles." msgstr "" -#: doc/classes/ProjectSettings.xml:986 +#: doc/classes/ProjectSettings.xml:992 +msgid "" +"Sets the quality of the depth of field effect. Higher quality takes more " +"samples, which is slower but looks smoother." +msgstr "" + +#: doc/classes/ProjectSettings.xml:995 +msgid "" +"Sets the depth of field shape. Can be Box, Hexagon, or Circle. Box is the " +"fastest. Circle is the most realistic, but also the most expensive to " +"compute." +msgstr "" + +#: doc/classes/ProjectSettings.xml:998 +msgid "" +"If [code]true[/code], jitters DOF samples to make effect slightly blurrier " +"and hide lines created from low sample rates. This can result in a slightly " +"grainy appearance when used with a low number of samples." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1001 msgid "" "Disables depth pre-pass for some GPU vendors (usually mobile), as their " "architecture already does this." msgstr "" -#: doc/classes/ProjectSettings.xml:989 +#: doc/classes/ProjectSettings.xml:1004 msgid "" "If [code]true[/code], performs a previous depth pass before rendering " "materials. This increases performance in scenes with high overdraw, when " "complex materials and lighting are used." msgstr "" -#: doc/classes/ProjectSettings.xml:992 +#: doc/classes/ProjectSettings.xml:1007 msgid "" "The directional shadow's size in pixels. Higher values will result in " "sharper shadows, at the cost of performance. The value will be rounded up to " "the nearest power of 2." msgstr "" -#: doc/classes/ProjectSettings.xml:995 +#: doc/classes/ProjectSettings.xml:1010 msgid "" "Lower-end override for [member rendering/quality/directional_shadow/size] on " "mobile devices, due to performance concerns or driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:998 +#: doc/classes/ProjectSettings.xml:1013 +msgid "" +"Quality setting for shadows cast by [DirectionalLight3D]s. Higher quality " +"settings use more samples when reading from shadow maps and are thus slower. " +"Low quality settings may result in shadows looking grainy." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1016 +msgid "" +"Lower-end override for [member rendering/quality/directional_shadow/" +"soft_shadow_quality] on mobile devices, due to performance concerns or " +"driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1019 msgid "" "The video driver to use (\"GLES2\" or \"Vulkan\").\n" "[b]Note:[/b] The backend in use can be overridden at runtime via the [code]--" @@ -39537,25 +39547,33 @@ msgid "" "get_current_video_driver[/code] to query it at run-time." msgstr "" -#: doc/classes/ProjectSettings.xml:1012 +#: doc/classes/ProjectSettings.xml:1025 msgid "" -"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing " -"around the edges of polygons. A higher MSAA value results in smoother edges " -"but can be significantly slower on some hardware.\n" -"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend." +"If [code]true[/code], take additional samples when rendering objects " +"affected by a [GIProbe] to reduce artifacts from only sampling in one " +"direction." msgstr "" -#: doc/classes/ProjectSettings.xml:1020 +#: doc/classes/ProjectSettings.xml:1028 msgid "" -"If [code]true[/code], uses nearest-neighbor mipmap filtering when using " -"mipmaps (also called \"bilinear filtering\"), which will result in visible " -"seams appearing between mipmap stages. This may increase performance in " -"mobile as less memory bandwidth is used. If [code]false[/code], linear " -"mipmap filtering (also called \"trilinear filtering\") is used." +"Sets the number of cone samples taken when rendering objects affected by " +"[GIProbe]s." msgstr "" #: doc/classes/ProjectSettings.xml:1031 msgid "" +"Sets how the glow effect is upscaled before being copied onto the screen. " +"Linear is faster, but looks blocky. Bicubic is slower but looks smooth." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1034 +msgid "" +"Lower-end override for [member rendering/quality/glow/upscale_mode] on " +"mobile devices, due to performance concerns or driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1037 +msgid "" "Strategy used for framebuffer allocation. The simpler it is, the less " "resources it uses (but the less features it supports). If set to \"2D " "Without Sampling\" or \"3D Without Effects\", sample buffers will not be " @@ -39564,41 +39582,41 @@ msgid "" "be available in the [Environment]." msgstr "" -#: doc/classes/ProjectSettings.xml:1034 +#: doc/classes/ProjectSettings.xml:1040 msgid "" "Lower-end override for [member rendering/quality/intended_usage/" "framebuffer_allocation] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1037 +#: doc/classes/ProjectSettings.xml:1043 msgid "" "Number of cubemaps to store in the reflection atlas. The number of " "[ReflectionProbe]s in a scene will be limited by this amount. A higher " "number requires more VRAM." msgstr "" -#: doc/classes/ProjectSettings.xml:1040 +#: doc/classes/ProjectSettings.xml:1046 msgid "" "Size of cubemap faces for [ReflectionProbe]s. A higher number requires more " "VRAM and may make reflection probe updating slower." msgstr "" -#: doc/classes/ProjectSettings.xml:1043 +#: doc/classes/ProjectSettings.xml:1049 msgid "" "Lower-end override for [member rendering/quality/reflection_atlas/" "reflection_size] on mobile devices, due to performance concerns or driver " "support." msgstr "" -#: doc/classes/ProjectSettings.xml:1046 +#: doc/classes/ProjectSettings.xml:1052 msgid "" "Use a higher quality variant of the fast filtering algorithm. Significantly " "slower than using default quality, but results in smoother reflections. " "Should only be used when the scene is especially detailed." msgstr "" -#: doc/classes/ProjectSettings.xml:1049 +#: doc/classes/ProjectSettings.xml:1055 msgid "" "Sets the number of samples to take when using importance sampling for [Sky]s " "and [ReflectionProbe]s. A higher value will result in smoother, higher " @@ -39608,19 +39626,19 @@ msgid "" "environments with a high level of detail." msgstr "" -#: doc/classes/ProjectSettings.xml:1052 +#: doc/classes/ProjectSettings.xml:1058 msgid "" "Lower-end override for [member rendering/quality/reflections/ggx_samples] on " "mobile devices, due to performance concerns or driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1055 +#: doc/classes/ProjectSettings.xml:1061 msgid "" "Limits the number of layers to use in radiance maps when using importance " "sampling. A lower number will be slightly faster and take up less VRAM." msgstr "" -#: doc/classes/ProjectSettings.xml:1058 +#: doc/classes/ProjectSettings.xml:1064 msgid "" "If [code]true[/code], uses texture arrays instead of mipmaps for reflection " "probes and panorama backgrounds (sky). This reduces jitter noise and " @@ -39629,128 +39647,229 @@ msgid "" "memory." msgstr "" -#: doc/classes/ProjectSettings.xml:1061 +#: doc/classes/ProjectSettings.xml:1067 msgid "" "Lower-end override for [member rendering/quality/reflections/" "texture_array_reflections] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1066 +#: doc/classes/ProjectSettings.xml:1070 +msgid "" +"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing " +"around the edges of polygons. A higher MSAA value results in smoother edges " +"but can be significantly slower on some hardware.\n" +"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1074 +msgid "" +"Sets the screen-space antialiasing mode for the default screen [Viewport]. " +"Screen-space antialiasing works by selectively blurring edges in a post-" +"process shader. It differs from MSAA which takes multiple coverage samples " +"while rendering objects. Screen-space AA methods are typically faster than " +"MSAA and will smooth out specular aliasing, but tend to make scenes appear " +"blurry.\n" +"Another way to combat specular aliasing is to enable [member rendering/" +"quality/screen_filters/screen_space_roughness_limiter]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1078 +msgid "" +"Enables the screen-space roughness limiter which increases material " +"roughness in areas with a high normal frequency (i.e. when normals change a " +"lot from pixel to pixel). This helps to reduce the amount of specular " +"aliasing in a scene. Specular aliasing looks like random bright pixels that " +"occur in reflections." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1081 +msgid "" +"Curves the amount of the roughness limited effect. A higher value limits the " +"effect to very sharply curved surfaces, while a lower threshold extends the " +"effect to smoother surfaces." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1084 +msgid "" +"Sets the quality for rough screen-space reflections. Turning off will make " +"all screen space reflections sharp, while higher values make rough " +"reflections look better." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1087 msgid "" "If [code]true[/code], uses faster but lower-quality Blinn model to generate " "blurred reflections instead of the GGX model." msgstr "" -#: doc/classes/ProjectSettings.xml:1069 +#: doc/classes/ProjectSettings.xml:1090 msgid "" "Lower-end override for [member rendering/quality/shading/" "force_blinn_over_ggx] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1072 +#: doc/classes/ProjectSettings.xml:1093 msgid "" "If [code]true[/code], uses faster but lower-quality Lambert material " "lighting model instead of Burley." msgstr "" -#: doc/classes/ProjectSettings.xml:1075 +#: doc/classes/ProjectSettings.xml:1096 msgid "" "Lower-end override for [member rendering/quality/shading/" "force_lambert_over_burley] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1078 +#: doc/classes/ProjectSettings.xml:1099 msgid "" "If [code]true[/code], forces vertex shading for all rendering. This can " "increase performance a lot, but also reduces quality immensely. Can be used " "to optimize performance on low-end mobile devices." msgstr "" -#: doc/classes/ProjectSettings.xml:1081 +#: doc/classes/ProjectSettings.xml:1102 msgid "" "Lower-end override for [member rendering/quality/shading/" "force_vertex_shading] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1084 doc/classes/ProjectSettings.xml:1087 -#: doc/classes/ProjectSettings.xml:1090 doc/classes/ProjectSettings.xml:1093 +#: doc/classes/ProjectSettings.xml:1105 doc/classes/ProjectSettings.xml:1108 +#: doc/classes/ProjectSettings.xml:1111 doc/classes/ProjectSettings.xml:1114 msgid "" "Subdivision quadrant size for shadow mapping. See shadow mapping " "documentation." msgstr "" -#: doc/classes/ProjectSettings.xml:1096 +#: doc/classes/ProjectSettings.xml:1117 msgid "" "Size for shadow atlas (used for OmniLights and SpotLights). See " "documentation." msgstr "" -#: doc/classes/ProjectSettings.xml:1099 +#: doc/classes/ProjectSettings.xml:1120 msgid "" "Lower-end override for [member rendering/quality/shadow_atlas/size] on " "mobile devices, due to performance concerns or driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1102 +#: doc/classes/ProjectSettings.xml:1123 msgid "" -"Shadow filter mode. Higher-quality settings result in smoother shadows that " -"flicker less when moving. \"Disabled\" is the fastest option, but also has " -"the lowest quality. \"PCF5\" is smoother but is also slower. \"PCF13\" is " -"the smoothest option, but is also the slowest." +"Quality setting for shadows cast by [OmniLight3D]s and [SpotLight3D]s. " +"Higher quality settings use more samples when reading from shadow maps and " +"are thus slower. Low quality settings may result in shadows looking grainy." msgstr "" -#: doc/classes/ProjectSettings.xml:1105 +#: doc/classes/ProjectSettings.xml:1126 msgid "" -"Lower-end override for [member rendering/quality/shadows/filter_mode] on " -"mobile devices, due to performance concerns or driver support." +"Lower-end override for [member rendering/quality/shadows/" +"soft_shadow_quality] on mobile devices, due to performance concerns or " +"driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1129 +msgid "" +"If [code]true[/code], screen-space ambient occlusion will be rendered at " +"half size and then upscaled before being added to the scene. This is " +"significantly faster but may miss small details." msgstr "" -#: doc/classes/ProjectSettings.xml:1118 +#: doc/classes/ProjectSettings.xml:1132 +msgid "" +"Sets the quality of the screen-space ambient occlusion effect. Higher values " +"take more samples and so will result in better quality, at the cost of " +"performance." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1135 +msgid "" +"Scales the depth over which the subsurface scattering effect is applied. A " +"high value may allow light to scatter into a part of the mesh or another " +"mesh that is close in screen space but far in depth." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1138 +msgid "" +"Sets the quality of the subsurface scattering effect. Higher values are " +"slower but look nicer." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1141 +msgid "" +"Scales the distance over which samples are taken for subsurface scattering " +"effect. Changing this does not impact performance, but higher values will " +"result in significant artifacts as the samples will become obviously spread " +"out. A lower value results in a smaller spread of scattered light." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1144 +msgid "" +"Sets the maximum number of samples to take when using anisotropic filtering " +"on textures. A higher sample count will result in sharper textures at " +"oblique angles, but is more expensive to compute.\n" +"Only power of two values are valid ([code]1[/code], [code]2[/code], [code]4[/" +"code], [code]8[/code], [code]16[/code]). A value of [code]1[/code] forcibly " +"disables anisotropic filtering, even on materials where it is enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1148 +msgid "" +"If [code]true[/code], uses nearest-neighbor mipmap filtering when using " +"mipmaps (also called \"bilinear filtering\"), which will result in visible " +"seams appearing between mipmap stages. This may increase performance in " +"mobile as less memory bandwidth is used. If [code]false[/code], linear " +"mipmap filtering (also called \"trilinear filtering\") is used." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1151 msgid "" "Thread model for rendering. Rendering on a thread can vastly improve " "performance, but synchronizing to the main thread can cause a bit more " "jitter." msgstr "" -#: doc/classes/ProjectSettings.xml:1121 +#: doc/classes/ProjectSettings.xml:1154 msgid "" "If [code]true[/code], the texture importer will import VRAM-compressed " "textures using the BPTC algorithm. This texture compression algorithm is " "only supported on desktop platforms, and only when using the Vulkan renderer." msgstr "" -#: doc/classes/ProjectSettings.xml:1124 +#: doc/classes/ProjectSettings.xml:1157 msgid "" "If [code]true[/code], the texture importer will import VRAM-compressed " "textures using the Ericsson Texture Compression algorithm. This algorithm " "doesn't support alpha channels in textures." msgstr "" -#: doc/classes/ProjectSettings.xml:1127 +#: doc/classes/ProjectSettings.xml:1160 msgid "" "If [code]true[/code], the texture importer will import VRAM-compressed " "textures using the Ericsson Texture Compression 2 algorithm. This texture " "compression algorithm is only supported when using the Vulkan renderer." msgstr "" -#: doc/classes/ProjectSettings.xml:1130 +#: doc/classes/ProjectSettings.xml:1163 msgid "" "If [code]true[/code], the texture importer will import VRAM-compressed " "textures using the PowerVR Texture Compression algorithm. This texture " "compression algorithm is only supported on iOS." msgstr "" -#: doc/classes/ProjectSettings.xml:1133 +#: doc/classes/ProjectSettings.xml:1166 msgid "" "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." msgstr "" +#: doc/classes/ProjectSettings.xml:1177 +msgid "Cell size used for the 2D hash grid that [VisibilityNotifier2D] uses." +msgstr "" + #: doc/classes/ProximityGroup3D.xml:4 doc/classes/ProximityGroup3D.xml:7 msgid "General-purpose proximity detection node." msgstr "" @@ -40851,11 +40970,11 @@ msgstr "" #: doc/classes/RenderingServer.xml:7 msgid "" -"Server for anything visible. The visual server is the API backend for " +"Server for anything visible. The rendering server is the API backend for " "everything visible. The whole scene system mounts on it to display.\n" -"The visual server is completely opaque, the internals are entirely " +"The rendering server is completely opaque, the internals are entirely " "implementation specific and cannot be accessed.\n" -"The visual server can be used to bypass the scene system entirely.\n" +"The rendering server can be used to bypass the scene system entirely.\n" "Resources are created using the [code]*_create[/code] functions.\n" "All objects are drawn to a viewport. You can use the [Viewport] attached to " "the [SceneTree] or you can create one yourself with [method " @@ -40863,10 +40982,10 @@ msgid "" "canvas needs to be attached to the viewport using [method " "viewport_set_scenario] or [method viewport_attach_canvas].\n" "In 3D, all visual objects must be associated with a scenario. The scenario " -"is a visual representation of the world. If accessing the visual server from " -"a running game, the scenario can be accessed from the scene tree from any " -"[Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can be " -"created with [method scenario_create].\n" +"is a visual representation of the world. If accessing the rendering server " +"from a running game, the scenario can be accessed from the scene tree from " +"any [Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can " +"be created with [method scenario_create].\n" "Similarly in 2D, a canvas is needed to draw all canvas items.\n" "In 3D, all visible objects are comprised of a resource and an instance. A " "resource can be a mesh, a particle system, a light, or any other 3D object. " @@ -41292,42 +41411,42 @@ msgstr "" msgid "Returns the id of a white texture. Creates one if none exists." msgstr "" -#: doc/classes/RenderingServer.xml:954 +#: doc/classes/RenderingServer.xml:1006 msgid "" "Returns [code]true[/code] if changes have been made to the RenderingServer's " "data. [method force_draw] is usually called if this happens." msgstr "" -#: doc/classes/RenderingServer.xml:963 +#: doc/classes/RenderingServer.xml:1015 msgid "Not yet implemented. Always returns [code]false[/code]." msgstr "" -#: doc/classes/RenderingServer.xml:972 +#: doc/classes/RenderingServer.xml:1024 msgid "" "Returns [code]true[/code] if the OS supports a certain feature. Features " "might be [code]s3tc[/code], [code]etc[/code], [code]etc2[/code] and " "[code]pvrtc[/code]." msgstr "" -#: doc/classes/RenderingServer.xml:985 +#: doc/classes/RenderingServer.xml:1037 msgid "" "Sets up [ImmediateGeometry3D] internals to prepare for drawing. Equivalent " "to [method ImmediateGeometry3D.begin]." msgstr "" -#: doc/classes/RenderingServer.xml:994 +#: doc/classes/RenderingServer.xml:1046 msgid "" "Clears everything that was set up between [method immediate_begin] and " "[method immediate_end]. Equivalent to [method ImmediateGeometry3D.clear]." msgstr "" -#: doc/classes/RenderingServer.xml:1005 +#: doc/classes/RenderingServer.xml:1057 msgid "" "Sets the color to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_color]." msgstr "" -#: doc/classes/RenderingServer.xml:1012 +#: doc/classes/RenderingServer.xml:1064 msgid "" "Creates an immediate geometry and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41338,78 +41457,78 @@ msgid "" "[method instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:1023 +#: doc/classes/RenderingServer.xml:1075 msgid "" "Ends drawing the [ImmediateGeometry3D] and displays it. Equivalent to " "[method ImmediateGeometry3D.end]." msgstr "" -#: doc/classes/RenderingServer.xml:1032 +#: doc/classes/RenderingServer.xml:1084 msgid "Returns the material assigned to the [ImmediateGeometry3D]." msgstr "" -#: doc/classes/RenderingServer.xml:1043 +#: doc/classes/RenderingServer.xml:1095 msgid "" "Sets the normal to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_normal]." msgstr "" -#: doc/classes/RenderingServer.xml:1054 +#: doc/classes/RenderingServer.xml:1106 msgid "Sets the material to be used to draw the [ImmediateGeometry3D]." msgstr "" -#: doc/classes/RenderingServer.xml:1065 +#: doc/classes/RenderingServer.xml:1117 msgid "" "Sets the tangent to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_tangent]." msgstr "" -#: doc/classes/RenderingServer.xml:1076 +#: doc/classes/RenderingServer.xml:1128 msgid "" "Sets the UV to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_uv]." msgstr "" -#: doc/classes/RenderingServer.xml:1087 +#: doc/classes/RenderingServer.xml:1139 msgid "" "Sets the UV2 to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_uv2]." msgstr "" -#: doc/classes/RenderingServer.xml:1098 +#: doc/classes/RenderingServer.xml:1150 msgid "" "Adds the next vertex using the information provided in advance. Equivalent " "to [method ImmediateGeometry3D.add_vertex]." msgstr "" -#: doc/classes/RenderingServer.xml:1109 +#: doc/classes/RenderingServer.xml:1161 msgid "" "Adds the next vertex using the information provided in advance. This is a " "helper class that calls [method immediate_vertex] under the hood. Equivalent " "to [method ImmediateGeometry3D.add_vertex]." msgstr "" -#: doc/classes/RenderingServer.xml:1116 +#: doc/classes/RenderingServer.xml:1168 msgid "" -"Initializes the visual server. This function is called internally by " +"Initializes the rendering server. This function is called internally by " "platform-dependent code during engine initialization. If called from a " "running game, it will not do anything." msgstr "" -#: doc/classes/RenderingServer.xml:1127 +#: doc/classes/RenderingServer.xml:1179 msgid "" "Attaches a unique Object ID to instance. Object ID must be attached to " "instance for proper culling with [method instances_cull_aabb], [method " "instances_cull_convex], and [method instances_cull_ray]." msgstr "" -#: doc/classes/RenderingServer.xml:1138 +#: doc/classes/RenderingServer.xml:1190 msgid "" "Attaches a skeleton to an instance. Removes the previous skeleton from the " "instance." msgstr "" -#: doc/classes/RenderingServer.xml:1145 +#: doc/classes/RenderingServer.xml:1197 msgid "" "Creates a visual instance and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41421,7 +41540,7 @@ msgid "" "instance to be visible in the scenario using [method instance_set_base]." msgstr "" -#: doc/classes/RenderingServer.xml:1158 +#: doc/classes/RenderingServer.xml:1210 msgid "" "Creates a visual instance, adds it to the RenderingServer, and sets both " "base and scenario. It can be accessed with the RID that is returned. This " @@ -41430,31 +41549,31 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:1170 doc/classes/RenderingServer.xml:1198 -#: doc/classes/RenderingServer.xml:1488 +#: doc/classes/RenderingServer.xml:1222 doc/classes/RenderingServer.xml:1250 +#: doc/classes/RenderingServer.xml:1540 msgid "Not implemented in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:1181 +#: doc/classes/RenderingServer.xml:1233 msgid "" "Sets the shadow casting setting to one of [enum ShadowCastingSetting]. " "Equivalent to [member GeometryInstance3D.cast_shadow]." msgstr "" -#: doc/classes/RenderingServer.xml:1211 +#: doc/classes/RenderingServer.xml:1263 msgid "" "Sets the flag for a given [enum InstanceFlags]. See [enum InstanceFlags] for " "more details." msgstr "" -#: doc/classes/RenderingServer.xml:1222 +#: doc/classes/RenderingServer.xml:1274 msgid "" "Sets a material that will override the material for all surfaces on the mesh " "associated with this instance. Equivalent to [member GeometryInstance3D." "material_override]." msgstr "" -#: doc/classes/RenderingServer.xml:1233 +#: doc/classes/RenderingServer.xml:1285 msgid "" "Sets the base of the instance. A base can be any of the 3D objects that are " "created in the RenderingServer that can be displayed. For example, any of " @@ -41463,62 +41582,62 @@ msgid "" "be set as the base of an instance in order to be displayed in the scenario." msgstr "" -#: doc/classes/RenderingServer.xml:1246 +#: doc/classes/RenderingServer.xml:1298 msgid "Sets the weight for a given blend shape associated with this instance." msgstr "" -#: doc/classes/RenderingServer.xml:1257 +#: doc/classes/RenderingServer.xml:1309 msgid "" "Sets a custom AABB to use when culling objects from the view frustum. " "Equivalent to [method GeometryInstance3D.set_custom_aabb]." msgstr "" -#: doc/classes/RenderingServer.xml:1268 +#: doc/classes/RenderingServer.xml:1320 msgid "Function not implemented in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:1279 +#: doc/classes/RenderingServer.xml:1331 msgid "" "Sets a margin to increase the size of the AABB when culling objects from the " "view frustum. This allows you avoid culling objects that fall outside the " "view frustum. Equivalent to [member GeometryInstance3D.extra_cull_margin]." msgstr "" -#: doc/classes/RenderingServer.xml:1290 +#: doc/classes/RenderingServer.xml:1342 msgid "" "Sets the render layers that this instance will be drawn to. Equivalent to " "[member VisualInstance3D.layers]." msgstr "" -#: doc/classes/RenderingServer.xml:1301 +#: doc/classes/RenderingServer.xml:1353 msgid "" "Sets the scenario that the instance is in. The scenario is the 3D world that " "the objects will be displayed in." msgstr "" -#: doc/classes/RenderingServer.xml:1314 +#: doc/classes/RenderingServer.xml:1366 msgid "" "Sets the material of a specific surface. Equivalent to [method " "MeshInstance3D.set_surface_material]." msgstr "" -#: doc/classes/RenderingServer.xml:1325 +#: doc/classes/RenderingServer.xml:1377 msgid "" "Sets the world space transform of the instance. Equivalent to [member Node3D." "transform]." msgstr "" -#: doc/classes/RenderingServer.xml:1338 +#: doc/classes/RenderingServer.xml:1390 msgid "Sets the lightmap to use with this instance." msgstr "" -#: doc/classes/RenderingServer.xml:1349 +#: doc/classes/RenderingServer.xml:1401 msgid "" "Sets whether an instance is drawn or not. Equivalent to [member Node3D." "visible]." msgstr "" -#: doc/classes/RenderingServer.xml:1360 +#: doc/classes/RenderingServer.xml:1412 msgid "" "Returns an array of object IDs intersecting with the provided AABB. Only " "visual 3D nodes are considered, such as [MeshInstance3D] or " @@ -41530,7 +41649,7 @@ msgid "" "game use cases, prefer physics collision." msgstr "" -#: doc/classes/RenderingServer.xml:1372 +#: doc/classes/RenderingServer.xml:1424 msgid "" "Returns an array of object IDs intersecting with the provided convex shape. " "Only visual 3D nodes are considered, such as [MeshInstance3D] or " @@ -41542,7 +41661,7 @@ msgid "" "game use cases, prefer physics collision." msgstr "" -#: doc/classes/RenderingServer.xml:1386 +#: doc/classes/RenderingServer.xml:1438 msgid "" "Returns an array of object IDs intersecting with the provided 3D ray. Only " "visual 3D nodes are considered, such as [MeshInstance3D] or " @@ -41554,58 +41673,58 @@ msgid "" "game use cases, prefer physics collision." msgstr "" -#: doc/classes/RenderingServer.xml:1398 +#: doc/classes/RenderingServer.xml:1450 msgid "" "If [code]true[/code], this directional light will blend between shadow map " "splits resulting in a smoother transition between them. Equivalent to " "[member DirectionalLight3D.directional_shadow_blend_splits]." msgstr "" -#: doc/classes/RenderingServer.xml:1409 +#: doc/classes/RenderingServer.xml:1461 msgid "" "Sets the shadow depth range mode for this directional light. Equivalent to " "[member DirectionalLight3D.directional_shadow_depth_range]. See [enum " "LightDirectionalShadowDepthRangeMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:1420 +#: doc/classes/RenderingServer.xml:1472 msgid "" "Sets the shadow mode for this directional light. Equivalent to [member " "DirectionalLight3D.directional_shadow_mode]. See [enum " "LightDirectionalShadowMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:1431 +#: doc/classes/RenderingServer.xml:1483 msgid "" "Sets whether to use a dual paraboloid or a cubemap for the shadow map. Dual " "paraboloid is faster but may suffer from artifacts. Equivalent to [member " "OmniLight3D.omni_shadow_mode]." msgstr "" -#: doc/classes/RenderingServer.xml:1442 +#: doc/classes/RenderingServer.xml:1494 msgid "" "Sets the color of the light. Equivalent to [member Light3D.light_color]." msgstr "" -#: doc/classes/RenderingServer.xml:1453 +#: doc/classes/RenderingServer.xml:1505 msgid "" "Sets the cull mask for this Light3D. Lights only affect objects in the " "selected layers. Equivalent to [member Light3D.light_cull_mask]." msgstr "" -#: doc/classes/RenderingServer.xml:1464 +#: doc/classes/RenderingServer.xml:1516 msgid "" "If [code]true[/code], light will subtract light instead of adding light. " "Equivalent to [member Light3D.light_negative]." msgstr "" -#: doc/classes/RenderingServer.xml:1477 +#: doc/classes/RenderingServer.xml:1529 msgid "" "Sets the specified light parameter. See [enum LightParam] for options. " "Equivalent to [method Light3D.set_param]." msgstr "" -#: doc/classes/RenderingServer.xml:1499 +#: doc/classes/RenderingServer.xml:1551 msgid "" "If [code]true[/code], reverses the backface culling of the mesh. This can be " "useful when you have a flat mesh that has a light behind it. If you need to " @@ -41614,23 +41733,23 @@ msgid "" "to [member Light3D.shadow_reverse_cull_face]." msgstr "" -#: doc/classes/RenderingServer.xml:1510 +#: doc/classes/RenderingServer.xml:1562 msgid "" "If [code]true[/code], light will cast shadows. Equivalent to [member Light3D." "shadow_enabled]." msgstr "" -#: doc/classes/RenderingServer.xml:1521 +#: doc/classes/RenderingServer.xml:1573 msgid "" "Sets the color of the shadow cast by the light. Equivalent to [member " "Light3D.shadow_color]." msgstr "" -#: doc/classes/RenderingServer.xml:1532 +#: doc/classes/RenderingServer.xml:1584 msgid "Sets whether GI probes capture light information from this light." msgstr "" -#: doc/classes/RenderingServer.xml:1539 +#: doc/classes/RenderingServer.xml:1591 msgid "" "Creates a lightmap capture and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41641,54 +41760,54 @@ msgid "" "[method instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:1550 +#: doc/classes/RenderingServer.xml:1602 msgid "Returns the size of the lightmap capture area." msgstr "" -#: doc/classes/RenderingServer.xml:1559 +#: doc/classes/RenderingServer.xml:1611 msgid "Returns the energy multiplier used by the lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1568 +#: doc/classes/RenderingServer.xml:1620 msgid "Returns the octree used by the lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1577 +#: doc/classes/RenderingServer.xml:1629 msgid "" "Returns the cell subdivision amount used by this lightmap capture's octree." msgstr "" -#: doc/classes/RenderingServer.xml:1586 +#: doc/classes/RenderingServer.xml:1638 msgid "Returns the cell transform for this lightmap capture's octree." msgstr "" -#: doc/classes/RenderingServer.xml:1597 +#: doc/classes/RenderingServer.xml:1649 msgid "Sets the size of the area covered by the lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1608 +#: doc/classes/RenderingServer.xml:1660 msgid "Sets the energy multiplier for this lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1619 +#: doc/classes/RenderingServer.xml:1671 msgid "Sets the octree to be used by this lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1630 +#: doc/classes/RenderingServer.xml:1682 msgid "Sets the subdivision level of this lightmap capture's octree." msgstr "" -#: doc/classes/RenderingServer.xml:1641 +#: doc/classes/RenderingServer.xml:1693 msgid "Sets the octree cell transform for this lightmap capture's octree." msgstr "" -#: doc/classes/RenderingServer.xml:1654 +#: doc/classes/RenderingServer.xml:1706 msgid "" "Returns a mesh of a sphere with the given amount of horizontal and vertical " "subdivisions." msgstr "" -#: doc/classes/RenderingServer.xml:1661 +#: doc/classes/RenderingServer.xml:1713 msgid "" "Creates an empty material and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41697,31 +41816,31 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:1673 +#: doc/classes/RenderingServer.xml:1725 msgid "Returns the value of a certain material's parameter." msgstr "" -#: doc/classes/RenderingServer.xml:1684 +#: doc/classes/RenderingServer.xml:1736 msgid "Sets an object's next material." msgstr "" -#: doc/classes/RenderingServer.xml:1697 +#: doc/classes/RenderingServer.xml:1749 msgid "Sets a material's parameter." msgstr "" -#: doc/classes/RenderingServer.xml:1708 +#: doc/classes/RenderingServer.xml:1760 msgid "Sets a material's render priority." msgstr "" -#: doc/classes/RenderingServer.xml:1719 +#: doc/classes/RenderingServer.xml:1771 msgid "Sets a shader material's shader." msgstr "" -#: doc/classes/RenderingServer.xml:1748 +#: doc/classes/RenderingServer.xml:1800 msgid "Removes all surfaces from a mesh." msgstr "" -#: doc/classes/RenderingServer.xml:1755 +#: doc/classes/RenderingServer.xml:1807 msgid "" "Creates a new mesh and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID will be used in all [code]mesh_*[/" @@ -41732,58 +41851,58 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:1766 +#: doc/classes/RenderingServer.xml:1818 msgid "Returns a mesh's blend shape count." msgstr "" -#: doc/classes/RenderingServer.xml:1775 +#: doc/classes/RenderingServer.xml:1827 msgid "Returns a mesh's blend shape mode." msgstr "" -#: doc/classes/RenderingServer.xml:1784 +#: doc/classes/RenderingServer.xml:1836 msgid "Returns a mesh's custom aabb." msgstr "" -#: doc/classes/RenderingServer.xml:1793 +#: doc/classes/RenderingServer.xml:1845 msgid "Returns a mesh's number of surfaces." msgstr "" -#: doc/classes/RenderingServer.xml:1804 +#: doc/classes/RenderingServer.xml:1856 msgid "Sets a mesh's blend shape mode." msgstr "" -#: doc/classes/RenderingServer.xml:1815 +#: doc/classes/RenderingServer.xml:1867 msgid "Sets a mesh's custom aabb." msgstr "" -#: doc/classes/RenderingServer.xml:1826 +#: doc/classes/RenderingServer.xml:1878 msgid "Returns a mesh's surface's buffer arrays." msgstr "" -#: doc/classes/RenderingServer.xml:1837 +#: doc/classes/RenderingServer.xml:1889 msgid "Returns a mesh's surface's arrays for blend shapes." msgstr "" -#: doc/classes/RenderingServer.xml:1852 doc/classes/RenderingServer.xml:1865 +#: doc/classes/RenderingServer.xml:1904 doc/classes/RenderingServer.xml:1917 msgid "Function is unused in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:1876 +#: doc/classes/RenderingServer.xml:1928 msgid "Returns a mesh's surface's material." msgstr "" -#: doc/classes/RenderingServer.xml:1889 +#: doc/classes/RenderingServer.xml:1941 msgid "Sets a mesh's surface's material." msgstr "" -#: doc/classes/RenderingServer.xml:1904 +#: doc/classes/RenderingServer.xml:1956 msgid "" "Updates a specific region of a vertex buffer for the specified surface. " "Warning: this function alters the vertex buffer directly with no safety " "mechanisms, you can easily corrupt your mesh." msgstr "" -#: doc/classes/RenderingServer.xml:1927 +#: doc/classes/RenderingServer.xml:1979 msgid "" "Creates a new multimesh on the RenderingServer and returns an [RID] handle. " "This RID will be used in all [code]multimesh_*[/code] RenderingServer " @@ -41794,82 +41913,82 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:1938 +#: doc/classes/RenderingServer.xml:1990 msgid "" "Calculates and returns the axis-aligned bounding box that encloses all " "instances within the multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:1955 +#: doc/classes/RenderingServer.xml:2007 msgid "Returns the number of instances allocated for this multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:1964 +#: doc/classes/RenderingServer.xml:2016 msgid "" "Returns the RID of the mesh that will be used in drawing this multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:1973 +#: doc/classes/RenderingServer.xml:2025 msgid "Returns the number of visible instances for this multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:1984 +#: doc/classes/RenderingServer.xml:2036 msgid "Returns the color by which the specified instance will be modulated." msgstr "" -#: doc/classes/RenderingServer.xml:1995 +#: doc/classes/RenderingServer.xml:2047 msgid "Returns the custom data associated with the specified instance." msgstr "" -#: doc/classes/RenderingServer.xml:2006 +#: doc/classes/RenderingServer.xml:2058 msgid "Returns the [Transform] of the specified instance." msgstr "" -#: doc/classes/RenderingServer.xml:2017 +#: doc/classes/RenderingServer.xml:2069 msgid "" "Returns the [Transform2D] of the specified instance. For use when the " "multimesh is set to use 2D transforms." msgstr "" -#: doc/classes/RenderingServer.xml:2030 +#: doc/classes/RenderingServer.xml:2082 msgid "" "Sets the color by which this instance will be modulated. Equivalent to " "[method MultiMesh.set_instance_color]." msgstr "" -#: doc/classes/RenderingServer.xml:2043 +#: doc/classes/RenderingServer.xml:2095 msgid "" "Sets the custom data for this instance. Custom data is passed as a [Color], " "but is interpreted as a [code]vec4[/code] in the shader. Equivalent to " "[method MultiMesh.set_instance_custom_data]." msgstr "" -#: doc/classes/RenderingServer.xml:2056 +#: doc/classes/RenderingServer.xml:2108 msgid "" "Sets the [Transform] for this instance. Equivalent to [method MultiMesh." "set_instance_transform]." msgstr "" -#: doc/classes/RenderingServer.xml:2069 +#: doc/classes/RenderingServer.xml:2121 msgid "" "Sets the [Transform2D] for this instance. For use when multimesh is used in " "2D. Equivalent to [method MultiMesh.set_instance_transform_2d]." msgstr "" -#: doc/classes/RenderingServer.xml:2090 +#: doc/classes/RenderingServer.xml:2142 msgid "" "Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh." "mesh]." msgstr "" -#: doc/classes/RenderingServer.xml:2101 +#: doc/classes/RenderingServer.xml:2153 msgid "" "Sets the number of instances visible at a given time. If -1, all instances " "that have been allocated are drawn. Equivalent to [member MultiMesh." "visible_instance_count]." msgstr "" -#: doc/classes/RenderingServer.xml:2108 +#: doc/classes/RenderingServer.xml:2160 msgid "" "Creates a new omni light and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID can be used in most " @@ -41880,7 +41999,7 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:2117 +#: doc/classes/RenderingServer.xml:2169 msgid "" "Creates a particle system and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41891,23 +42010,23 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:2128 +#: doc/classes/RenderingServer.xml:2180 msgid "" "Calculates and returns the axis-aligned bounding box that contains all the " "particles. Equivalent to [method GPUParticles3D.capture_aabb]." msgstr "" -#: doc/classes/RenderingServer.xml:2137 +#: doc/classes/RenderingServer.xml:2189 msgid "Returns [code]true[/code] if particles are currently set to emitting." msgstr "" -#: doc/classes/RenderingServer.xml:2146 +#: doc/classes/RenderingServer.xml:2198 msgid "" "Returns [code]true[/code] if particles are not emitting and particles are " "set to inactive." msgstr "" -#: doc/classes/RenderingServer.xml:2155 +#: doc/classes/RenderingServer.xml:2207 msgid "" "Add particle system to list of particle systems that need to be updated. " "Update will take place on the next frame, or on the next call to [method " @@ -41915,121 +42034,121 @@ msgid "" "instances_cull_ray]." msgstr "" -#: doc/classes/RenderingServer.xml:2164 +#: doc/classes/RenderingServer.xml:2216 msgid "" "Reset the particles on the next update. Equivalent to [method GPUParticles3D." "restart]." msgstr "" -#: doc/classes/RenderingServer.xml:2175 +#: doc/classes/RenderingServer.xml:2227 msgid "" "Sets the number of particles to be drawn and allocates the memory for them. " "Equivalent to [member GPUParticles3D.amount]." msgstr "" -#: doc/classes/RenderingServer.xml:2186 +#: doc/classes/RenderingServer.xml:2238 msgid "" "Sets a custom axis-aligned bounding box for the particle system. Equivalent " "to [member GPUParticles3D.visibility_aabb]." msgstr "" -#: doc/classes/RenderingServer.xml:2197 +#: doc/classes/RenderingServer.xml:2249 msgid "" "Sets the draw order of the particles to one of the named enums from [enum " "ParticlesDrawOrder]. See [enum ParticlesDrawOrder] for options. Equivalent " "to [member GPUParticles3D.draw_order]." msgstr "" -#: doc/classes/RenderingServer.xml:2210 +#: doc/classes/RenderingServer.xml:2262 msgid "" "Sets the mesh to be used for the specified draw pass. Equivalent to [member " "GPUParticles3D.draw_pass_1], [member GPUParticles3D.draw_pass_2], [member " "GPUParticles3D.draw_pass_3], and [member GPUParticles3D.draw_pass_4]." msgstr "" -#: doc/classes/RenderingServer.xml:2221 +#: doc/classes/RenderingServer.xml:2273 msgid "" "Sets the number of draw passes to use. Equivalent to [member GPUParticles3D." "draw_passes]." msgstr "" -#: doc/classes/RenderingServer.xml:2232 +#: doc/classes/RenderingServer.xml:2284 msgid "" "Sets the [Transform] that will be used by the particles when they first emit." msgstr "" -#: doc/classes/RenderingServer.xml:2243 +#: doc/classes/RenderingServer.xml:2295 msgid "" "If [code]true[/code], particles will emit over time. Setting to false does " "not reset the particles, but only stops their emission. Equivalent to " "[member GPUParticles3D.emitting]." msgstr "" -#: doc/classes/RenderingServer.xml:2254 +#: doc/classes/RenderingServer.xml:2306 msgid "" "Sets the explosiveness ratio. Equivalent to [member GPUParticles3D." "explosiveness]." msgstr "" -#: doc/classes/RenderingServer.xml:2265 +#: doc/classes/RenderingServer.xml:2317 msgid "" "Sets the frame rate that the particle system rendering will be fixed to. " "Equivalent to [member GPUParticles3D.fixed_fps]." msgstr "" -#: doc/classes/RenderingServer.xml:2276 +#: doc/classes/RenderingServer.xml:2328 msgid "" "If [code]true[/code], uses fractional delta which smooths the movement of " "the particles. Equivalent to [member GPUParticles3D.fract_delta]." msgstr "" -#: doc/classes/RenderingServer.xml:2287 +#: doc/classes/RenderingServer.xml:2339 msgid "" "Sets the lifetime of each particle in the system. Equivalent to [member " "GPUParticles3D.lifetime]." msgstr "" -#: doc/classes/RenderingServer.xml:2298 +#: doc/classes/RenderingServer.xml:2350 msgid "" "If [code]true[/code], particles will emit once and then stop. Equivalent to " "[member GPUParticles3D.one_shot]." msgstr "" -#: doc/classes/RenderingServer.xml:2309 +#: doc/classes/RenderingServer.xml:2361 msgid "" "Sets the preprocess time for the particles animation. This lets you delay " "starting an animation until after the particles have begun emitting. " "Equivalent to [member GPUParticles3D.preprocess]." msgstr "" -#: doc/classes/RenderingServer.xml:2320 +#: doc/classes/RenderingServer.xml:2372 msgid "" "Sets the material for processing the particles. Note: this is not the " "material used to draw the materials. Equivalent to [member GPUParticles3D." "process_material]." msgstr "" -#: doc/classes/RenderingServer.xml:2331 +#: doc/classes/RenderingServer.xml:2383 msgid "" "Sets the emission randomness ratio. This randomizes the emission of " "particles within their phase. Equivalent to [member GPUParticles3D." "randomness]." msgstr "" -#: doc/classes/RenderingServer.xml:2342 +#: doc/classes/RenderingServer.xml:2394 msgid "" "Sets the speed scale of the particle system. Equivalent to [member " "GPUParticles3D.speed_scale]." msgstr "" -#: doc/classes/RenderingServer.xml:2353 +#: doc/classes/RenderingServer.xml:2405 msgid "" "If [code]true[/code], particles use local coordinates. If [code]false[/code] " "they use global coordinates. Equivalent to [member GPUParticles3D." "local_coords]." msgstr "" -#: doc/classes/RenderingServer.xml:2360 +#: doc/classes/RenderingServer.xml:2412 msgid "" "Creates a reflection probe and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -42040,59 +42159,59 @@ msgid "" "[method instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:2373 +#: doc/classes/RenderingServer.xml:2425 msgid "" "If [code]true[/code], reflections will ignore sky contribution. Equivalent " "to [member ReflectionProbe.interior_enable]." msgstr "" -#: doc/classes/RenderingServer.xml:2384 +#: doc/classes/RenderingServer.xml:2436 msgid "" "Sets the render cull mask for this reflection probe. Only instances with a " "matching cull mask will be rendered by this probe. Equivalent to [member " "ReflectionProbe.cull_mask]." msgstr "" -#: doc/classes/RenderingServer.xml:2395 +#: doc/classes/RenderingServer.xml:2447 msgid "" "If [code]true[/code], uses box projection. This can make reflections look " "more correct in certain situations. Equivalent to [member ReflectionProbe." "box_projection]." msgstr "" -#: doc/classes/RenderingServer.xml:2406 +#: doc/classes/RenderingServer.xml:2458 msgid "" "If [code]true[/code], computes shadows in the reflection probe. This makes " "the reflection much slower to compute. Equivalent to [member ReflectionProbe." "enable_shadows]." msgstr "" -#: doc/classes/RenderingServer.xml:2417 +#: doc/classes/RenderingServer.xml:2469 msgid "" "Sets the size of the area that the reflection probe will capture. Equivalent " "to [member ReflectionProbe.extents]." msgstr "" -#: doc/classes/RenderingServer.xml:2428 +#: doc/classes/RenderingServer.xml:2480 msgid "" "Sets the intensity of the reflection probe. Intensity modulates the strength " "of the reflection. Equivalent to [member ReflectionProbe.intensity]." msgstr "" -#: doc/classes/RenderingServer.xml:2439 +#: doc/classes/RenderingServer.xml:2491 msgid "" "Sets the ambient light color for this reflection probe when set to interior " "mode. Equivalent to [member ReflectionProbe.interior_ambient_color]." msgstr "" -#: doc/classes/RenderingServer.xml:2450 +#: doc/classes/RenderingServer.xml:2502 msgid "" "Sets the energy multiplier for this reflection probes ambient light " "contribution when set to interior mode. Equivalent to [member " "ReflectionProbe.interior_ambient_energy]." msgstr "" -#: doc/classes/RenderingServer.xml:2461 +#: doc/classes/RenderingServer.xml:2513 msgid "" "Sets the contribution value for how much the reflection affects the ambient " "light for this reflection probe when set to interior mode. Useful so that " @@ -42100,25 +42219,25 @@ msgid "" "ReflectionProbe.interior_ambient_contrib]." msgstr "" -#: doc/classes/RenderingServer.xml:2472 +#: doc/classes/RenderingServer.xml:2524 msgid "" "Sets the max distance away from the probe an object can be before it is " "culled. Equivalent to [member ReflectionProbe.max_distance]." msgstr "" -#: doc/classes/RenderingServer.xml:2483 +#: doc/classes/RenderingServer.xml:2535 msgid "" "Sets the origin offset to be used when this reflection probe is in box " "project mode. Equivalent to [member ReflectionProbe.origin_offset]." msgstr "" -#: doc/classes/RenderingServer.xml:2494 +#: doc/classes/RenderingServer.xml:2546 msgid "" "Sets how often the reflection probe updates. Can either be once or every " "frame. See [enum ReflectionProbeUpdateMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:2507 +#: doc/classes/RenderingServer.xml:2559 msgid "" "Schedules a callback to the corresponding named [code]method[/code] on " "[code]where[/code] after a frame has been drawn.\n" @@ -42126,7 +42245,7 @@ msgid "" "[code]userdata[/code]." msgstr "" -#: doc/classes/RenderingServer.xml:2515 +#: doc/classes/RenderingServer.xml:2567 msgid "" "Creates a scenario and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID will be used in all " @@ -42136,24 +42255,24 @@ msgid "" "The scenario is the 3D world that all the visual instances exist in." msgstr "" -#: doc/classes/RenderingServer.xml:2528 +#: doc/classes/RenderingServer.xml:2580 msgid "" "Sets the [enum ScenarioDebugMode] for this scenario. See [enum " "ScenarioDebugMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:2539 +#: doc/classes/RenderingServer.xml:2591 msgid "Sets the environment that will be used with this scenario." msgstr "" -#: doc/classes/RenderingServer.xml:2550 +#: doc/classes/RenderingServer.xml:2602 msgid "" "Sets the fallback environment to be used by this scenario. The fallback " "environment is used if no environment is set. Internally, this is used by " "the editor to provide a default environment." msgstr "" -#: doc/classes/RenderingServer.xml:2565 +#: doc/classes/RenderingServer.xml:2617 msgid "" "Sets a boot image. The color defines the background color. If [code]scale[/" "code] is [code]true[/code], the image will be scaled to fit the screen size. " @@ -42162,19 +42281,19 @@ msgid "" "the image will be scaled with nearest-neighbor interpolation." msgstr "" -#: doc/classes/RenderingServer.xml:2574 +#: doc/classes/RenderingServer.xml:2626 msgid "" "If [code]true[/code], the engine will generate wireframes for use with the " "wireframe debug mode." msgstr "" -#: doc/classes/RenderingServer.xml:2583 +#: doc/classes/RenderingServer.xml:2635 msgid "" "Sets the default clear color which is used when a specific clear color has " "not been selected." msgstr "" -#: doc/classes/RenderingServer.xml:2590 +#: doc/classes/RenderingServer.xml:2642 msgid "" "Creates an empty shader and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -42183,47 +42302,47 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:2600 +#: doc/classes/RenderingServer.xml:2652 msgid "Returns a shader's code." msgstr "" -#: doc/classes/RenderingServer.xml:2611 +#: doc/classes/RenderingServer.xml:2663 msgid "Returns a default texture from a shader searched by name." msgstr "" -#: doc/classes/RenderingServer.xml:2630 +#: doc/classes/RenderingServer.xml:2682 msgid "Returns the parameters of a shader." msgstr "" -#: doc/classes/RenderingServer.xml:2641 +#: doc/classes/RenderingServer.xml:2693 msgid "Sets a shader's code." msgstr "" -#: doc/classes/RenderingServer.xml:2654 +#: doc/classes/RenderingServer.xml:2706 msgid "Sets a shader's default texture. Overwrites the texture given by name." msgstr "" -#: doc/classes/RenderingServer.xml:2667 +#: doc/classes/RenderingServer.xml:2719 msgid "Allocates the GPU buffers for this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2678 +#: doc/classes/RenderingServer.xml:2730 msgid "Returns the [Transform] set for a specific bone of this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2689 +#: doc/classes/RenderingServer.xml:2741 msgid "Returns the [Transform2D] set for a specific bone of this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2702 +#: doc/classes/RenderingServer.xml:2754 msgid "Sets the [Transform] for a specific bone of this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2715 +#: doc/classes/RenderingServer.xml:2767 msgid "Sets the [Transform2D] for a specific bone of this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2722 +#: doc/classes/RenderingServer.xml:2774 msgid "" "Creates a skeleton and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID will be used in all " @@ -42232,11 +42351,11 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:2732 +#: doc/classes/RenderingServer.xml:2784 msgid "Returns the number of bones allocated for this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2739 +#: doc/classes/RenderingServer.xml:2791 msgid "" "Creates an empty sky and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID will be used in all [code]sky_*[/" @@ -42245,13 +42364,13 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:2751 +#: doc/classes/RenderingServer.xml:2803 msgid "" "Sets the material that the sky uses to render the background and reflection " "maps." msgstr "" -#: doc/classes/RenderingServer.xml:2758 +#: doc/classes/RenderingServer.xml:2810 msgid "" "Creates a spot light and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID can be used in most [code]light_*[/" @@ -42262,15 +42381,15 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:2787 +#: doc/classes/RenderingServer.xml:2839 msgid "Sets a viewport's camera." msgstr "" -#: doc/classes/RenderingServer.xml:2798 +#: doc/classes/RenderingServer.xml:2850 msgid "Sets a viewport's canvas." msgstr "" -#: doc/classes/RenderingServer.xml:2811 +#: doc/classes/RenderingServer.xml:2863 msgid "" "Copies the viewport to a region of the screen specified by [code]rect[/" "code]. If [method viewport_set_render_direct_to_screen] is [code]true[/" @@ -42292,7 +42411,7 @@ msgid "" "viewport_set_render_direct_to_screen]." msgstr "" -#: doc/classes/RenderingServer.xml:2825 +#: doc/classes/RenderingServer.xml:2877 msgid "" "Creates an empty viewport and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -42301,72 +42420,72 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:2837 +#: doc/classes/RenderingServer.xml:2889 msgid "" "Returns a viewport's render information. For options, see the [enum " "ViewportRenderInfo] constants." msgstr "" -#: doc/classes/RenderingServer.xml:2846 +#: doc/classes/RenderingServer.xml:2898 msgid "Returns the viewport's last rendered frame." msgstr "" -#: doc/classes/RenderingServer.xml:2857 +#: doc/classes/RenderingServer.xml:2909 msgid "Detaches a viewport from a canvas and vice versa." msgstr "" -#: doc/classes/RenderingServer.xml:2868 +#: doc/classes/RenderingServer.xml:2920 msgid "If [code]true[/code], sets the viewport active, else sets it inactive." msgstr "" -#: doc/classes/RenderingServer.xml:2883 +#: doc/classes/RenderingServer.xml:2935 msgid "" "Sets the stacking order for a viewport's canvas.\n" "[code]layer[/code] is the actual canvas layer, while [code]sublayer[/code] " "specifies the stacking order of the canvas among those in the same layer." msgstr "" -#: doc/classes/RenderingServer.xml:2897 +#: doc/classes/RenderingServer.xml:2949 msgid "Sets the transformation of a viewport's canvas." msgstr "" -#: doc/classes/RenderingServer.xml:2908 +#: doc/classes/RenderingServer.xml:2960 msgid "" "Sets the clear mode of a viewport. See [enum ViewportClearMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:2919 +#: doc/classes/RenderingServer.xml:2971 msgid "" "Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for " "options." msgstr "" -#: doc/classes/RenderingServer.xml:2930 +#: doc/classes/RenderingServer.xml:2982 msgid "" "If [code]true[/code], rendering of a viewport's environment is disabled." msgstr "" -#: doc/classes/RenderingServer.xml:2941 +#: doc/classes/RenderingServer.xml:2993 msgid "Sets the viewport's global transformation matrix." msgstr "" -#: doc/classes/RenderingServer.xml:2952 +#: doc/classes/RenderingServer.xml:3004 msgid "If [code]true[/code], the viewport's canvas is not rendered." msgstr "" -#: doc/classes/RenderingServer.xml:2963 +#: doc/classes/RenderingServer.xml:3015 msgid "Currently unimplemented in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:2974 +#: doc/classes/RenderingServer.xml:3026 msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options." msgstr "" -#: doc/classes/RenderingServer.xml:2985 +#: doc/classes/RenderingServer.xml:3037 msgid "Sets the viewport's parent to another viewport." msgstr "" -#: doc/classes/RenderingServer.xml:2996 +#: doc/classes/RenderingServer.xml:3048 msgid "" "If [code]true[/code], render the contents of the viewport directly to " "screen. This allows a low-level optimization where you can skip drawing a " @@ -42382,708 +42501,864 @@ msgid "" "significantly larger than the window size." msgstr "" -#: doc/classes/RenderingServer.xml:3007 +#: doc/classes/RenderingServer.xml:3059 msgid "" "Sets a viewport's scenario.\n" "The scenario contains information about the [enum ScenarioDebugMode], " "environment information, reflection atlas etc." msgstr "" -#: doc/classes/RenderingServer.xml:3021 +#: doc/classes/RenderingServer.xml:3073 msgid "Sets the shadow atlas quadrant's subdivision." msgstr "" -#: doc/classes/RenderingServer.xml:3032 +#: doc/classes/RenderingServer.xml:3084 msgid "" "Sets the size of the shadow atlas's images (used for omni and spot lights). " "The value will be rounded up to the nearest power of 2." msgstr "" -#: doc/classes/RenderingServer.xml:3045 +#: doc/classes/RenderingServer.xml:3097 msgid "Sets the viewport's width and height." msgstr "" -#: doc/classes/RenderingServer.xml:3056 +#: doc/classes/RenderingServer.xml:3108 msgid "" "If [code]true[/code], the viewport renders its background as transparent." msgstr "" -#: doc/classes/RenderingServer.xml:3067 +#: doc/classes/RenderingServer.xml:3119 msgid "" "Sets when the viewport should be updated. See [enum ViewportUpdateMode] " "constants for options." msgstr "" -#: doc/classes/RenderingServer.xml:3078 +#: doc/classes/RenderingServer.xml:3130 msgid "" "If [code]true[/code], the viewport uses augmented or virtual reality " -"technologies. See [ARVRInterface]." +"technologies. See [XRInterface]." msgstr "" -#: doc/classes/RenderingServer.xml:3085 +#: doc/classes/RenderingServer.xml:3137 msgid "" "Emitted at the end of the frame, after the RenderingServer has finished " "updating all the Viewports." msgstr "" -#: doc/classes/RenderingServer.xml:3090 +#: doc/classes/RenderingServer.xml:3142 msgid "" "Emitted at the beginning of the frame, before the RenderingServer updates " "all the Viewports." msgstr "" -#: doc/classes/RenderingServer.xml:3096 +#: doc/classes/RenderingServer.xml:3148 msgid "Marks an error that shows that the index array is empty." msgstr "" -#: doc/classes/RenderingServer.xml:3099 +#: doc/classes/RenderingServer.xml:3151 msgid "Number of weights/bones per vertex." msgstr "" -#: doc/classes/RenderingServer.xml:3102 +#: doc/classes/RenderingServer.xml:3154 msgid "The minimum Z-layer for canvas items." msgstr "" -#: doc/classes/RenderingServer.xml:3105 +#: doc/classes/RenderingServer.xml:3157 msgid "The maximum Z-layer for canvas items." msgstr "" -#: doc/classes/RenderingServer.xml:3108 +#: doc/classes/RenderingServer.xml:3160 msgid "" "Max number of glow levels that can be used with glow post-process effect." msgstr "" -#: doc/classes/RenderingServer.xml:3111 +#: doc/classes/RenderingServer.xml:3163 msgid "Unused enum in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:3114 -msgid "The minimum renderpriority of all materials." -msgstr "" - -#: doc/classes/RenderingServer.xml:3117 -msgid "The maximum renderpriority of all materials." -msgstr "" - -#: doc/classes/RenderingServer.xml:3138 +#: doc/classes/RenderingServer.xml:3184 msgid "Shader is a 3D shader." msgstr "" -#: doc/classes/RenderingServer.xml:3141 +#: doc/classes/RenderingServer.xml:3187 msgid "Shader is a 2D shader." msgstr "" -#: doc/classes/RenderingServer.xml:3144 +#: doc/classes/RenderingServer.xml:3190 msgid "Shader is a particle shader." msgstr "" -#: doc/classes/RenderingServer.xml:3147 +#: doc/classes/RenderingServer.xml:3193 msgid "Shader is a sky shader." msgstr "" -#: doc/classes/RenderingServer.xml:3150 +#: doc/classes/RenderingServer.xml:3196 msgid "Represents the size of the [enum ShaderMode] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3153 +#: doc/classes/RenderingServer.xml:3199 +msgid "The minimum renderpriority of all materials." +msgstr "" + +#: doc/classes/RenderingServer.xml:3202 +msgid "The maximum renderpriority of all materials." +msgstr "" + +#: doc/classes/RenderingServer.xml:3205 msgid "Array is a vertex array." msgstr "" -#: doc/classes/RenderingServer.xml:3156 +#: doc/classes/RenderingServer.xml:3208 msgid "Array is a normal array." msgstr "" -#: doc/classes/RenderingServer.xml:3159 +#: doc/classes/RenderingServer.xml:3211 msgid "Array is a tangent array." msgstr "" -#: doc/classes/RenderingServer.xml:3162 +#: doc/classes/RenderingServer.xml:3214 msgid "Array is a color array." msgstr "" -#: doc/classes/RenderingServer.xml:3165 +#: doc/classes/RenderingServer.xml:3217 msgid "Array is an UV coordinates array." msgstr "" -#: doc/classes/RenderingServer.xml:3168 +#: doc/classes/RenderingServer.xml:3220 msgid "Array is an UV coordinates array for the second UV coordinates." msgstr "" -#: doc/classes/RenderingServer.xml:3171 +#: doc/classes/RenderingServer.xml:3223 msgid "Array contains bone information." msgstr "" -#: doc/classes/RenderingServer.xml:3174 +#: doc/classes/RenderingServer.xml:3226 msgid "Array is weight information." msgstr "" -#: doc/classes/RenderingServer.xml:3177 +#: doc/classes/RenderingServer.xml:3229 msgid "Array is index array." msgstr "" -#: doc/classes/RenderingServer.xml:3183 +#: doc/classes/RenderingServer.xml:3235 msgid "Flag used to mark a vertex array." msgstr "" -#: doc/classes/RenderingServer.xml:3186 +#: doc/classes/RenderingServer.xml:3238 msgid "Flag used to mark a normal array." msgstr "" -#: doc/classes/RenderingServer.xml:3189 +#: doc/classes/RenderingServer.xml:3241 msgid "Flag used to mark a tangent array." msgstr "" -#: doc/classes/RenderingServer.xml:3192 +#: doc/classes/RenderingServer.xml:3244 msgid "Flag used to mark a color array." msgstr "" -#: doc/classes/RenderingServer.xml:3195 +#: doc/classes/RenderingServer.xml:3247 msgid "Flag used to mark an UV coordinates array." msgstr "" -#: doc/classes/RenderingServer.xml:3198 +#: doc/classes/RenderingServer.xml:3250 msgid "" "Flag used to mark an UV coordinates array for the second UV coordinates." msgstr "" -#: doc/classes/RenderingServer.xml:3201 +#: doc/classes/RenderingServer.xml:3253 msgid "Flag used to mark a bone information array." msgstr "" -#: doc/classes/RenderingServer.xml:3204 +#: doc/classes/RenderingServer.xml:3256 msgid "Flag used to mark a weights array." msgstr "" -#: doc/classes/RenderingServer.xml:3207 +#: doc/classes/RenderingServer.xml:3259 msgid "Flag used to mark an index array." msgstr "" -#: doc/classes/RenderingServer.xml:3236 +#: doc/classes/RenderingServer.xml:3288 msgid "Primitive to draw consists of points." msgstr "" -#: doc/classes/RenderingServer.xml:3239 +#: doc/classes/RenderingServer.xml:3291 msgid "Primitive to draw consists of lines." msgstr "" -#: doc/classes/RenderingServer.xml:3242 +#: doc/classes/RenderingServer.xml:3294 msgid "Primitive to draw consists of a line strip from start to end." msgstr "" -#: doc/classes/RenderingServer.xml:3245 +#: doc/classes/RenderingServer.xml:3297 msgid "Primitive to draw consists of triangles." msgstr "" -#: doc/classes/RenderingServer.xml:3248 +#: doc/classes/RenderingServer.xml:3300 msgid "" "Primitive to draw consists of a triangle strip (the last 3 vertices are " "always combined to make a triangle)." msgstr "" -#: doc/classes/RenderingServer.xml:3251 +#: doc/classes/RenderingServer.xml:3303 msgid "Represents the size of the [enum PrimitiveType] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3260 +#: doc/classes/RenderingServer.xml:3312 msgid "Use [Transform2D] to store MultiMesh transform." msgstr "" -#: doc/classes/RenderingServer.xml:3263 +#: doc/classes/RenderingServer.xml:3315 msgid "Use [Transform] to store MultiMesh transform." msgstr "" -#: doc/classes/RenderingServer.xml:3266 +#: doc/classes/RenderingServer.xml:3318 msgid "Is a directional (sun) light." msgstr "" -#: doc/classes/RenderingServer.xml:3269 +#: doc/classes/RenderingServer.xml:3321 msgid "Is an omni light." msgstr "" -#: doc/classes/RenderingServer.xml:3272 +#: doc/classes/RenderingServer.xml:3324 msgid "Is a spot light." msgstr "" -#: doc/classes/RenderingServer.xml:3275 +#: doc/classes/RenderingServer.xml:3327 msgid "The light's energy." msgstr "" -#: doc/classes/RenderingServer.xml:3280 +#: doc/classes/RenderingServer.xml:3332 msgid "The light's influence on specularity." msgstr "" -#: doc/classes/RenderingServer.xml:3283 +#: doc/classes/RenderingServer.xml:3335 msgid "The light's range." msgstr "" -#: doc/classes/RenderingServer.xml:3286 +#: doc/classes/RenderingServer.xml:3338 +msgid "" +"The size of the light when using spot light or omni light. The angular size " +"of the light when using directional light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3341 msgid "The light's attenuation." msgstr "" -#: doc/classes/RenderingServer.xml:3289 +#: doc/classes/RenderingServer.xml:3344 msgid "The spotlight's angle." msgstr "" -#: doc/classes/RenderingServer.xml:3292 +#: doc/classes/RenderingServer.xml:3347 msgid "The spotlight's attenuation." msgstr "" -#: doc/classes/RenderingServer.xml:3295 -msgid "Scales the shadow color." -msgstr "" - -#: doc/classes/RenderingServer.xml:3298 +#: doc/classes/RenderingServer.xml:3350 msgid "Max distance that shadows will be rendered." msgstr "" -#: doc/classes/RenderingServer.xml:3301 +#: doc/classes/RenderingServer.xml:3353 msgid "Proportion of shadow atlas occupied by the first split." msgstr "" -#: doc/classes/RenderingServer.xml:3304 +#: doc/classes/RenderingServer.xml:3356 msgid "Proportion of shadow atlas occupied by the second split." msgstr "" -#: doc/classes/RenderingServer.xml:3307 +#: doc/classes/RenderingServer.xml:3359 msgid "" "Proportion of shadow atlas occupied by the third split. The fourth split " "occupies the rest." msgstr "" -#: doc/classes/RenderingServer.xml:3312 +#: doc/classes/RenderingServer.xml:3362 +msgid "" +"Proportion of shadow max distance where the shadow will start to fade out." +msgstr "" + +#: doc/classes/RenderingServer.xml:3365 msgid "" "Normal bias used to offset shadow lookup by object normal. Can be used to " "fix self-shadowing artifacts." msgstr "" -#: doc/classes/RenderingServer.xml:3315 +#: doc/classes/RenderingServer.xml:3368 msgid "Bias the shadow lookup to fix self-shadowing artifacts." msgstr "" -#: doc/classes/RenderingServer.xml:3318 -msgid "" -"Increases bias on further splits to fix self-shadowing that only occurs far " -"away from the camera." -msgstr "" - -#: doc/classes/RenderingServer.xml:3321 +#: doc/classes/RenderingServer.xml:3379 msgid "Represents the size of the [enum LightParam] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3324 +#: doc/classes/RenderingServer.xml:3382 msgid "Use a dual paraboloid shadow map for omni lights." msgstr "" -#: doc/classes/RenderingServer.xml:3327 +#: doc/classes/RenderingServer.xml:3385 msgid "" "Use a cubemap shadow map for omni lights. Slower but better quality than " "dual paraboloid." msgstr "" -#: doc/classes/RenderingServer.xml:3330 +#: doc/classes/RenderingServer.xml:3388 msgid "Use orthogonal shadow projection for directional light." msgstr "" -#: doc/classes/RenderingServer.xml:3333 +#: doc/classes/RenderingServer.xml:3391 msgid "Use 2 splits for shadow projection when using directional light." msgstr "" -#: doc/classes/RenderingServer.xml:3336 +#: doc/classes/RenderingServer.xml:3394 msgid "Use 4 splits for shadow projection when using directional light." msgstr "" -#: doc/classes/RenderingServer.xml:3339 +#: doc/classes/RenderingServer.xml:3397 msgid "" "Keeps shadows stable as camera moves but has lower effective resolution." msgstr "" -#: doc/classes/RenderingServer.xml:3342 +#: doc/classes/RenderingServer.xml:3400 msgid "" "Optimize use of shadow maps, increasing the effective resolution. But may " "result in shadows moving or flickering slightly." msgstr "" -#: doc/classes/RenderingServer.xml:3345 +#: doc/classes/RenderingServer.xml:3403 msgid "Reflection probe will update reflections once and then stop." msgstr "" -#: doc/classes/RenderingServer.xml:3348 +#: doc/classes/RenderingServer.xml:3406 msgid "" "Reflection probe will update each frame. This mode is necessary to capture " "moving objects." msgstr "" -#: doc/classes/RenderingServer.xml:3351 +#: doc/classes/RenderingServer.xml:3419 msgid "Draw particles in the order that they appear in the particles array." msgstr "" -#: doc/classes/RenderingServer.xml:3354 +#: doc/classes/RenderingServer.xml:3422 msgid "Sort particles based on their lifetime." msgstr "" -#: doc/classes/RenderingServer.xml:3357 +#: doc/classes/RenderingServer.xml:3425 msgid "Sort particles based on their distance to the camera." msgstr "" -#: doc/classes/RenderingServer.xml:3360 +#: doc/classes/RenderingServer.xml:3428 msgid "Do not update the viewport." msgstr "" -#: doc/classes/RenderingServer.xml:3363 +#: doc/classes/RenderingServer.xml:3431 msgid "Update the viewport once then set to disabled." msgstr "" -#: doc/classes/RenderingServer.xml:3366 +#: doc/classes/RenderingServer.xml:3434 msgid "Update the viewport whenever it is visible." msgstr "" -#: doc/classes/RenderingServer.xml:3371 +#: doc/classes/RenderingServer.xml:3439 msgid "Always update the viewport." msgstr "" -#: doc/classes/RenderingServer.xml:3374 +#: doc/classes/RenderingServer.xml:3442 msgid "The viewport is always cleared before drawing." msgstr "" -#: doc/classes/RenderingServer.xml:3377 +#: doc/classes/RenderingServer.xml:3445 msgid "The viewport is never cleared before drawing." msgstr "" -#: doc/classes/RenderingServer.xml:3380 +#: doc/classes/RenderingServer.xml:3448 msgid "" "The viewport is cleared once, then the clear mode is set to [constant " "VIEWPORT_CLEAR_NEVER]." msgstr "" -#: doc/classes/RenderingServer.xml:3383 +#: doc/classes/RenderingServer.xml:3451 msgid "Multisample antialiasing is disabled." msgstr "" -#: doc/classes/RenderingServer.xml:3386 -msgid "Multisample antialiasing is set to 2×." -msgstr "" - -#: doc/classes/RenderingServer.xml:3389 -msgid "Multisample antialiasing is set to 4×." -msgstr "" - -#: doc/classes/RenderingServer.xml:3392 -msgid "Multisample antialiasing is set to 8×." +#: doc/classes/RenderingServer.xml:3454 +msgid "Multisample antialiasing uses 2 samples per pixel." msgstr "" -#: doc/classes/RenderingServer.xml:3395 -msgid "Multisample antialiasing is set to 16×." +#: doc/classes/RenderingServer.xml:3457 +msgid "Multisample antialiasing uses 4 samples per pixel." msgstr "" -#: doc/classes/RenderingServer.xml:3398 -msgid "" -"Multisample antialiasing is set to 2× on external texture. Special mode for " -"GLES2 Android VR (Oculus Quest and Go)." +#: doc/classes/RenderingServer.xml:3460 +msgid "Multisample antialiasing uses 8 samples per pixel." msgstr "" -#: doc/classes/RenderingServer.xml:3401 -msgid "" -"Multisample antialiasing is set to 4× on external texture. Special mode for " -"GLES2 Android VR (Oculus Quest and Go)." +#: doc/classes/RenderingServer.xml:3463 +msgid "Multisample antialiasing uses 16 samples per pixel." msgstr "" -#: doc/classes/RenderingServer.xml:3404 +#: doc/classes/RenderingServer.xml:3474 msgid "Number of objects drawn in a single frame." msgstr "" -#: doc/classes/RenderingServer.xml:3407 +#: doc/classes/RenderingServer.xml:3477 msgid "Number of vertices drawn in a single frame." msgstr "" -#: doc/classes/RenderingServer.xml:3410 +#: doc/classes/RenderingServer.xml:3480 msgid "Number of material changes during this frame." msgstr "" -#: doc/classes/RenderingServer.xml:3413 +#: doc/classes/RenderingServer.xml:3483 msgid "Number of shader changes during this frame." msgstr "" -#: doc/classes/RenderingServer.xml:3416 +#: doc/classes/RenderingServer.xml:3486 msgid "Number of surface changes during this frame." msgstr "" -#: doc/classes/RenderingServer.xml:3419 +#: doc/classes/RenderingServer.xml:3489 msgid "Number of draw calls during this frame." msgstr "" -#: doc/classes/RenderingServer.xml:3422 +#: doc/classes/RenderingServer.xml:3492 msgid "Represents the size of the [enum ViewportRenderInfo] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3425 +#: doc/classes/RenderingServer.xml:3495 msgid "Debug draw is disabled. Default setting." msgstr "" -#: doc/classes/RenderingServer.xml:3428 -msgid "Debug draw sets objects to unshaded." +#: doc/classes/RenderingServer.xml:3498 doc/classes/Viewport.xml:348 +msgid "Objects are displayed without light information." +msgstr "" + +#: doc/classes/RenderingServer.xml:3501 +msgid "Objects are displayed with only light information." msgstr "" -#: doc/classes/RenderingServer.xml:3433 -msgid "Overwrites clear color to [code](0,0,0,0)[/code]." +#: doc/classes/RenderingServer.xml:3504 doc/classes/Viewport.xml:353 +msgid "" +"Objects are displayed semi-transparent with additive blending so you can see " +"where they are drawing over top of one another. A higher overdraw means you " +"are wasting performance on drawing pixels that are being hidden behind " +"others." msgstr "" -#: doc/classes/RenderingServer.xml:3436 +#: doc/classes/RenderingServer.xml:3507 msgid "Debug draw draws objects in wireframe." msgstr "" -#: doc/classes/RenderingServer.xml:3461 +#: doc/classes/RenderingServer.xml:3510 +msgid "" +"Normal buffer is drawn instead of regular scene so you can see the per-pixel " +"normals that will be used by post-processing effects." +msgstr "" + +#: doc/classes/RenderingServer.xml:3513 doc/classes/Viewport.xml:361 +msgid "Objects are displayed with only the albedo value from [GIProbe]s." +msgstr "" + +#: doc/classes/RenderingServer.xml:3516 doc/classes/Viewport.xml:364 +msgid "Objects are displayed with only the lighting value from [GIProbe]s." +msgstr "" + +#: doc/classes/RenderingServer.xml:3519 doc/classes/Viewport.xml:367 +msgid "Objects are displayed with only the emission color from [GIProbe]s." +msgstr "" + +#: doc/classes/RenderingServer.xml:3522 doc/classes/Viewport.xml:370 +msgid "" +"Draws the shadow atlas that stores shadows from [OmniLight3D]s and " +"[SpotLight3D]s in the upper left quadrant of the [Viewport]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3525 doc/classes/Viewport.xml:373 +msgid "" +"Draws the shadow atlas that stores shadows from [DirectionalLight3D]s in the " +"upper left quadrant of the [Viewport]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3530 +msgid "" +"Draws the screen space ambient occlusion texture instead of the scene so " +"that you can clearly see how it is affecting objects. In order for this " +"display mode to work, you must have [member Environment.ssao_enabled] set in " +"your [WorldEnvironment]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3533 doc/classes/Viewport.xml:381 +msgid "" +"Draws the roughness limiter post process over the Viewport so you can see " +"where it has an effect. It must be enabled in [member ProjectSettings." +"rendering/quality/screen_filters/screen_space_roughness_limiter] to work." +msgstr "" + +#: doc/classes/RenderingServer.xml:3536 +msgid "" +"Colors each PSSM split for the [DirectionalLight3D]s in the scene a " +"different color so you can see where the splits are. In order they will be " +"colored red, green, blue, yellow." +msgstr "" + +#: doc/classes/RenderingServer.xml:3541 +msgid "" +"Uses high quality importance sampling to process the radiance map. In " +"general, this results in much higher quality than [constant Sky." +"PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be " +"used if you plan on changing the sky at runtime. If you are finding that the " +"reflection is not blurry enough and is showing sparkles or fireflies, try " +"increasing [member ProjectSettings.rendering/quality/reflections/" +"ggx_samples]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3544 +msgid "" +"Uses the fast filtering algorithm to process the radiance map. In general " +"this results in lower quality, but substantially faster run times.\n" +"[b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so " +"[member Sky.radiance_size] must be set to [constant Sky.RADIANCE_SIZE_256]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3548 msgid "Use the clear color as background." msgstr "" -#: doc/classes/RenderingServer.xml:3464 +#: doc/classes/RenderingServer.xml:3551 msgid "Use a specified color as the background." msgstr "" -#: doc/classes/RenderingServer.xml:3467 +#: doc/classes/RenderingServer.xml:3554 msgid "Use a sky resource for the background." msgstr "" -#: doc/classes/RenderingServer.xml:3470 +#: doc/classes/RenderingServer.xml:3557 msgid "" "Use a specified canvas layer as the background. This can be useful for " "instantiating a 2D scene in a 3D world." msgstr "" -#: doc/classes/RenderingServer.xml:3473 +#: doc/classes/RenderingServer.xml:3560 msgid "" "Do not clear the background, use whatever was rendered last frame as the " "background." msgstr "" -#: doc/classes/RenderingServer.xml:3479 +#: doc/classes/RenderingServer.xml:3566 msgid "Represents the size of the [enum EnvironmentBG] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3506 +#: doc/classes/RenderingServer.xml:3605 msgid "Output color as they came in." msgstr "" -#: doc/classes/RenderingServer.xml:3509 +#: doc/classes/RenderingServer.xml:3608 msgid "Use the Reinhard tonemapper." msgstr "" -#: doc/classes/RenderingServer.xml:3512 +#: doc/classes/RenderingServer.xml:3611 msgid "Use the filmic tonemapper." msgstr "" -#: doc/classes/RenderingServer.xml:3515 +#: doc/classes/RenderingServer.xml:3614 msgid "Use the ACES tonemapper." msgstr "" -#: doc/classes/RenderingServer.xml:3518 +#: doc/classes/RenderingServer.xml:3625 msgid "Disables the blur set for SSAO. Will make SSAO look noisier." msgstr "" -#: doc/classes/RenderingServer.xml:3521 +#: doc/classes/RenderingServer.xml:3628 msgid "Perform a 1x1 blur on the SSAO output." msgstr "" -#: doc/classes/RenderingServer.xml:3524 +#: doc/classes/RenderingServer.xml:3631 msgid "Performs a 2x2 blur on the SSAO output." msgstr "" -#: doc/classes/RenderingServer.xml:3527 +#: doc/classes/RenderingServer.xml:3634 msgid "Performs a 3x3 blur on the SSAO output. Use this for smoothest SSAO." msgstr "" -#: doc/classes/RenderingServer.xml:3530 +#: doc/classes/RenderingServer.xml:3637 msgid "Lowest quality of screen space ambient occlusion." msgstr "" -#: doc/classes/RenderingServer.xml:3533 +#: doc/classes/RenderingServer.xml:3640 msgid "Medium quality screen space ambient occlusion." msgstr "" -#: doc/classes/RenderingServer.xml:3536 +#: doc/classes/RenderingServer.xml:3643 +msgid "High quality screen space ambient occlusion." +msgstr "" + +#: doc/classes/RenderingServer.xml:3646 msgid "Highest quality screen space ambient occlusion." msgstr "" -#: doc/classes/RenderingServer.xml:3555 +#: doc/classes/RenderingServer.xml:3657 +msgid "" +"Lowest quality DOF blur. This is the fastest setting, but you may be able to " +"see filtering artifacts." +msgstr "" + +#: doc/classes/RenderingServer.xml:3660 +msgid "Low quality DOF blur." +msgstr "" + +#: doc/classes/RenderingServer.xml:3663 +msgid "Medium quality DOF blur." +msgstr "" + +#: doc/classes/RenderingServer.xml:3666 +msgid "" +"Highest quality DOF blur. Results in the smoothest looking blur by taking " +"the most samples, but is also significantly slower." +msgstr "" + +#: doc/classes/RenderingServer.xml:3669 +msgid "" +"Calculate the DOF blur using a box filter. The fastest option, but results " +"in obvious lines in blur pattern." +msgstr "" + +#: doc/classes/RenderingServer.xml:3672 +msgid "Calculates DOF blur using a hexagon shaped filter." +msgstr "" + +#: doc/classes/RenderingServer.xml:3675 +msgid "" +"Calculates DOF blur using a circle shaped filter. Best quality and most " +"realistic, but slowest. Use only for areas where a lot of performance can be " +"dedicated to post-processing (e.g. cutscenes)." +msgstr "" + +#: doc/classes/RenderingServer.xml:3690 msgid "Do not use a debug mode." msgstr "" -#: doc/classes/RenderingServer.xml:3558 +#: doc/classes/RenderingServer.xml:3693 msgid "Draw all objects as wireframe models." msgstr "" -#: doc/classes/RenderingServer.xml:3561 +#: doc/classes/RenderingServer.xml:3696 msgid "" "Draw all objects in a way that displays how much overdraw is occurring. " "Overdraw occurs when a section of pixels is drawn and shaded and then " "another object covers it up. To optimize a scene, you should reduce overdraw." msgstr "" -#: doc/classes/RenderingServer.xml:3564 +#: doc/classes/RenderingServer.xml:3699 msgid "" "Draw all objects without shading. Equivalent to setting all objects shaders " "to [code]unshaded[/code]." msgstr "" -#: doc/classes/RenderingServer.xml:3567 +#: doc/classes/RenderingServer.xml:3702 msgid "The instance does not have a type." msgstr "" -#: doc/classes/RenderingServer.xml:3570 +#: doc/classes/RenderingServer.xml:3705 msgid "The instance is a mesh." msgstr "" -#: doc/classes/RenderingServer.xml:3573 +#: doc/classes/RenderingServer.xml:3708 msgid "The instance is a multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:3576 +#: doc/classes/RenderingServer.xml:3711 msgid "The instance is an immediate geometry." msgstr "" -#: doc/classes/RenderingServer.xml:3579 +#: doc/classes/RenderingServer.xml:3714 msgid "The instance is a particle emitter." msgstr "" -#: doc/classes/RenderingServer.xml:3582 +#: doc/classes/RenderingServer.xml:3717 msgid "The instance is a light." msgstr "" -#: doc/classes/RenderingServer.xml:3585 +#: doc/classes/RenderingServer.xml:3720 msgid "The instance is a reflection probe." msgstr "" -#: doc/classes/RenderingServer.xml:3588 +#: doc/classes/RenderingServer.xml:3723 +msgid "The instance is a decal." +msgstr "" + +#: doc/classes/RenderingServer.xml:3726 msgid "The instance is a GI probe." msgstr "" -#: doc/classes/RenderingServer.xml:3591 +#: doc/classes/RenderingServer.xml:3729 msgid "The instance is a lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:3594 +#: doc/classes/RenderingServer.xml:3732 msgid "Represents the size of the [enum InstanceType] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3597 +#: doc/classes/RenderingServer.xml:3735 msgid "" "A combination of the flags of geometry instances (mesh, multimesh, immediate " "and particles)." msgstr "" -#: doc/classes/RenderingServer.xml:3600 +#: doc/classes/RenderingServer.xml:3738 msgid "Allows the instance to be used in baked lighting." msgstr "" -#: doc/classes/RenderingServer.xml:3605 +#: doc/classes/RenderingServer.xml:3741 +msgid "Allows the instance to be used with dynamic global illumination." +msgstr "" + +#: doc/classes/RenderingServer.xml:3744 msgid "When set, manually requests to draw geometry on next frame." msgstr "" -#: doc/classes/RenderingServer.xml:3608 +#: doc/classes/RenderingServer.xml:3747 msgid "Represents the size of the [enum InstanceFlags] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3611 +#: doc/classes/RenderingServer.xml:3750 msgid "Disable shadows from this instance." msgstr "" -#: doc/classes/RenderingServer.xml:3614 +#: doc/classes/RenderingServer.xml:3753 msgid "Cast shadows from this instance." msgstr "" -#: doc/classes/RenderingServer.xml:3617 +#: doc/classes/RenderingServer.xml:3756 msgid "" "Disable backface culling when rendering the shadow of the object. This is " "slightly slower but may result in more correct shadows." msgstr "" -#: doc/classes/RenderingServer.xml:3620 +#: doc/classes/RenderingServer.xml:3759 msgid "" "Only render the shadows from the object. The object itself will not be drawn." msgstr "" -#: doc/classes/RenderingServer.xml:3623 +#: doc/classes/RenderingServer.xml:3762 msgid "The nine patch gets stretched where needed." msgstr "" -#: doc/classes/RenderingServer.xml:3626 +#: doc/classes/RenderingServer.xml:3765 msgid "The nine patch gets filled with tiles where needed." msgstr "" -#: doc/classes/RenderingServer.xml:3629 +#: doc/classes/RenderingServer.xml:3768 msgid "" "The nine patch gets filled with tiles where needed and stretches them a bit " "if needed." msgstr "" -#: doc/classes/RenderingServer.xml:3658 +#: doc/classes/RenderingServer.xml:3771 +msgid "Uses the default filter mode for this [Viewport]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3783 doc/classes/Viewport.xml:399 +msgid "" +"The texture filter blends between the nearest 4 pixels and between the " +"nearest 2 mipmaps." +msgstr "" + +#: doc/classes/RenderingServer.xml:3792 +msgid "Max value for [enum CanvasItemTextureFilter] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3795 +msgid "Uses the default repeat mode for this [Viewport]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3798 doc/classes/Viewport.xml:405 +msgid "" +"Disables textures repeating. Instead, when reading UVs outside the 0-1 " +"range, the value will be clamped to the edge of the texture, resulting in a " +"stretched out look at the borders of the texture." +msgstr "" + +#: doc/classes/RenderingServer.xml:3804 doc/classes/Viewport.xml:411 +msgid "" +"Flip the texture when repeating so that the edge lines up instead of " +"abruptly changing." +msgstr "" + +#: doc/classes/RenderingServer.xml:3807 +msgid "Max value for [enum CanvasItemTextureRepeat] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3810 msgid "Adds light color additive to the canvas." msgstr "" -#: doc/classes/RenderingServer.xml:3661 +#: doc/classes/RenderingServer.xml:3813 msgid "Adds light color subtractive to the canvas." msgstr "" -#: doc/classes/RenderingServer.xml:3664 +#: doc/classes/RenderingServer.xml:3816 msgid "The light adds color depending on transparency." msgstr "" -#: doc/classes/RenderingServer.xml:3667 +#: doc/classes/RenderingServer.xml:3819 msgid "The light adds color depending on mask." msgstr "" -#: doc/classes/RenderingServer.xml:3670 +#: doc/classes/RenderingServer.xml:3822 msgid "Do not apply a filter to canvas light shadows." msgstr "" -#: doc/classes/RenderingServer.xml:3673 +#: doc/classes/RenderingServer.xml:3825 msgid "Use PCF5 filtering to filter canvas light shadows." msgstr "" -#: doc/classes/RenderingServer.xml:3676 +#: doc/classes/RenderingServer.xml:3828 msgid "Use PCF13 filtering to filter canvas light shadows." msgstr "" -#: doc/classes/RenderingServer.xml:3681 +#: doc/classes/RenderingServer.xml:3831 +msgid "Max value of the [enum CanvasLightShadowFilter] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3834 msgid "Culling of the canvas occluder is disabled." msgstr "" -#: doc/classes/RenderingServer.xml:3684 +#: doc/classes/RenderingServer.xml:3837 msgid "Culling of the canvas occluder is clockwise." msgstr "" -#: doc/classes/RenderingServer.xml:3687 +#: doc/classes/RenderingServer.xml:3840 msgid "Culling of the canvas occluder is counterclockwise." msgstr "" -#: doc/classes/RenderingServer.xml:3690 +#: doc/classes/RenderingServer.xml:3901 msgid "The amount of objects in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3693 +#: doc/classes/RenderingServer.xml:3904 msgid "The amount of vertices in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3696 +#: doc/classes/RenderingServer.xml:3907 msgid "The amount of modified materials in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3699 +#: doc/classes/RenderingServer.xml:3910 msgid "The amount of shader rebinds in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3702 +#: doc/classes/RenderingServer.xml:3913 msgid "The amount of surface changes in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3705 +#: doc/classes/RenderingServer.xml:3916 msgid "The amount of draw calls in frame." msgstr "" -#: doc/classes/RenderingServer.xml:3720 +#: doc/classes/RenderingServer.xml:3931 msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:3723 +#: doc/classes/RenderingServer.xml:3934 msgid "" "Hardware supports multithreading. This enum is currently unused in Godot 3.x." msgstr "" @@ -44081,15 +44356,11 @@ msgid "" "Physics > 2d[/b]." msgstr "" -#: doc/classes/RigidBody2D.xml:158 doc/classes/RigidBody3D.xml:174 -msgid "The body's mass." -msgstr "" - #: doc/classes/RigidBody2D.xml:161 msgid "The body's mode. See [enum Mode] for possible values." msgstr "" -#: doc/classes/RigidBody2D.xml:164 doc/classes/RigidBody3D.xml:180 +#: doc/classes/RigidBody2D.xml:164 doc/classes/RigidBody3D.xml:181 #: doc/classes/StaticBody2D.xml:22 doc/classes/StaticBody3D.xml:22 msgid "" "The physics material override for the body.\n" @@ -44218,22 +44489,32 @@ msgid "" "for a body." msgstr "" +#: doc/classes/RigidBody3D.xml:31 +msgid "" +"Adds a constant directional force (i.e. acceleration) without affecting " +"rotation.\n" +"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." +msgstr "" + #: doc/classes/RigidBody3D.xml:43 -msgid "Adds a constant force (i.e. acceleration)." +msgid "" +"Adds a constant directional force (i.e. acceleration).\n" +"The position uses the rotation of the global coordinate system, but is " +"centered at the object's origin." msgstr "" -#: doc/classes/RigidBody3D.xml:52 +#: doc/classes/RigidBody3D.xml:53 msgid "" "Adds a constant rotational force (i.e. a motor) without affecting position." msgstr "" -#: doc/classes/RigidBody3D.xml:61 +#: doc/classes/RigidBody3D.xml:62 msgid "" "Applies a directional impulse without affecting rotation.\n" "This is equivalent to [code]apply_impulse(Vector3(0,0,0), impulse)[/code]." msgstr "" -#: doc/classes/RigidBody3D.xml:73 +#: doc/classes/RigidBody3D.xml:74 msgid "" "Applies a positioned impulse to the body. An impulse is time independent! " "Applying an impulse every frame would result in a framerate-dependent force. " @@ -44242,19 +44523,19 @@ msgid "" "at the object's origin." msgstr "" -#: doc/classes/RigidBody3D.xml:82 +#: doc/classes/RigidBody3D.xml:83 msgid "" "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." msgstr "" -#: doc/classes/RigidBody3D.xml:91 +#: doc/classes/RigidBody3D.xml:92 msgid "" "Returns [code]true[/code] if the specified linear or rotational axis is " "locked." msgstr "" -#: doc/classes/RigidBody3D.xml:98 +#: doc/classes/RigidBody3D.xml:99 msgid "" "Returns a list of the bodies colliding with this one. By default, number of " "max contacts reported is at 0, see the [member contacts_reported] property " @@ -44264,64 +44545,32 @@ msgid "" "physics step. Consider using signals instead." msgstr "" -#: doc/classes/RigidBody3D.xml:110 +#: doc/classes/RigidBody3D.xml:111 msgid "Locks the specified linear or rotational axis." msgstr "" -#: doc/classes/RigidBody3D.xml:125 +#: doc/classes/RigidBody3D.xml:126 msgid "Damps RigidBody3D's rotational forces." msgstr "" -#: doc/classes/RigidBody3D.xml:128 +#: doc/classes/RigidBody3D.xml:129 msgid "RigidBody3D's rotational velocity." msgstr "" -#: doc/classes/RigidBody3D.xml:131 -msgid "Lock the body's rotation in the X axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:134 -msgid "Lock the body's rotation in the Y axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:137 -msgid "Lock the body's rotation in the Z axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:140 -msgid "Lock the body's movement in the X axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:143 -msgid "Lock the body's movement in the Y axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:146 -msgid "Lock the body's movement in the Z axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:149 -msgid "" -"If [code]true[/code], the RigidBody3D will not calculate forces and will act " -"as a static body while there is no movement. It will wake up when forces are " -"applied through other collisions or when the [code]apply_impulse[/code] " -"method is used." -msgstr "" - -#: doc/classes/RigidBody3D.xml:152 +#: doc/classes/RigidBody3D.xml:153 msgid "" "If [code]true[/code], the RigidBody3D will emit signals when it collides " "with another RigidBody3D." msgstr "" -#: doc/classes/RigidBody3D.xml:155 +#: doc/classes/RigidBody3D.xml:156 msgid "" "The maximum contacts to report. Bodies can keep a log of the contacts with " "other bodies, this is enabled by setting the maximum amount of contacts " "reported to a number greater than 0." msgstr "" -#: doc/classes/RigidBody3D.xml:158 +#: doc/classes/RigidBody3D.xml:159 msgid "" "If [code]true[/code], continuous collision detection is used.\n" "Continuous collision detection tries to predict where a moving body will " @@ -44331,7 +44580,7 @@ msgid "" "faster to compute, but can miss small, fast-moving objects." msgstr "" -#: doc/classes/RigidBody3D.xml:162 +#: doc/classes/RigidBody3D.xml:163 msgid "" "If [code]true[/code], internal force integration will be disabled (like " "gravity or air friction) for this body. Other than collision response, the " @@ -44339,7 +44588,7 @@ msgid "" "function, if defined." msgstr "" -#: doc/classes/RigidBody3D.xml:165 +#: doc/classes/RigidBody3D.xml:166 msgid "" "This is multiplied by the global 3D gravity setting found in [b]Project > " "Project Settings > Physics > 3d[/b] to produce RigidBody3D's gravity. For " @@ -44347,14 +44596,14 @@ msgid "" "and 0.5 will apply half gravity to this object." msgstr "" -#: doc/classes/RigidBody3D.xml:168 +#: doc/classes/RigidBody3D.xml:169 msgid "" "The body's linear damp. Cannot be less than -1.0. If this value is different " "from -1.0, any linear damp derived from the world or areas will be " "overridden." msgstr "" -#: doc/classes/RigidBody3D.xml:171 +#: doc/classes/RigidBody3D.xml:172 msgid "" "The body's linear velocity. Can be used sporadically, but [b]don't set this " "every frame[/b], because physics may run in another thread and runs at a " @@ -44362,35 +44611,29 @@ msgid "" "for precise control of the body state." msgstr "" -#: doc/classes/RigidBody3D.xml:177 +#: doc/classes/RigidBody3D.xml:178 msgid "The body mode. See [enum Mode] for possible values." msgstr "" -#: doc/classes/RigidBody3D.xml:184 +#: doc/classes/RigidBody3D.xml:185 msgid "" "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." msgstr "" -#: doc/classes/RigidBody3D.xml:187 -msgid "" -"The body's weight based on its mass and the global 3D gravity. Global values " -"are set in [b]Project > Project Settings > Physics > 3d[/b]." -msgstr "" - -#: doc/classes/RigidBody3D.xml:195 +#: doc/classes/RigidBody3D.xml:196 msgid "" "Emitted when a body enters into contact with this one. Contact monitor and " "contacts reported must be enabled for this to work." msgstr "" -#: doc/classes/RigidBody3D.xml:202 +#: doc/classes/RigidBody3D.xml:203 msgid "" "Emitted when a body shape exits contact with this one. Contact monitor and " "contacts reported must be enabled for this to work." msgstr "" -#: doc/classes/RigidBody3D.xml:215 +#: doc/classes/RigidBody3D.xml:216 msgid "" "Emitted when a body enters into contact with this one. Contact monitor and " "contacts reported must be enabled for this to work.\n" @@ -44400,7 +44643,7 @@ msgid "" "([code]local_shape[/code]) the other body collided with." msgstr "" -#: doc/classes/RigidBody3D.xml:229 +#: doc/classes/RigidBody3D.xml:230 msgid "" "Emitted when a body shape exits contact with this one. Contact monitor and " "contacts reported must be enabled for this to work.\n" @@ -44410,30 +44653,30 @@ msgid "" "([code]local_shape[/code]) the other body stopped colliding with." msgstr "" -#: doc/classes/RigidBody3D.xml:235 +#: doc/classes/RigidBody3D.xml:236 msgid "" "Emitted when the body changes its sleeping state. Either by sleeping or " "waking up." msgstr "" -#: doc/classes/RigidBody3D.xml:241 +#: doc/classes/RigidBody3D.xml:242 msgid "" "Rigid body mode. This is the \"natural\" state of a rigid body. It is " "affected by forces, and can move, rotate, and be affected by user code." msgstr "" -#: doc/classes/RigidBody3D.xml:244 +#: doc/classes/RigidBody3D.xml:245 msgid "" "Static mode. The body behaves like a [StaticBody3D], and can only move by " "user code." msgstr "" -#: doc/classes/RigidBody3D.xml:247 +#: doc/classes/RigidBody3D.xml:248 msgid "" "Character body mode. This behaves like a rigid body, but can not rotate." msgstr "" -#: doc/classes/RigidBody3D.xml:250 +#: doc/classes/RigidBody3D.xml:251 msgid "" "Kinematic body mode. The body behaves like a [KinematicBody3D], and can only " "move by user code." @@ -45057,27 +45300,33 @@ msgstr "" msgid "Godot editor's script editor." msgstr "" -#: doc/classes/ScriptEditor.xml:39 +#: doc/classes/ScriptEditor.xml:7 +msgid "" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_script_editor]." +msgstr "" + +#: doc/classes/ScriptEditor.xml:40 msgid "Returns a [Script] that is currently active in editor." msgstr "" -#: doc/classes/ScriptEditor.xml:56 +#: doc/classes/ScriptEditor.xml:57 msgid "" "Returns an array with all [Script] objects which are currently open in " "editor." msgstr "" -#: doc/classes/ScriptEditor.xml:65 +#: doc/classes/ScriptEditor.xml:66 msgid "Goes to the specified line in the current script." msgstr "" -#: doc/classes/ScriptEditor.xml:84 +#: doc/classes/ScriptEditor.xml:85 msgid "" "Emitted when user changed active script. Argument is a freshly activated " "[Script]." msgstr "" -#: doc/classes/ScriptEditor.xml:91 +#: doc/classes/ScriptEditor.xml:92 msgid "" "Emitted when editor is about to close the active script. Argument is a " "[Script] that is going to be closed." @@ -45139,7 +45388,7 @@ msgid "" "visible." msgstr "" -#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:441 +#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:442 msgid "The current horizontal scroll value." msgstr "" @@ -45147,7 +45396,7 @@ msgstr "" msgid "If [code]true[/code], enables horizontal scrolling." msgstr "" -#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:444 +#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:445 msgid "The current vertical scroll value." msgstr "" @@ -45677,7 +45926,10 @@ msgid "" "Uses high quality importance sampling to process the radiance map. In " "general, this results in much higher quality than [constant " "PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be " -"used if you plan on changing the sky at runtime." +"used if you plan on changing the sky at runtime. If you are finding that the " +"reflection is not blurry enough and is showing sparkles or fireflies, try " +"increasing [member ProjectSettings.rendering/quality/reflections/" +"ggx_samples]." msgstr "" #: doc/classes/Sky.xml:55 @@ -47871,65 +48123,65 @@ msgid "" msgstr "" #: doc/classes/SubViewport.xml:13 -msgid "If [code]true[/code], the sub-viewport will be used in AR/VR process." -msgstr "" - -#: doc/classes/SubViewport.xml:16 msgid "The clear mode when the sub-viewport is used as a render target." msgstr "" -#: doc/classes/SubViewport.xml:19 +#: doc/classes/SubViewport.xml:16 msgid "The update mode when the sub-viewport is used as a render target." msgstr "" -#: doc/classes/SubViewport.xml:22 +#: doc/classes/SubViewport.xml:19 msgid "The width and height of the sub-viewport." msgstr "" -#: doc/classes/SubViewport.xml:25 +#: doc/classes/SubViewport.xml:22 msgid "" "The 2D size override of the sub-viewport. If either the width or height is " "[code]0[/code], the override is disabled." msgstr "" -#: doc/classes/SubViewport.xml:28 +#: doc/classes/SubViewport.xml:25 msgid "If [code]true[/code], the 2D size override affects stretch as well." msgstr "" +#: doc/classes/SubViewport.xml:28 +msgid "If [code]true[/code], the sub-viewport will be used in AR/VR process." +msgstr "" + #: doc/classes/SubViewport.xml:33 -msgid "Do not update the render target." +msgid "Always clear the render target before drawing." msgstr "" #: doc/classes/SubViewport.xml:36 -msgid "" -"Update the render target once, then switch to [constant UPDATE_DISABLED]." +msgid "Never clear the render target." msgstr "" #: doc/classes/SubViewport.xml:39 msgid "" -"Update the render target only when it is visible. This is the default value." +"Clear the render target next frame, then switch to [constant " +"CLEAR_MODE_NEVER]." msgstr "" #: doc/classes/SubViewport.xml:42 -msgid "Update the render target only when the its parent is visible." +msgid "Do not update the render target." msgstr "" #: doc/classes/SubViewport.xml:45 -msgid "Always update the render target." +msgid "" +"Update the render target once, then switch to [constant UPDATE_DISABLED]." msgstr "" #: doc/classes/SubViewport.xml:48 -msgid "Always clear the render target before drawing." +msgid "" +"Update the render target only when it is visible. This is the default value." msgstr "" #: doc/classes/SubViewport.xml:51 -msgid "Never clear the render target." +msgid "Update the render target only when the its parent is visible." msgstr "" #: doc/classes/SubViewport.xml:54 -msgid "" -"Clear the render target next frame, then switch to [constant " -"CLEAR_MODE_NEVER]." +msgid "Always update the render target." msgstr "" #: doc/classes/SubViewportContainer.xml:4 @@ -47984,85 +48236,90 @@ msgid "" "information to a mesh.\n" "Additionally, the attributes used before the first vertex is added determine " "the format of the mesh. For example, if you only add UVs to the first " -"vertex, you cannot add color to any of the subsequent vertices." +"vertex, you cannot add color to any of the subsequent vertices.\n" +"See also [ArrayMesh], [ImmediateGeometry3D] and [MeshDataTool] for " +"procedural geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." msgstr "" -#: doc/classes/SurfaceTool.xml:28 +#: doc/classes/SurfaceTool.xml:30 msgid "" "Adds an array of bones for the next vertex to use. [code]bones[/code] must " "contain 4 integers." msgstr "" -#: doc/classes/SurfaceTool.xml:37 +#: doc/classes/SurfaceTool.xml:39 msgid "Specifies a [Color] for the next vertex to use." msgstr "" -#: doc/classes/SurfaceTool.xml:46 +#: doc/classes/SurfaceTool.xml:48 msgid "" "Adds an index to index array if you are using indexed vertices. Does not " "need to be called before adding vertices." msgstr "" -#: doc/classes/SurfaceTool.xml:55 +#: doc/classes/SurfaceTool.xml:57 msgid "Specifies a normal for the next vertex to use." msgstr "" -#: doc/classes/SurfaceTool.xml:64 +#: doc/classes/SurfaceTool.xml:66 msgid "" "Specifies whether the current vertex (if using only vertex arrays) or " "current index (if also using index arrays) should use smooth normals for " "normal calculation." msgstr "" -#: doc/classes/SurfaceTool.xml:73 +#: doc/classes/SurfaceTool.xml:75 msgid "Specifies a tangent for the next vertex to use." msgstr "" -#: doc/classes/SurfaceTool.xml:92 +#: doc/classes/SurfaceTool.xml:94 msgid "" "Inserts a triangle fan made of array data into [Mesh] being constructed.\n" "Requires the primitive type be set to [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" -#: doc/classes/SurfaceTool.xml:102 +#: doc/classes/SurfaceTool.xml:104 msgid "Specifies a set of UV coordinates to use for the next vertex." msgstr "" -#: doc/classes/SurfaceTool.xml:111 +#: doc/classes/SurfaceTool.xml:113 msgid "" "Specifies an optional second set of UV coordinates to use for the next " "vertex." msgstr "" -#: doc/classes/SurfaceTool.xml:120 +#: doc/classes/SurfaceTool.xml:122 msgid "" "Specifies the position of current vertex. Should be called after specifying " "other vertex properties (e.g. Color, UV)." msgstr "" -#: doc/classes/SurfaceTool.xml:129 +#: doc/classes/SurfaceTool.xml:131 msgid "" "Specifies weight values for next vertex to use. [code]weights[/code] must " "contain 4 values." msgstr "" -#: doc/classes/SurfaceTool.xml:142 +#: doc/classes/SurfaceTool.xml:144 msgid "" "Append vertices from a given [Mesh] surface onto the current vertex array " "with specified [Transform]." msgstr "" -#: doc/classes/SurfaceTool.xml:151 +#: doc/classes/SurfaceTool.xml:153 msgid "" "Called before adding any vertices. Takes the primitive type as an argument " "(e.g. [constant Mesh.PRIMITIVE_TRIANGLES])." msgstr "" -#: doc/classes/SurfaceTool.xml:158 +#: doc/classes/SurfaceTool.xml:160 msgid "Clear all information passed into the surface tool so far." msgstr "" -#: doc/classes/SurfaceTool.xml:169 +#: doc/classes/SurfaceTool.xml:171 msgid "" "Returns a constructed [ArrayMesh] from current information passed in. If an " "existing [ArrayMesh] is passed in as an argument, will add an extra surface " @@ -48072,28 +48329,28 @@ msgid "" "flags." msgstr "" -#: doc/classes/SurfaceTool.xml:177 +#: doc/classes/SurfaceTool.xml:179 msgid "" "Commits the data to the same format used by [method ArrayMesh." "add_surface_from_arrays]. This way you can further process the mesh data " "using the [ArrayMesh] API." msgstr "" -#: doc/classes/SurfaceTool.xml:188 +#: doc/classes/SurfaceTool.xml:190 msgid "Creates a vertex array from an existing [Mesh]." msgstr "" -#: doc/classes/SurfaceTool.xml:201 +#: doc/classes/SurfaceTool.xml:203 msgid "" "Creates a vertex array from the specified blend shape of an existing [Mesh]. " "This can be used to extract a specific pose from a blend shape." msgstr "" -#: doc/classes/SurfaceTool.xml:208 +#: doc/classes/SurfaceTool.xml:210 msgid "Removes the index array by expanding the vertex array." msgstr "" -#: doc/classes/SurfaceTool.xml:217 +#: doc/classes/SurfaceTool.xml:219 msgid "" "Generates normals from vertices so you do not have to do it manually. If " "[code]flip[/code] is [code]true[/code], the resulting normals will be " @@ -48101,19 +48358,19 @@ msgid "" "Requires the primitive type to be set to [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" -#: doc/classes/SurfaceTool.xml:225 +#: doc/classes/SurfaceTool.xml:227 msgid "" "Generates a tangent vector for each vertex. Requires that each vertex have " "UVs and normals set already." msgstr "" -#: doc/classes/SurfaceTool.xml:232 +#: doc/classes/SurfaceTool.xml:234 msgid "" "Shrinks the vertex array by creating an index array (avoids reusing " "vertices)." msgstr "" -#: doc/classes/SurfaceTool.xml:241 +#: doc/classes/SurfaceTool.xml:243 msgid "Sets [Material] to be used by the [Mesh] you are constructing." msgstr "" @@ -48147,7 +48404,7 @@ msgid "Returns the previously active tab index." msgstr "" #: doc/classes/TabContainer.xml:42 -msgid "Returns the currently visible tab's [Control] node." +msgid "Returns the [Control] node from the tab at index [code]tab_idx[/code]." msgstr "" #: doc/classes/TabContainer.xml:49 doc/classes/Tabs.xml:50 @@ -48816,151 +49073,163 @@ msgstr "" msgid "If [code]true[/code], the line containing the cursor is highlighted." msgstr "" -#: doc/classes/TextEdit.xml:438 +#: doc/classes/TextEdit.xml:436 +msgid "" +"If [code]true[/code], custom [code]font_color_selected[/code] will be used " +"for selected text." +msgstr "" + +#: doc/classes/TextEdit.xml:439 msgid "" "If [code]true[/code], read-only mode is enabled. Existing text cannot be " "modified and new text cannot be added." msgstr "" -#: doc/classes/TextEdit.xml:451 +#: doc/classes/TextEdit.xml:452 msgid "" "If [code]true[/code], line numbers are displayed to the left of the text." msgstr "" -#: doc/classes/TextEdit.xml:454 +#: doc/classes/TextEdit.xml:455 msgid "" "If [code]true[/code], sets the [code]step[/code] of the scrollbars to " "[code]0.25[/code] which results in smoother scrolling." msgstr "" -#: doc/classes/TextEdit.xml:457 +#: doc/classes/TextEdit.xml:458 msgid "" "If [code]true[/code], any custom color properties that have been set for " "this [TextEdit] will be visible." msgstr "" -#: doc/classes/TextEdit.xml:460 +#: doc/classes/TextEdit.xml:461 msgid "String value of the [TextEdit]." msgstr "" -#: doc/classes/TextEdit.xml:463 +#: doc/classes/TextEdit.xml:464 msgid "Vertical scroll sensitivity." msgstr "" -#: doc/classes/TextEdit.xml:466 +#: doc/classes/TextEdit.xml:467 msgid "" "If [code]true[/code], enables text wrapping when it goes beyond the edge of " "what is visible." msgstr "" -#: doc/classes/TextEdit.xml:474 +#: doc/classes/TextEdit.xml:475 msgid "Emitted when a breakpoint is placed via the breakpoint gutter." msgstr "" -#: doc/classes/TextEdit.xml:479 +#: doc/classes/TextEdit.xml:480 msgid "Emitted when the cursor changes." msgstr "" -#: doc/classes/TextEdit.xml:488 +#: doc/classes/TextEdit.xml:489 msgid "Emitted when the info icon is clicked." msgstr "" -#: doc/classes/TextEdit.xml:519 +#: doc/classes/TextEdit.xml:520 msgid "Match case when searching." msgstr "" -#: doc/classes/TextEdit.xml:522 +#: doc/classes/TextEdit.xml:523 msgid "Match whole words when searching." msgstr "" -#: doc/classes/TextEdit.xml:525 +#: doc/classes/TextEdit.xml:526 msgid "Search from end to beginning." msgstr "" -#: doc/classes/TextEdit.xml:528 +#: doc/classes/TextEdit.xml:529 msgid "Used to access the result column from [method search]." msgstr "" -#: doc/classes/TextEdit.xml:531 +#: doc/classes/TextEdit.xml:532 msgid "Used to access the result line from [method search]." msgstr "" -#: doc/classes/TextEdit.xml:540 +#: doc/classes/TextEdit.xml:541 msgid "" "Pastes the clipboard text over the selected text (or at the cursor's " "position)." msgstr "" -#: doc/classes/TextEdit.xml:543 +#: doc/classes/TextEdit.xml:544 msgid "Erases the whole [TextEdit] text." msgstr "" -#: doc/classes/TextEdit.xml:546 +#: doc/classes/TextEdit.xml:547 msgid "Selects the whole [TextEdit] text." msgstr "" -#: doc/classes/TextEdit.xml:552 +#: doc/classes/TextEdit.xml:553 msgid "Redoes the previous action." msgstr "" -#: doc/classes/TextEdit.xml:560 +#: doc/classes/TextEdit.xml:561 msgid "" "Sets the background [Color] of this [TextEdit]. [member syntax_highlighting] " "has to be enabled." msgstr "" -#: doc/classes/TextEdit.xml:563 +#: doc/classes/TextEdit.xml:564 msgid "" "Sets the [Color] of the bookmark marker. [member syntax_highlighting] has to " "be enabled." msgstr "" -#: doc/classes/TextEdit.xml:568 doc/classes/TextEdit.xml:595 +#: doc/classes/TextEdit.xml:569 doc/classes/TextEdit.xml:596 msgid "" "Sets the [Color] of the breakpoints. [member breakpoint_gutter] has to be " "enabled." msgstr "" -#: doc/classes/TextEdit.xml:606 +#: doc/classes/TextEdit.xml:607 msgid "Sets the default [Font]." msgstr "" -#: doc/classes/TextEdit.xml:609 +#: doc/classes/TextEdit.xml:610 msgid "Sets the font [Color]." msgstr "" -#: doc/classes/TextEdit.xml:618 +#: doc/classes/TextEdit.xml:615 +msgid "" +"Sets the [Color] of the selected text. [member override_selected_font_color] " +"has to be enabled." +msgstr "" + +#: doc/classes/TextEdit.xml:620 msgid "" "Sets the [Color] of the line numbers. [member show_line_numbers] has to be " "enabled." msgstr "" -#: doc/classes/TextEdit.xml:621 +#: doc/classes/TextEdit.xml:623 msgid "Sets the spacing between the lines." msgstr "" -#: doc/classes/TextEdit.xml:624 +#: doc/classes/TextEdit.xml:626 msgid "Sets the [Color] of marked text." msgstr "" -#: doc/classes/TextEdit.xml:629 +#: doc/classes/TextEdit.xml:631 msgid "Sets the [StyleBox] of this [TextEdit]." msgstr "" -#: doc/classes/TextEdit.xml:634 +#: doc/classes/TextEdit.xml:636 msgid "" "Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled." msgstr "" -#: doc/classes/TextEdit.xml:639 +#: doc/classes/TextEdit.xml:641 msgid "Sets the highlight [Color] of text selections." msgstr "" -#: doc/classes/TextEdit.xml:646 +#: doc/classes/TextEdit.xml:648 msgid "Sets a custom [Texture2D] for tab text characters." msgstr "" -#: doc/classes/TextEdit.xml:649 +#: doc/classes/TextEdit.xml:651 msgid "" "Sets the highlight [Color] of multiple occurrences. [member " "highlight_all_occurrences] has to be enabled." @@ -49632,8 +49901,8 @@ msgstr "" #: doc/classes/TileMap.xml:46 msgid "" -"Returns the coordinate of the autotile variation in the tileset. Returns a " -"zero vector if the cell doesn't have autotiling." +"Returns the coordinate (subtile column and row) of the autotile variation in " +"the tileset. Returns a zero vector if the cell doesn't have autotiling." msgstr "" #: doc/classes/TileMap.xml:55 @@ -49690,7 +49959,8 @@ msgid "" "Sets the tile index for the cell given by a Vector2.\n" "An index of [code]-1[/code] clears the cell.\n" "Optionally, the tile can also be flipped, transposed, or given autotile " -"coordinates.\n" +"coordinates. The autotile coordinate refers to the column and row of the " +"subtile.\n" "[b]Note:[/b] Data such as navigation polygons and collision shapes are not " "immediately updated for performance reasons.\n" "If you need these to be immediately updated, you can call [method " @@ -50497,9 +50767,10 @@ msgid "" "using matrix multiplication. The axis must be a normalized vector." msgstr "" -#: doc/classes/Transform.xml:138 doc/classes/Transform2D.xml:140 +#: doc/classes/Transform.xml:138 msgid "" -"Scales the transform by the given scale factor, using matrix multiplication." +"Scales basis and origin of the transform by the given scale factor, using " +"matrix multiplication." msgstr "" #: doc/classes/Transform.xml:147 doc/classes/Transform2D.xml:149 @@ -50609,6 +50880,11 @@ msgid "" "multiplication." msgstr "" +#: doc/classes/Transform2D.xml:140 +msgid "" +"Scales the transform by the given scale factor, using matrix multiplication." +msgstr "" + #: doc/classes/Transform2D.xml:159 msgid "" "Transforms the given [Vector2], [Rect2], or [PackedVector2Array] by this " @@ -50766,7 +51042,8 @@ msgid "" "[/codeblock]\n" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " -"through [method get_root]." +"through [method get_root]. You can use [method Object.free] on a [TreeItem] " +"to remove it from the [Tree]." msgstr "" #: doc/classes/Tree.xml:28 @@ -51252,10 +51529,11 @@ msgstr "" #: doc/classes/TreeItem.xml:7 msgid "" "Control for a single item inside a [Tree]. May have child [TreeItem]s and be " -"styled as well as contain buttons." +"styled as well as contain buttons.\n" +"You can remove a [TreeItem] by using [method Object.free]." msgstr "" -#: doc/classes/TreeItem.xml:26 +#: doc/classes/TreeItem.xml:27 msgid "" "Adds a button with [Texture2D] [code]button[/code] at column [code]column[/" "code]. The [code]button_idx[/code] index is used to identify the button when " @@ -51265,89 +51543,89 @@ msgid "" "have a [code]tooltip[/code]." msgstr "" -#: doc/classes/TreeItem.xml:35 +#: doc/classes/TreeItem.xml:36 msgid "" "Calls the [code]method[/code] on the actual TreeItem and its children " "recursively. Pass parameters as a comma separated list." msgstr "" -#: doc/classes/TreeItem.xml:44 +#: doc/classes/TreeItem.xml:45 msgid "Resets the background color for the given column to default." msgstr "" -#: doc/classes/TreeItem.xml:53 +#: doc/classes/TreeItem.xml:54 msgid "Resets the color for the given column to default." msgstr "" -#: doc/classes/TreeItem.xml:62 +#: doc/classes/TreeItem.xml:63 msgid "Deselects the given column." msgstr "" -#: doc/classes/TreeItem.xml:73 +#: doc/classes/TreeItem.xml:74 msgid "" "Removes the button at index [code]button_idx[/code] in column [code]column[/" "code]." msgstr "" -#: doc/classes/TreeItem.xml:84 +#: doc/classes/TreeItem.xml:85 msgid "" "Returns the [Texture2D] of the button at index [code]button_idx[/code] in " "column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:93 +#: doc/classes/TreeItem.xml:94 msgid "" "Returns the number of buttons in column [code]column[/code]. May be used to " "get the most recently added button's index, if no index was specified." msgstr "" -#: doc/classes/TreeItem.xml:104 +#: doc/classes/TreeItem.xml:105 msgid "" "Returns the tooltip string for the button at index [code]button_idx[/code] " "in column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:113 +#: doc/classes/TreeItem.xml:114 msgid "Returns the column's cell mode." msgstr "" -#: doc/classes/TreeItem.xml:120 +#: doc/classes/TreeItem.xml:121 msgid "Returns the TreeItem's child items." msgstr "" -#: doc/classes/TreeItem.xml:129 +#: doc/classes/TreeItem.xml:130 msgid "Returns the custom background color of column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:138 +#: doc/classes/TreeItem.xml:139 msgid "Returns the custom color of column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:147 +#: doc/classes/TreeItem.xml:148 msgid "Returns [code]true[/code] if [code]expand_right[/code] is set." msgstr "" -#: doc/classes/TreeItem.xml:156 +#: doc/classes/TreeItem.xml:157 msgid "Returns the given column's icon [Texture2D]. Error if no icon is set." msgstr "" -#: doc/classes/TreeItem.xml:165 +#: doc/classes/TreeItem.xml:166 msgid "Returns the column's icon's maximum width." msgstr "" -#: doc/classes/TreeItem.xml:174 +#: doc/classes/TreeItem.xml:175 msgid "Returns the [Color] modulating the column's icon." msgstr "" -#: doc/classes/TreeItem.xml:183 +#: doc/classes/TreeItem.xml:184 msgid "Returns the icon [Texture2D] region as [Rect2]." msgstr "" -#: doc/classes/TreeItem.xml:198 +#: doc/classes/TreeItem.xml:199 msgid "Returns the next TreeItem in the tree." msgstr "" -#: doc/classes/TreeItem.xml:207 +#: doc/classes/TreeItem.xml:208 msgid "" "Returns the next visible TreeItem in the tree.\n" "If [code]wrap[/code] is enabled, the method will wrap around to the first " @@ -51355,15 +51633,15 @@ msgid "" "otherwise it returns [code]null[/code]." msgstr "" -#: doc/classes/TreeItem.xml:215 +#: doc/classes/TreeItem.xml:216 msgid "Returns the parent TreeItem." msgstr "" -#: doc/classes/TreeItem.xml:222 +#: doc/classes/TreeItem.xml:223 msgid "Returns the previous TreeItem in the tree." msgstr "" -#: doc/classes/TreeItem.xml:231 +#: doc/classes/TreeItem.xml:232 msgid "" "Returns the previous visible TreeItem in the tree.\n" "If [code]wrap[/code] is enabled, the method will wrap around to the last " @@ -51371,89 +51649,92 @@ msgid "" "otherwise it returns [code]null[/code]." msgstr "" -#: doc/classes/TreeItem.xml:257 +#: doc/classes/TreeItem.xml:258 msgid "Returns the given column's text." msgstr "" -#: doc/classes/TreeItem.xml:266 +#: doc/classes/TreeItem.xml:267 msgid "Returns the given column's text alignment." msgstr "" -#: doc/classes/TreeItem.xml:275 +#: doc/classes/TreeItem.xml:276 msgid "Returns the given column's tooltip." msgstr "" -#: doc/classes/TreeItem.xml:286 +#: doc/classes/TreeItem.xml:287 msgid "" "Returns [code]true[/code] if the button at index [code]button_idx[/code] for " "the given column is disabled." msgstr "" -#: doc/classes/TreeItem.xml:295 +#: doc/classes/TreeItem.xml:296 msgid "Returns [code]true[/code] if the given column is checked." msgstr "" -#: doc/classes/TreeItem.xml:312 +#: doc/classes/TreeItem.xml:313 msgid "Returns [code]true[/code] if column [code]column[/code] is editable." msgstr "" -#: doc/classes/TreeItem.xml:321 +#: doc/classes/TreeItem.xml:322 msgid "Returns [code]true[/code] if column [code]column[/code] is selectable." msgstr "" -#: doc/classes/TreeItem.xml:330 +#: doc/classes/TreeItem.xml:331 msgid "Returns [code]true[/code] if column [code]column[/code] is selected." msgstr "" -#: doc/classes/TreeItem.xml:337 +#: doc/classes/TreeItem.xml:338 msgid "Moves this TreeItem to the bottom in the [Tree] hierarchy." msgstr "" -#: doc/classes/TreeItem.xml:344 +#: doc/classes/TreeItem.xml:345 msgid "Moves this TreeItem to the top in the [Tree] hierarchy." msgstr "" -#: doc/classes/TreeItem.xml:353 -msgid "Removes the given child TreeItem." +#: doc/classes/TreeItem.xml:354 +msgid "" +"Removes the given child [TreeItem] and all its children from the [Tree]. " +"Note that it doesn't free the item from memory, so it can be reused later. " +"To completely remove a [TreeItem] use [method Object.free]." msgstr "" -#: doc/classes/TreeItem.xml:362 +#: doc/classes/TreeItem.xml:363 msgid "Selects the column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:375 +#: doc/classes/TreeItem.xml:376 msgid "" "Sets the given column's button [Texture2D] at index [code]button_idx[/code] " "to [code]button[/code]." msgstr "" -#: doc/classes/TreeItem.xml:388 +#: doc/classes/TreeItem.xml:389 msgid "" "If [code]true[/code], disables the button at index [code]button_idx[/code] " "in column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:399 +#: doc/classes/TreeItem.xml:400 msgid "" "Sets the given column's cell mode to [code]mode[/code]. See [enum " "TreeCellMode] constants." msgstr "" -#: doc/classes/TreeItem.xml:410 +#: doc/classes/TreeItem.xml:411 msgid "If [code]true[/code], the column [code]column[/code] is checked." msgstr "" -#: doc/classes/TreeItem.xml:433 +#: doc/classes/TreeItem.xml:434 msgid "" "Sets the given column's custom background color and whether to just use it " "as an outline." msgstr "" -#: doc/classes/TreeItem.xml:444 +#: doc/classes/TreeItem.xml:445 msgid "Sets the given column's custom color." msgstr "" -#: doc/classes/TreeItem.xml:457 +#: doc/classes/TreeItem.xml:458 msgid "" "Sets the given column's custom draw callback to [code]callback[/code] method " "on [code]object[/code].\n" @@ -51461,82 +51742,82 @@ msgid "" "is drawn and its position and size as a [Rect2]." msgstr "" -#: doc/classes/TreeItem.xml:469 +#: doc/classes/TreeItem.xml:470 msgid "If [code]true[/code], column [code]column[/code] is editable." msgstr "" -#: doc/classes/TreeItem.xml:480 +#: doc/classes/TreeItem.xml:481 msgid "" "If [code]true[/code], column [code]column[/code] is expanded to the right." msgstr "" -#: doc/classes/TreeItem.xml:491 +#: doc/classes/TreeItem.xml:492 msgid "Sets the given column's icon [Texture2D]." msgstr "" -#: doc/classes/TreeItem.xml:502 +#: doc/classes/TreeItem.xml:503 msgid "Sets the given column's icon's maximum width." msgstr "" -#: doc/classes/TreeItem.xml:513 +#: doc/classes/TreeItem.xml:514 msgid "Modulates the given column's icon with [code]modulate[/code]." msgstr "" -#: doc/classes/TreeItem.xml:524 +#: doc/classes/TreeItem.xml:525 msgid "Sets the given column's icon's texture region." msgstr "" -#: doc/classes/TreeItem.xml:571 +#: doc/classes/TreeItem.xml:572 msgid "If [code]true[/code], the given column is selectable." msgstr "" -#: doc/classes/TreeItem.xml:592 +#: doc/classes/TreeItem.xml:593 msgid "" "Sets the given column's text alignment. See [enum TextAlign] for possible " "values." msgstr "" -#: doc/classes/TreeItem.xml:603 +#: doc/classes/TreeItem.xml:604 msgid "Sets the given column's tooltip text." msgstr "" -#: doc/classes/TreeItem.xml:609 +#: doc/classes/TreeItem.xml:610 msgid "If [code]true[/code], the TreeItem is collapsed." msgstr "" -#: doc/classes/TreeItem.xml:612 +#: doc/classes/TreeItem.xml:613 msgid "The custom minimum height." msgstr "" -#: doc/classes/TreeItem.xml:615 +#: doc/classes/TreeItem.xml:616 msgid "If [code]true[/code], folding is disabled for this TreeItem." msgstr "" -#: doc/classes/TreeItem.xml:620 +#: doc/classes/TreeItem.xml:621 msgid "Cell contains a string." msgstr "" -#: doc/classes/TreeItem.xml:623 +#: doc/classes/TreeItem.xml:624 msgid "Cell can be checked." msgstr "" -#: doc/classes/TreeItem.xml:626 +#: doc/classes/TreeItem.xml:627 msgid "Cell contains a range." msgstr "" -#: doc/classes/TreeItem.xml:629 +#: doc/classes/TreeItem.xml:630 msgid "Cell contains an icon." msgstr "" -#: doc/classes/TreeItem.xml:634 +#: doc/classes/TreeItem.xml:635 msgid "Align text to the left. See [code]set_text_align()[/code]." msgstr "" -#: doc/classes/TreeItem.xml:637 +#: doc/classes/TreeItem.xml:638 msgid "Center text. See [code]set_text_align()[/code]." msgstr "" -#: doc/classes/TreeItem.xml:640 +#: doc/classes/TreeItem.xml:641 msgid "Align text to the right. See [code]set_text_align()[/code]." msgstr "" @@ -51562,8 +51843,8 @@ msgid "" "know the final values in advance. For example, interpolating a dynamically-" "chosen camera zoom value is best done with a [Tween] node; it would be " "difficult to do the same thing with an [AnimationPlayer] node.\n" -"Here is a brief usage example that causes a 2D node to move smoothly between " -"two positions:\n" +"Here is a brief usage example that makes a 2D node move smoothly between two " +"positions:\n" "[codeblock]\n" "var tween = get_node(\"Tween\")\n" "tween.interpolate_property($Node2D, \"position\",\n" @@ -51578,15 +51859,18 @@ msgid "" "where it would only apply to that particular component.\n" "Many of the methods accept [code]trans_type[/code] and [code]ease_type[/" "code]. The first accepts an [enum TransitionType] constant, and refers to " -"the way the timing of the animation is handled (see [code]http://easings.net/" -"[/code] for some examples). The second accepts an [enum EaseType] constant, " -"and controls the where [code]trans_type[/code] is applied to the " -"interpolation (in the beginning, the end, or both). If you don't know which " -"transition and easing to pick, you can try different [enum TransitionType] " -"constants with [constant EASE_IN_OUT], and use the one that looks best." +"the way the timing of the animation is handled (see [url=https://easings." +"net/]easings.net[/url] for some examples). The second accepts an [enum " +"EaseType] constant, and controls the where [code]trans_type[/code] is " +"applied to the interpolation (in the beginning, the end, or both). If you " +"don't know which transition and easing to pick, you can try different [enum " +"TransitionType] constants with [constant EASE_IN_OUT], and use the one that " +"looks best.\n" +"[b][url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url][/b]" msgstr "" -#: doc/classes/Tween.xml:45 +#: doc/classes/Tween.xml:46 msgid "" "Follows [code]method[/code] of [code]object[/code] and applies the returned " "value on [code]target_method[/code] of [code]target[/code], beginning from " @@ -51598,7 +51882,7 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:71 +#: doc/classes/Tween.xml:72 msgid "" "Follows [code]property[/code] of [code]object[/code] and applies it on " "[code]target_property[/code] of [code]target[/code], beginning from " @@ -51610,21 +51894,21 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:79 +#: doc/classes/Tween.xml:80 msgid "" "Returns the total time needed for all tweens to end. If you have two tweens, " "one lasting 10 seconds and the other 20 seconds, it would return 20 seconds, " "as by that time all tweens would have finished." msgstr "" -#: doc/classes/Tween.xml:102 +#: doc/classes/Tween.xml:103 msgid "" "Calls [code]callback[/code] of [code]object[/code] after [code]duration[/" "code]. [code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the " "callback." msgstr "" -#: doc/classes/Tween.xml:125 +#: doc/classes/Tween.xml:126 msgid "" "Calls [code]callback[/code] of [code]object[/code] after [code]duration[/" "code] on the main thread (similar to [method Object.call_deferred]). " @@ -51632,7 +51916,7 @@ msgid "" "callback." msgstr "" -#: doc/classes/Tween.xml:148 +#: doc/classes/Tween.xml:149 msgid "" "Animates [code]method[/code] of [code]object[/code] from [code]initial_val[/" "code] to [code]final_val[/code] for [code]duration[/code] seconds, " @@ -51644,7 +51928,7 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:172 +#: doc/classes/Tween.xml:173 msgid "" "Animates [code]property[/code] of [code]object[/code] from " "[code]initial_val[/code] to [code]final_val[/code] for [code]duration[/code] " @@ -51656,72 +51940,72 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:180 +#: doc/classes/Tween.xml:181 msgid "" "Returns [code]true[/code] if any tweens are currently running.\n" "[b]Note:[/b] This method doesn't consider tweens that have ended." msgstr "" -#: doc/classes/Tween.xml:192 +#: doc/classes/Tween.xml:193 msgid "" "Stops animation and removes a tween, given its object and property/method " "pair. By default, all tweens are removed, unless [code]key[/code] is " "specified." msgstr "" -#: doc/classes/Tween.xml:199 +#: doc/classes/Tween.xml:200 msgid "Stops animation and removes all tweens." msgstr "" -#: doc/classes/Tween.xml:210 +#: doc/classes/Tween.xml:211 msgid "" "Resets a tween to its initial value (the one given, not the one before the " "tween), given its object and property/method pair. By default, all tweens " "are removed, unless [code]key[/code] is specified." msgstr "" -#: doc/classes/Tween.xml:217 +#: doc/classes/Tween.xml:218 msgid "" "Resets all tweens to their initial values (the ones given, not those before " "the tween)." msgstr "" -#: doc/classes/Tween.xml:228 +#: doc/classes/Tween.xml:229 msgid "" "Continues animating a stopped tween, given its object and property/method " "pair. By default, all tweens are resumed, unless [code]key[/code] is " "specified." msgstr "" -#: doc/classes/Tween.xml:235 +#: doc/classes/Tween.xml:236 msgid "Continues animating all stopped tweens." msgstr "" -#: doc/classes/Tween.xml:244 +#: doc/classes/Tween.xml:245 msgid "Sets the interpolation to the given [code]time[/code] in seconds." msgstr "" -#: doc/classes/Tween.xml:253 +#: doc/classes/Tween.xml:254 msgid "" "Activates/deactivates the tween. See also [method stop_all] and [method " "resume_all]." msgstr "" -#: doc/classes/Tween.xml:260 +#: doc/classes/Tween.xml:261 msgid "Starts the tween. You can define animations both before and after this." msgstr "" -#: doc/classes/Tween.xml:271 +#: doc/classes/Tween.xml:272 msgid "" "Stops a tween, given its object and property/method pair. By default, all " "tweens are stopped, unless [code]key[/code] is specified." msgstr "" -#: doc/classes/Tween.xml:278 +#: doc/classes/Tween.xml:279 msgid "Stops animating all tweens." msgstr "" -#: doc/classes/Tween.xml:303 +#: doc/classes/Tween.xml:304 msgid "" "Animates [code]method[/code] of [code]object[/code] from the value returned " "by [code]initial_method[/code] to [code]final_val[/code] for [code]duration[/" @@ -51733,7 +52017,7 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:329 +#: doc/classes/Tween.xml:330 msgid "" "Animates [code]property[/code] of [code]object[/code] from the current value " "of the [code]initial_val[/code] property of [code]initial[/code] to " @@ -51745,15 +52029,15 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:337 +#: doc/classes/Tween.xml:338 msgid "Returns the current time of the tween." msgstr "" -#: doc/classes/Tween.xml:343 +#: doc/classes/Tween.xml:344 msgid "The tween's animation process thread. See [enum TweenProcessMode]." msgstr "" -#: doc/classes/Tween.xml:346 +#: doc/classes/Tween.xml:347 msgid "" "The tween's speed multiplier. For example, set it to [code]1.0[/code] for " "normal speed, [code]2.0[/code] for two times normal speed, or [code]0.5[/" @@ -51761,100 +52045,100 @@ msgid "" "animation, but see also [method set_active] or [method stop_all] for this." msgstr "" -#: doc/classes/Tween.xml:349 +#: doc/classes/Tween.xml:350 msgid "If [code]true[/code], the tween loops." msgstr "" -#: doc/classes/Tween.xml:355 +#: doc/classes/Tween.xml:356 msgid "Emitted when all processes in a tween end." msgstr "" -#: doc/classes/Tween.xml:364 +#: doc/classes/Tween.xml:365 msgid "Emitted when a tween ends." msgstr "" -#: doc/classes/Tween.xml:373 +#: doc/classes/Tween.xml:374 msgid "Emitted when a tween starts." msgstr "" -#: doc/classes/Tween.xml:386 +#: doc/classes/Tween.xml:387 msgid "Emitted at each step of the animation." msgstr "" -#: doc/classes/Tween.xml:392 +#: doc/classes/Tween.xml:393 msgid "The tween updates with the [code]_physics_process[/code] callback." msgstr "" -#: doc/classes/Tween.xml:395 +#: doc/classes/Tween.xml:396 msgid "The tween updates with the [code]_process[/code] callback." msgstr "" -#: doc/classes/Tween.xml:398 +#: doc/classes/Tween.xml:399 msgid "The animation is interpolated linearly." msgstr "" -#: doc/classes/Tween.xml:401 +#: doc/classes/Tween.xml:402 msgid "The animation is interpolated using a sine function." msgstr "" -#: doc/classes/Tween.xml:404 +#: doc/classes/Tween.xml:405 msgid "" "The animation is interpolated with a quintic (to the power of 5) function." msgstr "" -#: doc/classes/Tween.xml:407 +#: doc/classes/Tween.xml:408 msgid "" "The animation is interpolated with a quartic (to the power of 4) function." msgstr "" -#: doc/classes/Tween.xml:410 +#: doc/classes/Tween.xml:411 msgid "" "The animation is interpolated with a quadratic (to the power of 2) function." msgstr "" -#: doc/classes/Tween.xml:413 +#: doc/classes/Tween.xml:414 msgid "" "The animation is interpolated with an exponential (to the power of x) " "function." msgstr "" -#: doc/classes/Tween.xml:416 +#: doc/classes/Tween.xml:417 msgid "" "The animation is interpolated with elasticity, wiggling around the edges." msgstr "" -#: doc/classes/Tween.xml:419 +#: doc/classes/Tween.xml:420 msgid "" "The animation is interpolated with a cubic (to the power of 3) function." msgstr "" -#: doc/classes/Tween.xml:422 +#: doc/classes/Tween.xml:423 msgid "The animation is interpolated with a function using square roots." msgstr "" -#: doc/classes/Tween.xml:425 +#: doc/classes/Tween.xml:426 msgid "The animation is interpolated by bouncing at the end." msgstr "" -#: doc/classes/Tween.xml:428 +#: doc/classes/Tween.xml:429 msgid "The animation is interpolated backing out at ends." msgstr "" -#: doc/classes/Tween.xml:431 +#: doc/classes/Tween.xml:432 msgid "The interpolation starts slowly and speeds up towards the end." msgstr "" -#: doc/classes/Tween.xml:434 +#: doc/classes/Tween.xml:435 msgid "The interpolation starts quickly and slows down towards the end." msgstr "" -#: doc/classes/Tween.xml:437 +#: doc/classes/Tween.xml:438 msgid "" "A combination of [constant EASE_IN] and [constant EASE_OUT]. The " "interpolation is slowest at both ends." msgstr "" -#: doc/classes/Tween.xml:440 +#: doc/classes/Tween.xml:441 msgid "" "A combination of [constant EASE_IN] and [constant EASE_OUT]. The " "interpolation is fastest at both ends." @@ -53458,69 +53742,90 @@ msgstr "" msgid "If [code]true[/code], the viewport will process 3D audio streams." msgstr "" -#: doc/classes/Viewport.xml:199 +#: doc/classes/Viewport.xml:195 +msgid "" +"Sets the default filter mode used by [CanvasItem]s in this Viewport. See " +"[enum DefaultCanvasItemTextureFilter] for options." +msgstr "" + +#: doc/classes/Viewport.xml:198 +msgid "" +"Sets the default repeat mode used by [CanvasItem]s in this Viewport. See " +"[enum DefaultCanvasItemTextureRepeat] for options." +msgstr "" + +#: doc/classes/Viewport.xml:201 msgid "" "The canvas transform of the viewport, useful for changing the on-screen " "positions of all child [CanvasItem]s. This is relative to the global canvas " "transform of the viewport." msgstr "" -#: doc/classes/Viewport.xml:202 +#: doc/classes/Viewport.xml:204 msgid "The overlay mode for test rendered geometry in debug purposes." msgstr "" -#: doc/classes/Viewport.xml:205 +#: doc/classes/Viewport.xml:207 msgid "" "The global canvas transform of the viewport. The canvas transform is " "relative to this." msgstr "" -#: doc/classes/Viewport.xml:208 +#: doc/classes/Viewport.xml:210 msgid "If [code]true[/code], the viewport will not receive input event." msgstr "" -#: doc/classes/Viewport.xml:213 +#: doc/classes/Viewport.xml:215 msgid "" "If [code]true[/code], the GUI controls on the viewport will lay pixel " "perfectly." msgstr "" -#: doc/classes/Viewport.xml:218 +#: doc/classes/Viewport.xml:220 msgid "" "The multisample anti-aliasing mode. A higher number results in smoother " "edges at the cost of significantly worse performance. A value of 4 is best " "unless targeting very high-end systems." msgstr "" -#: doc/classes/Viewport.xml:221 +#: doc/classes/Viewport.xml:223 msgid "" "If [code]true[/code], the viewport will use [World3D] defined in " "[code]world[/code] property." msgstr "" -#: doc/classes/Viewport.xml:224 +#: doc/classes/Viewport.xml:226 msgid "" "If [code]true[/code], the objects rendered by viewport become subjects of " "mouse picking process." msgstr "" -#: doc/classes/Viewport.xml:227 +#: doc/classes/Viewport.xml:229 +msgid "" +"Sets the screen-space antialiasing method used. Screen-space antialiasing " +"works by selectively blurring edges in a post-process shader. It differs " +"from MSAA which takes multiple coverage samples while rendering objects. " +"Screen-space AA methods are typically faster than MSAA and will smooth out " +"specular aliasing, but tend to make scenes appear blurry." +msgstr "" + +#: doc/classes/Viewport.xml:232 msgid "The subdivision amount of the first quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:230 +#: doc/classes/Viewport.xml:235 msgid "The subdivision amount of the second quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:233 +#: doc/classes/Viewport.xml:238 msgid "The subdivision amount of the third quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:236 +#: doc/classes/Viewport.xml:241 msgid "The subdivision amount of the fourth quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:239 +#: doc/classes/Viewport.xml:244 msgid "" "The shadow atlas' resolution (used for omni and spot lights). The value will " "be rounded up to the nearest power of 2.\n" @@ -53529,136 +53834,177 @@ msgid "" "manually." msgstr "" -#: doc/classes/Viewport.xml:243 +#: doc/classes/Viewport.xml:248 msgid "" "If [code]true[/code], the viewport should render its background as " "transparent." msgstr "" -#: doc/classes/Viewport.xml:246 +#: doc/classes/Viewport.xml:251 msgid "The custom [World3D] which can be used as 3D environment source." msgstr "" -#: doc/classes/Viewport.xml:249 +#: doc/classes/Viewport.xml:254 msgid "The custom [World2D] which can be used as 2D environment source." msgstr "" -#: doc/classes/Viewport.xml:257 +#: doc/classes/Viewport.xml:262 msgid "Emitted when a Control node grabs keyboard focus." msgstr "" -#: doc/classes/Viewport.xml:262 +#: doc/classes/Viewport.xml:267 msgid "" "Emitted when the size of the viewport is changed, whether by resizing of " "window, or some other means." msgstr "" -#: doc/classes/Viewport.xml:268 +#: doc/classes/Viewport.xml:273 msgid "This quadrant will not be used." msgstr "" -#: doc/classes/Viewport.xml:271 +#: doc/classes/Viewport.xml:276 msgid "This quadrant will only be used by one shadow map." msgstr "" -#: doc/classes/Viewport.xml:274 +#: doc/classes/Viewport.xml:279 msgid "This quadrant will be split in 4 and used by up to 4 shadow maps." msgstr "" -#: doc/classes/Viewport.xml:277 +#: doc/classes/Viewport.xml:282 msgid "This quadrant will be split 16 ways and used by up to 16 shadow maps." msgstr "" -#: doc/classes/Viewport.xml:280 +#: doc/classes/Viewport.xml:285 msgid "This quadrant will be split 64 ways and used by up to 64 shadow maps." msgstr "" -#: doc/classes/Viewport.xml:283 +#: doc/classes/Viewport.xml:288 msgid "" "This quadrant will be split 256 ways and used by up to 256 shadow maps. " "Unless the [member shadow_atlas_size] is very high, the shadows in this " "quadrant will be very low resolution." msgstr "" -#: doc/classes/Viewport.xml:286 +#: doc/classes/Viewport.xml:291 msgid "" "This quadrant will be split 1024 ways and used by up to 1024 shadow maps. " "Unless the [member shadow_atlas_size] is very high, the shadows in this " "quadrant will be very low resolution." msgstr "" -#: doc/classes/Viewport.xml:289 +#: doc/classes/Viewport.xml:294 msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum." msgstr "" -#: doc/classes/Viewport.xml:292 -msgid "Amount of objects in frame." +#: doc/classes/Viewport.xml:297 +msgid "" +"Multisample antialiasing mode disabled. This is the default value, and also " +"the fastest setting." msgstr "" -#: doc/classes/Viewport.xml:295 -msgid "Amount of vertices in frame." +#: doc/classes/Viewport.xml:300 +msgid "Use 2x Multisample Antialiasing." msgstr "" -#: doc/classes/Viewport.xml:298 -msgid "Amount of material changes in frame." +#: doc/classes/Viewport.xml:303 +msgid "Use 4x Multisample Antialiasing." msgstr "" -#: doc/classes/Viewport.xml:301 -msgid "Amount of shader changes in frame." +#: doc/classes/Viewport.xml:306 +msgid "" +"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older " +"hardware." msgstr "" -#: doc/classes/Viewport.xml:304 -msgid "Amount of surface changes in frame." +#: doc/classes/Viewport.xml:309 +msgid "" +"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end " +"hardware." msgstr "" -#: doc/classes/Viewport.xml:307 -msgid "Amount of draw calls in frame." +#: doc/classes/Viewport.xml:312 +msgid "Represents the size of the [enum MSAA] enum." msgstr "" -#: doc/classes/Viewport.xml:310 -msgid "Represents the size of the [enum RenderInfo] enum." +#: doc/classes/Viewport.xml:315 +msgid "Do not perform any antialiasing in the full screen post-process." msgstr "" -#: doc/classes/Viewport.xml:313 -msgid "Objects are displayed normally." +#: doc/classes/Viewport.xml:318 +msgid "" +"Use fast approximate antialiasing. FXAA is a popular screen-space " +"antialising method, which is fast but will make the image look blurry, " +"especially at lower resolutions. It can still work relatively well at large " +"resolutions such as 1440p and 4K." msgstr "" -#: doc/classes/Viewport.xml:316 -msgid "Objects are displayed without light information." +#: doc/classes/Viewport.xml:321 +msgid "Represents the size of the [enum ScreenSpaceAA] enum." msgstr "" -#: doc/classes/Viewport.xml:319 -msgid "" -"Objected are displayed semi-transparent with additive blending so you can " -"see where they intersect." +#: doc/classes/Viewport.xml:324 +msgid "Amount of objects in frame." msgstr "" -#: doc/classes/Viewport.xml:322 -msgid "Objects are displayed in wireframe style." +#: doc/classes/Viewport.xml:327 +msgid "Amount of vertices in frame." +msgstr "" + +#: doc/classes/Viewport.xml:330 +msgid "Amount of material changes in frame." +msgstr "" + +#: doc/classes/Viewport.xml:333 +msgid "Amount of shader changes in frame." +msgstr "" + +#: doc/classes/Viewport.xml:336 +msgid "Amount of surface changes in frame." msgstr "" #: doc/classes/Viewport.xml:339 -msgid "Multisample anti-aliasing mode disabled. This is the default value." +msgid "Amount of draw calls in frame." msgstr "" #: doc/classes/Viewport.xml:342 -msgid "Use 2x Multisample Antialiasing." +msgid "Represents the size of the [enum RenderInfo] enum." msgstr "" #: doc/classes/Viewport.xml:345 -msgid "Use 4x Multisample Antialiasing." +msgid "Objects are displayed normally." msgstr "" -#: doc/classes/Viewport.xml:348 +#: doc/classes/Viewport.xml:356 +msgid "Objects are displayed in wireframe style." +msgstr "" + +#: doc/classes/Viewport.xml:378 msgid "" -"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older " -"hardware." +"Draws the screen-space ambient occlusion texture instead of the scene so " +"that you can clearly see how it is affecting objects. In order for this " +"display mode to work, you must have [member Environment.ssao_enabled] set in " +"your [WorldEnvironment]." msgstr "" -#: doc/classes/Viewport.xml:351 +#: doc/classes/Viewport.xml:384 msgid "" -"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end " -"hardware." +"Colors each PSSM split for the [DirectionalLight3D]s in the scene a " +"different color so you can see where the splits are. In order, they will be " +"colored red, green, blue, and yellow." +msgstr "" + +#: doc/classes/Viewport.xml:387 +msgid "" +"Draws the decal atlas used by [Decal]s and light projector textures in the " +"upper left quadrant of the [Viewport]." +msgstr "" + +#: doc/classes/Viewport.xml:402 +msgid "Max value for [enum DefaultCanvasItemTextureFilter] enum." +msgstr "" + +#: doc/classes/Viewport.xml:414 +msgid "Max value for [enum DefaultCanvasItemTextureRepeat] enum." msgstr "" #: doc/classes/ViewportTexture.xml:4 @@ -53680,7 +54026,7 @@ msgid "" msgstr "" #: doc/classes/VisibilityEnabler2D.xml:4 doc/classes/VisibilityEnabler3D.xml:4 -msgid "Enables certain nodes only when visible." +msgid "Enables certain nodes only when approximately visible." msgstr "" #: doc/classes/VisibilityEnabler2D.xml:7 @@ -53688,78 +54034,82 @@ msgid "" "The VisibilityEnabler2D will disable [RigidBody2D], [AnimationPlayer], and " "other nodes when they are not visible. It will only affect nodes with the " "same root node as the VisibilityEnabler2D, and the root node itself.\n" -"Note that VisibilityEnabler2D will not affect nodes added after scene " +"[b]Note:[/b] For performance reasons, VisibilityEnabler2D uses an " +"approximate heuristic with precision determined by [member ProjectSettings." +"world/2d/cell_size]. If you need exact visibility checking, use another " +"method such as adding an [Area2D] node as a child of a [Camera2D] node.\n" +"[b]Note:[/b] VisibilityEnabler2D will not affect nodes added after scene " "initialization." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:19 -#: doc/classes/VisibilityEnabler3D.xml:19 +#: doc/classes/VisibilityEnabler2D.xml:20 +#: doc/classes/VisibilityEnabler3D.xml:20 msgid "" "Returns whether the enabler identified by given [enum Enabler] constant is " "active." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:30 -#: doc/classes/VisibilityEnabler3D.xml:30 +#: doc/classes/VisibilityEnabler2D.xml:31 +#: doc/classes/VisibilityEnabler3D.xml:31 msgid "" "Sets active state of the enabler identified by given [enum Enabler] constant." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:36 +#: doc/classes/VisibilityEnabler2D.xml:37 msgid "If [code]true[/code], [RigidBody2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:39 +#: doc/classes/VisibilityEnabler2D.xml:40 msgid "If [code]true[/code], [AnimatedSprite2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:42 -#: doc/classes/VisibilityEnabler3D.xml:39 +#: doc/classes/VisibilityEnabler2D.xml:43 +#: doc/classes/VisibilityEnabler3D.xml:40 msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:45 +#: doc/classes/VisibilityEnabler2D.xml:46 msgid "If [code]true[/code], [GPUParticles2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:48 +#: doc/classes/VisibilityEnabler2D.xml:49 msgid "" "If [code]true[/code], the parent's [method Node._physics_process] will be " "stopped." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:51 +#: doc/classes/VisibilityEnabler2D.xml:52 msgid "" "If [code]true[/code], the parent's [method Node._process] will be stopped." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:56 -#: doc/classes/VisibilityEnabler3D.xml:44 +#: doc/classes/VisibilityEnabler2D.xml:57 +#: doc/classes/VisibilityEnabler3D.xml:45 msgid "This enabler will pause [AnimationPlayer] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:59 +#: doc/classes/VisibilityEnabler2D.xml:60 msgid "This enabler will freeze [RigidBody2D] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:62 +#: doc/classes/VisibilityEnabler2D.xml:63 msgid "This enabler will stop [GPUParticles2D] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:65 +#: doc/classes/VisibilityEnabler2D.xml:66 msgid "This enabler will stop the parent's _process function." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:68 +#: doc/classes/VisibilityEnabler2D.xml:69 msgid "This enabler will stop the parent's _physics_process function." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:71 +#: doc/classes/VisibilityEnabler2D.xml:72 msgid "This enabler will stop [AnimatedSprite2D] nodes animations." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:74 -#: doc/classes/VisibilityEnabler3D.xml:50 +#: doc/classes/VisibilityEnabler2D.xml:75 +#: doc/classes/VisibilityEnabler3D.xml:51 msgid "Represents the size of the [enum Enabler] enum." msgstr "" @@ -53768,31 +54118,39 @@ msgid "" "The VisibilityEnabler3D will disable [RigidBody3D] and [AnimationPlayer] " "nodes when they are not visible. It will only affect other nodes within the " "same scene as the VisibilityEnabler3D itself.\n" -"Note that VisibilityEnabler3D will not affect nodes added after scene " +"[b]Note:[/b] VisibilityEnabler3D uses an approximate heuristic for " +"performance reasons. It doesn't take walls and other occlusion into account. " +"If you need exact visibility checking, use another method such as adding an " +"[Area3D] node as a child of a [Camera3D] node.\n" +"[b]Note:[/b] VisibilityEnabler3D will not affect nodes added after scene " "initialization." msgstr "" -#: doc/classes/VisibilityEnabler3D.xml:36 +#: doc/classes/VisibilityEnabler3D.xml:37 msgid "If [code]true[/code], [RigidBody3D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler3D.xml:47 +#: doc/classes/VisibilityEnabler3D.xml:48 msgid "This enabler will freeze [RigidBody3D] nodes." msgstr "" #: doc/classes/VisibilityNotifier2D.xml:4 #: doc/classes/VisibilityNotifier3D.xml:4 -msgid "Detects when the node is visible on screen." +msgid "Detects approximately when the node is visible on screen." msgstr "" #: doc/classes/VisibilityNotifier2D.xml:7 msgid "" "The VisibilityNotifier2D detects when it is visible on the screen. It also " "notifies when its bounding rectangle enters or exits the screen or a " -"viewport." +"viewport.\n" +"[b]Note:[/b] For performance reasons, VisibilityNotifier2D uses an " +"approximate heuristic with precision determined by [member ProjectSettings." +"world/2d/cell_size]. If you need exact visibility checking, use another " +"method such as adding an [Area2D] node as a child of a [Camera2D] node." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:16 +#: doc/classes/VisibilityNotifier2D.xml:17 msgid "" "If [code]true[/code], the bounding rectangle is on the screen.\n" "[b]Note:[/b] It takes one frame for the node's visibility to be assessed " @@ -53801,23 +54159,23 @@ msgid "" "pass." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:23 +#: doc/classes/VisibilityNotifier2D.xml:24 msgid "The VisibilityNotifier2D's bounding rectangle." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:29 +#: doc/classes/VisibilityNotifier2D.xml:30 msgid "Emitted when the VisibilityNotifier2D enters the screen." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:34 +#: doc/classes/VisibilityNotifier2D.xml:35 msgid "Emitted when the VisibilityNotifier2D exits the screen." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:41 +#: doc/classes/VisibilityNotifier2D.xml:42 msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:48 +#: doc/classes/VisibilityNotifier2D.xml:49 msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view." msgstr "" @@ -53825,10 +54183,14 @@ msgstr "" msgid "" "The VisibilityNotifier3D detects when it is visible on the screen. It also " "notifies when its bounding rectangle enters or exits the screen or a " -"[Camera3D]'s view." +"[Camera3D]'s view.\n" +"[b]Note:[/b] VisibilityNotifier3D uses an approximate heuristic for " +"performance reasons. It doesn't take walls and other occlusion into account. " +"If you need exact visibility checking, use another method such as adding an " +"[Area3D] node as a child of a [Camera3D] node." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:16 +#: doc/classes/VisibilityNotifier3D.xml:17 msgid "" "If [code]true[/code], the bounding box is on the screen.\n" "[b]Note:[/b] It takes one frame for the node's visibility to be assessed " @@ -53837,23 +54199,23 @@ msgid "" "pass." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:23 +#: doc/classes/VisibilityNotifier3D.xml:24 msgid "The VisibilityNotifier3D's bounding box." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:31 +#: doc/classes/VisibilityNotifier3D.xml:32 msgid "Emitted when the VisibilityNotifier3D enters a [Camera3D]'s view." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:38 +#: doc/classes/VisibilityNotifier3D.xml:39 msgid "Emitted when the VisibilityNotifier3D exits a [Camera3D]'s view." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:43 +#: doc/classes/VisibilityNotifier3D.xml:44 msgid "Emitted when the VisibilityNotifier3D enters the screen." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:48 +#: doc/classes/VisibilityNotifier3D.xml:49 msgid "Emitted when the VisibilityNotifier3D exits the screen." msgstr "" @@ -56445,7 +56807,7 @@ msgstr "" msgid "The background of the area below the grabber." msgstr "" -#: doc/classes/VSlider.xml:33 +#: doc/classes/VSlider.xml:35 msgid "" "The background for the whole slider. Determines the width of the " "[code]grabber_area[/code]." @@ -57427,6 +57789,667 @@ msgstr "" msgid "Unknown node." msgstr "" +#: doc/classes/XRAnchor3D.xml:4 +msgid "An anchor point in AR space." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:7 +msgid "" +"The [XRAnchor3D] point is a spatial node that maps a real world location " +"identified by the AR platform to a position within the game world. For " +"example, as long as plane detection in ARKit is on, ARKit will identify and " +"update the position of planes (tables, floors, etc) and create anchors for " +"them.\n" +"This node is mapped to one of the anchors through its unique ID. When you " +"receive a signal that a new anchor is available, you should add this node to " +"your scene for that anchor. You can predefine nodes and set the ID; the " +"nodes will simply remain on 0,0,0 until a plane is recognized.\n" +"Keep in mind that, as long as plane detection is enabled, the size, placing " +"and orientation of an anchor will be updated as the detection logic learns " +"more about the real world out there especially if only part of the surface " +"is in view." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:18 +msgid "Returns the name given to this anchor." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:25 +msgid "" +"Returns [code]true[/code] if the anchor is being tracked and [code]false[/" +"code] if no anchor with this ID is currently known." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:32 +msgid "" +"If provided by the [XRInterface], this returns a mesh object for the anchor. " +"For an anchor, this can be a shape related to the object being tracked or it " +"can be a mesh that provides topology related to the anchor and can be used " +"to create shadows/reflections on surfaces or for generating collision shapes." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:39 +msgid "" +"Returns a plane aligned with our anchor; handy for intersection testing." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:46 +msgid "" +"Returns the estimated size of the plane that was detected. Say when the " +"anchor relates to a table in the real world, this is the estimated size of " +"the surface of that table." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:52 +msgid "" +"The anchor's ID. You can set this before the anchor itself exists. The first " +"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], " +"etc. When anchors get removed, the engine can then assign the corresponding " +"ID to new anchors. The most common situation where anchors \"disappear\" is " +"when the AR server identifies that two anchors represent different parts of " +"the same plane and merges them." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:60 +msgid "" +"Emitted when the mesh associated with the anchor changes or when one becomes " +"available. This is especially important for topology that is constantly " +"being [code]mesh_updated[/code]." +msgstr "" + +#: doc/classes/XRCamera3D.xml:4 +msgid "" +"A camera node with a few overrules for AR/VR applied, such as location " +"tracking." +msgstr "" + +#: doc/classes/XRCamera3D.xml:7 +msgid "" +"This is a helper spatial node for our camera; note that, if stereoscopic " +"rendering is applicable (VR-HMD), most of the camera properties are ignored, " +"as the HMD information overrides them. The only properties that can be " +"trusted are the near and far planes.\n" +"The position and orientation of this node is automatically updated by the XR " +"Server to represent the location of the HMD if such tracking is available " +"and can thus be used by game logic. Note that, in contrast to the XR " +"Controller, the render thread has access to the most up-to-date tracking " +"data of the HMD and the location of the XRCamera3D can lag a few " +"milliseconds behind what is used for rendering as a result." +msgstr "" + +#: doc/classes/XRCamera3D.xml:11 doc/classes/XRController3D.xml:12 +#: doc/classes/XRInterface.xml:11 doc/classes/XROrigin3D.xml:13 +#: doc/classes/XRPositionalTracker.xml:12 doc/classes/XRServer.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/vr/index.html" +msgstr "" + +#: doc/classes/XRController3D.xml:4 +msgid "A spatial node representing a spatially-tracked controller." +msgstr "" + +#: doc/classes/XRController3D.xml:7 +msgid "" +"This is a helper spatial node that is linked to the tracking of controllers. " +"It also offers several handy passthroughs to the state of buttons and such " +"on the controllers.\n" +"Controllers are linked by their ID. You can create controller nodes before " +"the controllers are available. If your game always uses two controllers (one " +"for each hand), you can predefine the controllers with ID 1 and 2; they will " +"become active as soon as the controllers are identified. If you expect " +"additional controllers to be used, you should react to the signals and add " +"XRController3D nodes to your scene.\n" +"The position of the controller node is automatically updated by the " +"[XRServer]. This makes this node ideal to add child nodes to visualize the " +"controller." +msgstr "" + +#: doc/classes/XRController3D.xml:19 +msgid "" +"If active, returns the name of the associated controller if provided by the " +"AR/VR SDK used." +msgstr "" + +#: doc/classes/XRController3D.xml:26 +msgid "" +"Returns the hand holding this controller, if known. See [enum " +"XRPositionalTracker.TrackerHand]." +msgstr "" + +#: doc/classes/XRController3D.xml:33 +msgid "" +"Returns [code]true[/code] if the bound controller is active. XR systems " +"attempt to track active controllers." +msgstr "" + +#: doc/classes/XRController3D.xml:42 +msgid "" +"Returns the value of the given axis for things like triggers, touchpads, " +"etc. that are embedded into the controller." +msgstr "" + +#: doc/classes/XRController3D.xml:49 +msgid "" +"Returns the ID of the joystick object bound to this. Every controller " +"tracked by the [XRServer] that has buttons and axis will also be registered " +"as a joystick within Godot. This means that all the normal joystick tracking " +"and input mapping will work for buttons and axis found on the AR/VR " +"controllers. This ID is purely offered as information so you can link up the " +"controller with its joystick entry." +msgstr "" + +#: doc/classes/XRController3D.xml:56 +msgid "" +"If provided by the [XRInterface], this returns a mesh associated with the " +"controller. This can be used to visualize the controller." +msgstr "" + +#: doc/classes/XRController3D.xml:65 +msgid "" +"Returns [code]true[/code] if the button at index [code]button[/code] is " +"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " +"constants." +msgstr "" + +#: doc/classes/XRController3D.xml:71 +msgid "" +"The controller's ID.\n" +"A controller ID of 0 is unbound and will always result in an inactive node. " +"Controller ID 1 is reserved for the first controller that identifies itself " +"as the left-hand controller and ID 2 is reserved for the first controller " +"that identifies itself as the right-hand controller.\n" +"For any other controller that the [XRServer] detects, we continue with " +"controller ID 3.\n" +"When a controller is turned off, its slot is freed. This ensures controllers " +"will keep the same ID even when controllers with lower IDs are turned off." +msgstr "" + +#: doc/classes/XRController3D.xml:77 +msgid "" +"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to " +"[code]1.0[/code] with precision [code].01[/code]. If changed, updates " +"[member XRPositionalTracker.rumble] accordingly.\n" +"This is a useful property to animate if you want the controller to vibrate " +"for a limited duration." +msgstr "" + +#: doc/classes/XRController3D.xml:86 +msgid "Emitted when a button on this controller is pressed." +msgstr "" + +#: doc/classes/XRController3D.xml:93 +msgid "Emitted when a button on this controller is released." +msgstr "" + +#: doc/classes/XRController3D.xml:100 +msgid "" +"Emitted when the mesh associated with the controller changes or when one " +"becomes available. Generally speaking this will be a static mesh after " +"becoming available." +msgstr "" + +#: doc/classes/XRInterface.xml:4 +msgid "Base class for an AR/VR interface implementation." +msgstr "" + +#: doc/classes/XRInterface.xml:7 +msgid "" +"This class needs to be implemented to make an AR or VR platform available to " +"Godot and these should be implemented as C++ modules or GDNative modules " +"(note that for GDNative the subclass XRScriptInterface should be used). Part " +"of the interface is exposed to GDScript so you can detect, enable and " +"configure an AR or VR platform.\n" +"Interfaces should be written in such a way that simply enabling them will " +"give us a working setup. You can query the available interfaces through " +"[XRServer]." +msgstr "" + +#: doc/classes/XRInterface.xml:18 +msgid "" +"If this is an AR interface that requires displaying a camera feed as the " +"background, this method returns the feed ID in the [CameraServer] for this " +"interface." +msgstr "" + +#: doc/classes/XRInterface.xml:25 +msgid "" +"Returns a combination of [enum Capabilities] flags providing information " +"about the capabilities of this interface." +msgstr "" + +#: doc/classes/XRInterface.xml:32 +msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." +msgstr "" + +#: doc/classes/XRInterface.xml:39 +msgid "" +"Returns the resolution at which we should render our intermediate results " +"before things like lens distortion are applied by the VR platform." +msgstr "" + +#: doc/classes/XRInterface.xml:46 +msgid "" +"If supported, returns the status of our tracking. This will allow you to " +"provide feedback to the user whether there are issues with positional " +"tracking." +msgstr "" + +#: doc/classes/XRInterface.xml:53 +msgid "" +"Call this to initialize this interface. The first interface that is " +"initialized is identified as the primary interface and it will be used for " +"rendering output.\n" +"After initializing the interface you want to use you then need to enable the " +"AR/VR mode of a viewport and rendering should commence.\n" +"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any " +"device that uses the main output of Godot, such as for mobile VR.\n" +"If you do this for a platform that handles its own output (such as OpenVR) " +"Godot will show just one eye without distortion on screen. Alternatively, " +"you can add a separate viewport node to your scene and enable AR/VR on that " +"viewport. It will be used to output to the HMD, leaving you free to do " +"anything you like in the main window, such as using a separate camera as a " +"spectator camera or rendering something completely different.\n" +"While currently not used, you can activate additional interfaces. You may " +"wish to do this if you want to track controllers from other platforms. " +"However, at this point in time only one interface can render to an HMD." +msgstr "" + +#: doc/classes/XRInterface.xml:64 +msgid "" +"Returns [code]true[/code] if the current output of this interface is in " +"stereo." +msgstr "" + +#: doc/classes/XRInterface.xml:71 +msgid "Turns the interface off." +msgstr "" + +#: doc/classes/XRInterface.xml:77 +msgid "On an AR interface, [code]true[/code] if anchor detection is enabled." +msgstr "" + +#: doc/classes/XRInterface.xml:80 +msgid "[code]true[/code] if this interface been initialized." +msgstr "" + +#: doc/classes/XRInterface.xml:83 +msgid "[code]true[/code] if this is the primary interface." +msgstr "" + +#: doc/classes/XRInterface.xml:88 +msgid "No XR capabilities." +msgstr "" + +#: doc/classes/XRInterface.xml:91 +msgid "" +"This interface can work with normal rendering output (non-HMD based AR)." +msgstr "" + +#: doc/classes/XRInterface.xml:94 +msgid "This interface supports stereoscopic rendering." +msgstr "" + +#: doc/classes/XRInterface.xml:97 +msgid "This interface supports AR (video background and real world tracking)." +msgstr "" + +#: doc/classes/XRInterface.xml:100 +msgid "" +"This interface outputs to an external device. If the main viewport is used, " +"the on screen output is an unmodified buffer of either the left or right eye " +"(stretched if the viewport size is not changed to the same aspect ratio of " +"[method get_render_targetsize]). Using a separate viewport node frees up the " +"main viewport for other purposes." +msgstr "" + +#: doc/classes/XRInterface.xml:103 +msgid "" +"Mono output, this is mostly used internally when retrieving positioning " +"information for our camera node or when stereo scopic rendering is not " +"supported." +msgstr "" + +#: doc/classes/XRInterface.xml:106 +msgid "" +"Left eye output, this is mostly used internally when rendering the image for " +"the left eye and obtaining positioning and projection information." +msgstr "" + +#: doc/classes/XRInterface.xml:109 +msgid "" +"Right eye output, this is mostly used internally when rendering the image " +"for the right eye and obtaining positioning and projection information." +msgstr "" + +#: doc/classes/XRInterface.xml:112 +msgid "Tracking is behaving as expected." +msgstr "" + +#: doc/classes/XRInterface.xml:115 +msgid "" +"Tracking is hindered by excessive motion (the player is moving faster than " +"tracking can keep up)." +msgstr "" + +#: doc/classes/XRInterface.xml:118 +msgid "" +"Tracking is hindered by insufficient features, it's too dark (for camera-" +"based tracking), player is blocked, etc." +msgstr "" + +#: doc/classes/XRInterface.xml:121 +msgid "" +"We don't know the status of the tracking or this interface does not provide " +"feedback." +msgstr "" + +#: doc/classes/XRInterface.xml:124 +msgid "" +"Tracking is not functional (camera not plugged in or obscured, lighthouses " +"turned off, etc.)." +msgstr "" + +#: modules/gdnative/doc_classes/XRInterfaceGDNative.xml:4 +msgid "GDNative wrapper for an XR interface." +msgstr "" + +#: modules/gdnative/doc_classes/XRInterfaceGDNative.xml:7 +msgid "" +"This is a wrapper class for GDNative implementations of the XR interface. To " +"use a GDNative XR interface, simply instantiate this object and set your " +"GDNative library containing the XR interface implementation." +msgstr "" + +#: doc/classes/XROrigin3D.xml:4 +msgid "The origin point in AR/VR." +msgstr "" + +#: doc/classes/XROrigin3D.xml:7 +msgid "" +"This is a special node within the AR/VR system that maps the physical " +"location of the center of our tracking space to the virtual location within " +"our game world.\n" +"There should be only one of these nodes in your scene and you must have one. " +"All the XRCamera3D, XRController3D and XRAnchor3D nodes should be direct " +"children of this node for spatial tracking to work correctly.\n" +"It is the position of this node that you update when your character needs to " +"move through your game world while we're not moving in the real world. " +"Movement in the real world is always in relation to this origin point.\n" +"For example, if your character is driving a car, the XROrigin3D node should " +"be a child node of this car. Or, if you're implementing a teleport system to " +"move your character, you should change the position of this node." +msgstr "" + +#: doc/classes/XROrigin3D.xml:19 +msgid "" +"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.\n" +"[b]Note:[/b] This method is a passthrough to the [XRServer] itself." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:4 +msgid "A tracked object." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:7 +msgid "" +"An instance of this object represents a device that is tracked, such as a " +"controller or anchor point. HMDs aren't represented here as they are handled " +"internally.\n" +"As controllers are turned on and the AR/VR interface detects them, instances " +"of this object are automatically added to this list of active tracking " +"objects accessible through the [XRServer].\n" +"The [XRController3D] and [XRAnchor3D] both consume objects of this type and " +"should be used in your project. The positional trackers are just under-the-" +"hood objects that make this all work. These are mostly exposed so that " +"GDNative-based interfaces can interact with them." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:19 +msgid "" +"Returns the hand holding this tracker, if known. See [enum TrackerHand] " +"constants." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:26 +msgid "" +"If this is a controller that is being tracked, the controller will also be " +"represented by a joystick entry with this ID." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:33 +msgid "" +"Returns the mesh related to a controller or anchor point if one is available." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:40 +msgid "Returns the controller or anchor point's name if available." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:47 +msgid "Returns the controller's orientation matrix." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:54 +msgid "Returns the world-space controller position." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:61 +msgid "" +"Returns the internal tracker ID. This uniquely identifies the tracker per " +"tracker type and matches the ID you need to specify for nodes such as the " +"[XRController3D] and [XRAnchor3D] nodes." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:68 +msgid "Returns [code]true[/code] if this device tracks orientation." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:75 +msgid "Returns [code]true[/code] if this device tracks position." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:84 +msgid "Returns the transform combining this device's orientation and position." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:91 +msgid "Returns the tracker's type." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:97 +msgid "" +"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to " +"[code]1.0[/code] with precision [code].01[/code]." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:102 +msgid "The hand this tracker is held in is unknown or not applicable." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:105 +msgid "This tracker is the left hand controller." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:108 +msgid "This tracker is the right hand controller." +msgstr "" + +#: doc/classes/XRServer.xml:4 +msgid "Server for AR and VR features." +msgstr "" + +#: doc/classes/XRServer.xml:7 +msgid "" +"The AR/VR server is the heart of our Advanced and Virtual Reality solution " +"and handles all the processing." +msgstr "" + +#: doc/classes/XRServer.xml:21 +msgid "" +"This is an important function to understand correctly. AR and VR platforms " +"all handle positioning slightly differently.\n" +"For platforms that do not offer spatial tracking, our origin point (0,0,0) " +"is the location of our HMD, but you have little control over the direction " +"the player is facing in the real world.\n" +"For platforms that do offer spatial tracking, our origin point depends very " +"much on the system. For OpenVR, our origin point is usually the center of " +"the tracking space, on the ground. For other platforms, it's often the " +"location of the tracking camera.\n" +"This method allows you to center your tracker on the location of the HMD. It " +"will take the current location of the HMD and use that to adjust all your " +"tracking data; in essence, realigning the real world to your player's " +"current position in the game world.\n" +"For this method to produce usable results, tracking information must be " +"available. This often takes a few frames after starting your game.\n" +"You should call this method after a few seconds have passed. For instance, " +"when the user requests a realignment of the display holding a designated " +"button on a controller for a short period of time, or when implementing a " +"teleport mechanism." +msgstr "" + +#: doc/classes/XRServer.xml:35 +msgid "" +"Finds an interface by its name. For instance, if your project uses " +"capabilities of an AR/VR platform, you can find the interface for that " +"platform by name and initialize it." +msgstr "" + +#: doc/classes/XRServer.xml:42 +msgid "Returns the primary interface's transformation." +msgstr "" + +#: doc/classes/XRServer.xml:51 +msgid "" +"Returns the interface registered at a given index in our list of interfaces." +msgstr "" + +#: doc/classes/XRServer.xml:58 +msgid "" +"Returns the number of interfaces currently registered with the AR/VR server. " +"If your project supports multiple AR/VR platforms, you can look through the " +"available interface, and either present the user with a selection or simply " +"try to initialize each interface and use the first one that returns " +"[code]true[/code]." +msgstr "" + +#: doc/classes/XRServer.xml:65 +msgid "" +"Returns a list of available interfaces the ID and name of each interface." +msgstr "" + +#: doc/classes/XRServer.xml:72 +msgid "" +"Returns the absolute timestamp (in μs) of the last [XRServer] commit of the " +"AR/VR eyes to [RenderingServer]. The value comes from an internal call to " +"[method OS.get_ticks_usec]." +msgstr "" + +#: doc/classes/XRServer.xml:79 +msgid "" +"Returns the duration (in μs) of the last frame. This is computed as the " +"difference between [method get_last_commit_usec] and [method " +"get_last_process_usec] when committing." +msgstr "" + +#: doc/classes/XRServer.xml:86 +msgid "" +"Returns the absolute timestamp (in μs) of the last [XRServer] process " +"callback. The value comes from an internal call to [method OS." +"get_ticks_usec]." +msgstr "" + +#: doc/classes/XRServer.xml:93 +msgid "" +"Returns the reference frame transform. Mostly used internally and exposed " +"for GDNative build interfaces." +msgstr "" + +#: doc/classes/XRServer.xml:102 +msgid "Returns the positional tracker at the given ID." +msgstr "" + +#: doc/classes/XRServer.xml:109 +msgid "Returns the number of trackers currently registered." +msgstr "" + +#: doc/classes/XRServer.xml:115 +msgid "The primary [XRInterface] currently bound to the [XRServer]." +msgstr "" + +#: doc/classes/XRServer.xml:118 +msgid "" +"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." +msgstr "" + +#: doc/classes/XRServer.xml:126 +msgid "Emitted when a new interface has been added." +msgstr "" + +#: doc/classes/XRServer.xml:133 +msgid "Emitted when an interface is removed." +msgstr "" + +#: doc/classes/XRServer.xml:144 +msgid "" +"Emitted when a new tracker has been added. If you don't use a fixed number " +"of controllers or if you're using [XRAnchor3D]s for an AR solution, it is " +"important to react to this signal to add the appropriate [XRController3D] or " +"[XRAnchor3D] nodes related to this new tracker." +msgstr "" + +#: doc/classes/XRServer.xml:155 +msgid "" +"Emitted when a tracker is removed. You should remove any [XRController3D] or " +"[XRAnchor3D] points if applicable. This is not mandatory, the nodes simply " +"become inactive and will be made active again when a new tracker becomes " +"available (i.e. a new controller is switched on that takes the place of the " +"previous one)." +msgstr "" + +#: doc/classes/XRServer.xml:161 +msgid "The tracker tracks the location of a controller." +msgstr "" + +#: doc/classes/XRServer.xml:164 +msgid "The tracker tracks the location of a base station." +msgstr "" + +#: doc/classes/XRServer.xml:167 +msgid "The tracker tracks the location and size of an AR anchor." +msgstr "" + +#: doc/classes/XRServer.xml:170 +msgid "Used internally to filter trackers of any known type." +msgstr "" + +#: doc/classes/XRServer.xml:173 +msgid "Used internally if we haven't set the tracker type yet." +msgstr "" + +#: doc/classes/XRServer.xml:176 +msgid "Used internally to select all trackers." +msgstr "" + +#: doc/classes/XRServer.xml:179 +msgid "" +"Fully reset the orientation of the HMD. Regardless of what direction the " +"user is looking to in the real world. The user will look dead ahead in the " +"virtual world." +msgstr "" + +#: doc/classes/XRServer.xml:182 +msgid "" +"Resets the orientation but keeps the tilt of the device. So if we're looking " +"down, we keep looking down but heading will be reset." +msgstr "" + +#: doc/classes/XRServer.xml:185 +msgid "" +"Does not reset the orientation of the HMD, only the position of the player " +"gets centered." +msgstr "" + #: doc/classes/YSort.xml:4 msgid "Sort all child nodes based on their Y positions." msgstr "" diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 6926376c05..d39ab5f248 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -9,15 +9,15 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Rémi Verschelde <remi@godotengine.org>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-classes/fr/>\n" "Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" #: doc/tools/makerst.py @@ -490,7 +490,7 @@ msgid "" "[float], the return value is a [float].\n" "If both are of the same vector type ([Vector2], [Vector3] or [Color]), the " "return value will be of the same type ([code]lerp[/code] then calls the " -"vector type's [code]linear_interpolate[/code] method).\n" +"vector type's [code]lerp[/code] method).\n" "[codeblock]\n" "lerp(0, 4, 0.75) # Returns 3.0\n" "lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Returns Vector2(2, 3.5)\n" @@ -1214,19 +1214,19 @@ msgid "" msgstr "" #: doc/classes/@GlobalScope.xml:16 -msgid "The [ARVRServer] singleton." +msgid "The [AudioServer] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:19 -msgid "The [AudioServer] singleton." +msgid "The [CameraServer] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:22 -msgid "The [CameraServer] singleton." +msgid "The [ClassDB] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:25 -msgid "The [ClassDB] singleton." +msgid "The [DisplayServer] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:28 @@ -1238,90 +1238,89 @@ msgid "The [Geometry] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:34 -msgid "" -"The [GodotSharp] singleton. Only available when using Godot's Mono build." +msgid "The [IP] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:37 -msgid "The [IP] singleton." +msgid "The [Input] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:40 -msgid "The [InputFilter] singleton." -msgstr "" - -#: doc/classes/@GlobalScope.xml:43 msgid "The [InputMap] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:46 +#: doc/classes/@GlobalScope.xml:43 msgid "The [JSON] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:49 +#: doc/classes/@GlobalScope.xml:46 msgid "" "The [JavaClassWrapper] singleton.\n" "[b]Note:[/b] Only implemented on Android." msgstr "" -#: doc/classes/@GlobalScope.xml:53 +#: doc/classes/@GlobalScope.xml:50 msgid "" "The [JavaScript] singleton.\n" "[b]Note:[/b] Only implemented on HTML5." msgstr "" -#: doc/classes/@GlobalScope.xml:57 +#: doc/classes/@GlobalScope.xml:54 msgid "The [Marshalls] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:60 +#: doc/classes/@GlobalScope.xml:57 msgid "The [NavigationMeshGenerator] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:63 doc/classes/@GlobalScope.xml:66 +#: doc/classes/@GlobalScope.xml:60 doc/classes/@GlobalScope.xml:63 msgid "The [NavigationServer2D] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:69 +#: doc/classes/@GlobalScope.xml:66 msgid "The [OS] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:72 +#: doc/classes/@GlobalScope.xml:69 msgid "The [Performance] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:75 +#: doc/classes/@GlobalScope.xml:72 msgid "The [PhysicsServer2D] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:78 +#: doc/classes/@GlobalScope.xml:75 msgid "The [PhysicsServer3D] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:81 +#: doc/classes/@GlobalScope.xml:78 msgid "The [ProjectSettings] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:84 +#: doc/classes/@GlobalScope.xml:81 msgid "The [RenderingServer] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:87 +#: doc/classes/@GlobalScope.xml:84 msgid "The [ResourceLoader] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:90 +#: doc/classes/@GlobalScope.xml:87 msgid "The [ResourceSaver] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:93 +#: doc/classes/@GlobalScope.xml:90 msgid "The [TranslationServer] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:96 +#: doc/classes/@GlobalScope.xml:93 msgid "The [VisualScriptEditor] singleton." msgstr "" +#: doc/classes/@GlobalScope.xml:96 +msgid "The [XRServer] singleton." +msgstr "" + #: doc/classes/@GlobalScope.xml:101 msgid "Left margin, usually used for [Control] or [StyleBox]-derived classes." msgstr "" @@ -1404,7 +1403,7 @@ msgid "Tab key." msgstr "" #: doc/classes/@GlobalScope.xml:158 -msgid "Shift+Tab key." +msgid "Shift + Tab key." msgstr "" #: doc/classes/@GlobalScope.xml:161 @@ -3134,305 +3133,311 @@ msgid "Used to categorize properties together in the editor." msgstr "" #: doc/classes/@GlobalScope.xml:1424 -msgid "The property does not save its state in [PackedScene]." +msgid "" +"Used to group properties together in the editor in a subgroup (under a " +"group)." msgstr "" #: doc/classes/@GlobalScope.xml:1427 -msgid "Editing the property prompts the user for restarting the editor." +msgid "The property does not save its state in [PackedScene]." msgstr "" #: doc/classes/@GlobalScope.xml:1430 +msgid "Editing the property prompts the user for restarting the editor." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1433 msgid "" "The property is a script variable which should be serialized and saved in " "the scene file." msgstr "" -#: doc/classes/@GlobalScope.xml:1433 +#: doc/classes/@GlobalScope.xml:1436 msgid "Default usage (storage, editor and network)." msgstr "" -#: doc/classes/@GlobalScope.xml:1436 +#: doc/classes/@GlobalScope.xml:1439 msgid "" "Default usage for translatable strings (storage, editor, network and " "internationalized)." msgstr "" -#: doc/classes/@GlobalScope.xml:1439 +#: doc/classes/@GlobalScope.xml:1442 msgid "" "Default usage but without showing the property in the editor (storage, " "network)." msgstr "" -#: doc/classes/@GlobalScope.xml:1442 +#: doc/classes/@GlobalScope.xml:1445 msgid "Flag for a normal method." msgstr "" -#: doc/classes/@GlobalScope.xml:1445 +#: doc/classes/@GlobalScope.xml:1448 msgid "Flag for an editor method." msgstr "" -#: doc/classes/@GlobalScope.xml:1448 doc/classes/@GlobalScope.xml:1454 -#: doc/classes/@GlobalScope.xml:1460 +#: doc/classes/@GlobalScope.xml:1451 doc/classes/@GlobalScope.xml:1457 +#: doc/classes/@GlobalScope.xml:1463 msgid "Deprecated method flag, unused." msgstr "" -#: doc/classes/@GlobalScope.xml:1451 +#: doc/classes/@GlobalScope.xml:1454 msgid "Flag for a constant method." msgstr "" -#: doc/classes/@GlobalScope.xml:1457 +#: doc/classes/@GlobalScope.xml:1460 msgid "Flag for a virtual method." msgstr "" -#: doc/classes/@GlobalScope.xml:1463 +#: doc/classes/@GlobalScope.xml:1466 msgid "Default method flags." msgstr "" -#: doc/classes/@GlobalScope.xml:1466 +#: doc/classes/@GlobalScope.xml:1469 msgid "Variable is [code]null[/code]." msgstr "" -#: doc/classes/@GlobalScope.xml:1469 +#: doc/classes/@GlobalScope.xml:1472 msgid "Variable is of type [bool]." msgstr "" -#: doc/classes/@GlobalScope.xml:1472 +#: doc/classes/@GlobalScope.xml:1475 msgid "Variable is of type [int]." msgstr "" -#: doc/classes/@GlobalScope.xml:1475 +#: doc/classes/@GlobalScope.xml:1478 msgid "Variable is of type [float] (real)." msgstr "" -#: doc/classes/@GlobalScope.xml:1478 +#: doc/classes/@GlobalScope.xml:1481 msgid "Variable is of type [String]." msgstr "" -#: doc/classes/@GlobalScope.xml:1481 +#: doc/classes/@GlobalScope.xml:1484 msgid "Variable is of type [Vector2]." msgstr "" -#: doc/classes/@GlobalScope.xml:1484 +#: doc/classes/@GlobalScope.xml:1487 msgid "Variable is of type [Vector2i]." msgstr "" -#: doc/classes/@GlobalScope.xml:1487 +#: doc/classes/@GlobalScope.xml:1490 msgid "Variable is of type [Rect2]." msgstr "" -#: doc/classes/@GlobalScope.xml:1490 +#: doc/classes/@GlobalScope.xml:1493 msgid "Variable is of type [Rect2i]." msgstr "" -#: doc/classes/@GlobalScope.xml:1493 +#: doc/classes/@GlobalScope.xml:1496 msgid "Variable is of type [Vector3]." msgstr "" -#: doc/classes/@GlobalScope.xml:1496 +#: doc/classes/@GlobalScope.xml:1499 msgid "Variable is of type [Vector3i]." msgstr "" -#: doc/classes/@GlobalScope.xml:1499 +#: doc/classes/@GlobalScope.xml:1502 msgid "Variable is of type [Transform2D]." msgstr "" -#: doc/classes/@GlobalScope.xml:1502 +#: doc/classes/@GlobalScope.xml:1505 msgid "Variable is of type [Plane]." msgstr "" -#: doc/classes/@GlobalScope.xml:1505 +#: doc/classes/@GlobalScope.xml:1508 msgid "Variable is of type [Quat]." msgstr "" -#: doc/classes/@GlobalScope.xml:1508 +#: doc/classes/@GlobalScope.xml:1511 msgid "Variable is of type [AABB]." msgstr "" -#: doc/classes/@GlobalScope.xml:1511 +#: doc/classes/@GlobalScope.xml:1514 msgid "Variable is of type [Basis]." msgstr "" -#: doc/classes/@GlobalScope.xml:1514 +#: doc/classes/@GlobalScope.xml:1517 msgid "Variable is of type [Transform]." msgstr "" -#: doc/classes/@GlobalScope.xml:1517 +#: doc/classes/@GlobalScope.xml:1520 msgid "Variable is of type [Color]." msgstr "" -#: doc/classes/@GlobalScope.xml:1520 +#: doc/classes/@GlobalScope.xml:1523 msgid "Variable is of type [StringName]." msgstr "" -#: doc/classes/@GlobalScope.xml:1523 +#: doc/classes/@GlobalScope.xml:1526 msgid "Variable is of type [NodePath]." msgstr "" -#: doc/classes/@GlobalScope.xml:1526 +#: doc/classes/@GlobalScope.xml:1529 msgid "Variable is of type [RID]." msgstr "" -#: doc/classes/@GlobalScope.xml:1529 +#: doc/classes/@GlobalScope.xml:1532 msgid "Variable is of type [Object]." msgstr "" -#: doc/classes/@GlobalScope.xml:1532 +#: doc/classes/@GlobalScope.xml:1535 msgid "Variable is of type [Callable]." msgstr "" -#: doc/classes/@GlobalScope.xml:1535 +#: doc/classes/@GlobalScope.xml:1538 msgid "Variable is of type [Signal]." msgstr "" -#: doc/classes/@GlobalScope.xml:1538 +#: doc/classes/@GlobalScope.xml:1541 msgid "Variable is of type [Dictionary]." msgstr "" -#: doc/classes/@GlobalScope.xml:1541 +#: doc/classes/@GlobalScope.xml:1544 msgid "Variable is of type [Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1544 +#: doc/classes/@GlobalScope.xml:1547 msgid "Variable is of type [PackedByteArray]." msgstr "" -#: doc/classes/@GlobalScope.xml:1547 +#: doc/classes/@GlobalScope.xml:1550 msgid "Variable is of type [PackedInt32Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1550 +#: doc/classes/@GlobalScope.xml:1553 msgid "Variable is of type [PackedInt64Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1553 +#: doc/classes/@GlobalScope.xml:1556 msgid "Variable is of type [PackedFloat32Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1556 +#: doc/classes/@GlobalScope.xml:1559 msgid "Variable is of type [PackedFloat64Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1559 +#: doc/classes/@GlobalScope.xml:1562 msgid "Variable is of type [PackedStringArray]." msgstr "" -#: doc/classes/@GlobalScope.xml:1562 +#: doc/classes/@GlobalScope.xml:1565 msgid "Variable is of type [PackedVector2Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1565 +#: doc/classes/@GlobalScope.xml:1568 msgid "Variable is of type [PackedVector3Array]." msgstr "" -#: doc/classes/@GlobalScope.xml:1568 +#: doc/classes/@GlobalScope.xml:1571 msgid "Variable is of type [PackedColorArray]." msgstr "" -#: doc/classes/@GlobalScope.xml:1571 +#: doc/classes/@GlobalScope.xml:1574 msgid "Represents the size of the [enum Variant.Type] enum." msgstr "" -#: doc/classes/@GlobalScope.xml:1574 +#: doc/classes/@GlobalScope.xml:1577 msgid "Equality operator ([code]==[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1577 +#: doc/classes/@GlobalScope.xml:1580 msgid "Inequality operator ([code]!=[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1580 +#: doc/classes/@GlobalScope.xml:1583 msgid "Less than operator ([code]<[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1583 +#: doc/classes/@GlobalScope.xml:1586 msgid "Less than or equal operator ([code]<=[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1586 +#: doc/classes/@GlobalScope.xml:1589 msgid "Greater than operator ([code]>[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1589 +#: doc/classes/@GlobalScope.xml:1592 msgid "Greater than or equal operator ([code]>=[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1592 +#: doc/classes/@GlobalScope.xml:1595 msgid "Addition operator ([code]+[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1595 +#: doc/classes/@GlobalScope.xml:1598 msgid "Subtraction operator ([code]-[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1598 +#: doc/classes/@GlobalScope.xml:1601 msgid "Multiplication operator ([code]*[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1601 +#: doc/classes/@GlobalScope.xml:1604 msgid "Division operator ([code]/[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1604 +#: doc/classes/@GlobalScope.xml:1607 msgid "Unary negation operator ([code]-[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1607 +#: doc/classes/@GlobalScope.xml:1610 msgid "Unary plus operator ([code]+[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1610 +#: doc/classes/@GlobalScope.xml:1613 msgid "Remainder/modulo operator ([code]%[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1613 +#: doc/classes/@GlobalScope.xml:1616 msgid "String concatenation operator ([code]+[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1616 +#: doc/classes/@GlobalScope.xml:1619 msgid "Left shift operator ([code]<<[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1619 +#: doc/classes/@GlobalScope.xml:1622 msgid "Right shift operator ([code]>>[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1622 +#: doc/classes/@GlobalScope.xml:1625 msgid "Bitwise AND operator ([code]&[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1625 +#: doc/classes/@GlobalScope.xml:1628 msgid "Bitwise OR operator ([code]|[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1628 +#: doc/classes/@GlobalScope.xml:1631 msgid "Bitwise XOR operator ([code]^[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1631 +#: doc/classes/@GlobalScope.xml:1634 msgid "Bitwise NOT operator ([code]~[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1634 +#: doc/classes/@GlobalScope.xml:1637 msgid "Logical AND operator ([code]and[/code] or [code]&&[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1637 +#: doc/classes/@GlobalScope.xml:1640 msgid "Logical OR operator ([code]or[/code] or [code]||[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1640 +#: doc/classes/@GlobalScope.xml:1643 msgid "Logical XOR operator (not implemented in GDScript)." msgstr "" -#: doc/classes/@GlobalScope.xml:1643 +#: doc/classes/@GlobalScope.xml:1646 msgid "Logical NOT operator ([code]not[/code] or [code]![/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1646 +#: doc/classes/@GlobalScope.xml:1649 msgid "Logical IN operator ([code]in[/code])." msgstr "" -#: doc/classes/@GlobalScope.xml:1649 +#: doc/classes/@GlobalScope.xml:1652 msgid "Represents the size of the [enum Variant.Operator] enum." msgstr "" @@ -3804,6 +3809,10 @@ msgid "" msgstr "" #: doc/classes/AnimatedTexture.xml:65 +msgid "Sets the currently visible frame of the texture." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:68 msgid "" "Animation speed in frames per second. This value defines the default time " "interval between two frames of the animation, and thus the overall duration " @@ -3814,7 +3823,7 @@ msgid "" "code] value of 2 will run for 4 seconds, with each frame lasting 0.5 seconds." msgstr "" -#: doc/classes/AnimatedTexture.xml:69 +#: doc/classes/AnimatedTexture.xml:72 msgid "" "Number of frames to use in the animation. While you can create the frames " "independently with [method set_frame_texture], you need to set this value " @@ -3822,7 +3831,21 @@ msgid "" "frames is [constant MAX_FRAMES]." msgstr "" -#: doc/classes/AnimatedTexture.xml:74 +#: doc/classes/AnimatedTexture.xml:75 +msgid "" +"If [code]true[/code], the animation will only play once and will not loop " +"back to the first frame after reaching the end. Note that reaching the end " +"will not set [member pause] to [code]true[/code]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:78 +msgid "" +"If [code]true[/code], the animation will pause where it currently is (i.e. " +"at [member current_frame]). The animation will continue from where it was " +"paused when changing this property to [code]false[/code]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:83 msgid "" "The maximum number of frames supported by [AnimatedTexture]. If you need " "more frames in your animation, use [AnimationPlayer] or [AnimatedSprite2D]." @@ -6102,22 +6125,27 @@ msgid "" "var m = MeshInstance3D.new()\n" "m.mesh = arr_mesh\n" "[/codeblock]\n" -"The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown." +"The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown.\n" +"See also [ImmediateGeometry3D], [MeshDataTool] and [SurfaceTool] for " +"procedural geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." msgstr "" -#: doc/classes/ArrayMesh.xml:27 +#: doc/classes/ArrayMesh.xml:29 msgid "" "https://docs.godotengine.org/en/latest/tutorials/content/procedural_geometry/" "arraymesh.html" msgstr "" -#: doc/classes/ArrayMesh.xml:36 +#: doc/classes/ArrayMesh.xml:38 msgid "" "Adds name for a blend shape that will be added with [method " "add_surface_from_arrays]. Must be called before surface is added." msgstr "" -#: doc/classes/ArrayMesh.xml:55 +#: doc/classes/ArrayMesh.xml:57 msgid "" "Creates a new surface.\n" "Surfaces are created to be rendered using a [code]primitive[/code], which " @@ -6135,141 +6163,139 @@ msgid "" "it is used.\n" "Adding an index array puts this function into \"index mode\" where the " "vertex and other arrays become the sources of data, and the index array " -"defines the order of the vertices.\n" -"Godot uses clockwise winding order for front faces of triangle primitive " -"modes." +"defines the order of the vertices." msgstr "" -#: doc/classes/ArrayMesh.xml:66 +#: doc/classes/ArrayMesh.xml:67 msgid "Removes all blend shapes from this [ArrayMesh]." msgstr "" -#: doc/classes/ArrayMesh.xml:73 +#: doc/classes/ArrayMesh.xml:74 msgid "Removes all surfaces from this [ArrayMesh]." msgstr "" -#: doc/classes/ArrayMesh.xml:80 +#: doc/classes/ArrayMesh.xml:81 msgid "Returns the number of blend shapes that the [ArrayMesh] holds." msgstr "" -#: doc/classes/ArrayMesh.xml:89 +#: doc/classes/ArrayMesh.xml:90 msgid "Returns the name of the blend shape at this index." msgstr "" -#: doc/classes/ArrayMesh.xml:100 +#: doc/classes/ArrayMesh.xml:101 msgid "" "Will perform a UV unwrap on the [ArrayMesh] to prepare the mesh for " "lightmapping." msgstr "" -#: doc/classes/ArrayMesh.xml:107 +#: doc/classes/ArrayMesh.xml:108 msgid "Will regenerate normal maps for the [ArrayMesh]." msgstr "" -#: doc/classes/ArrayMesh.xml:116 +#: doc/classes/ArrayMesh.xml:117 msgid "" "Returns the index of the first surface with this name held within this " "[ArrayMesh]. If none are found, -1 is returned." msgstr "" -#: doc/classes/ArrayMesh.xml:125 +#: doc/classes/ArrayMesh.xml:126 msgid "" "Returns the length in indices of the index array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" -#: doc/classes/ArrayMesh.xml:134 +#: doc/classes/ArrayMesh.xml:135 msgid "" "Returns the length in vertices of the vertex array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" -#: doc/classes/ArrayMesh.xml:143 +#: doc/classes/ArrayMesh.xml:144 msgid "" "Returns the format mask of the requested surface (see [method " "add_surface_from_arrays])." msgstr "" -#: doc/classes/ArrayMesh.xml:152 +#: doc/classes/ArrayMesh.xml:153 msgid "Gets the name assigned to this surface." msgstr "" -#: doc/classes/ArrayMesh.xml:161 +#: doc/classes/ArrayMesh.xml:162 msgid "" "Returns the primitive type of the requested surface (see [method " "add_surface_from_arrays])." msgstr "" -#: doc/classes/ArrayMesh.xml:172 +#: doc/classes/ArrayMesh.xml:173 msgid "Sets a name for a given surface." msgstr "" -#: doc/classes/ArrayMesh.xml:185 +#: doc/classes/ArrayMesh.xml:186 msgid "" "Updates a specified region of mesh arrays on the GPU.\n" "[b]Warning:[/b] Only use if you know what you are doing. You can easily " "cause crashes by calling this function with improper arguments." msgstr "" -#: doc/classes/ArrayMesh.xml:192 +#: doc/classes/ArrayMesh.xml:193 msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]." msgstr "" -#: doc/classes/ArrayMesh.xml:195 +#: doc/classes/ArrayMesh.xml:196 msgid "" "Overrides the [AABB] with one defined by user for use with frustum culling. " "Especially useful to avoid unexpected culling when using a shader to offset " "vertices." msgstr "" -#: doc/classes/ArrayMesh.xml:200 +#: doc/classes/ArrayMesh.xml:201 msgid "Default value used for index_array_len when no indices are present." msgstr "" -#: doc/classes/ArrayMesh.xml:203 +#: doc/classes/ArrayMesh.xml:204 msgid "Amount of weights/bone indices per vertex (always 4)." msgstr "" -#: doc/classes/ArrayMesh.xml:206 +#: doc/classes/ArrayMesh.xml:207 msgid "" "[PackedVector3Array], [PackedVector2Array], or [Array] of vertex positions." msgstr "" -#: doc/classes/ArrayMesh.xml:209 +#: doc/classes/ArrayMesh.xml:210 msgid "[PackedVector3Array] of vertex normals." msgstr "" -#: doc/classes/ArrayMesh.xml:212 +#: doc/classes/ArrayMesh.xml:213 msgid "" "[PackedFloat32Array] of vertex tangents. Each element in groups of 4 floats, " "first 3 floats determine the tangent, and the last the binormal direction as " "-1 or 1." msgstr "" -#: doc/classes/ArrayMesh.xml:215 +#: doc/classes/ArrayMesh.xml:216 msgid "[PackedColorArray] of vertex colors." msgstr "" -#: doc/classes/ArrayMesh.xml:218 +#: doc/classes/ArrayMesh.xml:219 msgid "[PackedVector2Array] for UV coordinates." msgstr "" -#: doc/classes/ArrayMesh.xml:221 +#: doc/classes/ArrayMesh.xml:222 msgid "[PackedVector2Array] for second UV coordinates." msgstr "" -#: doc/classes/ArrayMesh.xml:224 +#: doc/classes/ArrayMesh.xml:225 msgid "" "[PackedFloat32Array] or [PackedInt32Array] of bone indices. Each element in " "groups of 4 floats." msgstr "" -#: doc/classes/ArrayMesh.xml:227 +#: doc/classes/ArrayMesh.xml:228 msgid "" "[PackedFloat32Array] of bone weights. Each element in groups of 4 floats." msgstr "" -#: doc/classes/ArrayMesh.xml:230 +#: doc/classes/ArrayMesh.xml:231 msgid "" "[PackedInt32Array] of integers used as indices referencing vertices, colors, " "normals, tangents, and textures. All of those arrays must have the same " @@ -6283,709 +6309,47 @@ msgid "" "the start and end of each line." msgstr "" -#: doc/classes/ArrayMesh.xml:234 doc/classes/Mesh.xml:210 -#: doc/classes/RenderingServer.xml:3180 +#: doc/classes/ArrayMesh.xml:235 doc/classes/Mesh.xml:210 +#: doc/classes/RenderingServer.xml:3232 msgid "Represents the size of the [enum ArrayType] enum." msgstr "" -#: doc/classes/ArrayMesh.xml:237 +#: doc/classes/ArrayMesh.xml:238 msgid "Array format will include vertices (mandatory)." msgstr "" -#: doc/classes/ArrayMesh.xml:240 +#: doc/classes/ArrayMesh.xml:241 msgid "Array format will include normals." msgstr "" -#: doc/classes/ArrayMesh.xml:243 +#: doc/classes/ArrayMesh.xml:244 msgid "Array format will include tangents." msgstr "" -#: doc/classes/ArrayMesh.xml:246 +#: doc/classes/ArrayMesh.xml:247 msgid "Array format will include a color array." msgstr "" -#: doc/classes/ArrayMesh.xml:249 +#: doc/classes/ArrayMesh.xml:250 msgid "Array format will include UVs." msgstr "" -#: doc/classes/ArrayMesh.xml:252 +#: doc/classes/ArrayMesh.xml:253 msgid "Array format will include another set of UVs." msgstr "" -#: doc/classes/ArrayMesh.xml:255 +#: doc/classes/ArrayMesh.xml:256 msgid "Array format will include bone indices." msgstr "" -#: doc/classes/ArrayMesh.xml:258 +#: doc/classes/ArrayMesh.xml:259 msgid "Array format will include bone weights." msgstr "" -#: doc/classes/ArrayMesh.xml:261 +#: doc/classes/ArrayMesh.xml:262 msgid "Index array will be used." msgstr "" -#: doc/classes/ARVRAnchor.xml:4 -msgid "An anchor point in AR space." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:7 -msgid "" -"The [ARVRAnchor] point is a spatial node that maps a real world location " -"identified by the AR platform to a position within the game world. For " -"example, as long as plane detection in ARKit is on, ARKit will identify and " -"update the position of planes (tables, floors, etc) and create anchors for " -"them.\n" -"This node is mapped to one of the anchors through its unique ID. When you " -"receive a signal that a new anchor is available, you should add this node to " -"your scene for that anchor. You can predefine nodes and set the ID; the " -"nodes will simply remain on 0,0,0 until a plane is recognized.\n" -"Keep in mind that, as long as plane detection is enabled, the size, placing " -"and orientation of an anchor will be updated as the detection logic learns " -"more about the real world out there especially if only part of the surface " -"is in view." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:18 -msgid "Returns the name given to this anchor." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:25 -msgid "" -"Returns [code]true[/code] if the anchor is being tracked and [code]false[/" -"code] if no anchor with this ID is currently known." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:32 -msgid "" -"If provided by the [ARVRInterface], this returns a mesh object for the " -"anchor. For an anchor, this can be a shape related to the object being " -"tracked or it can be a mesh that provides topology related to the anchor and " -"can be used to create shadows/reflections on surfaces or for generating " -"collision shapes." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:39 -msgid "" -"Returns a plane aligned with our anchor; handy for intersection testing." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:46 -msgid "" -"Returns the estimated size of the plane that was detected. Say when the " -"anchor relates to a table in the real world, this is the estimated size of " -"the surface of that table." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:52 -msgid "" -"The anchor's ID. You can set this before the anchor itself exists. The first " -"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], " -"etc. When anchors get removed, the engine can then assign the corresponding " -"ID to new anchors. The most common situation where anchors \"disappear\" is " -"when the AR server identifies that two anchors represent different parts of " -"the same plane and merges them." -msgstr "" - -#: doc/classes/ARVRAnchor.xml:60 -msgid "" -"Emitted when the mesh associated with the anchor changes or when one becomes " -"available. This is especially important for topology that is constantly " -"being [code]mesh_updated[/code]." -msgstr "" - -#: doc/classes/ARVRCamera.xml:4 -msgid "" -"A camera node with a few overrules for AR/VR applied, such as location " -"tracking." -msgstr "" - -#: doc/classes/ARVRCamera.xml:7 -msgid "" -"This is a helper spatial node for our camera; note that, if stereoscopic " -"rendering is applicable (VR-HMD), most of the camera properties are ignored, " -"as the HMD information overrides them. The only properties that can be " -"trusted are the near and far planes.\n" -"The position and orientation of this node is automatically updated by the " -"ARVR Server to represent the location of the HMD if such tracking is " -"available and can thus be used by game logic. Note that, in contrast to the " -"ARVR Controller, the render thread has access to the most up-to-date " -"tracking data of the HMD and the location of the ARVRCamera can lag a few " -"milliseconds behind what is used for rendering as a result." -msgstr "" - -#: doc/classes/ARVRCamera.xml:11 doc/classes/ARVRController.xml:12 -#: doc/classes/ARVRInterface.xml:11 doc/classes/ARVROrigin.xml:13 -#: doc/classes/ARVRPositionalTracker.xml:12 doc/classes/ARVRServer.xml:10 -msgid "https://docs.godotengine.org/en/latest/tutorials/vr/index.html" -msgstr "" - -#: doc/classes/ARVRController.xml:4 -msgid "A spatial node representing a spatially-tracked controller." -msgstr "" - -#: doc/classes/ARVRController.xml:7 -msgid "" -"This is a helper spatial node that is linked to the tracking of controllers. " -"It also offers several handy passthroughs to the state of buttons and such " -"on the controllers.\n" -"Controllers are linked by their ID. You can create controller nodes before " -"the controllers are available. If your game always uses two controllers (one " -"for each hand), you can predefine the controllers with ID 1 and 2; they will " -"become active as soon as the controllers are identified. If you expect " -"additional controllers to be used, you should react to the signals and add " -"ARVRController nodes to your scene.\n" -"The position of the controller node is automatically updated by the " -"[ARVRServer]. This makes this node ideal to add child nodes to visualize the " -"controller." -msgstr "" - -#: doc/classes/ARVRController.xml:19 -msgid "" -"If active, returns the name of the associated controller if provided by the " -"AR/VR SDK used." -msgstr "" - -#: doc/classes/ARVRController.xml:26 -msgid "" -"Returns the hand holding this controller, if known. See [enum " -"ARVRPositionalTracker.TrackerHand]." -msgstr "" - -#: doc/classes/ARVRController.xml:33 -msgid "" -"Returns [code]true[/code] if the bound controller is active. ARVR systems " -"attempt to track active controllers." -msgstr "" - -#: doc/classes/ARVRController.xml:42 -msgid "" -"Returns the value of the given axis for things like triggers, touchpads, " -"etc. that are embedded into the controller." -msgstr "" - -#: doc/classes/ARVRController.xml:49 -msgid "" -"Returns the ID of the joystick object bound to this. Every controller " -"tracked by the [ARVRServer] that has buttons and axis will also be " -"registered as a joystick within Godot. This means that all the normal " -"joystick tracking and input mapping will work for buttons and axis found on " -"the AR/VR controllers. This ID is purely offered as information so you can " -"link up the controller with its joystick entry." -msgstr "" - -#: doc/classes/ARVRController.xml:56 -msgid "" -"If provided by the [ARVRInterface], this returns a mesh associated with the " -"controller. This can be used to visualize the controller." -msgstr "" - -#: doc/classes/ARVRController.xml:65 -msgid "" -"Returns [code]true[/code] if the button at index [code]button[/code] is " -"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " -"constants." -msgstr "" - -#: doc/classes/ARVRController.xml:71 -msgid "" -"The controller's ID.\n" -"A controller ID of 0 is unbound and will always result in an inactive node. " -"Controller ID 1 is reserved for the first controller that identifies itself " -"as the left-hand controller and ID 2 is reserved for the first controller " -"that identifies itself as the right-hand controller.\n" -"For any other controller that the [ARVRServer] detects, we continue with " -"controller ID 3.\n" -"When a controller is turned off, its slot is freed. This ensures controllers " -"will keep the same ID even when controllers with lower IDs are turned off." -msgstr "" - -#: doc/classes/ARVRController.xml:77 -msgid "" -"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to " -"[code]1.0[/code] with precision [code].01[/code]. If changed, updates " -"[member ARVRPositionalTracker.rumble] accordingly.\n" -"This is a useful property to animate if you want the controller to vibrate " -"for a limited duration." -msgstr "" - -#: doc/classes/ARVRController.xml:86 -msgid "Emitted when a button on this controller is pressed." -msgstr "" - -#: doc/classes/ARVRController.xml:93 -msgid "Emitted when a button on this controller is released." -msgstr "" - -#: doc/classes/ARVRController.xml:100 -msgid "" -"Emitted when the mesh associated with the controller changes or when one " -"becomes available. Generally speaking this will be a static mesh after " -"becoming available." -msgstr "" - -#: doc/classes/ARVRInterface.xml:4 -msgid "Base class for an AR/VR interface implementation." -msgstr "" - -#: doc/classes/ARVRInterface.xml:7 -msgid "" -"This class needs to be implemented to make an AR or VR platform available to " -"Godot and these should be implemented as C++ modules or GDNative modules " -"(note that for GDNative the subclass ARVRScriptInterface should be used). " -"Part of the interface is exposed to GDScript so you can detect, enable and " -"configure an AR or VR platform.\n" -"Interfaces should be written in such a way that simply enabling them will " -"give us a working setup. You can query the available interfaces through " -"[ARVRServer]." -msgstr "" - -#: doc/classes/ARVRInterface.xml:18 -msgid "" -"If this is an AR interface that requires displaying a camera feed as the " -"background, this method returns the feed ID in the [CameraServer] for this " -"interface." -msgstr "" - -#: doc/classes/ARVRInterface.xml:25 -msgid "" -"Returns a combination of [enum Capabilities] flags providing information " -"about the capabilities of this interface." -msgstr "" - -#: doc/classes/ARVRInterface.xml:32 -msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." -msgstr "" - -#: doc/classes/ARVRInterface.xml:39 -msgid "" -"Returns the resolution at which we should render our intermediate results " -"before things like lens distortion are applied by the VR platform." -msgstr "" - -#: doc/classes/ARVRInterface.xml:46 -msgid "" -"If supported, returns the status of our tracking. This will allow you to " -"provide feedback to the user whether there are issues with positional " -"tracking." -msgstr "" - -#: doc/classes/ARVRInterface.xml:53 -msgid "" -"Call this to initialize this interface. The first interface that is " -"initialized is identified as the primary interface and it will be used for " -"rendering output.\n" -"After initializing the interface you want to use you then need to enable the " -"AR/VR mode of a viewport and rendering should commence.\n" -"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any " -"device that uses the main output of Godot, such as for mobile VR.\n" -"If you do this for a platform that handles its own output (such as OpenVR) " -"Godot will show just one eye without distortion on screen. Alternatively, " -"you can add a separate viewport node to your scene and enable AR/VR on that " -"viewport. It will be used to output to the HMD, leaving you free to do " -"anything you like in the main window, such as using a separate camera as a " -"spectator camera or rendering something completely different.\n" -"While currently not used, you can activate additional interfaces. You may " -"wish to do this if you want to track controllers from other platforms. " -"However, at this point in time only one interface can render to an HMD." -msgstr "" - -#: doc/classes/ARVRInterface.xml:64 -msgid "" -"Returns [code]true[/code] if the current output of this interface is in " -"stereo." -msgstr "" - -#: doc/classes/ARVRInterface.xml:71 -msgid "Turns the interface off." -msgstr "" - -#: doc/classes/ARVRInterface.xml:77 -msgid "On an AR interface, [code]true[/code] if anchor detection is enabled." -msgstr "" - -#: doc/classes/ARVRInterface.xml:80 -msgid "[code]true[/code] if this interface been initialized." -msgstr "" - -#: doc/classes/ARVRInterface.xml:83 -msgid "[code]true[/code] if this is the primary interface." -msgstr "" - -#: doc/classes/ARVRInterface.xml:88 -msgid "No ARVR capabilities." -msgstr "" - -#: doc/classes/ARVRInterface.xml:91 -msgid "" -"This interface can work with normal rendering output (non-HMD based AR)." -msgstr "" - -#: doc/classes/ARVRInterface.xml:94 -msgid "This interface supports stereoscopic rendering." -msgstr "" - -#: doc/classes/ARVRInterface.xml:97 -msgid "This interface supports AR (video background and real world tracking)." -msgstr "" - -#: doc/classes/ARVRInterface.xml:100 -msgid "" -"This interface outputs to an external device. If the main viewport is used, " -"the on screen output is an unmodified buffer of either the left or right eye " -"(stretched if the viewport size is not changed to the same aspect ratio of " -"[method get_render_targetsize]). Using a separate viewport node frees up the " -"main viewport for other purposes." -msgstr "" - -#: doc/classes/ARVRInterface.xml:103 -msgid "" -"Mono output, this is mostly used internally when retrieving positioning " -"information for our camera node or when stereo scopic rendering is not " -"supported." -msgstr "" - -#: doc/classes/ARVRInterface.xml:106 -msgid "" -"Left eye output, this is mostly used internally when rendering the image for " -"the left eye and obtaining positioning and projection information." -msgstr "" - -#: doc/classes/ARVRInterface.xml:109 -msgid "" -"Right eye output, this is mostly used internally when rendering the image " -"for the right eye and obtaining positioning and projection information." -msgstr "" - -#: doc/classes/ARVRInterface.xml:112 -msgid "Tracking is behaving as expected." -msgstr "" - -#: doc/classes/ARVRInterface.xml:115 -msgid "" -"Tracking is hindered by excessive motion (the player is moving faster than " -"tracking can keep up)." -msgstr "" - -#: doc/classes/ARVRInterface.xml:118 -msgid "" -"Tracking is hindered by insufficient features, it's too dark (for camera-" -"based tracking), player is blocked, etc." -msgstr "" - -#: doc/classes/ARVRInterface.xml:121 -msgid "" -"We don't know the status of the tracking or this interface does not provide " -"feedback." -msgstr "" - -#: doc/classes/ARVRInterface.xml:124 -msgid "" -"Tracking is not functional (camera not plugged in or obscured, lighthouses " -"turned off, etc.)." -msgstr "" - -#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml:4 -msgid "GDNative wrapper for an ARVR interface." -msgstr "" - -#: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml:7 -msgid "" -"This is a wrapper class for GDNative implementations of the ARVR interface. " -"To use a GDNative ARVR interface, simply instantiate this object and set " -"your GDNative library containing the ARVR interface implementation." -msgstr "" - -#: doc/classes/ARVROrigin.xml:4 -msgid "The origin point in AR/VR." -msgstr "" - -#: doc/classes/ARVROrigin.xml:7 -msgid "" -"This is a special node within the AR/VR system that maps the physical " -"location of the center of our tracking space to the virtual location within " -"our game world.\n" -"There should be only one of these nodes in your scene and you must have one. " -"All the ARVRCamera, ARVRController and ARVRAnchor nodes should be direct " -"children of this node for spatial tracking to work correctly.\n" -"It is the position of this node that you update when your character needs to " -"move through your game world while we're not moving in the real world. " -"Movement in the real world is always in relation to this origin point.\n" -"For example, if your character is driving a car, the ARVROrigin node should " -"be a child node of this car. Or, if you're implementing a teleport system to " -"move your character, you should change the position of this node." -msgstr "" - -#: doc/classes/ARVROrigin.xml:19 -msgid "" -"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.\n" -"[b]Note:[/b] This method is a passthrough to the [ARVRServer] itself." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:4 -msgid "A tracked object." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:7 -msgid "" -"An instance of this object represents a device that is tracked, such as a " -"controller or anchor point. HMDs aren't represented here as they are handled " -"internally.\n" -"As controllers are turned on and the AR/VR interface detects them, instances " -"of this object are automatically added to this list of active tracking " -"objects accessible through the [ARVRServer].\n" -"The [ARVRController] and [ARVRAnchor] both consume objects of this type and " -"should be used in your project. The positional trackers are just under-the-" -"hood objects that make this all work. These are mostly exposed so that " -"GDNative-based interfaces can interact with them." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:19 -msgid "" -"Returns the hand holding this tracker, if known. See [enum TrackerHand] " -"constants." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:26 -msgid "" -"If this is a controller that is being tracked, the controller will also be " -"represented by a joystick entry with this ID." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:33 -msgid "" -"Returns the mesh related to a controller or anchor point if one is available." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:40 -msgid "Returns the controller or anchor point's name if available." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:47 -msgid "Returns the controller's orientation matrix." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:54 -msgid "Returns the world-space controller position." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:61 -msgid "" -"Returns the internal tracker ID. This uniquely identifies the tracker per " -"tracker type and matches the ID you need to specify for nodes such as the " -"[ARVRController] and [ARVRAnchor] nodes." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:68 -msgid "Returns [code]true[/code] if this device tracks orientation." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:75 -msgid "Returns [code]true[/code] if this device tracks position." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:84 -msgid "Returns the transform combining this device's orientation and position." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:91 -msgid "Returns the tracker's type." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:97 -msgid "" -"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to " -"[code]1.0[/code] with precision [code].01[/code]." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:102 -msgid "The hand this tracker is held in is unknown or not applicable." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:105 -msgid "This tracker is the left hand controller." -msgstr "" - -#: doc/classes/ARVRPositionalTracker.xml:108 -msgid "This tracker is the right hand controller." -msgstr "" - -#: doc/classes/ARVRServer.xml:4 -msgid "Server for AR and VR features." -msgstr "" - -#: doc/classes/ARVRServer.xml:7 -msgid "" -"The AR/VR server is the heart of our Advanced and Virtual Reality solution " -"and handles all the processing." -msgstr "" - -#: doc/classes/ARVRServer.xml:21 -msgid "" -"This is an important function to understand correctly. AR and VR platforms " -"all handle positioning slightly differently.\n" -"For platforms that do not offer spatial tracking, our origin point (0,0,0) " -"is the location of our HMD, but you have little control over the direction " -"the player is facing in the real world.\n" -"For platforms that do offer spatial tracking, our origin point depends very " -"much on the system. For OpenVR, our origin point is usually the center of " -"the tracking space, on the ground. For other platforms, it's often the " -"location of the tracking camera.\n" -"This method allows you to center your tracker on the location of the HMD. It " -"will take the current location of the HMD and use that to adjust all your " -"tracking data; in essence, realigning the real world to your player's " -"current position in the game world.\n" -"For this method to produce usable results, tracking information must be " -"available. This often takes a few frames after starting your game.\n" -"You should call this method after a few seconds have passed. For instance, " -"when the user requests a realignment of the display holding a designated " -"button on a controller for a short period of time, or when implementing a " -"teleport mechanism." -msgstr "" - -#: doc/classes/ARVRServer.xml:35 -msgid "" -"Finds an interface by its name. For instance, if your project uses " -"capabilities of an AR/VR platform, you can find the interface for that " -"platform by name and initialize it." -msgstr "" - -#: doc/classes/ARVRServer.xml:42 -msgid "Returns the primary interface's transformation." -msgstr "" - -#: doc/classes/ARVRServer.xml:51 -msgid "" -"Returns the interface registered at a given index in our list of interfaces." -msgstr "" - -#: doc/classes/ARVRServer.xml:58 -msgid "" -"Returns the number of interfaces currently registered with the AR/VR server. " -"If your project supports multiple AR/VR platforms, you can look through the " -"available interface, and either present the user with a selection or simply " -"try to initialize each interface and use the first one that returns " -"[code]true[/code]." -msgstr "" - -#: doc/classes/ARVRServer.xml:65 -msgid "" -"Returns a list of available interfaces the ID and name of each interface." -msgstr "" - -#: doc/classes/ARVRServer.xml:72 -msgid "" -"Returns the absolute timestamp (in μs) of the last [ARVRServer] commit of " -"the AR/VR eyes to [RenderingServer]. The value comes from an internal call " -"to [method OS.get_ticks_usec]." -msgstr "" - -#: doc/classes/ARVRServer.xml:79 -msgid "" -"Returns the duration (in μs) of the last frame. This is computed as the " -"difference between [method get_last_commit_usec] and [method " -"get_last_process_usec] when committing." -msgstr "" - -#: doc/classes/ARVRServer.xml:86 -msgid "" -"Returns the absolute timestamp (in μs) of the last [ARVRServer] process " -"callback. The value comes from an internal call to [method OS." -"get_ticks_usec]." -msgstr "" - -#: doc/classes/ARVRServer.xml:93 -msgid "" -"Returns the reference frame transform. Mostly used internally and exposed " -"for GDNative build interfaces." -msgstr "" - -#: doc/classes/ARVRServer.xml:102 -msgid "Returns the positional tracker at the given ID." -msgstr "" - -#: doc/classes/ARVRServer.xml:109 -msgid "Returns the number of trackers currently registered." -msgstr "" - -#: doc/classes/ARVRServer.xml:115 -msgid "The primary [ARVRInterface] currently bound to the [ARVRServer]." -msgstr "" - -#: doc/classes/ARVRServer.xml:118 -msgid "" -"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." -msgstr "" - -#: doc/classes/ARVRServer.xml:126 -msgid "Emitted when a new interface has been added." -msgstr "" - -#: doc/classes/ARVRServer.xml:133 -msgid "Emitted when an interface is removed." -msgstr "" - -#: doc/classes/ARVRServer.xml:144 -msgid "" -"Emitted when a new tracker has been added. If you don't use a fixed number " -"of controllers or if you're using [ARVRAnchor]s for an AR solution, it is " -"important to react to this signal to add the appropriate [ARVRController] or " -"[ARVRAnchor] nodes related to this new tracker." -msgstr "" - -#: doc/classes/ARVRServer.xml:155 -msgid "" -"Emitted when a tracker is removed. You should remove any [ARVRController] or " -"[ARVRAnchor] points if applicable. This is not mandatory, the nodes simply " -"become inactive and will be made active again when a new tracker becomes " -"available (i.e. a new controller is switched on that takes the place of the " -"previous one)." -msgstr "" - -#: doc/classes/ARVRServer.xml:161 -msgid "The tracker tracks the location of a controller." -msgstr "" - -#: doc/classes/ARVRServer.xml:164 -msgid "The tracker tracks the location of a base station." -msgstr "" - -#: doc/classes/ARVRServer.xml:167 -msgid "The tracker tracks the location and size of an AR anchor." -msgstr "" - -#: doc/classes/ARVRServer.xml:170 -msgid "Used internally to filter trackers of any known type." -msgstr "" - -#: doc/classes/ARVRServer.xml:173 -msgid "Used internally if we haven't set the tracker type yet." -msgstr "" - -#: doc/classes/ARVRServer.xml:176 -msgid "Used internally to select all trackers." -msgstr "" - -#: doc/classes/ARVRServer.xml:179 -msgid "" -"Fully reset the orientation of the HMD. Regardless of what direction the " -"user is looking to in the real world. The user will look dead ahead in the " -"virtual world." -msgstr "" - -#: doc/classes/ARVRServer.xml:182 -msgid "" -"Resets the orientation but keeps the tilt of the device. So if we're looking " -"down, we keep looking down but heading will be reset." -msgstr "" - -#: doc/classes/ARVRServer.xml:185 -msgid "" -"Does not reset the orientation of the HMD, only the position of the player " -"gets centered." -msgstr "" - #: doc/classes/AStar.xml:4 msgid "" "An implementation of A* to find shortest paths among connected points in " @@ -8387,7 +7751,9 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml:64 doc/classes/AudioStreamPlayer2D.xml:70 #: doc/classes/AudioStreamPlayer3D.xml:94 -msgid "Changes the pitch and the tempo of the audio." +msgid "" +"The pitch and the tempo of the audio, as a multiplier of the audio sample's " +"sample rate." msgstr "" #: doc/classes/AudioStreamPlayer.xml:67 doc/classes/AudioStreamPlayer2D.xml:73 @@ -8632,15 +7998,23 @@ msgid "Audio format. See [enum Format] constants for values." msgstr "" #: doc/classes/AudioStreamSample.xml:33 -msgid "Loop start in bytes." +msgid "" +"The loop start point (in number of samples, relative to the beginning of the " +"sample). This information will be imported automatically from the WAV file " +"if present." msgstr "" #: doc/classes/AudioStreamSample.xml:36 -msgid "Loop end in bytes." +msgid "" +"The loop end point (in number of samples, relative to the beginning of the " +"sample). This information will be imported automatically from the WAV file " +"if present." msgstr "" #: doc/classes/AudioStreamSample.xml:39 -msgid "Loop mode. See [enum LoopMode] constants for values." +msgid "" +"The loop mode. This information will be imported automatically from the WAV " +"file if present. See [enum LoopMode] constants for values." msgstr "" #: doc/classes/AudioStreamSample.xml:42 @@ -8669,19 +8043,19 @@ msgstr "" #: doc/classes/AudioStreamSample.xml:62 msgid "" -"Audio loops the data between [member loop_begin] and [member loop_end] " +"Audio loops the data between [member loop_begin] and [member loop_end], " "playing forward only." msgstr "" #: doc/classes/AudioStreamSample.xml:65 msgid "" -"Audio loops the data between [member loop_begin] and [member loop_end] " +"Audio loops the data between [member loop_begin] and [member loop_end], " "playing back and forth." msgstr "" #: doc/classes/AudioStreamSample.xml:68 msgid "" -"Audio loops the data between [member loop_begin] and [member loop_end] " +"Audio loops the data between [member loop_begin] and [member loop_end], " "playing backward only." msgstr "" @@ -8698,30 +8072,35 @@ msgid "" "in the BackBufferCopy node is bufferized with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " -"access the buffer." +"access the buffer.\n" +"[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " +"anchors and margins won't apply to child [Control]-derived nodes. This can " +"be problematic when resizing the window. To avoid this, add [Control]-" +"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"adding them as children." msgstr "" -#: doc/classes/BackBufferCopy.xml:15 +#: doc/classes/BackBufferCopy.xml:16 msgid "Buffer mode. See [enum CopyMode] constants." msgstr "" -#: doc/classes/BackBufferCopy.xml:18 +#: doc/classes/BackBufferCopy.xml:19 msgid "" "The area covered by the BackBufferCopy. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" -#: doc/classes/BackBufferCopy.xml:23 +#: doc/classes/BackBufferCopy.xml:24 msgid "" "Disables the buffering mode. This means the BackBufferCopy node will " "directly use the portion of screen it covers." msgstr "" -#: doc/classes/BackBufferCopy.xml:26 +#: doc/classes/BackBufferCopy.xml:27 msgid "BackBufferCopy buffers a rectangular region." msgstr "" -#: doc/classes/BackBufferCopy.xml:29 +#: doc/classes/BackBufferCopy.xml:30 msgid "BackBufferCopy buffers the entire screen." msgstr "" @@ -8791,80 +8170,83 @@ msgstr "" #: doc/classes/BaseButton.xml:62 msgid "" "If [code]true[/code], the button stays pressed when moving the cursor " -"outside the button while pressing it." +"outside the button while pressing it.\n" +"[b]Note:[/b] This property only affects the button's visual appearance. " +"Signals will be emitted at the same moment regardless of this property's " +"value." msgstr "" -#: doc/classes/BaseButton.xml:65 +#: doc/classes/BaseButton.xml:66 msgid "" "If [code]true[/code], the button's state is pressed. Means the button is " "pressed down or toggled (if [member toggle_mode] is active)." msgstr "" -#: doc/classes/BaseButton.xml:68 +#: doc/classes/BaseButton.xml:69 msgid "[ShortCut] associated to the button." msgstr "" -#: doc/classes/BaseButton.xml:71 +#: doc/classes/BaseButton.xml:72 msgid "" "If [code]true[/code], the button will add information about its shortcut in " "the tooltip." msgstr "" -#: doc/classes/BaseButton.xml:74 +#: doc/classes/BaseButton.xml:75 msgid "" "If [code]true[/code], the button is in toggle mode. Makes the button flip " "state between pressed and unpressed each time its area is clicked." msgstr "" -#: doc/classes/BaseButton.xml:80 +#: doc/classes/BaseButton.xml:81 msgid "Emitted when the button starts being held down." msgstr "" -#: doc/classes/BaseButton.xml:85 +#: doc/classes/BaseButton.xml:86 msgid "Emitted when the button stops being held down." msgstr "" -#: doc/classes/BaseButton.xml:90 +#: doc/classes/BaseButton.xml:91 msgid "" "Emitted when the button is toggled or pressed. This is on [signal " "button_down] if [member action_mode] is [constant ACTION_MODE_BUTTON_PRESS] " "and on [signal button_up] otherwise." msgstr "" -#: doc/classes/BaseButton.xml:97 +#: doc/classes/BaseButton.xml:98 msgid "" "Emitted when the button was just toggled between pressed and normal states " "(only if [member toggle_mode] is active). The new state is contained in the " "[code]button_pressed[/code] argument." msgstr "" -#: doc/classes/BaseButton.xml:103 +#: doc/classes/BaseButton.xml:104 msgid "" "The normal state (i.e. not pressed, not hovered, not toggled and enabled) of " "buttons." msgstr "" -#: doc/classes/BaseButton.xml:106 +#: doc/classes/BaseButton.xml:107 msgid "The state of buttons are pressed." msgstr "" -#: doc/classes/BaseButton.xml:109 +#: doc/classes/BaseButton.xml:110 msgid "The state of buttons are hovered." msgstr "" -#: doc/classes/BaseButton.xml:112 +#: doc/classes/BaseButton.xml:113 msgid "The state of buttons are disabled." msgstr "" -#: doc/classes/BaseButton.xml:115 +#: doc/classes/BaseButton.xml:116 msgid "The state of buttons are both hovered and pressed." msgstr "" -#: doc/classes/BaseButton.xml:118 +#: doc/classes/BaseButton.xml:119 msgid "Require just a press to consider the button clicked." msgstr "" -#: doc/classes/BaseButton.xml:121 +#: doc/classes/BaseButton.xml:122 msgid "" "Require a press and a subsequent release before considering the button " "clicked." @@ -8988,8 +8370,8 @@ msgid "" "the object." msgstr "" -#: doc/classes/BaseMaterial3D.xml:109 doc/classes/BaseMaterial3D.xml:275 -#: doc/classes/BaseMaterial3D.xml:296 +#: doc/classes/BaseMaterial3D.xml:109 doc/classes/BaseMaterial3D.xml:284 +#: doc/classes/BaseMaterial3D.xml:305 msgid "" "Specifies the channel of the [member ao_texture] in which the ambient " "occlusion information is stored. This is useful when you store the " @@ -9000,29 +8382,45 @@ msgstr "" #: doc/classes/BaseMaterial3D.xml:112 msgid "" +"The color used by the backlight effect. Represents the light passing through " +"an object." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:115 +msgid "If [code]true[/code], the backlight effect is enabled." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:118 +msgid "" +"Texture used to control the backlight effect per-pixel. Added to [member " +"backlight]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:121 +msgid "" "If [code]true[/code], the shader will keep the scale set for the mesh. " "Otherwise the scale is lost when billboarding. Only applies when [member " "billboard_mode] is [constant BILLBOARD_ENABLED]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:115 +#: doc/classes/BaseMaterial3D.xml:124 msgid "Controls how the object faces the camera. See [enum BillboardMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:118 +#: doc/classes/BaseMaterial3D.xml:127 msgid "" "The material's blend mode.\n" "[b]Note:[/b] Values other than [code]Mix[/code] force the object into the " "transparent pipeline. See [enum BlendMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:122 +#: doc/classes/BaseMaterial3D.xml:131 msgid "" "Sets the strength of the clearcoat effect. Setting to [code]0[/code] looks " "the same as disabling the clearcoat effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:125 +#: doc/classes/BaseMaterial3D.xml:134 msgid "" "If [code]true[/code], clearcoat rendering is enabled. Adds a secondary " "transparent pass to the lighting calculation resulting in an added specular " @@ -9030,42 +8428,42 @@ msgid "" "can be either glossy or rough." msgstr "" -#: doc/classes/BaseMaterial3D.xml:128 +#: doc/classes/BaseMaterial3D.xml:137 msgid "" "Sets the roughness of the clearcoat pass. A higher value results in a " "smoother clearcoat while a lower value results in a rougher clearcoat." msgstr "" -#: doc/classes/BaseMaterial3D.xml:131 +#: doc/classes/BaseMaterial3D.xml:140 msgid "" "Texture that defines the strength of the clearcoat effect and the glossiness " "of the clearcoat. Strength is specified in the red channel while glossiness " "is specified in the green channel." msgstr "" -#: doc/classes/BaseMaterial3D.xml:134 +#: doc/classes/BaseMaterial3D.xml:143 msgid "" "Which side of the object is not drawn when backfaces are rendered. See [enum " "CullMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:137 +#: doc/classes/BaseMaterial3D.xml:146 msgid "" "Determines when depth rendering takes place. See [enum DepthDrawMode]. See " "also [member transparency]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:140 +#: doc/classes/BaseMaterial3D.xml:149 msgid "Texture that specifies the color of the detail overlay." msgstr "" -#: doc/classes/BaseMaterial3D.xml:143 +#: doc/classes/BaseMaterial3D.xml:152 msgid "" "Specifies how the [member detail_albedo] should blend with the current " "[code]ALBEDO[/code]. See [enum BlendMode] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:146 +#: doc/classes/BaseMaterial3D.xml:155 msgid "" "If [code]true[/code], enables the detail overlay. Detail is a second texture " "that gets mixed over the surface of the object based on [member " @@ -9073,99 +8471,99 @@ msgid "" "between two different albedo/normal textures." msgstr "" -#: doc/classes/BaseMaterial3D.xml:149 +#: doc/classes/BaseMaterial3D.xml:158 msgid "" "Texture used to specify how the detail textures get blended with the base " "textures." msgstr "" -#: doc/classes/BaseMaterial3D.xml:152 +#: doc/classes/BaseMaterial3D.xml:161 msgid "Texture that specifies the per-pixel normal of the detail overlay." msgstr "" -#: doc/classes/BaseMaterial3D.xml:155 +#: doc/classes/BaseMaterial3D.xml:164 msgid "" "Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail " "layer. See [enum DetailUV] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:158 +#: doc/classes/BaseMaterial3D.xml:167 msgid "" "The algorithm used for diffuse light scattering. See [enum DiffuseMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:161 +#: doc/classes/BaseMaterial3D.xml:170 msgid "If [code]true[/code], the object receives no ambient light." msgstr "" -#: doc/classes/BaseMaterial3D.xml:164 +#: doc/classes/BaseMaterial3D.xml:173 msgid "" "If [code]true[/code], the object receives no shadow that would otherwise be " "cast onto it." msgstr "" -#: doc/classes/BaseMaterial3D.xml:167 +#: doc/classes/BaseMaterial3D.xml:176 msgid "Distance at which the object fades fully and is no longer visible." msgstr "" -#: doc/classes/BaseMaterial3D.xml:170 +#: doc/classes/BaseMaterial3D.xml:179 msgid "" "Distance at which the object starts to fade. If the object is less than this " "distance away it will appear normal." msgstr "" -#: doc/classes/BaseMaterial3D.xml:173 +#: doc/classes/BaseMaterial3D.xml:182 msgid "" "Specifies which type of fade to use. Can be any of the [enum " "DistanceFadeMode]s." msgstr "" -#: doc/classes/BaseMaterial3D.xml:176 +#: doc/classes/BaseMaterial3D.xml:185 msgid "The emitted light's color. See [member emission_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:179 +#: doc/classes/BaseMaterial3D.xml:188 msgid "" "If [code]true[/code], the body emits light. Emitting light makes the object " "appear brighter. The object can also cast light on other objects if a " "[GIProbe] is used and this object is used in baked lighting." msgstr "" -#: doc/classes/BaseMaterial3D.xml:182 +#: doc/classes/BaseMaterial3D.xml:191 msgid "The emitted light's strength. See [member emission_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:185 +#: doc/classes/BaseMaterial3D.xml:194 msgid "Use [code]UV2[/code] to read from the [member emission_texture]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:188 +#: doc/classes/BaseMaterial3D.xml:197 msgid "" "Sets how [member emission] interacts with [member emission_texture]. Can " "either add or multiply. See [enum EmissionOperator] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:191 +#: doc/classes/BaseMaterial3D.xml:200 msgid "Texture that specifies how much surface emits light at a given point." msgstr "" -#: doc/classes/BaseMaterial3D.xml:194 +#: doc/classes/BaseMaterial3D.xml:203 msgid "" "If [code]true[/code], the object is rendered at the same size regardless of " "distance." msgstr "" -#: doc/classes/BaseMaterial3D.xml:197 +#: doc/classes/BaseMaterial3D.xml:206 msgid "" "If [code]true[/code], enables the vertex grow setting. See [member " "grow_amount]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:200 +#: doc/classes/BaseMaterial3D.xml:209 msgid "Grows object vertices in the direction of their normals." msgstr "" -#: doc/classes/BaseMaterial3D.xml:221 +#: doc/classes/BaseMaterial3D.xml:230 msgid "" "A high value makes the material appear more like a metal. Non-metals use " "their albedo as the diffuse color and add diffuse to the specular " @@ -9178,7 +8576,7 @@ msgid "" "roughness]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:224 +#: doc/classes/BaseMaterial3D.xml:233 msgid "" "Sets the size of the specular lobe. The specular lobe is the bright spot " "that is reflected from light sources.\n" @@ -9187,13 +8585,13 @@ msgid "" "roughness]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:228 +#: doc/classes/BaseMaterial3D.xml:237 msgid "" "Texture used to specify metallic for an object. This is multiplied by " "[member metallic]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:231 +#: doc/classes/BaseMaterial3D.xml:240 msgid "" "Specifies the channel of the [member metallic_texture] in which the metallic " "information is stored. This is useful when you store the information for " @@ -9202,21 +8600,21 @@ msgid "" "you could reduce the number of textures you use." msgstr "" -#: doc/classes/BaseMaterial3D.xml:234 +#: doc/classes/BaseMaterial3D.xml:243 msgid "" "If [code]true[/code], depth testing is disabled and the object will be drawn " "in render order." msgstr "" -#: doc/classes/BaseMaterial3D.xml:237 +#: doc/classes/BaseMaterial3D.xml:246 msgid "If [code]true[/code], normal mapping is enabled." msgstr "" -#: doc/classes/BaseMaterial3D.xml:240 +#: doc/classes/BaseMaterial3D.xml:249 msgid "The strength of the normal map's effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:243 +#: doc/classes/BaseMaterial3D.xml:252 msgid "" "Texture used to specify the normal at a given pixel. The " "[code]normal_texture[/code] only uses the red and green channels. The normal " @@ -9224,93 +8622,100 @@ msgid "" "provided by the [Mesh]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:248 +#: doc/classes/BaseMaterial3D.xml:257 msgid "" "The number of horizontal frames in the particle sprite sheet. Only enabled " "when using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:251 +#: doc/classes/BaseMaterial3D.xml:260 msgid "" "If [code]true[/code], particle animations are looped. Only enabled when " "using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:254 +#: doc/classes/BaseMaterial3D.xml:263 msgid "" "The number of vertical frames in the particle sprite sheet. Only enabled " "when using [constant BILLBOARD_PARTICLES]. See [member billboard_mode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:257 +#: doc/classes/BaseMaterial3D.xml:266 msgid "The point size in pixels. See [member use_point_size]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:260 +#: doc/classes/BaseMaterial3D.xml:269 msgid "" "Distance over which the fade effect takes place. The larger the distance the " "longer it takes for an object to fade." msgstr "" -#: doc/classes/BaseMaterial3D.xml:263 +#: doc/classes/BaseMaterial3D.xml:272 msgid "" "If [code]true[/code], the proximity fade effect is enabled. The proximity " "fade effect fades out each pixel based on its distance to another object." msgstr "" -#: doc/classes/BaseMaterial3D.xml:266 +#: doc/classes/BaseMaterial3D.xml:275 msgid "" "If [code]true[/code], the refraction effect is enabled. Distorts " "transparency based on light from behind the object." msgstr "" -#: doc/classes/BaseMaterial3D.xml:269 +#: doc/classes/BaseMaterial3D.xml:278 msgid "The strength of the refraction effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:272 +#: doc/classes/BaseMaterial3D.xml:281 msgid "" "Texture that controls the strength of the refraction per-pixel. Multiplied " "by [member refraction_scale]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:278 +#: doc/classes/BaseMaterial3D.xml:287 msgid "Sets the strength of the rim lighting effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:281 +#: doc/classes/BaseMaterial3D.xml:290 msgid "" "If [code]true[/code], rim effect is enabled. Rim lighting increases the " "brightness at glancing angles on an object." msgstr "" -#: doc/classes/BaseMaterial3D.xml:284 +#: doc/classes/BaseMaterial3D.xml:293 msgid "" "Texture used to set the strength of the rim lighting effect per-pixel. " "Multiplied by [member rim]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:287 +#: doc/classes/BaseMaterial3D.xml:296 msgid "" "The amount of to blend light and albedo color when rendering rim effect. If " "[code]0[/code] the light color is used, while [code]1[/code] means albedo " "color is used. An intermediate value generally works best." msgstr "" -#: doc/classes/BaseMaterial3D.xml:290 +#: doc/classes/BaseMaterial3D.xml:299 msgid "" "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]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:293 +#: doc/classes/BaseMaterial3D.xml:302 msgid "" "Texture used to control the roughness per-pixel. Multiplied by [member " "roughness]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:301 +#: doc/classes/BaseMaterial3D.xml:308 +msgid "" +"Sets whether the shading takes place per-pixel or per-vertex. Per-vertex " +"lighting is faster, making it the best choice for mobile applications, " +"however it looks considerably worse than per-pixel." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:311 msgid "" "If [code]true[/code], enables the \"shadow to opacity\" render mode where " "lighting modifies the alpha so shadowed areas are opaque and non-shadowed " @@ -9318,77 +8723,67 @@ msgid "" "AR." msgstr "" -#: doc/classes/BaseMaterial3D.xml:304 +#: doc/classes/BaseMaterial3D.xml:314 msgid "The method for rendering the specular blob. See [enum SpecularMode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:307 +#: doc/classes/BaseMaterial3D.xml:317 msgid "" "If [code]true[/code], subsurface scattering is enabled. Emulates light that " "penetrates an object's surface, is scattered, and then emerges." msgstr "" -#: doc/classes/BaseMaterial3D.xml:312 +#: doc/classes/BaseMaterial3D.xml:320 +msgid "" +"If [code]true[/code], subsurface scattering will use a special mode " +"optimized for the color and density of human skin." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:323 msgid "The strength of the subsurface scattering effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:315 +#: doc/classes/BaseMaterial3D.xml:326 msgid "" "Texture used to control the subsurface scattering strength. Stored in the " "red texture channel. Multiplied by [member subsurf_scatter_strength]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:318 +#: doc/classes/BaseMaterial3D.xml:341 msgid "Filter flags for the texture. See [enum TextureFilter] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:321 +#: doc/classes/BaseMaterial3D.xml:344 msgid "Repeat flags for the texture. See [enum TextureFilter] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:324 -msgid "" -"The color used by the transmission effect. Represents the light passing " -"through an object." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:327 -msgid "If [code]true[/code], the transmission effect is enabled." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:330 -msgid "" -"Texture used to control the transmission effect per-pixel. Added to [member " -"transmission]." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:333 +#: doc/classes/BaseMaterial3D.xml:347 msgid "" "If [code]true[/code], transparency is enabled on the body. See also [member " "blend_mode]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:336 +#: doc/classes/BaseMaterial3D.xml:350 msgid "" "If [code]true[/code], render point size can be changed.\n" "[b]Note:[/b] this is only effective for objects whose geometry is point-" "based rather than triangle-based. See also [member point_size]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:340 +#: doc/classes/BaseMaterial3D.xml:354 msgid "" "How much to offset the [code]UV[/code] coordinates. This amount will be " "added to [code]UV[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:343 +#: doc/classes/BaseMaterial3D.xml:357 msgid "" "How much to scale the [code]UV[/code] coordinates. This is multiplied by " "[code]UV[/code] in the vertex function." msgstr "" -#: doc/classes/BaseMaterial3D.xml:346 +#: doc/classes/BaseMaterial3D.xml:360 msgid "" "If [code]true[/code], instead of using [code]UV[/code] textures will use a " "triplanar texture lookup to determine how to apply textures. Triplanar uses " @@ -9402,32 +8797,32 @@ msgid "" "when you are trying to achieve crisp texturing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:349 doc/classes/BaseMaterial3D.xml:364 +#: doc/classes/BaseMaterial3D.xml:363 doc/classes/BaseMaterial3D.xml:378 msgid "" "A lower number blends the texture more softly while a higher number blends " "the texture more sharply." msgstr "" -#: doc/classes/BaseMaterial3D.xml:352 +#: doc/classes/BaseMaterial3D.xml:366 msgid "" "If [code]true[/code], triplanar mapping for [code]UV[/code] is calculated in " "world space rather than object local space. See also [member uv1_triplanar]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:355 +#: doc/classes/BaseMaterial3D.xml:369 msgid "" "How much to offset the [code]UV2[/code] coordinates. This amount will be " "added to [code]UV2[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:358 +#: doc/classes/BaseMaterial3D.xml:372 msgid "" "How much to scale the [code]UV2[/code] coordinates. This is multiplied by " "[code]UV2[/code] in the vertex function." msgstr "" -#: doc/classes/BaseMaterial3D.xml:361 +#: doc/classes/BaseMaterial3D.xml:375 msgid "" "If [code]true[/code], instead of using [code]UV2[/code] textures will use a " "triplanar texture lookup to determine how to apply textures. Triplanar uses " @@ -9441,368 +8836,443 @@ msgid "" "when you are trying to achieve crisp texturing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:367 +#: doc/classes/BaseMaterial3D.xml:381 msgid "" "If [code]true[/code], triplanar mapping for [code]UV2[/code] is calculated " "in world space rather than object local space. See also [member " "uv2_triplanar]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:370 +#: doc/classes/BaseMaterial3D.xml:384 msgid "" "If [code]true[/code], the model's vertex colors are processed as sRGB mode." msgstr "" -#: doc/classes/BaseMaterial3D.xml:373 +#: doc/classes/BaseMaterial3D.xml:387 msgid "If [code]true[/code], the vertex color is used as albedo color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:378 +#: doc/classes/BaseMaterial3D.xml:392 msgid "Texture specifying per-pixel color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:381 +#: doc/classes/BaseMaterial3D.xml:395 msgid "Texture specifying per-pixel metallic value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:384 +#: doc/classes/BaseMaterial3D.xml:398 msgid "Texture specifying per-pixel roughness value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:387 +#: doc/classes/BaseMaterial3D.xml:401 msgid "Texture specifying per-pixel emission color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:390 +#: doc/classes/BaseMaterial3D.xml:404 msgid "Texture specifying per-pixel normal vector." msgstr "" -#: doc/classes/BaseMaterial3D.xml:393 +#: doc/classes/BaseMaterial3D.xml:407 msgid "Texture specifying per-pixel rim value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:396 +#: doc/classes/BaseMaterial3D.xml:410 msgid "Texture specifying per-pixel clearcoat value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:399 +#: doc/classes/BaseMaterial3D.xml:413 msgid "" "Texture specifying per-pixel flowmap direction for use with [member " "anisotropy]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:402 +#: doc/classes/BaseMaterial3D.xml:416 msgid "Texture specifying per-pixel ambient occlusion value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:405 +#: doc/classes/BaseMaterial3D.xml:419 msgid "Texture specifying per-pixel height." msgstr "" -#: doc/classes/BaseMaterial3D.xml:408 +#: doc/classes/BaseMaterial3D.xml:422 msgid "Texture specifying per-pixel subsurface scattering." msgstr "" -#: doc/classes/BaseMaterial3D.xml:411 -msgid "Texture specifying per-pixel transmission color." +#: doc/classes/BaseMaterial3D.xml:425 +msgid "Texture specifying per-pixel transmittance for subsurface scattering." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:428 +msgid "Texture specifying per-pixel backlight color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:414 +#: doc/classes/BaseMaterial3D.xml:431 msgid "Texture specifying per-pixel refraction strength." msgstr "" -#: doc/classes/BaseMaterial3D.xml:417 +#: doc/classes/BaseMaterial3D.xml:434 msgid "Texture specifying per-pixel detail mask blending value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:420 +#: doc/classes/BaseMaterial3D.xml:437 msgid "Texture specifying per-pixel detail color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:423 +#: doc/classes/BaseMaterial3D.xml:440 msgid "Texture specifying per-pixel detail normal." msgstr "" -#: doc/classes/BaseMaterial3D.xml:428 +#: doc/classes/BaseMaterial3D.xml:443 +msgid "Texture holding ambient occlusion, roughness, and metallic." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:446 msgid "Represents the size of the [enum TextureParam] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:431 +#: doc/classes/BaseMaterial3D.xml:449 doc/classes/RenderingServer.xml:3774 +#: doc/classes/Viewport.xml:390 msgid "" "The texture filter reads from the nearest pixel only. The simplest and " "fastest method of filtering, but the texture will look pixelized." msgstr "" -#: doc/classes/BaseMaterial3D.xml:434 doc/classes/CanvasItem.xml:665 +#: doc/classes/BaseMaterial3D.xml:452 doc/classes/RenderingServer.xml:3777 +#: doc/classes/Viewport.xml:393 msgid "" -"The texture filter blends between the nearest four pixels. Use this for most " -"cases where you want to avoid a pixelated style." +"The texture filter blends between the nearest 4 pixels. Use this when you " +"want to avoid a pixelated style, but do not want mipmaps." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:455 doc/classes/RenderingServer.xml:3780 +#: doc/classes/Viewport.xml:396 +msgid "" +"The texture filter reads from the nearest pixel in the nearest mipmap. The " +"fastest way to read from textures with mipmaps." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:458 +msgid "" +"The texture filter blends between the nearest 4 pixels and between the " +"nearest 2 mipmaps. Use this for most cases as mipmaps are important to " +"smooth out pixels that are far from the camera." msgstr "" -#: doc/classes/BaseMaterial3D.xml:445 doc/classes/CanvasItem.xml:676 +#: doc/classes/BaseMaterial3D.xml:461 doc/classes/RenderingServer.xml:3786 +msgid "" +"The texture filter reads from the nearest pixel, but selects a mipmap based " +"on the angle between the surface and the camera view. This reduces artifacts " +"on surfaces that are almost in line with the camera." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:464 doc/classes/RenderingServer.xml:3789 +msgid "" +"The texture filter blends between the nearest 4 pixels and selects a mipmap " +"based on the angle between the surface and the camera view. This reduces " +"artifacts on surfaces that are almost in line with the camera. This is the " +"slowest of the filtering options, but results in the highest quality " +"texturing." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:467 doc/classes/CanvasItem.xml:677 msgid "Represents the size of the [enum TextureFilter] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:448 +#: doc/classes/BaseMaterial3D.xml:470 msgid "Use [code]UV[/code] with the detail texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:451 +#: doc/classes/BaseMaterial3D.xml:473 msgid "Use [code]UV2[/code] with the detail texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:454 +#: doc/classes/BaseMaterial3D.xml:476 msgid "The material will not use transparency." msgstr "" -#: doc/classes/BaseMaterial3D.xml:457 +#: doc/classes/BaseMaterial3D.xml:479 msgid "The material will use the texture's alpha values for transparency." msgstr "" -#: doc/classes/BaseMaterial3D.xml:464 +#: doc/classes/BaseMaterial3D.xml:482 +msgid "" +"The material will cut off all values below a threshold, the rest will remain " +"opaque." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:485 +msgid "" +"The material will use the texture's alpha value for transparency, but will " +"still be rendered in the pre-pass." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:488 msgid "Represents the size of the [enum Transparency] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:467 +#: doc/classes/BaseMaterial3D.xml:491 msgid "The object will not receive shadows." msgstr "" -#: doc/classes/BaseMaterial3D.xml:470 +#: doc/classes/BaseMaterial3D.xml:494 msgid "" "The object will be shaded per pixel. Useful for realistic shading effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:473 +#: doc/classes/BaseMaterial3D.xml:497 msgid "" "The object will be shaded per vertex. Useful when you want cheaper shaders " "and do not care about visual quality." msgstr "" -#: doc/classes/BaseMaterial3D.xml:476 +#: doc/classes/BaseMaterial3D.xml:500 msgid "Represents the size of the [enum ShadingMode] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:479 +#: doc/classes/BaseMaterial3D.xml:503 msgid "Constant for setting [member emission_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:482 +#: doc/classes/BaseMaterial3D.xml:506 msgid "Constant for setting [member normal_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:485 +#: doc/classes/BaseMaterial3D.xml:509 msgid "Constant for setting [member rim_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:488 +#: doc/classes/BaseMaterial3D.xml:512 msgid "Constant for setting [member clearcoat_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:491 +#: doc/classes/BaseMaterial3D.xml:515 msgid "Constant for setting [member anisotropy_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:494 +#: doc/classes/BaseMaterial3D.xml:518 msgid "Constant for setting [member ao_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:499 +#: doc/classes/BaseMaterial3D.xml:521 +msgid "Constant for setting [member heightmap_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:524 msgid "Constant for setting [member subsurf_scatter_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:502 -msgid "Constant for setting [member transmission_enabled]." +#: doc/classes/BaseMaterial3D.xml:527 +msgid "Constant for setting [member subsurf_scatter_transmittance_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:505 +#: doc/classes/BaseMaterial3D.xml:530 +msgid "Constant for setting [member backlight_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:533 msgid "Constant for setting [member refraction_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:508 +#: doc/classes/BaseMaterial3D.xml:536 msgid "Constant for setting [member detail_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:511 doc/classes/EditorFeatureProfile.xml:148 +#: doc/classes/BaseMaterial3D.xml:539 doc/classes/EditorFeatureProfile.xml:148 msgid "Represents the size of the [enum Feature] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:514 +#: doc/classes/BaseMaterial3D.xml:542 msgid "" "Default blend mode. The color of the object is blended over the background " "based on the object's alpha value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:517 +#: doc/classes/BaseMaterial3D.xml:545 msgid "The color of the object is added to the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:520 +#: doc/classes/BaseMaterial3D.xml:548 msgid "The color of the object is subtracted from the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:523 +#: doc/classes/BaseMaterial3D.xml:551 msgid "The color of the object is multiplied by the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:526 +#: doc/classes/BaseMaterial3D.xml:554 msgid "Default depth draw mode. Depth is drawn only for opaque objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:529 +#: doc/classes/BaseMaterial3D.xml:557 msgid "Depth draw is calculated for both opaque and transparent objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:532 +#: doc/classes/BaseMaterial3D.xml:560 msgid "No depth draw." msgstr "" -#: doc/classes/BaseMaterial3D.xml:535 +#: doc/classes/BaseMaterial3D.xml:563 msgid "Default cull mode. The back of the object is culled when not visible." msgstr "" -#: doc/classes/BaseMaterial3D.xml:538 +#: doc/classes/BaseMaterial3D.xml:566 msgid "The front of the object is culled when not visible." msgstr "" -#: doc/classes/BaseMaterial3D.xml:541 +#: doc/classes/BaseMaterial3D.xml:569 msgid "No culling is performed." msgstr "" -#: doc/classes/BaseMaterial3D.xml:544 +#: doc/classes/BaseMaterial3D.xml:572 msgid "" "Disables the depth test, so this object is drawn on top of all others. " "However, objects drawn after it in the draw order may cover it." msgstr "" -#: doc/classes/BaseMaterial3D.xml:547 +#: doc/classes/BaseMaterial3D.xml:575 msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh." msgstr "" -#: doc/classes/BaseMaterial3D.xml:550 +#: doc/classes/BaseMaterial3D.xml:578 msgid "" "Vertex color is in sRGB space and needs to be converted to linear. Only " "applies in the Vulkan renderer." msgstr "" -#: doc/classes/BaseMaterial3D.xml:553 +#: doc/classes/BaseMaterial3D.xml:581 msgid "" "Uses point size to alter the size of primitive points. Also changes the " "albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/" "code]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:556 +#: doc/classes/BaseMaterial3D.xml:584 msgid "" "Object is scaled by depth so that it always appears the same size on screen." msgstr "" -#: doc/classes/BaseMaterial3D.xml:559 +#: doc/classes/BaseMaterial3D.xml:587 msgid "" "Shader will keep the scale set for the mesh. Otherwise the scale is lost " "when billboarding. Only applies when [member billboard_mode] is [constant " "BILLBOARD_ENABLED]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:562 doc/classes/BaseMaterial3D.xml:568 +#: doc/classes/BaseMaterial3D.xml:590 doc/classes/BaseMaterial3D.xml:596 msgid "" "Use triplanar texture lookup for all texture lookups that would normally use " "[code]UV[/code]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:565 doc/classes/BaseMaterial3D.xml:571 +#: doc/classes/BaseMaterial3D.xml:593 doc/classes/BaseMaterial3D.xml:599 msgid "" "Use triplanar texture lookup for all texture lookups that would normally use " "[code]UV2[/code]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:574 +#: doc/classes/BaseMaterial3D.xml:602 msgid "" "Use [code]UV2[/code] coordinates to look up from the [member ao_texture]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:577 +#: doc/classes/BaseMaterial3D.xml:605 msgid "" "Use [code]UV2[/code] coordinates to look up from the [member " "emission_texture]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:580 +#: doc/classes/BaseMaterial3D.xml:608 msgid "Forces the shader to convert albedo from sRGB space to linear space." msgstr "" -#: doc/classes/BaseMaterial3D.xml:583 +#: doc/classes/BaseMaterial3D.xml:611 msgid "Disables receiving shadows from other objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:586 +#: doc/classes/BaseMaterial3D.xml:614 msgid "Disables receiving ambient light." msgstr "" -#: doc/classes/BaseMaterial3D.xml:589 +#: doc/classes/BaseMaterial3D.xml:617 msgid "Enables the shadow to opacity feature." msgstr "" -#: doc/classes/BaseMaterial3D.xml:594 +#: doc/classes/BaseMaterial3D.xml:620 doc/classes/RenderingServer.xml:3801 +#: doc/classes/Viewport.xml:408 +msgid "" +"Enables the texture to repeat when UV coordinates are outside the 0-1 range. " +"If using one of the linear filtering modes, this can result in artifacts at " +"the edges of a texture when the sampler filters across the edges of the " +"texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:623 msgid "" "Invert values read from a depth texture to convert them to height values " "(heightmap)." msgstr "" -#: doc/classes/BaseMaterial3D.xml:599 doc/classes/CPUParticles2D.xml:355 -#: doc/classes/CPUParticles3D.xml:364 doc/classes/GeometryInstance3D.xml:100 +#: doc/classes/BaseMaterial3D.xml:626 +msgid "" +"Enables the skin mode for subsurface scattering which is used to improve the " +"look of subsurface scattering when used for human skin." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:629 doc/classes/CPUParticles2D.xml:355 +#: doc/classes/CPUParticles3D.xml:364 doc/classes/GeometryInstance3D.xml:118 #: doc/classes/ParticlesMaterial.xml:315 msgid "Represents the size of the [enum Flags] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:602 +#: doc/classes/BaseMaterial3D.xml:632 msgid "Default diffuse scattering algorithm." msgstr "" -#: doc/classes/BaseMaterial3D.xml:605 +#: doc/classes/BaseMaterial3D.xml:635 msgid "Diffuse scattering ignores roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:608 +#: doc/classes/BaseMaterial3D.xml:638 msgid "Extends Lambert to cover more than 90 degrees when roughness increases." msgstr "" -#: doc/classes/BaseMaterial3D.xml:611 +#: doc/classes/BaseMaterial3D.xml:641 msgid "Attempts to use roughness to emulate microsurfacing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:614 +#: doc/classes/BaseMaterial3D.xml:644 msgid "Uses a hard cut for lighting, with smoothing affected by roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:617 +#: doc/classes/BaseMaterial3D.xml:647 msgid "Default specular blob." msgstr "" -#: doc/classes/BaseMaterial3D.xml:620 doc/classes/BaseMaterial3D.xml:623 +#: doc/classes/BaseMaterial3D.xml:650 doc/classes/BaseMaterial3D.xml:653 msgid "Older specular algorithm, included for compatibility." msgstr "" -#: doc/classes/BaseMaterial3D.xml:626 +#: doc/classes/BaseMaterial3D.xml:656 msgid "Toon blob which changes size based on roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:629 +#: doc/classes/BaseMaterial3D.xml:659 msgid "No specular blob." msgstr "" -#: doc/classes/BaseMaterial3D.xml:632 +#: doc/classes/BaseMaterial3D.xml:662 msgid "Billboard mode is disabled." msgstr "" -#: doc/classes/BaseMaterial3D.xml:635 +#: doc/classes/BaseMaterial3D.xml:665 msgid "The object's Z axis will always face the camera." msgstr "" -#: doc/classes/BaseMaterial3D.xml:638 +#: doc/classes/BaseMaterial3D.xml:668 msgid "The object's X axis will always face the camera." msgstr "" -#: doc/classes/BaseMaterial3D.xml:641 +#: doc/classes/BaseMaterial3D.xml:671 msgid "" "Used for particle systems when assigned to [GPUParticles3D] and " "[CPUParticles3D] nodes. Enables [code]particles_anim_*[/code] properties.\n" @@ -9810,45 +9280,45 @@ msgid "" "anim_speed] should also be set to a positive value for the animation to play." msgstr "" -#: doc/classes/BaseMaterial3D.xml:645 +#: doc/classes/BaseMaterial3D.xml:675 msgid "Used to read from the red channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:648 +#: doc/classes/BaseMaterial3D.xml:678 msgid "Used to read from the green channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:651 +#: doc/classes/BaseMaterial3D.xml:681 msgid "Used to read from the blue channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:654 +#: doc/classes/BaseMaterial3D.xml:684 msgid "Used to read from the alpha channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:657 +#: doc/classes/BaseMaterial3D.xml:687 msgid "Currently unused." msgstr "" -#: doc/classes/BaseMaterial3D.xml:660 +#: doc/classes/BaseMaterial3D.xml:690 msgid "Adds the emission color to the color from the emission texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:663 +#: doc/classes/BaseMaterial3D.xml:693 msgid "Multiplies the emission color by the color from the emission texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:666 +#: doc/classes/BaseMaterial3D.xml:696 msgid "Do not use distance fade." msgstr "" -#: doc/classes/BaseMaterial3D.xml:669 +#: doc/classes/BaseMaterial3D.xml:699 msgid "" "Smoothly fades the object out based on each pixel's distance from the camera " "using the alpha channel." msgstr "" -#: doc/classes/BaseMaterial3D.xml:672 +#: doc/classes/BaseMaterial3D.xml:702 msgid "" "Smoothly fades the object out based on each pixel's distance from the camera " "using a dither approach. Dithering discards pixels based on a set pattern to " @@ -9856,7 +9326,7 @@ msgid "" "faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:675 +#: doc/classes/BaseMaterial3D.xml:705 msgid "" "Smoothly fades the object out based on the object's distance from the camera " "using a dither approach. Dithering discards pixels based on a set pattern to " @@ -10530,176 +10000,181 @@ msgid "" "scenes than manually changing the position of [CanvasItem]-based nodes.\n" "This node is intended to be a simple helper to get things going quickly and " "it may happen that more functionality is desired to change how the camera " -"works. To make your own custom camera node, simply inherit from [Node2D] and " -"change the transform of the canvas by calling get_viewport()." -"set_canvas_transform(m) in [Viewport]." +"works. To make your own custom camera node, inherit from [Node2D] and change " +"the transform of the canvas by setting [member Viewport.canvas_transform] in " +"[Viewport] (you can obtain the current [Viewport] by using [method Node." +"get_viewport]).\n" +"Note that the [Camera2D] node's [code]position[/code] doesn't represent the " +"actual position of the screen, which may differ due to applied smoothing or " +"limits. You can use [method get_camera_screen_center] to get the real " +"position." msgstr "" -#: doc/classes/Camera2D.xml:17 +#: doc/classes/Camera2D.xml:18 msgid "Aligns the camera to the tracked node." msgstr "" -#: doc/classes/Camera2D.xml:24 +#: doc/classes/Camera2D.xml:25 msgid "" "Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-" "assigned camera." msgstr "" -#: doc/classes/Camera2D.xml:31 +#: doc/classes/Camera2D.xml:32 msgid "Forces the camera to update scroll immediately." msgstr "" -#: doc/classes/Camera2D.xml:38 +#: doc/classes/Camera2D.xml:39 msgid "Returns the camera position." msgstr "" -#: doc/classes/Camera2D.xml:45 +#: doc/classes/Camera2D.xml:46 msgid "" "Returns the location of the [Camera2D]'s screen-center, relative to the " "origin." msgstr "" -#: doc/classes/Camera2D.xml:54 +#: doc/classes/Camera2D.xml:55 msgid "" "Returns the specified margin. See also [member drag_margin_bottom], [member " "drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." msgstr "" -#: doc/classes/Camera2D.xml:63 +#: doc/classes/Camera2D.xml:64 msgid "" "Returns the specified camera limit. See also [member limit_bottom], [member " "limit_top], [member limit_left], and [member limit_right]." msgstr "" -#: doc/classes/Camera2D.xml:70 +#: doc/classes/Camera2D.xml:71 msgid "" "Make this the current 2D camera for the scene (viewport and layer), in case " "there are many cameras in the scene." msgstr "" -#: doc/classes/Camera2D.xml:77 +#: doc/classes/Camera2D.xml:78 msgid "" "Sets the camera's position immediately to its current smoothing " "destination.\n" "This has no effect if smoothing is disabled." msgstr "" -#: doc/classes/Camera2D.xml:89 +#: doc/classes/Camera2D.xml:90 msgid "" "Sets the specified margin. See also [member drag_margin_bottom], [member " "drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." msgstr "" -#: doc/classes/Camera2D.xml:100 +#: doc/classes/Camera2D.xml:101 msgid "" "Sets the specified camera limit. See also [member limit_bottom], [member " "limit_top], [member limit_left], and [member limit_right]." msgstr "" -#: doc/classes/Camera2D.xml:106 +#: doc/classes/Camera2D.xml:107 msgid "The Camera2D's anchor point. See [enum AnchorMode] constants." msgstr "" -#: doc/classes/Camera2D.xml:109 +#: doc/classes/Camera2D.xml:110 msgid "" "If [code]true[/code], the camera is the active camera for the current scene. " "Only one camera can be current, so setting a different camera [code]current[/" "code] will disable this one." msgstr "" -#: doc/classes/Camera2D.xml:112 +#: doc/classes/Camera2D.xml:113 msgid "" "The custom [Viewport] node attached to the [Camera2D]. If [code]null[/code] " "or not a [Viewport], uses the default viewport instead." msgstr "" -#: doc/classes/Camera2D.xml:115 +#: doc/classes/Camera2D.xml:116 msgid "" "Bottom margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -#: doc/classes/Camera2D.xml:118 +#: doc/classes/Camera2D.xml:119 msgid "" "If [code]true[/code], the camera only moves when reaching the horizontal " "drag margins. If [code]false[/code], the camera moves horizontally " "regardless of margins." msgstr "" -#: doc/classes/Camera2D.xml:121 +#: doc/classes/Camera2D.xml:122 msgid "" "Left margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -#: doc/classes/Camera2D.xml:124 +#: doc/classes/Camera2D.xml:125 msgid "" "Right margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -#: doc/classes/Camera2D.xml:127 +#: doc/classes/Camera2D.xml:128 msgid "" "Top margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -#: doc/classes/Camera2D.xml:130 +#: doc/classes/Camera2D.xml:131 msgid "" "If [code]true[/code], the camera only moves when reaching the vertical drag " "margins. If [code]false[/code], the camera moves vertically regardless of " "margins." msgstr "" -#: doc/classes/Camera2D.xml:133 +#: doc/classes/Camera2D.xml:134 msgid "" "If [code]true[/code], draws the camera's drag margin rectangle in the editor." msgstr "" -#: doc/classes/Camera2D.xml:136 +#: doc/classes/Camera2D.xml:137 msgid "" "If [code]true[/code], draws the camera's limits rectangle in the editor." msgstr "" -#: doc/classes/Camera2D.xml:139 +#: doc/classes/Camera2D.xml:140 msgid "" "If [code]true[/code], draws the camera's screen rectangle in the editor." msgstr "" -#: doc/classes/Camera2D.xml:142 +#: doc/classes/Camera2D.xml:143 msgid "" "Bottom scroll limit in pixels. The camera stops moving when reaching this " "value." msgstr "" -#: doc/classes/Camera2D.xml:145 +#: doc/classes/Camera2D.xml:146 msgid "" "Left scroll limit in pixels. The camera stops moving when reaching this " "value." msgstr "" -#: doc/classes/Camera2D.xml:148 +#: doc/classes/Camera2D.xml:149 msgid "" "Right scroll limit in pixels. The camera stops moving when reaching this " "value." msgstr "" -#: doc/classes/Camera2D.xml:151 +#: doc/classes/Camera2D.xml:152 msgid "" "If [code]true[/code], the camera smoothly stops when reaches its limits." msgstr "" -#: doc/classes/Camera2D.xml:154 +#: doc/classes/Camera2D.xml:155 msgid "" "Top scroll limit in pixels. The camera stops moving when reaching this value." msgstr "" -#: doc/classes/Camera2D.xml:157 +#: doc/classes/Camera2D.xml:158 msgid "" "The camera's offset, useful for looking around or camera shake animations." msgstr "" -#: doc/classes/Camera2D.xml:160 +#: doc/classes/Camera2D.xml:161 msgid "" "The horizontal offset of the camera, relative to the drag margins.\n" "[b]Note:[/b] Offset H is used only to force offset relative to margins. It's " @@ -10707,33 +10182,33 @@ msgid "" "initial offset." msgstr "" -#: doc/classes/Camera2D.xml:164 +#: doc/classes/Camera2D.xml:165 msgid "" "The vertical offset of the camera, relative to the drag margins.\n" "[b]Note:[/b] Used the same as [member offset_h]." msgstr "" -#: doc/classes/Camera2D.xml:168 +#: doc/classes/Camera2D.xml:169 msgid "The camera's process callback. See [enum Camera2DProcessMode]." msgstr "" -#: doc/classes/Camera2D.xml:171 +#: doc/classes/Camera2D.xml:172 msgid "If [code]true[/code], the camera rotates with the target." msgstr "" -#: doc/classes/Camera2D.xml:174 +#: doc/classes/Camera2D.xml:175 msgid "" "If [code]true[/code], the camera smoothly moves towards the target at " "[member smoothing_speed]." msgstr "" -#: doc/classes/Camera2D.xml:177 +#: doc/classes/Camera2D.xml:178 msgid "" "Speed in pixels per second of the camera's smoothing effect when [member " "smoothing_enabled] is [code]true[/code]." msgstr "" -#: doc/classes/Camera2D.xml:180 +#: doc/classes/Camera2D.xml:181 msgid "" "The camera's zoom relative to the viewport. Values larger than " "[code]Vector2(1, 1)[/code] zoom out and smaller values zoom in. For an " @@ -10741,23 +10216,23 @@ msgid "" "[code]Vector2(4, 4)[/code] for a 4× zoom-out." msgstr "" -#: doc/classes/Camera2D.xml:185 +#: doc/classes/Camera2D.xml:186 msgid "" "The camera's position is fixed so that the top-left corner is always at the " "origin." msgstr "" -#: doc/classes/Camera2D.xml:188 +#: doc/classes/Camera2D.xml:189 msgid "" "The camera's position takes into account vertical/horizontal offsets and the " "screen size." msgstr "" -#: doc/classes/Camera2D.xml:191 doc/classes/ClippedCamera3D.xml:104 +#: doc/classes/Camera2D.xml:192 doc/classes/ClippedCamera3D.xml:104 msgid "The camera updates with the [code]_physics_process[/code] callback." msgstr "" -#: doc/classes/Camera2D.xml:194 doc/classes/ClippedCamera3D.xml:107 +#: doc/classes/Camera2D.xml:195 doc/classes/ClippedCamera3D.xml:107 msgid "The camera updates with the [code]_process[/code] callback." msgstr "" @@ -11019,6 +10494,72 @@ msgid "" "Audio's [code]pitch shift[/code])." msgstr "" +#: doc/classes/CameraEffects.xml:4 +msgid "" +"Contains camera-specific effects such as depth of field and exposure " +"override." +msgstr "" + +#: doc/classes/CameraEffects.xml:7 +msgid "" +"Contains camera-specific effects such as depth of field and exposure " +"override.\n" +"See also [Environment] for general 3D environment settings." +msgstr "" + +#: doc/classes/CameraEffects.xml:16 +msgid "" +"The amount of blur for both near and far depth-of-field effects. The amount " +"of blur increases the radius of the blur effect, making the affected area " +"blurrier. However, If the amount is too high, you might start to see lines " +"appearing, especially when using a low quality blur." +msgstr "" + +#: doc/classes/CameraEffects.xml:19 +msgid "" +"The distance from the camera where the far blur effect affects the rendering." +msgstr "" + +#: doc/classes/CameraEffects.xml:22 +msgid "" +"If [code]true[/code], enables the depth-of-field far blur effect. This has a " +"significant performance cost. Consider disabling it in scenes where there " +"are no far away objects." +msgstr "" + +#: doc/classes/CameraEffects.xml:25 +msgid "The length of the transition between the no-blur area and far blur." +msgstr "" + +#: doc/classes/CameraEffects.xml:28 +msgid "" +"Distance from the camera where the near blur effect affects the rendering." +msgstr "" + +#: doc/classes/CameraEffects.xml:31 +msgid "" +"If [code]true[/code], enables the depth-of-field near blur effect. This has " +"a significant performance cost. Consider disabling it in scenes where there " +"are no nearby objects." +msgstr "" + +#: doc/classes/CameraEffects.xml:34 +msgid "The length of the transition between the near blur and no-blur area." +msgstr "" + +#: doc/classes/CameraEffects.xml:37 +msgid "" +"The exposure override value to use. Higher values will result in a brighter " +"scene. Only effective if [member override_exposure_enable] is [code]true[/" +"code]." +msgstr "" + +#: doc/classes/CameraEffects.xml:40 +msgid "" +"If [code]true[/code], overrides the manual or automatic exposure defined in " +"the [Environment] with the value in [member override_exposure]." +msgstr "" + #: doc/classes/CameraFeed.xml:4 msgid "" "A camera feed gives you access to a single physical camera attached to your " @@ -11029,7 +10570,7 @@ msgstr "" msgid "" "A camera feed gives you access to a single physical camera attached to your " "device. When enabled, Godot will start capturing frames from the camera " -"which can then be used.\n" +"which can then be used. See also [CameraServer].\n" "[b]Note:[/b] Many cameras will return YCbCr images which are split into two " "textures and need to be combined in a shader. Godot does this automatically " "for you if you set the environment to show the camera image in the " @@ -11044,50 +10585,54 @@ msgstr "" msgid "" "The [CameraServer] keeps track of different cameras accessible in Godot. " "These are external cameras such as webcams or the cameras on your phone.\n" -"It is notably used to provide AR modules with a video feed from the camera." +"It is notably used to provide AR modules with a video feed from the camera.\n" +"[b]Note:[/b] This class is currently only implemented on macOS and iOS. On " +"other platforms, no [CameraFeed]s will be available." msgstr "" -#: doc/classes/CameraServer.xml:19 -msgid "Adds a camera feed to the camera server." +#: doc/classes/CameraServer.xml:20 +msgid "Adds the camera [code]feed[/code] to the camera server." msgstr "" -#: doc/classes/CameraServer.xml:26 +#: doc/classes/CameraServer.xml:27 msgid "Returns an array of [CameraFeed]s." msgstr "" -#: doc/classes/CameraServer.xml:35 -msgid "Returns the [CameraFeed] with this id." +#: doc/classes/CameraServer.xml:36 +msgid "" +"Returns the [CameraFeed] corresponding to the camera with the given " +"[code]index[/code]." msgstr "" -#: doc/classes/CameraServer.xml:42 +#: doc/classes/CameraServer.xml:43 msgid "Returns the number of [CameraFeed]s registered." msgstr "" -#: doc/classes/CameraServer.xml:51 -msgid "Removes a [CameraFeed]." +#: doc/classes/CameraServer.xml:52 +msgid "Removes the specified camera [code]feed[/code]." msgstr "" -#: doc/classes/CameraServer.xml:60 -msgid "Emitted when a [CameraFeed] is added (e.g. webcam is plugged in)." +#: doc/classes/CameraServer.xml:61 +msgid "Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in)." msgstr "" -#: doc/classes/CameraServer.xml:67 -msgid "Emitted when a [CameraFeed] is removed (e.g. webcam is unplugged)." +#: doc/classes/CameraServer.xml:68 +msgid "Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged)." msgstr "" -#: doc/classes/CameraServer.xml:73 +#: doc/classes/CameraServer.xml:74 msgid "The RGBA camera image." msgstr "" -#: doc/classes/CameraServer.xml:76 -msgid "The YCbCr camera image." +#: doc/classes/CameraServer.xml:77 +msgid "The [url=https://en.wikipedia.org/wiki/YCbCr]YCbCr[/url] camera image." msgstr "" -#: doc/classes/CameraServer.xml:79 +#: doc/classes/CameraServer.xml:80 msgid "The Y component camera image." msgstr "" -#: doc/classes/CameraServer.xml:82 +#: doc/classes/CameraServer.xml:83 msgid "The CbCr component camera image." msgstr "" @@ -11143,97 +10688,100 @@ msgid "" "its children) and self modulation (only for itself), as well as its blend " "mode.\n" "Ultimately, a transform notification can be requested, which will notify the " -"node that its global position changed in case the parent tree changed." +"node that its global position changed in case the parent tree changed.\n" +"[b]Note:[/b] Unless otherwise specified, all methods that have angle " +"parameters must have angles specified as [i]radians[/i]. To convert degrees " +"to radians, use [method @GDScript.deg2rad]." msgstr "" -#: doc/classes/CanvasItem.xml:14 doc/classes/CanvasLayer.xml:10 +#: doc/classes/CanvasItem.xml:15 doc/classes/CanvasLayer.xml:10 #: doc/classes/InputEvent.xml:11 doc/classes/Viewport.xml:15 msgid "https://docs.godotengine.org/en/latest/tutorials/2d/2d_transforms.html" msgstr "" -#: doc/classes/CanvasItem.xml:15 doc/classes/Control.xml:19 +#: doc/classes/CanvasItem.xml:16 doc/classes/Control.xml:19 #: doc/classes/Node2D.xml:10 msgid "" "https://docs.godotengine.org/en/latest/tutorials/2d/custom_drawing_in_2d.html" msgstr "" -#: doc/classes/CanvasItem.xml:22 +#: doc/classes/CanvasItem.xml:23 msgid "" "Overridable function called by the engine (if defined) to draw the canvas " "item." msgstr "" -#: doc/classes/CanvasItem.xml:43 +#: doc/classes/CanvasItem.xml:44 msgid "" "Draws an arc between the given angles. The larger the value of " "[code]point_count[/code], the smoother the curve." msgstr "" -#: doc/classes/CanvasItem.xml:60 +#: doc/classes/CanvasItem.xml:61 msgid "" "Draws a string character using a custom font. Returns the advance, depending " "on the character width and kerning with an optional next character." msgstr "" -#: doc/classes/CanvasItem.xml:73 +#: doc/classes/CanvasItem.xml:74 msgid "Draws a colored circle." msgstr "" -#: doc/classes/CanvasItem.xml:98 +#: doc/classes/CanvasItem.xml:99 msgid "Draws a colored polygon of any amount of points, convex or concave." msgstr "" -#: doc/classes/CanvasItem.xml:113 +#: doc/classes/CanvasItem.xml:114 msgid "Draws a line from a 2D point to another, with a given color and width." msgstr "" -#: doc/classes/CanvasItem.xml:138 +#: doc/classes/CanvasItem.xml:139 msgid "" "Draws a [Mesh] in 2D, using the provided texture. See [MeshInstance2D] for " "related documentation." msgstr "" -#: doc/classes/CanvasItem.xml:151 +#: doc/classes/CanvasItem.xml:152 msgid "Draws multiple, parallel lines with a uniform [code]color[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:164 +#: doc/classes/CanvasItem.xml:165 msgid "" "Draws multiple, parallel lines with a uniform [code]width[/code] and segment-" "by-segment coloring. Colors assigned to line segments match by index between " "[code]points[/code] and [code]colors[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:185 +#: doc/classes/CanvasItem.xml:186 msgid "" "Draws a [MultiMesh] in 2D with the provided texture. See " "[MultiMeshInstance2D] for related documentation." msgstr "" -#: doc/classes/CanvasItem.xml:210 +#: doc/classes/CanvasItem.xml:211 msgid "Draws a polygon of any amount of points, convex or concave." msgstr "" -#: doc/classes/CanvasItem.xml:223 +#: doc/classes/CanvasItem.xml:224 msgid "" "Draws interconnected line segments with a uniform [code]color[/code] and " "[code]width[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:236 +#: doc/classes/CanvasItem.xml:237 msgid "" "Draws interconnected line segments with a uniform [code]width[/code] and " "segment-by-segment coloring. Colors assigned to line segments match by index " "between [code]points[/code] and [code]colors[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:263 +#: doc/classes/CanvasItem.xml:264 msgid "" "Draws a custom primitive. 1 point for a point, 2 points for a line, 3 points " "for a triangle, and 4 points for a quad." msgstr "" -#: doc/classes/CanvasItem.xml:278 +#: doc/classes/CanvasItem.xml:279 msgid "" "Draws a rectangle. If [code]filled[/code] is [code]true[/code], the " "rectangle will be filled with the [code]color[/code] specified. If " @@ -11243,272 +10791,278 @@ msgid "" "[code]false[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:292 +#: doc/classes/CanvasItem.xml:293 msgid "" "Sets a custom transform for drawing via components. Anything drawn " "afterwards will be transformed by this." msgstr "" -#: doc/classes/CanvasItem.xml:301 +#: doc/classes/CanvasItem.xml:302 msgid "" "Sets a custom transform for drawing via matrix. Anything drawn afterwards " "will be transformed by this." msgstr "" -#: doc/classes/CanvasItem.xml:318 +#: doc/classes/CanvasItem.xml:319 msgid "Draws a string using a custom font." msgstr "" -#: doc/classes/CanvasItem.xml:329 +#: doc/classes/CanvasItem.xml:330 msgid "Draws a styled rectangle." msgstr "" -#: doc/classes/CanvasItem.xml:352 +#: doc/classes/CanvasItem.xml:353 msgid "Draws a texture at a given position." msgstr "" -#: doc/classes/CanvasItem.xml:379 +#: doc/classes/CanvasItem.xml:380 msgid "" "Draws a textured rectangle at a given position, optionally modulated by a " "color. If [code]transpose[/code] is [code]true[/code], the texture will have " "its X and Y coordinates swapped." msgstr "" -#: doc/classes/CanvasItem.xml:408 +#: doc/classes/CanvasItem.xml:409 msgid "" "Draws a textured rectangle region at a given position, optionally modulated " "by a color. If [code]transpose[/code] is [code]true[/code], the texture will " "have its X and Y coordinates swapped." msgstr "" -#: doc/classes/CanvasItem.xml:415 doc/classes/Node3D.xml:18 +#: doc/classes/CanvasItem.xml:416 doc/classes/Node3D.xml:19 msgid "" "Forces the transform to update. Transform changes in physics are not instant " "for performance reasons. Transforms are accumulated and then set. Use this " "if you need an up-to-date transform when doing physics operations." msgstr "" -#: doc/classes/CanvasItem.xml:422 +#: doc/classes/CanvasItem.xml:423 msgid "Returns the [RID] of the [World2D] canvas where this item is in." msgstr "" -#: doc/classes/CanvasItem.xml:429 +#: doc/classes/CanvasItem.xml:430 msgid "Returns the canvas item RID used by [RenderingServer] for this item." msgstr "" -#: doc/classes/CanvasItem.xml:436 +#: doc/classes/CanvasItem.xml:437 msgid "Returns the transform matrix of this item's canvas." msgstr "" -#: doc/classes/CanvasItem.xml:443 +#: doc/classes/CanvasItem.xml:444 msgid "Returns the global position of the mouse." msgstr "" -#: doc/classes/CanvasItem.xml:450 +#: doc/classes/CanvasItem.xml:451 msgid "Returns the global transform matrix of this item." msgstr "" -#: doc/classes/CanvasItem.xml:457 +#: doc/classes/CanvasItem.xml:458 msgid "" "Returns the global transform matrix of this item in relation to the canvas." msgstr "" -#: doc/classes/CanvasItem.xml:464 +#: doc/classes/CanvasItem.xml:465 msgid "Returns the mouse position relative to this item's position." msgstr "" -#: doc/classes/CanvasItem.xml:471 +#: doc/classes/CanvasItem.xml:472 msgid "Returns the transform matrix of this item." msgstr "" -#: doc/classes/CanvasItem.xml:478 +#: doc/classes/CanvasItem.xml:479 msgid "Returns the viewport's boundaries as a [Rect2]." msgstr "" -#: doc/classes/CanvasItem.xml:485 +#: doc/classes/CanvasItem.xml:486 msgid "Returns this item's transform in relation to the viewport." msgstr "" -#: doc/classes/CanvasItem.xml:492 +#: doc/classes/CanvasItem.xml:493 msgid "Returns the [World2D] where this item is in." msgstr "" -#: doc/classes/CanvasItem.xml:499 +#: doc/classes/CanvasItem.xml:500 msgid "Hide the [CanvasItem] if it's currently visible." msgstr "" -#: doc/classes/CanvasItem.xml:506 +#: doc/classes/CanvasItem.xml:507 msgid "" "Returns [code]true[/code] if local transform notifications are communicated " "to children." msgstr "" -#: doc/classes/CanvasItem.xml:513 +#: doc/classes/CanvasItem.xml:514 msgid "" "Returns [code]true[/code] if the node is set as top-level. See [method " "set_as_toplevel]." msgstr "" -#: doc/classes/CanvasItem.xml:520 +#: doc/classes/CanvasItem.xml:521 msgid "" "Returns [code]true[/code] if global transform notifications are communicated " "to children." msgstr "" -#: doc/classes/CanvasItem.xml:527 +#: doc/classes/CanvasItem.xml:528 msgid "" "Returns [code]true[/code] if the node is present in the [SceneTree], its " "[member visible] property is [code]true[/code] and its inherited visibility " "is also [code]true[/code]." msgstr "" -#: doc/classes/CanvasItem.xml:536 +#: doc/classes/CanvasItem.xml:537 msgid "Assigns [code]screen_point[/code] as this node's new local transform." msgstr "" -#: doc/classes/CanvasItem.xml:545 +#: doc/classes/CanvasItem.xml:546 msgid "" "Transformations issued by [code]event[/code]'s inputs are applied in local " "space instead of global space." msgstr "" -#: doc/classes/CanvasItem.xml:554 +#: doc/classes/CanvasItem.xml:555 msgid "" "If [code]enable[/code] is [code]true[/code], the node won't inherit its " "transform from parent canvas items." msgstr "" -#: doc/classes/CanvasItem.xml:563 +#: doc/classes/CanvasItem.xml:564 msgid "" "If [code]enable[/code] is [code]true[/code], children will be updated with " "local transform data." msgstr "" -#: doc/classes/CanvasItem.xml:572 +#: doc/classes/CanvasItem.xml:573 msgid "" "If [code]enable[/code] is [code]true[/code], children will be updated with " "global transform data." msgstr "" -#: doc/classes/CanvasItem.xml:579 +#: doc/classes/CanvasItem.xml:580 msgid "" "Show the [CanvasItem] if it's currently hidden. For controls that inherit " "[Popup], the correct way to make them visible is to call one of the multiple " "[code]popup*()[/code] functions instead." msgstr "" -#: doc/classes/CanvasItem.xml:586 +#: doc/classes/CanvasItem.xml:587 msgid "" "Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " "called on idle time to request redraw." msgstr "" -#: doc/classes/CanvasItem.xml:592 +#: doc/classes/CanvasItem.xml:593 msgid "" "The rendering layers in which this [CanvasItem] responds to [Light2D] nodes." msgstr "" -#: doc/classes/CanvasItem.xml:595 +#: doc/classes/CanvasItem.xml:596 msgid "The material applied to textures on this [CanvasItem]." msgstr "" -#: doc/classes/CanvasItem.xml:598 +#: doc/classes/CanvasItem.xml:599 msgid "The color applied to textures on this [CanvasItem]." msgstr "" -#: doc/classes/CanvasItem.xml:601 +#: doc/classes/CanvasItem.xml:602 msgid "" "The color applied to textures on this [CanvasItem]. This is not inherited by " "children [CanvasItem]s." msgstr "" -#: doc/classes/CanvasItem.xml:604 +#: doc/classes/CanvasItem.xml:605 msgid "If [code]true[/code], the object draws behind its parent." msgstr "" -#: doc/classes/CanvasItem.xml:607 +#: doc/classes/CanvasItem.xml:608 msgid "If [code]true[/code], the object draws on top of its parent." msgstr "" -#: doc/classes/CanvasItem.xml:614 +#: doc/classes/CanvasItem.xml:615 msgid "" "If [code]true[/code], the parent [CanvasItem]'s [member material] property " "is used as this one's material." msgstr "" -#: doc/classes/CanvasItem.xml:617 +#: doc/classes/CanvasItem.xml:618 msgid "" "If [code]true[/code], this [CanvasItem] is drawn. For controls that inherit " "[Popup], the correct way to make them visible is to call one of the multiple " "[code]popup*()[/code] functions instead." msgstr "" -#: doc/classes/CanvasItem.xml:623 +#: doc/classes/CanvasItem.xml:624 msgid "" "Emitted when the [CanvasItem] must redraw. This can only be connected " "realtime, as deferred will not allow drawing." msgstr "" -#: doc/classes/CanvasItem.xml:628 +#: doc/classes/CanvasItem.xml:629 msgid "Emitted when becoming hidden." msgstr "" -#: doc/classes/CanvasItem.xml:633 +#: doc/classes/CanvasItem.xml:634 msgid "Emitted when the item rect has changed." msgstr "" -#: doc/classes/CanvasItem.xml:638 +#: doc/classes/CanvasItem.xml:639 msgid "Emitted when the visibility (hidden/visible) changes." msgstr "" -#: doc/classes/CanvasItem.xml:644 +#: doc/classes/CanvasItem.xml:645 msgid "" "The [CanvasItem]'s transform has changed. This notification is only received " "if enabled by [method set_notify_transform] or [method " "set_notify_local_transform]." msgstr "" -#: doc/classes/CanvasItem.xml:647 +#: doc/classes/CanvasItem.xml:648 msgid "The [CanvasItem] is requested to draw." msgstr "" -#: doc/classes/CanvasItem.xml:650 +#: doc/classes/CanvasItem.xml:651 msgid "The [CanvasItem]'s visibility has changed." msgstr "" -#: doc/classes/CanvasItem.xml:653 +#: doc/classes/CanvasItem.xml:654 msgid "The [CanvasItem] has entered the canvas." msgstr "" -#: doc/classes/CanvasItem.xml:656 +#: doc/classes/CanvasItem.xml:657 msgid "The [CanvasItem] has exited the canvas." msgstr "" -#: doc/classes/CanvasItem.xml:659 doc/classes/CanvasItem.xml:679 +#: doc/classes/CanvasItem.xml:660 doc/classes/CanvasItem.xml:680 msgid "The [CanvasItem] will inherit the filter from its parent." msgstr "" -#: doc/classes/CanvasItem.xml:662 +#: doc/classes/CanvasItem.xml:663 msgid "" "The texture filter reads from the nearest pixel only. The simplest and " "fastest method of filtering. Useful for pixel art." msgstr "" -#: doc/classes/CanvasItem.xml:682 +#: doc/classes/CanvasItem.xml:666 +msgid "" +"The texture filter blends between the nearest four pixels. Use this for most " +"cases where you want to avoid a pixelated style." +msgstr "" + +#: doc/classes/CanvasItem.xml:683 msgid "Texture will not repeat." msgstr "" -#: doc/classes/CanvasItem.xml:685 +#: doc/classes/CanvasItem.xml:686 msgid "Texture will repeat normally." msgstr "" -#: doc/classes/CanvasItem.xml:688 +#: doc/classes/CanvasItem.xml:689 msgid "" "Texture will repeat in a 2x2 tiled mode, where elements at even positions " "are mirrored." msgstr "" -#: doc/classes/CanvasItem.xml:691 +#: doc/classes/CanvasItem.xml:692 msgid "Represents the size of the [enum TextureRepeat] enum." msgstr "" @@ -12696,25 +12250,24 @@ msgid "" "component." msgstr "" -#: doc/classes/Color.xml:158 +#: doc/classes/Color.xml:160 msgid "" -"Returns a new color resulting from making this color lighter by the " -"specified percentage (ratio from 0 to 1).\n" +"Returns the linear interpolation with another color. The interpolation " +"factor [code]t[/code] is between 0 and 1.\n" "[codeblock]\n" -"var green = Color(0.0, 1.0, 0.0)\n" -"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n" +"var c1 = Color(1.0, 0.0, 0.0)\n" +"var c2 = Color(0.0, 1.0, 0.0)\n" +"var li_c = c1.lerp(c2, 0.5) # A color of an RGBA(128, 128, 0, 255)\n" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:173 +#: doc/classes/Color.xml:174 msgid "" -"Returns the linear interpolation with another color. The interpolation " -"factor [code]t[/code] is between 0 and 1.\n" +"Returns a new color resulting from making this color lighter by the " +"specified percentage (ratio from 0 to 1).\n" "[codeblock]\n" -"var c1 = Color(1.0, 0.0, 0.0)\n" -"var c2 = Color(0.0, 1.0, 0.0)\n" -"var li_c = c1.linear_interpolate(c2, 0.5) # A color of an RGBA(128, 128, 0, " -"255)\n" +"var green = Color(0.0, 1.0, 0.0)\n" +"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n" "[/codeblock]" msgstr "" @@ -13736,7 +13289,7 @@ msgid "" msgstr "" #: doc/classes/ConeTwistJoint3D.xml:77 doc/classes/Generic6DOFJoint3D.xml:404 -#: doc/classes/HingeJoint3D.xml:109 doc/classes/Light3D.xml:124 +#: doc/classes/HingeJoint3D.xml:109 doc/classes/Light3D.xml:145 #: doc/classes/SliderJoint3D.xml:170 msgid "Represents the size of the [enum Param] enum." msgstr "" @@ -14620,8 +14173,8 @@ msgstr "" #: doc/classes/Control.xml:801 msgid "" "Tells Godot which node it should give keyboard focus to if the user presses " -"Tab on a keyboard by default. You can change the key by editing the " -"[code]ui_focus_next[/code] input action.\n" +"[kbd]Tab[/kbd] on a keyboard by default. You can change the key by editing " +"the [code]ui_focus_next[/code] input action.\n" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" @@ -14629,8 +14182,8 @@ msgstr "" #: doc/classes/Control.xml:805 msgid "" "Tells Godot which node it should give keyboard focus to if the user presses " -"Shift+Tab on a keyboard by default. You can change the key by editing the " -"[code]ui_focus_prev[/code] input action.\n" +"[kbd]Shift + Tab[/kbd] on a keyboard by default. You can change the key by " +"editing the [code]ui_focus_prev[/code] input action.\n" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" @@ -14712,9 +14265,9 @@ msgstr "" #: doc/classes/Control.xml:841 msgid "" -"Enables whether rendering of children should be clipped to this control's " -"rectangle. If [code]true[/code], parts of a child which would be visibly " -"outside of this control's rectangle will not be rendered." +"Enables whether rendering of [CanvasItem] based children should be clipped " +"to this control's rectangle. If [code]true[/code], parts of a child which " +"would be visibly outside of this control's rectangle will not be rendered." msgstr "" #: doc/classes/Control.xml:844 @@ -16870,6 +16423,172 @@ msgid "" "stiffness multiplied by the size difference from its resting length." msgstr "" +#: doc/classes/Decal.xml:4 +msgid "Node that projects a texture onto a [MeshInstance3D]." +msgstr "" + +#: doc/classes/Decal.xml:7 +msgid "" +"[Decal]s are used to project a texture onto a [Mesh] in the scene. Use " +"Decals to add detail to a scene without affecting the underlying [Mesh]. " +"They are often used to add weathering to building, add dirt or mud to the " +"ground, or add variety to props. Decals can be moved at any time, making " +"them suitable for things like blob shadows or laser sight dots.\n" +"They are made of an [AABB] and a group of [Texture2D]s specifying [Color], " +"normal, ORM (ambient occlusion, roughness, metallic), and emission. Decals " +"are projected within their [AABB] so altering the orientation of the Decal " +"affects the direction in which they are projected. By default, Decals are " +"projected down (i.e. from positive Y to negative Y).\n" +"The [Texture2D]s associated with the Decal are automatically stored in a " +"texture atlas which is used for drawing the decals so all decals can be " +"drawn at once. Godot uses clustered decals, meaning they are stored in " +"cluster data and drawn when the mesh is drawn, they are not drawn as a " +"postprocessing effect after." +msgstr "" + +#: doc/classes/Decal.xml:20 +msgid "" +"Returns the [Texture2D] associated with the specified [enum DecalTexture]. " +"This is a convenience method, in most cases you should access the texture " +"directly. \n" +"For example, instead of [code]albedo_tex = $Decal.get_texture(Decal." +"TEXTURE_ALBEDO)[/code], use [code]albedo_tex = $Decal.texture_albedo[/" +"code].\n" +"One case where this is better than accessing the texture directly is when " +"you want to copy one Decal's textures to another. For example:\n" +"[codeblock]\n" +"for i in Decal.TEXTURE_MAX:\n" +" $NewDecal.set_texture(i, $OldDecal.get_texture(i))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Decal.xml:37 +msgid "" +"Sets the [Texture2D] associated with the specified [enum DecalTexture]. This " +"is a convenience method, in most cases you should access the texture " +"directly. \n" +"For example, instead of [code]$Decal.set_texture(Decal.TEXTURE_ALBEDO, " +"albedo_tex)[/code], use [code]$Decal.texture_albedo = albedo_tex[/code].\n" +"One case where this is better than accessing the texture directly is when " +"you want to copy one Decal's textures to another. For example:\n" +"[codeblock]\n" +"for i in Decal.TEXTURE_MAX:\n" +" $NewDecal.set_texture(i, $OldDecal.get_texture(i))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Decal.xml:49 +msgid "" +"Blends the albedo [Color] of the decal with albedo [Color] of the underlying " +"mesh." +msgstr "" + +#: doc/classes/Decal.xml:52 +msgid "" +"Specifies which [member VisualInstance3D.layers] this decal will project on. " +"By default, Decals affect all layers. This is used so you can specify which " +"types of objects receive the Decal and which do not. This is especially " +"useful so you an ensure that dynamic objects don't accidentally receive a " +"Decal intended for the terrain under them." +msgstr "" + +#: doc/classes/Decal.xml:55 +msgid "Distance from the camera at which the Decal begins to fade away." +msgstr "" + +#: doc/classes/Decal.xml:58 +msgid "" +"If [code]true[/code], decals will smoothly fade away when far from the " +"active [Camera3D] starting at [member distance_fade_begin]. The Decal will " +"fade out over [member distance_fade_length], after which it will be culled " +"and not sent to the shader at all. Use this to reduce the number of active " +"Decals in a scene and thus improve performance." +msgstr "" + +#: doc/classes/Decal.xml:61 +msgid "" +"Distance over which the Decal fades. The Decal becomes slowly more " +"transparent over this distance and is completely invisible at the end." +msgstr "" + +#: doc/classes/Decal.xml:64 +msgid "" +"Energy multiplier for the emission texture. This will make the decal emit " +"light at a higher intensity." +msgstr "" + +#: doc/classes/Decal.xml:67 +msgid "" +"Sets the size of the [AABB] used by the decal. The AABB goes from [code]-" +"extents[/code] to [code]extents[/code]." +msgstr "" + +#: doc/classes/Decal.xml:70 doc/classes/Decal.xml:91 +msgid "" +"Sets the curve over which the decal will fade as the surface gets further " +"from the center of the [AABB]." +msgstr "" + +#: doc/classes/Decal.xml:73 +msgid "Changes the [Color] of the Decal by multiplying it with this value." +msgstr "" + +#: doc/classes/Decal.xml:76 +msgid "" +"Fades the Decal if the angle between the Decal's [AABB] and the target " +"surface becomes too large. A value of [code]0[/code] projects the Decal " +"regardless of angle, a value of [code]1[/code] limits the Decal to surfaces " +"that are nearly perpendicular." +msgstr "" + +#: doc/classes/Decal.xml:79 +msgid "" +"[Texture2D] with the base [Color] of the Decal. Either this or the [member " +"texture_emission] must be set for the Decal to be visible. Use the alpha " +"channel like a mask to smoothly blend the edges of the decal with the " +"underlying object." +msgstr "" + +#: doc/classes/Decal.xml:82 +msgid "" +"[Texture2D] with the emission [Color] of the Decal. Either this or the " +"[member texture_emission] must be set for the Decal to be visible. Use the " +"alpha channel like a mask to smoothly blend the edges of the decal with the " +"underlying object." +msgstr "" + +#: doc/classes/Decal.xml:85 +msgid "" +"[Texture2D] with the per-pixel normalmap for the decal. Use this to add " +"extra detail to decals." +msgstr "" + +#: doc/classes/Decal.xml:88 +msgid "" +"[Texture2D] storing ambient occlusion, roughness, and metallic for the " +"decal. Use this to add extra detail to decals." +msgstr "" + +#: doc/classes/Decal.xml:96 +msgid "[Texture2D] corresponding to [member texture_albedo]." +msgstr "" + +#: doc/classes/Decal.xml:99 +msgid "[Texture2D] corresponding to [member texture_normal]." +msgstr "" + +#: doc/classes/Decal.xml:102 +msgid "[Texture2D] corresponding to [member texture_orm]." +msgstr "" + +#: doc/classes/Decal.xml:105 +msgid "[Texture2D] corresponding to [member texture_emission]." +msgstr "" + +#: doc/classes/Decal.xml:108 +msgid "Max size of [enum DecalTexture] enum." +msgstr "" + #: doc/classes/Dictionary.xml:4 msgid "Dictionary type." msgstr "" @@ -16877,30 +16596,40 @@ msgstr "" #: doc/classes/Dictionary.xml:7 msgid "" "Dictionary type. Associative container which contains values referenced by " -"unique keys. Dictionary are composed of pairs of keys (which must be unique) " -"and values. You can define a dictionary by placing a comma separated list of " -"[code]key: value[/code] pairs in curly braces [code]{}[/code].\n" -"Erasing elements while iterating over them [b]is not supported[/b].\n" +"unique keys. Dictionaries are composed of pairs of keys (which must be " +"unique) and values. Dictionaries will preserve the insertion order when " +"adding elements, even though this may not be reflected when printing the " +"dictionary. In other programming languages, this data structure is sometimes " +"referred to as an hash map or associative array.\n" +"You can define a dictionary by placing a comma-separated list of [code]key: " +"value[/code] pairs in curly braces [code]{}[/code].\n" +"Erasing elements while iterating over them [b]is not supported[/b] and will " +"result in undefined behavior.\n" "Creating a dictionary:\n" "[codeblock]\n" "var my_dir = {} # Creates an empty dictionary.\n" "var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" -"var my_dir = {\n" +"var another_dir = {\n" " key1: value1,\n" " key2: value2,\n" " key3: value3,\n" "}\n" "[/codeblock]\n" -"You can access values of a dictionary by referencing appropriate key in " -"above example [code]points_dir[\"White\"][/code] would return value of 50.\n" +"You can access a dictionary's values by referencing the appropriate key. In " +"the above example, [code]points_dir[\"White\"][/code] will return [code]50[/" +"code]. You can also write [code]points_dir.White[/code], which is " +"equivalent. However, you'll have to use the bracket syntax if the key you're " +"accessing the dictionary with isn't a fixed string (such as a number or " +"variable).\n" "[codeblock]\n" "export(String, \"White\", \"Yellow\", \"Orange\") var my_color\n" "var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" "\n" "func _ready():\n" +" # We can't use dot syntax here as `my_color` is a variable.\n" " var points = points_dir[my_color]\n" "[/codeblock]\n" -"In the above code [code]points[/code] will be assigned the value that is " +"In the above code, [code]points[/code] will be assigned the value that is " "paired with the appropriate color selected in [code]my_color[/code].\n" "Dictionaries can contain more complex data:\n" "[codeblock]\n" @@ -16911,16 +16640,24 @@ msgid "" "assign to it:\n" "[codeblock]\n" "var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" -"var points_dir[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its " +"points_dir[\"Blue\"] = 150 # Add \"Blue\" as a key and assign 150 as its " "value.\n" "[/codeblock]\n" "Finally, dictionaries can contain different types of keys and values in the " "same dictionary:\n" "[codeblock]\n" -"var my_dir = {\"String Key\": 5, 4: [1, 2, 3], 7: \"Hello\"} # This is a " -"valid dictionary.\n" +"# This is a valid dictionary.\n" +"# To access the string \"Nested value\" below, use `my_dir.sub_dir.sub_key` " +"or `my_dir[\"sub_dir\"][\"sub_key\"]`.\n" +"# Indexing styles can be mixed and matched depending on your needs.\n" +"var my_dir = {\n" +" \"String Key\": 5,\n" +" 4: [1, 2, 3],\n" +" 7: \"Hello\",\n" +" \"sub_dir\": {\"sub_key\": \"Nested value\"},\n" +"}\n" "[/codeblock]\n" -"[b]Note:[/b] Unlike [Array]s you can't compare dictionaries directly:\n" +"[b]Note:[/b] Unlike [Array]s, you can't compare dictionaries directly:\n" "[codeblock]\n" "array1 = [1, 2, 3]\n" "array2 = [1, 2, 3]\n" @@ -16945,49 +16682,52 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Dictionary.xml:65 +#: doc/classes/Dictionary.xml:75 msgid "" "https://docs.godotengine.org/en/latest/getting_started/scripting/gdscript/" "gdscript_basics.html#dictionary" msgstr "" -#: doc/classes/Dictionary.xml:72 +#: doc/classes/Dictionary.xml:82 msgid "Clear the dictionary, removing all key/value pairs." msgstr "" -#: doc/classes/Dictionary.xml:81 -msgid "Creates a copy of the dictionary, and returns it." +#: doc/classes/Dictionary.xml:91 +msgid "" +"Creates a copy of the dictionary, and returns it. The [code]deep[/code] " +"parameter causes inner dictionaries and arrays to be copied recursively, but " +"does not apply to objects." msgstr "" -#: doc/classes/Dictionary.xml:88 +#: doc/classes/Dictionary.xml:98 msgid "Returns [code]true[/code] if the dictionary is empty." msgstr "" -#: doc/classes/Dictionary.xml:97 +#: doc/classes/Dictionary.xml:107 msgid "" "Erase a dictionary key/value pair by key. Returns [code]true[/code] if the " "given key was present in the dictionary, [code]false[/code] otherwise. Does " "not erase elements while iterating over the dictionary." msgstr "" -#: doc/classes/Dictionary.xml:108 +#: doc/classes/Dictionary.xml:118 msgid "" "Returns the current value for the specified key in the [Dictionary]. If the " "key does not exist, the method returns the value of the optional default " "argument, or [code]null[/code] if it is omitted." msgstr "" -#: doc/classes/Dictionary.xml:117 +#: doc/classes/Dictionary.xml:127 msgid "Returns [code]true[/code] if the dictionary has a given key." msgstr "" -#: doc/classes/Dictionary.xml:126 +#: doc/classes/Dictionary.xml:136 msgid "" "Returns [code]true[/code] if the dictionary has all of the keys in the given " "array." msgstr "" -#: doc/classes/Dictionary.xml:133 +#: doc/classes/Dictionary.xml:143 msgid "" "Returns a hashed integer value representing the dictionary contents. This " "can be used to compare dictionaries by value:\n" @@ -17000,15 +16740,15 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Dictionary.xml:146 +#: doc/classes/Dictionary.xml:156 msgid "Returns the list of keys in the [Dictionary]." msgstr "" -#: doc/classes/Dictionary.xml:153 +#: doc/classes/Dictionary.xml:163 msgid "Returns the size of the dictionary (in pairs)." msgstr "" -#: doc/classes/Dictionary.xml:160 +#: doc/classes/Dictionary.xml:170 msgid "Returns the list of values in the [Dictionary]." msgstr "" @@ -17034,37 +16774,42 @@ msgstr "" #: doc/classes/DirectionalLight3D.xml:16 msgid "" -"Amount of extra bias for shadow splits that are far away. If self-shadowing " -"occurs only on the splits far away, increasing this value can fix them." +"If [code]true[/code], shadow detail is sacrificed in exchange for smoother " +"transitions between splits." msgstr "" #: doc/classes/DirectionalLight3D.xml:19 msgid "" -"If [code]true[/code], shadow detail is sacrificed in exchange for smoother " -"transitions between splits." +"Optimizes shadow rendering for detail versus movement. See [enum " +"ShadowDepthRange]." msgstr "" #: doc/classes/DirectionalLight3D.xml:22 msgid "" -"Optimizes shadow rendering for detail versus movement. See [enum " -"ShadowDepthRange]." +"Proportion of [member directional_shadow_max_distance] at which point the " +"shadow starts to fade. At [member directional_shadow_max_distance] the " +"shadow will disappear." msgstr "" -#: doc/classes/DirectionalLight3D.xml:27 +#: doc/classes/DirectionalLight3D.xml:25 msgid "The maximum distance for shadow splits." msgstr "" -#: doc/classes/DirectionalLight3D.xml:30 +#: doc/classes/DirectionalLight3D.xml:28 msgid "The light's shadow rendering algorithm. See [enum ShadowMode]." msgstr "" -#: doc/classes/DirectionalLight3D.xml:33 +#: doc/classes/DirectionalLight3D.xml:31 doc/classes/RenderingServer.xml:3371 msgid "" -"Can be used to fix special cases of self shadowing when objects are " -"perpendicular to the light." +"Sets the size of the directional shadow pancake. The pancake offsets the " +"start of the shadow's camera frustum to provide a higher effective depth " +"resolution for the shadow. However, a high pancake size can cause artifacts " +"in the shadows of large objects that are close to the edge of the frustum. " +"Reducing the pancake size can help. Setting the size to [code]0[/code] turns " +"off the pancaking effect." msgstr "" -#: doc/classes/DirectionalLight3D.xml:36 +#: doc/classes/DirectionalLight3D.xml:34 msgid "" "The distance from camera to shadow split 1. Relative to [member " "directional_shadow_max_distance]. Only used when [member " @@ -17072,7 +16817,7 @@ msgid "" "[code]SHADOW_PARALLEL_4_SPLITS[/code]." msgstr "" -#: doc/classes/DirectionalLight3D.xml:39 +#: doc/classes/DirectionalLight3D.xml:37 msgid "" "The distance from shadow split 1 to split 2. Relative to [member " "directional_shadow_max_distance]. Only used when [member " @@ -17080,34 +16825,34 @@ msgid "" "[code]SHADOW_PARALLEL_4_SPLITS[/code]." msgstr "" -#: doc/classes/DirectionalLight3D.xml:42 +#: doc/classes/DirectionalLight3D.xml:40 msgid "" "The distance from shadow split 2 to split 3. Relative to [member " "directional_shadow_max_distance]. Only used when [member " "directional_shadow_mode] is [code]SHADOW_PARALLEL_4_SPLITS[/code]." msgstr "" -#: doc/classes/DirectionalLight3D.xml:48 +#: doc/classes/DirectionalLight3D.xml:45 msgid "" "Renders the entire scene's shadow map from an orthogonal point of view. May " "result in blockier shadows on close objects." msgstr "" -#: doc/classes/DirectionalLight3D.xml:51 +#: doc/classes/DirectionalLight3D.xml:48 msgid "Splits the view frustum in 2 areas, each with its own shadow map." msgstr "" -#: doc/classes/DirectionalLight3D.xml:54 +#: doc/classes/DirectionalLight3D.xml:51 msgid "Splits the view frustum in 4 areas, each with its own shadow map." msgstr "" -#: doc/classes/DirectionalLight3D.xml:57 +#: doc/classes/DirectionalLight3D.xml:54 msgid "" "Keeps the shadow stable when the camera moves, at the cost of lower " "effective shadow resolution." msgstr "" -#: doc/classes/DirectionalLight3D.xml:60 +#: doc/classes/DirectionalLight3D.xml:57 msgid "" "Tries to achieve maximum shadow resolution. May result in saw effect on " "shadow edges." @@ -17397,61 +17142,67 @@ msgid "" "dynamic_font.font_data = load(\"res://BarlowCondensed-Bold.ttf\")\n" "dynamic_font.size = 64\n" "$\"Label\".set(\"custom_fonts/font\", dynamic_font)\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] DynamicFont doesn't support features such as right-to-left " +"typesetting, ligatures, text shaping, variable fonts and optional font " +"features yet. If you wish to \"bake\" an optional font feature into a TTF " +"font file, you can use [url=https://fontforge.org/]FontForge[/url] to do so. " +"In FontForge, use [b]File > Generate Fonts[/b], click [b]Options[/b], choose " +"the desired features then generate the font." msgstr "" -#: doc/classes/DynamicFont.xml:25 +#: doc/classes/DynamicFont.xml:26 msgid "Adds a fallback font." msgstr "" -#: doc/classes/DynamicFont.xml:34 +#: doc/classes/DynamicFont.xml:35 msgid "Returns the fallback font at index [code]idx[/code]." msgstr "" -#: doc/classes/DynamicFont.xml:41 +#: doc/classes/DynamicFont.xml:42 msgid "Returns the number of fallback fonts." msgstr "" -#: doc/classes/DynamicFont.xml:50 +#: doc/classes/DynamicFont.xml:51 msgid "" "Returns the spacing for the given [code]type[/code] (see [enum SpacingType])." msgstr "" -#: doc/classes/DynamicFont.xml:59 +#: doc/classes/DynamicFont.xml:60 msgid "Removes the fallback font at index [code]idx[/code]." msgstr "" -#: doc/classes/DynamicFont.xml:70 +#: doc/classes/DynamicFont.xml:71 msgid "Sets the fallback font at index [code]idx[/code]." msgstr "" -#: doc/classes/DynamicFont.xml:81 +#: doc/classes/DynamicFont.xml:82 msgid "" "Sets the spacing for [code]type[/code] (see [enum SpacingType]) to " "[code]value[/code] in pixels (not relative to the font size)." msgstr "" -#: doc/classes/DynamicFont.xml:87 +#: doc/classes/DynamicFont.xml:88 msgid "Extra spacing at the bottom in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:90 +#: doc/classes/DynamicFont.xml:91 msgid "Extra character spacing in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:93 +#: doc/classes/DynamicFont.xml:94 msgid "Extra space spacing in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:96 +#: doc/classes/DynamicFont.xml:97 msgid "Extra spacing at the top in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:99 +#: doc/classes/DynamicFont.xml:100 msgid "The font data." msgstr "" -#: doc/classes/DynamicFont.xml:102 +#: doc/classes/DynamicFont.xml:103 msgid "" "The font outline's color.\n" "[b]Note:[/b] It's recommended to leave this at the default value so that you " @@ -17460,27 +17211,27 @@ msgid "" "outline modulate theme item." msgstr "" -#: doc/classes/DynamicFont.xml:106 +#: doc/classes/DynamicFont.xml:107 msgid "The font outline's thickness in pixels (not relative to the font size)." msgstr "" -#: doc/classes/DynamicFont.xml:109 +#: doc/classes/DynamicFont.xml:110 msgid "The font size in pixels." msgstr "" -#: doc/classes/DynamicFont.xml:114 +#: doc/classes/DynamicFont.xml:115 msgid "Spacing at the top." msgstr "" -#: doc/classes/DynamicFont.xml:117 +#: doc/classes/DynamicFont.xml:118 msgid "Spacing at the bottom." msgstr "" -#: doc/classes/DynamicFont.xml:120 +#: doc/classes/DynamicFont.xml:121 msgid "Character spacing." msgstr "" -#: doc/classes/DynamicFont.xml:123 +#: doc/classes/DynamicFont.xml:124 msgid "Space spacing." msgstr "" @@ -17595,7 +17346,7 @@ msgstr "" msgid "" "Saves the editor feature profile to a file in JSON format. It can then be " "imported using the feature profile manager's [b]Import[/b] button or the " -"[method load_from_file] button." +"[method load_from_file] button." msgstr "" #: doc/classes/EditorFeatureProfile.xml:86 @@ -17809,56 +17560,58 @@ msgstr "" #: doc/classes/EditorFileSystem.xml:7 msgid "" "This object holds information of all resources in the filesystem, their " -"types, etc." +"types, etc.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_resource_filesystem]." msgstr "" -#: doc/classes/EditorFileSystem.xml:18 +#: doc/classes/EditorFileSystem.xml:19 msgid "Gets the type of the file, given the full path." msgstr "" -#: doc/classes/EditorFileSystem.xml:25 +#: doc/classes/EditorFileSystem.xml:26 msgid "Gets the root directory object." msgstr "" -#: doc/classes/EditorFileSystem.xml:34 +#: doc/classes/EditorFileSystem.xml:35 msgid "Returns a view into the filesystem at [code]path[/code]." msgstr "" -#: doc/classes/EditorFileSystem.xml:41 +#: doc/classes/EditorFileSystem.xml:42 msgid "Returns the scan progress for 0 to 1 if the FS is being scanned." msgstr "" -#: doc/classes/EditorFileSystem.xml:48 +#: doc/classes/EditorFileSystem.xml:49 msgid "Returns [code]true[/code] of the filesystem is being scanned." msgstr "" -#: doc/classes/EditorFileSystem.xml:55 +#: doc/classes/EditorFileSystem.xml:56 msgid "Scan the filesystem for changes." msgstr "" -#: doc/classes/EditorFileSystem.xml:62 +#: doc/classes/EditorFileSystem.xml:63 msgid "Check if the source of any imported resource changed." msgstr "" -#: doc/classes/EditorFileSystem.xml:71 +#: doc/classes/EditorFileSystem.xml:72 msgid "" "Update a file information. Call this if an external program (not Godot) " "modified the file." msgstr "" -#: doc/classes/EditorFileSystem.xml:78 +#: doc/classes/EditorFileSystem.xml:79 msgid "Scans the script files and updates the list of custom class names." msgstr "" -#: doc/classes/EditorFileSystem.xml:85 +#: doc/classes/EditorFileSystem.xml:86 msgid "Emitted if the filesystem changed." msgstr "" -#: doc/classes/EditorFileSystem.xml:92 +#: doc/classes/EditorFileSystem.xml:93 msgid "Remitted if a resource is reimported." msgstr "" -#: doc/classes/EditorFileSystem.xml:105 +#: doc/classes/EditorFileSystem.xml:106 msgid "Emitted if the source of any imported file changed." msgstr "" @@ -18062,7 +17815,9 @@ msgid "" "editor. It's used to edit the properties of the selected node. For example, " "you can select a node such as the Sprite2D then edit its transform through " "the inspector tool. The editor inspector is an essential tool in the game " -"development workflow." +"development workflow.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_inspector]." msgstr "" #: doc/classes/EditorInspectorPlugin.xml:4 @@ -18132,95 +17887,97 @@ msgid "" "customizing the window, saving and (re-)loading scenes, rendering mesh " "previews, inspecting and editing resources and objects, and provides access " "to [EditorSettings], [EditorFileSystem], [EditorResourcePreview], " -"[ScriptEditor], the editor viewport, and information about scenes." +"[ScriptEditor], the editor viewport, and information about scenes.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorPlugin.get_editor_interface]." msgstr "" -#: doc/classes/EditorInterface.xml:18 +#: doc/classes/EditorInterface.xml:19 msgid "Edits the given [Resource]." msgstr "" -#: doc/classes/EditorInterface.xml:25 +#: doc/classes/EditorInterface.xml:26 msgid "" "Returns the main container of Godot editor's window. You can use it, for " "example, to retrieve the size of the container and place your controls " "accordingly." msgstr "" -#: doc/classes/EditorInterface.xml:38 +#: doc/classes/EditorInterface.xml:39 msgid "Returns the edited (current) scene's root [Node]." msgstr "" -#: doc/classes/EditorInterface.xml:45 +#: doc/classes/EditorInterface.xml:46 msgid "Returns the [EditorSettings]." msgstr "" -#: doc/classes/EditorInterface.xml:52 +#: doc/classes/EditorInterface.xml:53 msgid "Returns the editor [Viewport]." msgstr "" -#: doc/classes/EditorInterface.xml:71 +#: doc/classes/EditorInterface.xml:72 msgid "Returns an [Array] with the file paths of the currently opened scenes." msgstr "" -#: doc/classes/EditorInterface.xml:78 +#: doc/classes/EditorInterface.xml:79 msgid "Returns the [EditorFileSystem]." msgstr "" -#: doc/classes/EditorInterface.xml:85 +#: doc/classes/EditorInterface.xml:86 msgid "Returns the [EditorResourcePreview]." msgstr "" -#: doc/classes/EditorInterface.xml:92 +#: doc/classes/EditorInterface.xml:93 msgid "Returns the [ScriptEditor]." msgstr "" -#: doc/classes/EditorInterface.xml:105 +#: doc/classes/EditorInterface.xml:106 msgid "Returns the [EditorSelection]." msgstr "" -#: doc/classes/EditorInterface.xml:116 +#: doc/classes/EditorInterface.xml:117 msgid "" "Shows the given property on the given [code]object[/code] in the Editor's " "Inspector dock." msgstr "" -#: doc/classes/EditorInterface.xml:125 +#: doc/classes/EditorInterface.xml:126 msgid "" "Returns the enabled status of a plugin. The plugin name is the same as its " "directory name." msgstr "" -#: doc/classes/EditorInterface.xml:136 +#: doc/classes/EditorInterface.xml:137 msgid "" "Returns mesh previews rendered at the given size as an [Array] of " "[Texture2D]s." msgstr "" -#: doc/classes/EditorInterface.xml:145 +#: doc/classes/EditorInterface.xml:146 msgid "Opens the scene at the given path." msgstr "" -#: doc/classes/EditorInterface.xml:154 +#: doc/classes/EditorInterface.xml:155 msgid "Reloads the scene at the given path." msgstr "" -#: doc/classes/EditorInterface.xml:161 +#: doc/classes/EditorInterface.xml:162 msgid "" "Saves the scene. Returns either [code]OK[/code] or [code]ERR_CANT_CREATE[/" "code] (see [@GlobalScope] constants)." msgstr "" -#: doc/classes/EditorInterface.xml:172 +#: doc/classes/EditorInterface.xml:173 msgid "Saves the scene as a file at [code]path[/code]." msgstr "" -#: doc/classes/EditorInterface.xml:181 +#: doc/classes/EditorInterface.xml:182 msgid "" "Selects the file, with the path provided by [code]file[/code], in the " "FileSystem dock." msgstr "" -#: doc/classes/EditorInterface.xml:208 +#: doc/classes/EditorInterface.xml:209 msgid "" "Sets the enabled status of a plugin. The plugin name is the same as its " "directory name." @@ -18833,57 +18590,57 @@ msgstr "" msgid "Used by the inspector, when the property is checked." msgstr "" -#: doc/classes/EditorProperty.xml:82 +#: doc/classes/EditorProperty.xml:84 msgid "Used by the inspector, when the property must draw with error color." msgstr "" -#: doc/classes/EditorProperty.xml:85 +#: doc/classes/EditorProperty.xml:87 msgid "Used by the inspector, when the property can add keys for animation." msgstr "" -#: doc/classes/EditorProperty.xml:88 +#: doc/classes/EditorProperty.xml:90 msgid "Sets this property to change the label (if you want to show one)." msgstr "" -#: doc/classes/EditorProperty.xml:91 +#: doc/classes/EditorProperty.xml:93 msgid "Used by the inspector, when the property is read-only." msgstr "" -#: doc/classes/EditorProperty.xml:101 +#: doc/classes/EditorProperty.xml:103 msgid "" "Emit it if you want multiple properties modified at the same time. Do not " "use if added via [method EditorInspectorPlugin.parse_property]." msgstr "" -#: doc/classes/EditorProperty.xml:110 +#: doc/classes/EditorProperty.xml:112 msgid "Used by sub-inspectors. Emit it if what was selected was an Object ID." msgstr "" -#: doc/classes/EditorProperty.xml:119 +#: doc/classes/EditorProperty.xml:121 msgid "" "Do not emit this manually, use the [method emit_changed] method instead." msgstr "" -#: doc/classes/EditorProperty.xml:128 +#: doc/classes/EditorProperty.xml:130 msgid "Emitted when a property was checked. Used internally." msgstr "" -#: doc/classes/EditorProperty.xml:135 +#: doc/classes/EditorProperty.xml:143 msgid "" "Emit it if you want to add this value as an animation key (check for keying " "being enabled first)." msgstr "" -#: doc/classes/EditorProperty.xml:144 +#: doc/classes/EditorProperty.xml:152 msgid "Emit it if you want to key a property with a single value." msgstr "" -#: doc/classes/EditorProperty.xml:153 +#: doc/classes/EditorProperty.xml:161 msgid "" "If you want a sub-resource to be edited, emit this signal with the resource." msgstr "" -#: doc/classes/EditorProperty.xml:162 +#: doc/classes/EditorProperty.xml:170 msgid "Emitted when selected. Used internally." msgstr "" @@ -18892,20 +18649,23 @@ msgid "Helper to generate previews of resources or files." msgstr "" #: doc/classes/EditorResourcePreview.xml:7 -msgid "This object is used to generate previews for resources of files." +msgid "" +"This object is used to generate previews for resources of files.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_resource_previewer]." msgstr "" -#: doc/classes/EditorResourcePreview.xml:18 +#: doc/classes/EditorResourcePreview.xml:19 msgid "Create an own, custom preview generator." msgstr "" -#: doc/classes/EditorResourcePreview.xml:27 +#: doc/classes/EditorResourcePreview.xml:28 msgid "" "Check if the resource changed, if so, it will be invalidated and the " "corresponding signal emitted." msgstr "" -#: doc/classes/EditorResourcePreview.xml:42 +#: doc/classes/EditorResourcePreview.xml:43 msgid "" "Queue a resource being edited for preview (using an instance). Once the " "preview is ready, your receiver.receiver_func will be called either " @@ -18914,7 +18674,7 @@ msgid "" "can be anything." msgstr "" -#: doc/classes/EditorResourcePreview.xml:57 +#: doc/classes/EditorResourcePreview.xml:58 msgid "" "Queue a resource file for preview (using a path). Once the preview is ready, " "your receiver.receiver_func will be called either containing the preview " @@ -18922,11 +18682,11 @@ msgid "" "the format: (path,texture,userdata). Userdata can be anything." msgstr "" -#: doc/classes/EditorResourcePreview.xml:66 +#: doc/classes/EditorResourcePreview.xml:67 msgid "Removes a custom preview generator." msgstr "" -#: doc/classes/EditorResourcePreview.xml:75 +#: doc/classes/EditorResourcePreview.xml:76 msgid "" "Emitted if a preview was invalidated (changed). [code]path[/code] " "corresponds to the path of the preview." @@ -19084,7 +18844,7 @@ msgstr "" msgid "" "Scripts extending this class and implementing its [method _run] method can " "be executed from the Script Editor's [b]File > Run[/b] menu option (or by " -"pressing [code]Ctrl+Shift+X[/code]) while the editor is running. This is " +"pressing [kbd]Ctrl + Shift + X[/kbd]) while the editor is running. This is " "useful for adding custom in-editor functionality to Godot. For more complex " "additions, consider using [EditorPlugin]s instead.\n" "[b]Note:[/b] Extending scripts need to have [code]tool[/code] mode enabled.\n" @@ -19124,33 +18884,36 @@ msgid "Manages the SceneTree selection in the editor." msgstr "" #: doc/classes/EditorSelection.xml:7 -msgid "This object manages the SceneTree selection in the editor." +msgid "" +"This object manages the SceneTree selection in the editor.\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_selection]." msgstr "" -#: doc/classes/EditorSelection.xml:18 +#: doc/classes/EditorSelection.xml:19 msgid "Adds a node to the selection." msgstr "" -#: doc/classes/EditorSelection.xml:25 +#: doc/classes/EditorSelection.xml:26 msgid "Clear the selection." msgstr "" -#: doc/classes/EditorSelection.xml:32 +#: doc/classes/EditorSelection.xml:33 msgid "Gets the list of selected nodes." msgstr "" -#: doc/classes/EditorSelection.xml:39 +#: doc/classes/EditorSelection.xml:40 msgid "" "Gets the list of selected nodes, optimized for transform operations (i.e. " "moving them, rotating, etc). This list avoids situations where a node is " "selected and also child/grandchild." msgstr "" -#: doc/classes/EditorSelection.xml:48 +#: doc/classes/EditorSelection.xml:49 msgid "Removes a node from the selection." msgstr "" -#: doc/classes/EditorSelection.xml:55 +#: doc/classes/EditorSelection.xml:56 msgid "Emitted when the selection changes." msgstr "" @@ -19167,10 +18930,12 @@ msgid "" "settings.set(prop,value)\n" "settings.get(prop)\n" "list_of_settings = settings.get_property_list()\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_editor_settings]." msgstr "" -#: doc/classes/EditorSettings.xml:24 +#: doc/classes/EditorSettings.xml:25 msgid "" "Adds a custom property info to a property. The dictionary must contain:\n" "- [code]name[/code]: [String] (the name of the property)\n" @@ -19192,27 +18957,27 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/EditorSettings.xml:49 +#: doc/classes/EditorSettings.xml:50 msgid "Erase a given setting (pass full property path)." msgstr "" -#: doc/classes/EditorSettings.xml:56 +#: doc/classes/EditorSettings.xml:57 msgid "Gets the list of favorite files and directories for this project." msgstr "" -#: doc/classes/EditorSettings.xml:75 +#: doc/classes/EditorSettings.xml:76 msgid "" "Gets the specific project settings path. Projects all have a unique sub-" "directory inside the settings path where project specific settings are saved." msgstr "" -#: doc/classes/EditorSettings.xml:82 +#: doc/classes/EditorSettings.xml:83 msgid "" "Gets the list of recently visited folders in the file dialog for this " "project." msgstr "" -#: doc/classes/EditorSettings.xml:97 +#: doc/classes/EditorSettings.xml:98 msgid "" "Gets the global settings path for the engine. Inside this path, you can find " "some standard paths such as:\n" @@ -19220,21 +18985,21 @@ msgid "" "[code]settings/templates[/code] - Where export templates are located" msgstr "" -#: doc/classes/EditorSettings.xml:132 +#: doc/classes/EditorSettings.xml:133 msgid "Sets the list of favorite files and directories for this project." msgstr "" -#: doc/classes/EditorSettings.xml:165 +#: doc/classes/EditorSettings.xml:166 msgid "" "Sets the list of recently visited folders in the file dialog for this " "project." msgstr "" -#: doc/classes/EditorSettings.xml:182 +#: doc/classes/EditorSettings.xml:183 msgid "Emitted when editor settings change." msgstr "" -#: doc/classes/EditorSettings.xml:188 +#: doc/classes/EditorSettings.xml:189 msgid "" "Emitted when editor settings change. It used by various editor plugins to " "update their visuals on theme changes or logic on configuration changes." @@ -19977,7 +19742,7 @@ msgid "" "is visible, \"ghost trail\" artifacts will be visible when moving the camera." msgstr "" -#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3476 +#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3563 msgid "Displays a camera feed in the background." msgstr "" @@ -19985,64 +19750,103 @@ msgstr "" msgid "Represents the size of the [enum BGMode] enum." msgstr "" -#: doc/classes/Environment.xml:282 +#: doc/classes/Environment.xml:268 doc/classes/RenderingServer.xml:3569 +msgid "" +"Gather ambient light from whichever source is specified as the background." +msgstr "" + +#: doc/classes/Environment.xml:271 doc/classes/RenderingServer.xml:3572 +msgid "Disable ambient light." +msgstr "" + +#: doc/classes/Environment.xml:274 doc/classes/RenderingServer.xml:3575 +msgid "Specify a specific [Color] for ambient light." +msgstr "" + +#: doc/classes/Environment.xml:277 doc/classes/RenderingServer.xml:3578 +msgid "" +"Gather ambient light from the [Sky] regardless of what the background is." +msgstr "" + +#: doc/classes/Environment.xml:280 doc/classes/RenderingServer.xml:3581 +msgid "Use the background for reflections." +msgstr "" + +#: doc/classes/Environment.xml:283 doc/classes/RenderingServer.xml:3584 +msgid "Disable reflections." +msgstr "" + +#: doc/classes/Environment.xml:286 doc/classes/RenderingServer.xml:3587 +msgid "Use the [Sky] for reflections regardless of what the background is." +msgstr "" + +#: doc/classes/Environment.xml:289 doc/classes/RenderingServer.xml:3590 msgid "" "Additive glow blending mode. Mostly used for particles, glows (bloom), lens " "flare, bright sources." msgstr "" -#: doc/classes/Environment.xml:285 +#: doc/classes/Environment.xml:292 doc/classes/RenderingServer.xml:3593 msgid "" "Screen glow blending mode. Increases brightness, used frequently with bloom." msgstr "" -#: doc/classes/Environment.xml:288 +#: doc/classes/Environment.xml:295 doc/classes/RenderingServer.xml:3596 msgid "" "Soft light glow blending mode. Modifies contrast, exposes shadows and " "highlights (vivid bloom)." msgstr "" -#: doc/classes/Environment.xml:291 +#: doc/classes/Environment.xml:298 doc/classes/RenderingServer.xml:3599 msgid "" "Replace glow blending mode. Replaces all pixels' color by the glow value. " "This can be used to simulate a full-screen blur effect by tweaking the glow " "parameters to match the original image's brightness." msgstr "" -#: doc/classes/Environment.xml:296 +#: doc/classes/Environment.xml:301 doc/classes/RenderingServer.xml:3602 +msgid "" +"Mixes the glow with the underlying color to avoid increasing brightness as " +"much while still maintaining a glow effect." +msgstr "" + +#: doc/classes/Environment.xml:304 msgid "" "Linear tonemapper operator. Reads the linear data and passes it on " "unmodified." msgstr "" -#: doc/classes/Environment.xml:299 +#: doc/classes/Environment.xml:307 msgid "" "Reinhardt tonemapper operator. Performs a variation on rendered pixels' " "colors by this formula: [code]color = color / (1 + color)[/code]." msgstr "" -#: doc/classes/Environment.xml:302 +#: doc/classes/Environment.xml:310 msgid "Filmic tonemapper operator." msgstr "" -#: doc/classes/Environment.xml:305 +#: doc/classes/Environment.xml:313 msgid "Academy Color Encoding System tonemapper operator." msgstr "" -#: doc/classes/Environment.xml:308 +#: doc/classes/Environment.xml:316 msgid "No blur for the screen-space ambient occlusion effect (fastest)." msgstr "" -#: doc/classes/Environment.xml:311 +#: doc/classes/Environment.xml:319 msgid "1×1 blur for the screen-space ambient occlusion effect." msgstr "" -#: doc/classes/Environment.xml:314 +#: doc/classes/Environment.xml:322 msgid "2×2 blur for the screen-space ambient occlusion effect." msgstr "" -#: doc/classes/Environment.xml:317 -msgid "3×3 blur for the screen-space ambient occlusion effect (slowest)." +#: doc/classes/Environment.xml:325 +msgid "" +"3×3 blur for the screen-space ambient occlusion effect. Increases the radius " +"of the blur for a smoother look, but can result in checkerboard-like " +"artifacts." msgstr "" #: doc/classes/Expression.xml:4 @@ -20303,26 +20107,38 @@ msgid "" msgstr "" #: doc/classes/File.xml:299 -msgid "Stores an integer as 16 bits in the file." +msgid "" +"Stores an integer as 16 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, " +"2^16 - 1][/code]." msgstr "" -#: doc/classes/File.xml:308 -msgid "Stores an integer as 32 bits in the file." +#: doc/classes/File.xml:309 +msgid "" +"Stores an integer as 32 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, " +"2^32 - 1][/code]." msgstr "" -#: doc/classes/File.xml:317 -msgid "Stores an integer as 64 bits in the file." +#: doc/classes/File.xml:319 +msgid "" +"Stores an integer as 64 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] must lie in the interval [code][-2^63, " +"2^63 - 1][/code] (i.e. be a valid [int] value)." msgstr "" -#: doc/classes/File.xml:326 -msgid "Stores an integer as 8 bits in the file." +#: doc/classes/File.xml:329 +msgid "" +"Stores an integer as 8 bits in the file.\n" +"[b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, 255]" +"[/code]." msgstr "" -#: doc/classes/File.xml:335 +#: doc/classes/File.xml:339 msgid "Stores the given array of bytes in the file." msgstr "" -#: doc/classes/File.xml:346 +#: doc/classes/File.xml:350 msgid "" "Store the given [PackedStringArray] in the file as a line formatted in the " "CSV (Comma-Separated Values) format. You can pass a different delimiter " @@ -20331,45 +20147,45 @@ msgid "" "Text will be encoded as UTF-8." msgstr "" -#: doc/classes/File.xml:356 +#: doc/classes/File.xml:360 msgid "Stores a floating-point number as 64 bits in the file." msgstr "" -#: doc/classes/File.xml:365 +#: doc/classes/File.xml:369 msgid "Stores a floating-point number as 32 bits in the file." msgstr "" -#: doc/classes/File.xml:374 +#: doc/classes/File.xml:378 msgid "" "Stores the given [String] as a line in the file.\n" "Text will be encoded as UTF-8." msgstr "" -#: doc/classes/File.xml:384 +#: doc/classes/File.xml:388 msgid "" "Stores the given [String] as a line in the file in Pascal format (i.e. also " "store the length of the string).\n" "Text will be encoded as UTF-8." msgstr "" -#: doc/classes/File.xml:394 +#: doc/classes/File.xml:398 msgid "Stores a floating-point number in the file." msgstr "" -#: doc/classes/File.xml:403 +#: doc/classes/File.xml:407 msgid "" "Stores the given [String] in the file.\n" "Text will be encoded as UTF-8." msgstr "" -#: doc/classes/File.xml:415 +#: doc/classes/File.xml:419 msgid "" "Stores any Variant value in the file. If [code]full_objects[/code] is " "[code]true[/code], encoding objects is allowed (and can potentially include " "code)." msgstr "" -#: doc/classes/File.xml:421 +#: doc/classes/File.xml:425 msgid "" "If [code]true[/code], the file's endianness is swapped. Use this if you're " "dealing with files written on big-endian machines.\n" @@ -20377,44 +20193,44 @@ msgid "" "reset to [code]false[/code] whenever you open the file." msgstr "" -#: doc/classes/File.xml:427 +#: doc/classes/File.xml:431 msgid "Opens the file for read operations." msgstr "" -#: doc/classes/File.xml:430 +#: doc/classes/File.xml:434 msgid "" "Opens the file for write operations. Create it if the file does not exist " "and truncate if it exists." msgstr "" -#: doc/classes/File.xml:433 +#: doc/classes/File.xml:437 msgid "" "Opens the file for read and write operations. Does not truncate the file." msgstr "" -#: doc/classes/File.xml:436 +#: doc/classes/File.xml:440 msgid "" "Opens the file for read and write operations. Create it if the file does not " "exist and truncate if it exists." msgstr "" -#: doc/classes/File.xml:439 +#: doc/classes/File.xml:443 msgid "Uses the [url=http://fastlz.org/]FastLZ[/url] compression method." msgstr "" -#: doc/classes/File.xml:442 +#: doc/classes/File.xml:446 msgid "" "Uses the [url=https://en.wikipedia.org/wiki/DEFLATE]DEFLATE[/url] " "compression method." msgstr "" -#: doc/classes/File.xml:445 +#: doc/classes/File.xml:449 msgid "" "Uses the [url=https://facebook.github.io/zstd/]Zstandard[/url] compression " "method." msgstr "" -#: doc/classes/File.xml:448 +#: doc/classes/File.xml:452 msgid "Uses the [url=https://www.gzip.org/]gzip[/url] compression method." msgstr "" @@ -20718,7 +20534,7 @@ msgstr "" msgid "" "A GDNative library can implement [NativeScript]s, global functions to call " "with the [GDNative] class, or low-level engine extensions through interfaces " -"such as [ARVRInterfaceGDNative]. The library must be compiled for each " +"such as [XRInterfaceGDNative]. The library must be compiled for each " "platform and architecture that the project will run on." msgstr "" @@ -21673,99 +21489,99 @@ msgid "" "object." msgstr "" -#: doc/classes/GeometryInstance3D.xml:27 +#: doc/classes/GeometryInstance3D.xml:35 msgid "" "Overrides the bounding box of this node with a custom one. To remove it, set " "an [AABB] with all fields set to zero." msgstr "" -#: doc/classes/GeometryInstance3D.xml:38 +#: doc/classes/GeometryInstance3D.xml:46 msgid "" "Sets the [enum GeometryInstance3D.Flags] specified. See [enum " "GeometryInstance3D.Flags] for options." msgstr "" -#: doc/classes/GeometryInstance3D.xml:44 +#: doc/classes/GeometryInstance3D.xml:62 msgid "" "The selected shadow casting flag. See [enum ShadowCastingSetting] for " "possible values." msgstr "" -#: doc/classes/GeometryInstance3D.xml:47 +#: doc/classes/GeometryInstance3D.xml:65 msgid "" "The extra distance added to the GeometryInstance3D's bounding box ([AABB]) " "to increase its cull box." msgstr "" -#: doc/classes/GeometryInstance3D.xml:50 +#: doc/classes/GeometryInstance3D.xml:68 msgid "" "The GeometryInstance3D's max LOD distance.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance3D.xml:54 +#: doc/classes/GeometryInstance3D.xml:72 msgid "" "The GeometryInstance3D's max LOD margin.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance3D.xml:58 +#: doc/classes/GeometryInstance3D.xml:76 msgid "" "The GeometryInstance3D's min LOD distance.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance3D.xml:62 +#: doc/classes/GeometryInstance3D.xml:80 msgid "" "The GeometryInstance3D's min LOD margin.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance3D.xml:66 +#: doc/classes/GeometryInstance3D.xml:84 msgid "" "The material override for the whole geometry.\n" "If a material is assigned to this property, it will be used instead of any " "material set in any material slot of the mesh." msgstr "" -#: doc/classes/GeometryInstance3D.xml:72 +#: doc/classes/GeometryInstance3D.xml:90 msgid "" "If [code]true[/code], this GeometryInstance3D will be used when baking " "lights using a [GIProbe]." msgstr "" -#: doc/classes/GeometryInstance3D.xml:77 +#: doc/classes/GeometryInstance3D.xml:95 msgid "Will not cast any shadows." msgstr "" -#: doc/classes/GeometryInstance3D.xml:80 +#: doc/classes/GeometryInstance3D.xml:98 msgid "" "Will cast shadows from all visible faces in the GeometryInstance3D.\n" "Will take culling into account, so faces not being rendered will not be " "taken into account when shadow casting." msgstr "" -#: doc/classes/GeometryInstance3D.xml:84 +#: doc/classes/GeometryInstance3D.xml:102 msgid "" "Will cast shadows from all visible faces in the GeometryInstance3D.\n" "Will not take culling into account, so all faces will be taken into account " "when shadow casting." msgstr "" -#: doc/classes/GeometryInstance3D.xml:88 +#: doc/classes/GeometryInstance3D.xml:106 msgid "" "Will only show the shadows casted from this object.\n" "In other words, the actual mesh will not be visible, only the shadows casted " "from the mesh will be." msgstr "" -#: doc/classes/GeometryInstance3D.xml:92 +#: doc/classes/GeometryInstance3D.xml:110 msgid "" "Will allow the GeometryInstance3D to be used when baking lights using a " "[GIProbe]." msgstr "" -#: doc/classes/GeometryInstance3D.xml:97 +#: doc/classes/GeometryInstance3D.xml:115 msgid "" "Unused in this class, exposed for consistency with [enum RenderingServer." "InstanceFlags]." @@ -22235,7 +22051,7 @@ msgid "" msgstr "" #: doc/classes/GraphEdit.xml:243 -msgid "Emitted when the user presses [code]Ctrl + C[/code]." +msgid "Emitted when the user presses [kbd]Ctrl + C[/kbd]." msgstr "" #: doc/classes/GraphEdit.xml:248 @@ -22258,65 +22074,65 @@ msgstr "" msgid "Emitted when a GraphNode is selected." msgstr "" -#: doc/classes/GraphEdit.xml:278 -msgid "Emitted when the user presses [code]Ctrl + V[/code]." +#: doc/classes/GraphEdit.xml:284 +msgid "Emitted when the user presses [kbd]Ctrl + V[/kbd]." msgstr "" -#: doc/classes/GraphEdit.xml:285 +#: doc/classes/GraphEdit.xml:291 msgid "" "Emitted when a popup is requested. Happens on right-clicking in the " "GraphEdit. [code]position[/code] is the position of the mouse pointer when " "the signal is sent." msgstr "" -#: doc/classes/GraphEdit.xml:292 +#: doc/classes/GraphEdit.xml:298 msgid "" "Emitted when the scroll offset is changed by the user. It will not be " "emitted when changed in code." msgstr "" -#: doc/classes/GraphEdit.xml:306 +#: doc/classes/GraphEdit.xml:312 msgid "The background drawn under the grid." msgstr "" -#: doc/classes/GraphEdit.xml:309 +#: doc/classes/GraphEdit.xml:315 msgid "Color of major grid lines." msgstr "" -#: doc/classes/GraphEdit.xml:312 +#: doc/classes/GraphEdit.xml:318 msgid "Color of minor grid lines." msgstr "" -#: doc/classes/GraphEdit.xml:315 +#: doc/classes/GraphEdit.xml:321 msgid "The icon for the zoom out button." msgstr "" -#: doc/classes/GraphEdit.xml:318 +#: doc/classes/GraphEdit.xml:324 msgid "The icon for the zoom in button." msgstr "" -#: doc/classes/GraphEdit.xml:321 +#: doc/classes/GraphEdit.xml:327 msgid "" "The horizontal range within which a port can be grabbed (on both sides)." msgstr "" -#: doc/classes/GraphEdit.xml:324 +#: doc/classes/GraphEdit.xml:330 msgid "The vertical range within which a port can be grabbed (on both sides)." msgstr "" -#: doc/classes/GraphEdit.xml:327 +#: doc/classes/GraphEdit.xml:333 msgid "The icon for the zoom reset button." msgstr "" -#: doc/classes/GraphEdit.xml:330 +#: doc/classes/GraphEdit.xml:336 msgid "The fill color of the selection rectangle." msgstr "" -#: doc/classes/GraphEdit.xml:333 +#: doc/classes/GraphEdit.xml:339 msgid "The outline color of the selection rectangle." msgstr "" -#: doc/classes/GraphEdit.xml:336 +#: doc/classes/GraphEdit.xml:342 msgid "The icon for the snap toggle button." msgstr "" @@ -23049,21 +22865,21 @@ msgstr "" msgid "The background of the area to the left of the grabber." msgstr "" -#: doc/classes/HSlider.xml:23 doc/classes/VSlider.xml:27 +#: doc/classes/HSlider.xml:25 doc/classes/VSlider.xml:29 msgid "The texture for the grabber when it's disabled." msgstr "" -#: doc/classes/HSlider.xml:26 doc/classes/VSlider.xml:30 +#: doc/classes/HSlider.xml:28 doc/classes/VSlider.xml:32 msgid "The texture for the grabber when it's focused." msgstr "" -#: doc/classes/HSlider.xml:29 +#: doc/classes/HSlider.xml:31 msgid "" "The background for the whole slider. Determines the height of the " "[code]grabber_area[/code]." msgstr "" -#: doc/classes/HSlider.xml:32 doc/classes/VSlider.xml:36 +#: doc/classes/HSlider.xml:34 doc/classes/VSlider.xml:38 msgid "" "The texture for the ticks, visible when [member Slider.tick_count] is " "greater than 0." @@ -24006,16 +23822,19 @@ msgstr "" msgid "" "Native image datatype. Contains image data, which can be converted to a " "[Texture2D], and several functions to interact with it. The maximum width " -"and height for an [Image] are [constant MAX_WIDTH] and [constant MAX_HEIGHT]." +"and height for an [Image] are [constant MAX_WIDTH] and [constant " +"MAX_HEIGHT].\n" +"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics " +"hardware limitations. Larger images will fail to import." msgstr "" -#: doc/classes/Image.xml:22 +#: doc/classes/Image.xml:23 msgid "" "Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image " "at coordinates [code]dest[/code]." msgstr "" -#: doc/classes/Image.xml:37 +#: doc/classes/Image.xml:38 msgid "" "Alpha-blends [code]src_rect[/code] from [code]src[/code] image to this image " "using [code]mask[/code] image at coordinates [code]dst[/code]. Alpha " @@ -24026,13 +23845,13 @@ msgid "" "but they can have different formats." msgstr "" -#: doc/classes/Image.xml:50 +#: doc/classes/Image.xml:51 msgid "" "Copies [code]src_rect[/code] from [code]src[/code] image to this image at " "coordinates [code]dst[/code]." msgstr "" -#: doc/classes/Image.xml:65 +#: doc/classes/Image.xml:66 msgid "" "Blits [code]src_rect[/code] area from [code]src[/code] image to this image " "at the coordinates given by [code]dst[/code]. [code]src[/code] pixel is " @@ -24042,17 +23861,17 @@ msgid "" "different formats." msgstr "" -#: doc/classes/Image.xml:74 +#: doc/classes/Image.xml:75 msgid "" "Converts a bumpmap to a normalmap. A bumpmap provides a height offset per-" "pixel, while a normalmap provides a normal direction per pixel." msgstr "" -#: doc/classes/Image.xml:81 +#: doc/classes/Image.xml:82 msgid "Removes the image's mipmaps." msgstr "" -#: doc/classes/Image.xml:94 +#: doc/classes/Image.xml:95 msgid "" "Compresses the image to use less memory. Can not directly access pixel data " "while the image is compressed. Returns error if the chosen compression mode " @@ -24060,22 +23879,22 @@ msgid "" "constants." msgstr "" -#: doc/classes/Image.xml:115 +#: doc/classes/Image.xml:116 msgid "Converts the image's format. See [enum Format] constants." msgstr "" -#: doc/classes/Image.xml:124 +#: doc/classes/Image.xml:125 msgid "Copies [code]src[/code] image to this image." msgstr "" -#: doc/classes/Image.xml:139 +#: doc/classes/Image.xml:140 msgid "" "Creates an empty image of given size and format. See [enum Format] " "constants. If [code]use_mipmaps[/code] is [code]true[/code] then generate " "mipmaps for this image. See the [method generate_mipmaps]." msgstr "" -#: doc/classes/Image.xml:156 +#: doc/classes/Image.xml:157 msgid "" "Creates a new image of given size and format. See [enum Format] constants. " "Fills the image with the given raw data. If [code]use_mipmaps[/code] is " @@ -24083,49 +23902,49 @@ msgid "" "generate_mipmaps]." msgstr "" -#: doc/classes/Image.xml:167 +#: doc/classes/Image.xml:168 msgid "" "Crops the image to the given [code]width[/code] and [code]height[/code]. If " "the specified size is larger than the current size, the extra area is filled " "with black pixels." msgstr "" -#: doc/classes/Image.xml:174 +#: doc/classes/Image.xml:175 msgid "" "Decompresses the image if it is compressed. Returns an error if decompress " "function is not available." msgstr "" -#: doc/classes/Image.xml:181 +#: doc/classes/Image.xml:182 msgid "" "Returns [constant ALPHA_BLEND] if the image has data for alpha values. " "Returns [constant ALPHA_BIT] if all the alpha values are stored in a single " "bit. Returns [constant ALPHA_NONE] if no data for alpha values is found." msgstr "" -#: doc/classes/Image.xml:196 +#: doc/classes/Image.xml:197 msgid "" "Stretches the image and enlarges it by a factor of 2. No interpolation is " "done." msgstr "" -#: doc/classes/Image.xml:205 +#: doc/classes/Image.xml:206 msgid "Fills the image with a given [Color]." msgstr "" -#: doc/classes/Image.xml:212 +#: doc/classes/Image.xml:213 msgid "Blends low-alpha pixels with nearby pixels." msgstr "" -#: doc/classes/Image.xml:219 +#: doc/classes/Image.xml:220 msgid "Flips the image horizontally." msgstr "" -#: doc/classes/Image.xml:226 +#: doc/classes/Image.xml:227 msgid "Flips the image vertically." msgstr "" -#: doc/classes/Image.xml:235 +#: doc/classes/Image.xml:236 msgid "" "Generates mipmaps for the image. Mipmaps are pre-calculated and lower " "resolution copies of the image. Mipmaps are automatically used if the image " @@ -24134,125 +23953,129 @@ msgid "" "in a custom format or if the image's width/height is 0." msgstr "" -#: doc/classes/Image.xml:242 +#: doc/classes/Image.xml:243 msgid "Returns the image's raw data." msgstr "" -#: doc/classes/Image.xml:249 +#: doc/classes/Image.xml:250 msgid "Returns the image's format. See [enum Format] constants." msgstr "" -#: doc/classes/Image.xml:256 +#: doc/classes/Image.xml:257 msgid "Returns the image's height." msgstr "" -#: doc/classes/Image.xml:265 +#: doc/classes/Image.xml:266 msgid "" "Returns the offset where the image's mipmap with index [code]mipmap[/code] " "is stored in the [code]data[/code] dictionary." msgstr "" -#: doc/classes/Image.xml:276 +#: doc/classes/Image.xml:277 msgid "" "Returns the color of the pixel at [code](x, y)[/code]. This is the same as " "[method get_pixelv], but with two integer arguments instead of a [Vector2] " "argument." msgstr "" -#: doc/classes/Image.xml:285 +#: doc/classes/Image.xml:286 msgid "" "Returns the color of the pixel at [code]src[/code]. This is the same as " "[method get_pixel], but with a [Vector2] argument instead of two integer " "arguments." msgstr "" -#: doc/classes/Image.xml:294 +#: doc/classes/Image.xml:295 msgid "" "Returns a new image that is a copy of the image's area specified with " "[code]rect[/code]." msgstr "" -#: doc/classes/Image.xml:301 +#: doc/classes/Image.xml:302 msgid "Returns the image's size (width and height)." msgstr "" -#: doc/classes/Image.xml:308 +#: doc/classes/Image.xml:309 msgid "" "Returns a [Rect2] enclosing the visible portion of the image, considering " "each pixel with a non-zero alpha channel as visible." msgstr "" -#: doc/classes/Image.xml:315 +#: doc/classes/Image.xml:316 msgid "Returns the image's width." msgstr "" -#: doc/classes/Image.xml:322 +#: doc/classes/Image.xml:323 msgid "Returns [code]true[/code] if the image has generated mipmaps." msgstr "" -#: doc/classes/Image.xml:329 +#: doc/classes/Image.xml:330 msgid "Returns [code]true[/code] if the image is compressed." msgstr "" -#: doc/classes/Image.xml:336 +#: doc/classes/Image.xml:337 msgid "Returns [code]true[/code] if the image has no data." msgstr "" -#: doc/classes/Image.xml:343 +#: doc/classes/Image.xml:344 msgid "" "Returns [code]true[/code] if all the image's pixels have an alpha value of " "0. Returns [code]false[/code] if any pixel has an alpha value higher than 0." msgstr "" -#: doc/classes/Image.xml:352 -msgid "Loads an image from file [code]path[/code]." +#: doc/classes/Image.xml:353 +msgid "" +"Loads an image from file [code]path[/code]. See [url=https://docs." +"godotengine.org/en/latest/getting_started/workflow/assets/importing_images." +"html#supported-image-formats]Supported image formats[/url] for a list of " +"supported image formats and limitations." msgstr "" -#: doc/classes/Image.xml:361 +#: doc/classes/Image.xml:362 msgid "Loads an image from the binary contents of a JPEG file." msgstr "" -#: doc/classes/Image.xml:370 +#: doc/classes/Image.xml:371 msgid "Loads an image from the binary contents of a PNG file." msgstr "" -#: doc/classes/Image.xml:379 +#: doc/classes/Image.xml:380 msgid "Loads an image from the binary contents of a WebP file." msgstr "" -#: doc/classes/Image.xml:386 +#: doc/classes/Image.xml:387 msgid "" "Converts the image's data to represent coordinates on a 3D plane. This is " "used when the image represents a normalmap. A normalmap can add lots of " "detail to a 3D surface without increasing the polygon count." msgstr "" -#: doc/classes/Image.xml:393 +#: doc/classes/Image.xml:394 msgid "" "Multiplies color values with alpha values. Resulting color values for a " "pixel are [code](color * alpha)/256[/code]." msgstr "" -#: doc/classes/Image.xml:406 +#: doc/classes/Image.xml:407 msgid "" "Resizes the image to the given [code]width[/code] and [code]height[/code]. " "New pixels are calculated using [code]interpolation[/code]. See " "[code]interpolation[/code] constants." msgstr "" -#: doc/classes/Image.xml:415 +#: doc/classes/Image.xml:416 msgid "" "Resizes the image to the nearest power of 2 for the width and height. If " "[code]square[/code] is [code]true[/code] then set width and height to be the " "same." msgstr "" -#: doc/classes/Image.xml:422 +#: doc/classes/Image.xml:423 msgid "" "Converts a standard RGBE (Red Green Blue Exponent) image to an sRGB image." msgstr "" -#: doc/classes/Image.xml:433 +#: doc/classes/Image.xml:434 msgid "" "Saves the image as an EXR file to [code]path[/code]. If [code]grayscale[/" "code] is [code]true[/code] and the image has only one channel, it will be " @@ -24261,11 +24084,11 @@ msgid "" "TinyEXR module." msgstr "" -#: doc/classes/Image.xml:442 +#: doc/classes/Image.xml:443 msgid "Saves the image as a PNG file to [code]path[/code]." msgstr "" -#: doc/classes/Image.xml:455 +#: doc/classes/Image.xml:456 msgid "" "Sets the [Color] of the pixel at [code](x, y)[/code]. Example:\n" "[codeblock]\n" @@ -24275,7 +24098,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Image.xml:471 +#: doc/classes/Image.xml:472 msgid "" "Sets the [Color] of the pixel at [code](dst.x, dst.y)[/code]. Note that the " "[code]dst[/code] values must be integers. Example:\n" @@ -24286,51 +24109,51 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Image.xml:483 +#: doc/classes/Image.xml:484 msgid "Shrinks the image by a factor of 2." msgstr "" -#: doc/classes/Image.xml:490 +#: doc/classes/Image.xml:491 msgid "Converts the raw data from the sRGB colorspace to a linear scale." msgstr "" -#: doc/classes/Image.xml:496 +#: doc/classes/Image.xml:497 msgid "" "Holds all of the image's color data in a given format. See [enum Format] " "constants." msgstr "" -#: doc/classes/Image.xml:501 +#: doc/classes/Image.xml:502 msgid "The maximal width allowed for [Image] resources." msgstr "" -#: doc/classes/Image.xml:504 +#: doc/classes/Image.xml:505 msgid "The maximal height allowed for [Image] resources." msgstr "" -#: doc/classes/Image.xml:507 +#: doc/classes/Image.xml:508 msgid "Texture format with a single 8-bit depth representing luminance." msgstr "" -#: doc/classes/Image.xml:510 +#: doc/classes/Image.xml:511 msgid "" "OpenGL texture format with two values, luminance and alpha each stored with " "8 bits." msgstr "" -#: doc/classes/Image.xml:513 +#: doc/classes/Image.xml:514 msgid "" "OpenGL texture format [code]RED[/code] with a single component and a " "bitdepth of 8." msgstr "" -#: doc/classes/Image.xml:516 +#: doc/classes/Image.xml:517 msgid "" "OpenGL texture format [code]RG[/code] with two components and a bitdepth of " "8 for each." msgstr "" -#: doc/classes/Image.xml:519 +#: doc/classes/Image.xml:520 msgid "" "OpenGL texture format [code]RGB[/code] with three components, each with a " "bitdepth of 8.\n" @@ -24338,7 +24161,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:523 +#: doc/classes/Image.xml:524 msgid "" "OpenGL texture format [code]RGBA[/code] with four components, each with a " "bitdepth of 8.\n" @@ -24346,67 +24169,67 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:527 +#: doc/classes/Image.xml:528 msgid "" "OpenGL texture format [code]RGBA[/code] with four components, each with a " "bitdepth of 4." msgstr "" -#: doc/classes/Image.xml:532 +#: doc/classes/Image.xml:533 msgid "" "OpenGL texture format [code]GL_R32F[/code] where there's one component, a 32-" "bit floating-point value." msgstr "" -#: doc/classes/Image.xml:535 +#: doc/classes/Image.xml:536 msgid "" "OpenGL texture format [code]GL_RG32F[/code] where there are two components, " "each a 32-bit floating-point values." msgstr "" -#: doc/classes/Image.xml:538 +#: doc/classes/Image.xml:539 msgid "" "OpenGL texture format [code]GL_RGB32F[/code] where there are three " "components, each a 32-bit floating-point values." msgstr "" -#: doc/classes/Image.xml:541 +#: doc/classes/Image.xml:542 msgid "" "OpenGL texture format [code]GL_RGBA32F[/code] where there are four " "components, each a 32-bit floating-point values." msgstr "" -#: doc/classes/Image.xml:544 +#: doc/classes/Image.xml:545 msgid "" "OpenGL texture format [code]GL_R32F[/code] where there's one component, a 16-" "bit \"half-precision\" floating-point value." msgstr "" -#: doc/classes/Image.xml:547 +#: doc/classes/Image.xml:548 msgid "" "OpenGL texture format [code]GL_RG32F[/code] where there are two components, " "each a 16-bit \"half-precision\" floating-point value." msgstr "" -#: doc/classes/Image.xml:550 +#: doc/classes/Image.xml:551 msgid "" "OpenGL texture format [code]GL_RGB32F[/code] where there are three " "components, each a 16-bit \"half-precision\" floating-point value." msgstr "" -#: doc/classes/Image.xml:553 +#: doc/classes/Image.xml:554 msgid "" "OpenGL texture format [code]GL_RGBA32F[/code] where there are four " "components, each a 16-bit \"half-precision\" floating-point value." msgstr "" -#: doc/classes/Image.xml:556 +#: doc/classes/Image.xml:557 msgid "" "A special OpenGL texture format where the three color components have 9 bits " "of precision and all three share a single 5-bit exponent." msgstr "" -#: doc/classes/Image.xml:559 +#: doc/classes/Image.xml:560 msgid "" "The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " "texture format that uses Block Compression 1, and is the smallest variation " @@ -24416,7 +24239,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:563 +#: doc/classes/Image.xml:564 msgid "" "The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " "texture format that uses Block Compression 2, and color data is interpreted " @@ -24426,7 +24249,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:567 +#: doc/classes/Image.xml:568 msgid "" "The [url=https://en.wikipedia.org/wiki/S3_Texture_Compression]S3TC[/url] " "texture format also known as Block Compression 3 or BC3 that contains 64 " @@ -24437,7 +24260,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:571 +#: doc/classes/Image.xml:572 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "Red_Green_Texture_Compression]Red Green Texture Compression[/url], " @@ -24445,7 +24268,7 @@ msgid "" "DXT5 uses for the alpha channel." msgstr "" -#: doc/classes/Image.xml:574 +#: doc/classes/Image.xml:575 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "Red_Green_Texture_Compression]Red Green Texture Compression[/url], " @@ -24453,7 +24276,7 @@ msgid "" "algorithm that DXT5 uses for the alpha channel." msgstr "" -#: doc/classes/Image.xml:577 +#: doc/classes/Image.xml:578 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "BPTC_Texture_Compression]BPTC[/url] compression with unsigned normalized " @@ -24462,21 +24285,21 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:581 +#: doc/classes/Image.xml:582 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "BPTC_Texture_Compression]BPTC[/url] compression with signed floating-point " "RGB components." msgstr "" -#: doc/classes/Image.xml:584 +#: doc/classes/Image.xml:585 msgid "" "Texture format that uses [url=https://www.khronos.org/opengl/wiki/" "BPTC_Texture_Compression]BPTC[/url] compression with unsigned floating-point " "RGB components." msgstr "" -#: doc/classes/Image.xml:587 +#: doc/classes/Image.xml:588 msgid "" "Texture format used on PowerVR-supported mobile platforms, uses 2-bit color " "depth with no alpha. More information can be found [url=https://en.wikipedia." @@ -24485,25 +24308,25 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:591 +#: doc/classes/Image.xml:592 msgid "" "Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with an " "alpha component." msgstr "" -#: doc/classes/Image.xml:594 +#: doc/classes/Image.xml:595 msgid "" "Similar to [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC2[/url], but with 4-" "bit color depth and no alpha." msgstr "" -#: doc/classes/Image.xml:597 +#: doc/classes/Image.xml:598 msgid "" "Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC4[/url], but with an " "alpha component." msgstr "" -#: doc/classes/Image.xml:600 +#: doc/classes/Image.xml:601 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC1]Ericsson Texture Compression format 1[/" @@ -24511,7 +24334,7 @@ msgid "" "standard. This format cannot store an alpha channel." msgstr "" -#: doc/classes/Image.xml:603 +#: doc/classes/Image.xml:604 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24519,7 +24342,7 @@ msgid "" "unsigned data." msgstr "" -#: doc/classes/Image.xml:606 +#: doc/classes/Image.xml:607 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24527,7 +24350,7 @@ msgid "" "channel of signed data." msgstr "" -#: doc/classes/Image.xml:609 +#: doc/classes/Image.xml:610 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24535,7 +24358,7 @@ msgid "" "of unsigned data." msgstr "" -#: doc/classes/Image.xml:612 +#: doc/classes/Image.xml:613 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24543,7 +24366,7 @@ msgid "" "channels of signed data." msgstr "" -#: doc/classes/Image.xml:615 +#: doc/classes/Image.xml:616 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24553,7 +24376,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:619 +#: doc/classes/Image.xml:620 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24563,7 +24386,7 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:623 +#: doc/classes/Image.xml:624 msgid "" "[url=https://en.wikipedia.org/wiki/" "Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " @@ -24574,31 +24397,31 @@ msgid "" "conversion is performed." msgstr "" -#: doc/classes/Image.xml:631 +#: doc/classes/Image.xml:632 msgid "Represents the size of the [enum Format] enum." msgstr "" -#: doc/classes/Image.xml:634 +#: doc/classes/Image.xml:635 msgid "" "Performs nearest-neighbor interpolation. If the image is resized, it will be " "pixelated." msgstr "" -#: doc/classes/Image.xml:637 +#: doc/classes/Image.xml:638 msgid "" "Performs bilinear interpolation. If the image is resized, it will be blurry. " "This mode is faster than [constant INTERPOLATE_CUBIC], but it results in " "lower quality." msgstr "" -#: doc/classes/Image.xml:640 +#: doc/classes/Image.xml:641 msgid "" "Performs cubic interpolation. If the image is resized, it will be blurry. " "This mode often gives better results compared to [constant " "INTERPOLATE_BILINEAR], at the cost of being slower." msgstr "" -#: doc/classes/Image.xml:643 +#: doc/classes/Image.xml:644 msgid "" "Performs bilinear separately on the two most-suited mipmap levels, then " "linearly interpolates between them.\n" @@ -24613,55 +24436,55 @@ msgid "" "a new set will be generated for the resulting image." msgstr "" -#: doc/classes/Image.xml:650 +#: doc/classes/Image.xml:651 msgid "" "Performs Lanczos interpolation. This is the slowest image resizing mode, but " "it typically gives the best results, especially when downscalng images." msgstr "" -#: doc/classes/Image.xml:653 +#: doc/classes/Image.xml:654 msgid "Image does not have alpha." msgstr "" -#: doc/classes/Image.xml:656 +#: doc/classes/Image.xml:657 msgid "Image stores alpha in a single bit." msgstr "" -#: doc/classes/Image.xml:659 +#: doc/classes/Image.xml:660 msgid "Image uses alpha." msgstr "" -#: doc/classes/Image.xml:662 +#: doc/classes/Image.xml:663 msgid "Use S3TC compression." msgstr "" -#: doc/classes/Image.xml:665 +#: doc/classes/Image.xml:666 msgid "Use PVRTC2 compression." msgstr "" -#: doc/classes/Image.xml:668 +#: doc/classes/Image.xml:669 msgid "Use PVRTC4 compression." msgstr "" -#: doc/classes/Image.xml:671 +#: doc/classes/Image.xml:672 msgid "Use ETC compression." msgstr "" -#: doc/classes/Image.xml:674 +#: doc/classes/Image.xml:675 msgid "Use ETC2 compression." msgstr "" -#: doc/classes/Image.xml:689 +#: doc/classes/Image.xml:690 msgid "" "Source texture (before compression) is a regular texture. Default for all " "textures." msgstr "" -#: doc/classes/Image.xml:692 +#: doc/classes/Image.xml:693 msgid "Source texture (before compression) is in sRGB space." msgstr "" -#: doc/classes/Image.xml:695 +#: doc/classes/Image.xml:696 msgid "" "Source texture (before compression) is a normal texture (e.g. it can be " "compressed into two channels)." @@ -24674,22 +24497,24 @@ msgstr "" #: doc/classes/ImageTexture.xml:7 msgid "" "A [Texture2D] based on an [Image]. Can be created from an [Image] with " -"[method create_from_image]." +"[method create_from_image].\n" +"[b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics " +"hardware limitations. Larger images will fail to import." msgstr "" -#: doc/classes/ImageTexture.xml:18 +#: doc/classes/ImageTexture.xml:19 msgid "Create a new [ImageTexture] from an [Image]." msgstr "" -#: doc/classes/ImageTexture.xml:25 +#: doc/classes/ImageTexture.xml:26 msgid "Returns the format of the [ImageTexture], one of [enum Image.Format]." msgstr "" -#: doc/classes/ImageTexture.xml:34 +#: doc/classes/ImageTexture.xml:35 msgid "Resizes the [ImageTexture] to the specified dimensions." msgstr "" -#: doc/classes/ImageTexture.xml:45 +#: doc/classes/ImageTexture.xml:46 msgid "" "Replaces the texture's data with a new [code]image[/code]. If " "[code]immediate[/code] is [code]true[/code], it will take effect immediately " @@ -24702,20 +24527,29 @@ msgstr "" #: doc/classes/ImmediateGeometry3D.xml:7 msgid "" -"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x." +"Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x.\n" +"See also [ArrayMesh], [MeshDataTool] and [SurfaceTool] for procedural " +"geometry generation.\n" +"[b]Note:[/b] ImmediateGeometry3D is best suited to small amounts of mesh " +"data that change every frame. It will be slow when handling large amounts of " +"mesh data. If mesh data doesn't change often, use [ArrayMesh], " +"[MeshDataTool] or [SurfaceTool] instead.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:24 +#: doc/classes/ImmediateGeometry3D.xml:27 msgid "" "Simple helper to draw an UV sphere with given latitude, longitude and radius." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:33 +#: doc/classes/ImmediateGeometry3D.xml:36 msgid "" "Adds a vertex in local coordinate space with the currently set color/uv/etc." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:44 +#: doc/classes/ImmediateGeometry3D.xml:47 msgid "" "Begin drawing (and optionally pass a texture override). When done call " "[method end]. For more information on how this works, search for " @@ -24723,34 +24557,454 @@ msgid "" "For the type of primitive, see the [enum Mesh.PrimitiveType] enum." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:52 +#: doc/classes/ImmediateGeometry3D.xml:55 msgid "Clears everything that was drawn using begin/end." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:59 +#: doc/classes/ImmediateGeometry3D.xml:62 msgid "Ends a drawing context and displays the results." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:68 +#: doc/classes/ImmediateGeometry3D.xml:71 msgid "The current drawing color." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:77 +#: doc/classes/ImmediateGeometry3D.xml:80 msgid "The next vertex's normal." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:86 +#: doc/classes/ImmediateGeometry3D.xml:89 msgid "The next vertex's tangent (and binormal facing)." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:95 +#: doc/classes/ImmediateGeometry3D.xml:98 msgid "The next vertex's UV." msgstr "" -#: doc/classes/ImmediateGeometry3D.xml:104 +#: doc/classes/ImmediateGeometry3D.xml:107 msgid "The next vertex's second layer UV." msgstr "" +#: doc/classes/Input.xml:4 +msgid "A singleton that deals with inputs." +msgstr "" + +#: doc/classes/Input.xml:7 +msgid "" +"A singleton that deals with inputs. This includes key presses, mouse buttons " +"and movement, joypads, and input actions. Actions and their events can be " +"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or " +"with the [InputMap] class." +msgstr "" + +#: doc/classes/Input.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/index.html" +msgstr "" + +#: doc/classes/Input.xml:21 +msgid "" +"This will simulate pressing the specified action.\n" +"The strength can be used for non-boolean actions, it's ranged between 0 and " +"1 representing the intensity of the given action.\n" +"[b]Note:[/b] This method will not cause any [method Node._input] calls. It " +"is intended to be used with [method is_action_pressed] and [method " +"is_action_just_pressed]. If you want to simulate [code]_input[/code], use " +"[method parse_input_event] instead." +msgstr "" + +#: doc/classes/Input.xml:32 +msgid "If the specified action is already pressed, this will release it." +msgstr "" + +#: doc/classes/Input.xml:43 +msgid "" +"Adds a new mapping entry (in SDL2 format) to the mapping database. " +"Optionally update already connected devices." +msgstr "" + +#: doc/classes/Input.xml:50 +msgid "" +"If the device has an accelerometer, this will return the acceleration. " +"Otherwise, it returns an empty [Vector3].\n" +"Note this method returns an empty [Vector3] when running from the editor " +"even when your device has an accelerometer. You must export your project to " +"a supported device to read values from the accelerometer." +msgstr "" + +#: doc/classes/Input.xml:60 +msgid "" +"Returns a value between 0 and 1 representing the intensity of the given " +"action. In a joypad, for example, the further away the axis (analog sticks " +"or L2, R2 triggers) is from the dead zone, the closer the value will be to " +"1. If the action is mapped to a control that has no axis as the keyboard, " +"the value returned will be 0 or 1." +msgstr "" + +#: doc/classes/Input.xml:67 +msgid "" +"Returns an [Array] containing the device IDs of all currently connected " +"joypads." +msgstr "" + +#: doc/classes/Input.xml:74 +msgid "Returns the currently assigned cursor shape (see [enum CursorShape])." +msgstr "" + +#: doc/classes/Input.xml:81 +msgid "" +"If the device has an accelerometer, this will return the gravity. Otherwise, " +"it returns an empty [Vector3]." +msgstr "" + +#: doc/classes/Input.xml:88 +msgid "" +"If the device has a gyroscope, this will return the rate of rotation in rad/" +"s around a device's X, Y, and Z axes. Otherwise, it returns an empty " +"[Vector3]." +msgstr "" + +#: doc/classes/Input.xml:99 +msgid "" +"Returns the current value of the joypad axis at given index (see [enum " +"JoystickList])." +msgstr "" + +#: doc/classes/Input.xml:108 +msgid "Returns the index of the provided axis name." +msgstr "" + +#: doc/classes/Input.xml:117 +msgid "" +"Receives a [enum JoystickList] axis and returns its equivalent name as a " +"string." +msgstr "" + +#: doc/classes/Input.xml:126 +msgid "Returns the index of the provided button name." +msgstr "" + +#: doc/classes/Input.xml:135 +msgid "" +"Receives a gamepad button from [enum JoystickList] and returns its " +"equivalent name as a string." +msgstr "" + +#: doc/classes/Input.xml:144 +msgid "" +"Returns a SDL2-compatible device GUID on platforms that use gamepad " +"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise." +msgstr "" + +#: doc/classes/Input.xml:153 +msgid "Returns the name of the joypad at the specified device index." +msgstr "" + +#: doc/classes/Input.xml:162 +msgid "Returns the duration of the current vibration effect in seconds." +msgstr "" + +#: doc/classes/Input.xml:171 +msgid "" +"Returns the strength of the joypad vibration: x is the strength of the weak " +"motor, and y is the strength of the strong motor." +msgstr "" + +#: doc/classes/Input.xml:178 +msgid "" +"Returns the mouse speed for the last time the cursor was moved, and this " +"until the next frame where the mouse moves. This means that even if the " +"mouse is not moving, this function will still return the value of the last " +"motion." +msgstr "" + +#: doc/classes/Input.xml:185 +msgid "" +"If the device has a magnetometer, this will return the magnetic field " +"strength in micro-Tesla for all axes." +msgstr "" + +#: doc/classes/Input.xml:192 +msgid "" +"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at " +"the same time, the bits are added together." +msgstr "" + +#: doc/classes/Input.xml:199 +msgid "Returns the mouse mode. See the constants for more information." +msgstr "" + +#: doc/classes/Input.xml:208 +msgid "" +"Returns [code]true[/code] when the user starts pressing the action event, " +"meaning it's [code]true[/code] only on the frame that the user pressed down " +"the button.\n" +"This is useful for code that needs to run only once when an action is " +"pressed, instead of every frame while it's pressed." +msgstr "" + +#: doc/classes/Input.xml:218 +msgid "" +"Returns [code]true[/code] when the user stops pressing the action event, " +"meaning it's [code]true[/code] only on the frame that the user released the " +"button." +msgstr "" + +#: doc/classes/Input.xml:227 +msgid "" +"Returns [code]true[/code] if you are pressing the action event. Note that if " +"an action has multiple buttons assigned 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." +msgstr "" + +#: doc/classes/Input.xml:238 +msgid "" +"Returns [code]true[/code] if you are pressing the joypad button (see [enum " +"JoystickList])." +msgstr "" + +#: doc/classes/Input.xml:247 +msgid "" +"Returns [code]true[/code] if the system knows the specified device. This " +"means that it sets all button and axis indices exactly as defined in [enum " +"JoystickList]. Unknown joypads are not expected to match these constants, " +"but you can still retrieve events from them." +msgstr "" + +#: doc/classes/Input.xml:256 +msgid "" +"Returns [code]true[/code] if you are pressing the key in the current " +"keyboard layout. You can pass a [enum KeyList] constant." +msgstr "" + +#: doc/classes/Input.xml:265 +msgid "" +"Returns [code]true[/code] if you are pressing the mouse button specified " +"with [enum ButtonList]." +msgstr "" + +#: doc/classes/Input.xml:280 +msgid "" +"Notifies the [Input] singleton that a connection has changed, to update the " +"state for the [code]device[/code] index.\n" +"This is used internally and should not have to be called from user scripts. " +"See [signal joy_connection_changed] for the signal emitted when this is " +"triggered internally." +msgstr "" + +#: doc/classes/Input.xml:290 +msgid "" +"Feeds an [InputEvent] to the game. Can be used to artificially trigger input " +"events from code. Also generates [method Node._input] calls.\n" +"Example:\n" +"[codeblock]\n" +"var a = InputEventAction.new()\n" +"a.action = \"ui_cancel\"\n" +"a.pressed = true\n" +"Input.parse_input_event(a)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Input.xml:306 +msgid "" +"Removes all mappings from the internal database that match the given GUID." +msgstr "" + +#: doc/classes/Input.xml:319 +msgid "" +"Sets a custom mouse cursor image, which is only visible inside the game " +"window. The hotspot can also be specified. Passing [code]null[/code] to the " +"image parameter resets to the system cursor. See [enum CursorShape] for the " +"list of shapes.\n" +"[code]image[/code]'s size must be lower than 256×256.\n" +"[code]hotspot[/code] must be within [code]image[/code]'s size.\n" +"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If " +"using an [AnimatedTexture], only the first frame will be displayed.\n" +"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or " +"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] " +"compression mode can't be used for custom cursors." +msgstr "" + +#: doc/classes/Input.xml:332 +msgid "" +"Sets the default cursor shape to be used in the viewport instead of " +"[constant CURSOR_ARROW].\n" +"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s " +"nodes, use [member Control.mouse_default_cursor_shape] instead.\n" +"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update " +"cursor immediately." +msgstr "" + +#: doc/classes/Input.xml:343 +msgid "Sets the mouse mode. See the constants for more information." +msgstr "" + +#: doc/classes/Input.xml:352 +msgid "" +"Enables or disables the accumulation of similar input events sent by the " +"operating system. When input accumulation is enabled, all input events " +"generated during a frame will be merged and emitted when the frame is done " +"rendering. Therefore, this limits the number of input method calls per " +"second to the rendering FPS.\n" +"Input accumulation is enabled by default. It can be disabled to get slightly " +"more precise/reactive input at the cost of increased CPU usage. In " +"applications where drawing freehand lines is required, input accumulation " +"should generally be disabled while the user is drawing the line to get " +"results that closely follow the actual input." +msgstr "" + +#: doc/classes/Input.xml:368 +msgid "" +"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a " +"strong and a weak one. [code]weak_magnitude[/code] is the strength of the " +"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the " +"strength of the strong motor (between 0 and 1). [code]duration[/code] is the " +"duration of the effect in seconds (a duration of 0 will try to play the " +"vibration indefinitely).\n" +"[b]Note:[/b] Not every hardware is compatible with long effect durations; it " +"is recommended to restart an effect if it has to be played for more than a " +"few seconds." +msgstr "" + +#: doc/classes/Input.xml:378 +msgid "Stops the vibration of the joypad." +msgstr "" + +#: doc/classes/Input.xml:387 +msgid "" +"Vibrate Android and iOS devices.\n" +"[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS " +"does not support duration." +msgstr "" + +#: doc/classes/Input.xml:397 +msgid "Sets the mouse position to the specified vector." +msgstr "" + +#: doc/classes/Input.xml:408 +msgid "Emitted when a joypad device has been connected or disconnected." +msgstr "" + +#: doc/classes/Input.xml:414 +msgid "Makes the mouse cursor visible if it is hidden." +msgstr "" + +#: doc/classes/Input.xml:417 +msgid "Makes the mouse cursor hidden if it is visible." +msgstr "" + +#: doc/classes/Input.xml:420 +msgid "" +"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." +msgstr "" + +#: doc/classes/Input.xml:423 +msgid "Makes the mouse cursor visible but confines it to the game window." +msgstr "" + +#: doc/classes/Input.xml:426 +msgid "Arrow cursor. Standard, default pointing cursor." +msgstr "" + +#: doc/classes/Input.xml:429 +msgid "" +"I-beam cursor. Usually used to show where the text cursor will appear when " +"the mouse is clicked." +msgstr "" + +#: doc/classes/Input.xml:432 +msgid "" +"Pointing hand cursor. Usually used to indicate the pointer is over a link or " +"other interactable item." +msgstr "" + +#: doc/classes/Input.xml:435 +msgid "" +"Cross cursor. Typically appears over regions in which a drawing operation " +"can be performed or for selections." +msgstr "" + +#: doc/classes/Input.xml:438 +msgid "" +"Wait cursor. Indicates that the application is busy performing an operation. " +"This cursor shape denotes that the application is still usable during the " +"operation." +msgstr "" + +#: doc/classes/Input.xml:441 +msgid "" +"Busy cursor. Indicates that the application is busy performing an operation. " +"This cursor shape denotes that the application isn't usable during the " +"operation (e.g. something is blocking its main thread)." +msgstr "" + +#: doc/classes/Input.xml:444 +msgid "Drag cursor. Usually displayed when dragging something." +msgstr "" + +#: doc/classes/Input.xml:447 +msgid "" +"Can drop cursor. Usually displayed when dragging something to indicate that " +"it can be dropped at the current position." +msgstr "" + +#: doc/classes/Input.xml:450 +msgid "" +"Forbidden cursor. Indicates that the current action is forbidden (for " +"example, when dragging something) or that the control at a position is " +"disabled." +msgstr "" + +#: doc/classes/Input.xml:453 +msgid "" +"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the " +"user they can resize the window or the panel vertically." +msgstr "" + +#: doc/classes/Input.xml:456 +msgid "" +"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells " +"the user they can resize the window or the panel horizontally." +msgstr "" + +#: doc/classes/Input.xml:459 +msgid "" +"Window resize mouse cursor. The cursor is a double-headed arrow that goes " +"from the bottom left to the top right. It tells the user they can resize the " +"window or the panel both horizontally and vertically." +msgstr "" + +#: doc/classes/Input.xml:462 +msgid "" +"Window resize mouse cursor. The cursor is a double-headed arrow that goes " +"from the top left to the bottom right, the opposite of [constant " +"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel " +"both horizontally and vertically." +msgstr "" + +#: doc/classes/Input.xml:465 +msgid "Move cursor. Indicates that something can be moved." +msgstr "" + +#: doc/classes/Input.xml:468 +msgid "" +"Vertical split mouse cursor. On Windows, it's the same as [constant " +"CURSOR_VSIZE]." +msgstr "" + +#: doc/classes/Input.xml:471 +msgid "" +"Horizontal split mouse cursor. On Windows, it's the same as [constant " +"CURSOR_HSIZE]." +msgstr "" + +#: doc/classes/Input.xml:474 +msgid "Help cursor. Usually a question mark." +msgstr "" + #: doc/classes/InputEvent.xml:4 msgid "Generic input event." msgstr "" @@ -24956,8 +25210,8 @@ msgstr "" #: doc/classes/InputEventKey.xml:17 msgid "" -"Returns the keycode combined with modifier keys such as [code]Shift[/code] " -"or [code]Alt[/code]. See also [InputEventWithModifiers].\n" +"Returns the keycode combined with modifier keys such as [kbd]Shift[/kbd] or " +"[kbd]Alt[/kbd]. See also [InputEventWithModifiers].\n" "To get a human-readable representation of the [InputEventKey] with " "modifiers, use [code]OS.get_keycode_string(event." "get_keycode_with_modifiers())[/code] where [code]event[/code] is the " @@ -24966,8 +25220,8 @@ msgstr "" #: doc/classes/InputEventKey.xml:25 msgid "" -"Returns the physical keycode combined with modifier keys such as " -"[code]Shift[/code] or [code]Alt[/code]. See also [InputEventWithModifiers].\n" +"Returns the physical keycode combined with modifier keys such as [kbd]Shift[/" +"kbd] or [kbd]Alt[/kbd]. See also [InputEventWithModifiers].\n" "To get a human-readable representation of the [InputEventKey] with " "modifiers, use [code]OS.get_keycode_string(event." "get_physical_keycode_with_modifiers())[/code] where [code]event[/code] is " @@ -25174,448 +25428,28 @@ msgstr "" #: doc/classes/InputEventWithModifiers.xml:7 msgid "" -"Contains keys events information with modifiers support like [code]Shift[/" -"code] or [code]Alt[/code]. See [method Node._input]." +"Contains keys events information with modifiers support like [kbd]Shift[/" +"kbd] or [kbd]Alt[/kbd]. See [method Node._input]." msgstr "" #: doc/classes/InputEventWithModifiers.xml:16 -msgid "State of the [code]Alt[/code] modifier." +msgid "State of the [kbd]Alt[/kbd] modifier." msgstr "" #: doc/classes/InputEventWithModifiers.xml:19 -msgid "State of the [code]Command[/code] modifier." +msgid "State of the [kbd]Cmd[/kbd] modifier." msgstr "" #: doc/classes/InputEventWithModifiers.xml:22 -msgid "State of the [code]Ctrl[/code] modifier." +msgid "State of the [kbd]Ctrl[/kbd] modifier." msgstr "" #: doc/classes/InputEventWithModifiers.xml:25 -msgid "State of the [code]Meta[/code] modifier." +msgid "State of the [kbd]Meta[/kbd] modifier." msgstr "" #: doc/classes/InputEventWithModifiers.xml:28 -msgid "State of the [code]Shift[/code] modifier." -msgstr "" - -#: doc/classes/InputFilter.xml:4 -msgid "A singleton that deals with inputs." -msgstr "" - -#: doc/classes/InputFilter.xml:7 -msgid "" -"A singleton that deals with inputs. This includes key presses, mouse buttons " -"and movement, joypads, and input actions. Actions and their events can be " -"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or " -"with the [InputMap] class." -msgstr "" - -#: doc/classes/InputFilter.xml:10 -msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/index.html" -msgstr "" - -#: doc/classes/InputFilter.xml:21 -msgid "" -"This will simulate pressing the specified action.\n" -"The strength can be used for non-boolean actions, it's ranged between 0 and " -"1 representing the intensity of the given action.\n" -"[b]Note:[/b] This method will not cause any [method Node._input] calls. It " -"is intended to be used with [method is_action_pressed] and [method " -"is_action_just_pressed]. If you want to simulate [code]_input[/code], use " -"[method parse_input_event] instead." -msgstr "" - -#: doc/classes/InputFilter.xml:32 -msgid "If the specified action is already pressed, this will release it." -msgstr "" - -#: doc/classes/InputFilter.xml:43 -msgid "" -"Adds a new mapping entry (in SDL2 format) to the mapping database. " -"Optionally update already connected devices." -msgstr "" - -#: doc/classes/InputFilter.xml:50 -msgid "" -"If the device has an accelerometer, this will return the acceleration. " -"Otherwise, it returns an empty [Vector3].\n" -"Note this method returns an empty [Vector3] when running from the editor " -"even when your device has an accelerometer. You must export your project to " -"a supported device to read values from the accelerometer." -msgstr "" - -#: doc/classes/InputFilter.xml:60 -msgid "" -"Returns a value between 0 and 1 representing the intensity of the given " -"action. In a joypad, for example, the further away the axis (analog sticks " -"or L2, R2 triggers) is from the dead zone, the closer the value will be to " -"1. If the action is mapped to a control that has no axis as the keyboard, " -"the value returned will be 0 or 1." -msgstr "" - -#: doc/classes/InputFilter.xml:67 -msgid "" -"Returns an [Array] containing the device IDs of all currently connected " -"joypads." -msgstr "" - -#: doc/classes/InputFilter.xml:74 -msgid "Returns the currently assigned cursor shape (see [enum CursorShape])." -msgstr "" - -#: doc/classes/InputFilter.xml:81 -msgid "" -"If the device has an accelerometer, this will return the gravity. Otherwise, " -"it returns an empty [Vector3]." -msgstr "" - -#: doc/classes/InputFilter.xml:88 -msgid "" -"If the device has a gyroscope, this will return the rate of rotation in rad/" -"s around a device's X, Y, and Z axes. Otherwise, it returns an empty " -"[Vector3]." -msgstr "" - -#: doc/classes/InputFilter.xml:99 -msgid "" -"Returns the current value of the joypad axis at given index (see [enum " -"JoystickList])." -msgstr "" - -#: doc/classes/InputFilter.xml:108 -msgid "Returns the index of the provided axis name." -msgstr "" - -#: doc/classes/InputFilter.xml:117 -msgid "" -"Receives a [enum JoystickList] axis and returns its equivalent name as a " -"string." -msgstr "" - -#: doc/classes/InputFilter.xml:126 -msgid "Returns the index of the provided button name." -msgstr "" - -#: doc/classes/InputFilter.xml:135 -msgid "" -"Receives a gamepad button from [enum JoystickList] and returns its " -"equivalent name as a string." -msgstr "" - -#: doc/classes/InputFilter.xml:144 -msgid "" -"Returns a SDL2-compatible device GUID on platforms that use gamepad " -"remapping. Returns [code]\"Default Gamepad\"[/code] otherwise." -msgstr "" - -#: doc/classes/InputFilter.xml:153 -msgid "Returns the name of the joypad at the specified device index." -msgstr "" - -#: doc/classes/InputFilter.xml:162 -msgid "Returns the duration of the current vibration effect in seconds." -msgstr "" - -#: doc/classes/InputFilter.xml:171 -msgid "" -"Returns the strength of the joypad vibration: x is the strength of the weak " -"motor, and y is the strength of the strong motor." -msgstr "" - -#: doc/classes/InputFilter.xml:178 -msgid "" -"Returns the mouse speed for the last time the cursor was moved, and this " -"until the next frame where the mouse moves. This means that even if the " -"mouse is not moving, this function will still return the value of the last " -"motion." -msgstr "" - -#: doc/classes/InputFilter.xml:185 -msgid "" -"If the device has a magnetometer, this will return the magnetic field " -"strength in micro-Tesla for all axes." -msgstr "" - -#: doc/classes/InputFilter.xml:192 -msgid "" -"Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at " -"the same time, the bits are added together." -msgstr "" - -#: doc/classes/InputFilter.xml:199 -msgid "Returns the mouse mode. See the constants for more information." -msgstr "" - -#: doc/classes/InputFilter.xml:208 -msgid "" -"Returns [code]true[/code] when the user starts pressing the action event, " -"meaning it's [code]true[/code] only on the frame that the user pressed down " -"the button.\n" -"This is useful for code that needs to run only once when an action is " -"pressed, instead of every frame while it's pressed." -msgstr "" - -#: doc/classes/InputFilter.xml:218 -msgid "" -"Returns [code]true[/code] when the user stops pressing the action event, " -"meaning it's [code]true[/code] only on the frame that the user released the " -"button." -msgstr "" - -#: doc/classes/InputFilter.xml:227 -msgid "" -"Returns [code]true[/code] if you are pressing the action event. Note that if " -"an action has multiple buttons assigned 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." -msgstr "" - -#: doc/classes/InputFilter.xml:238 -msgid "" -"Returns [code]true[/code] if you are pressing the joypad button (see [enum " -"JoystickList])." -msgstr "" - -#: doc/classes/InputFilter.xml:247 -msgid "" -"Returns [code]true[/code] if the system knows the specified device. This " -"means that it sets all button and axis indices exactly as defined in [enum " -"JoystickList]. Unknown joypads are not expected to match these constants, " -"but you can still retrieve events from them." -msgstr "" - -#: doc/classes/InputFilter.xml:256 -msgid "" -"Returns [code]true[/code] if you are pressing the key in the current " -"keyboard layout. You can pass a [enum KeyList] constant." -msgstr "" - -#: doc/classes/InputFilter.xml:265 -msgid "" -"Returns [code]true[/code] if you are pressing the mouse button specified " -"with [enum ButtonList]." -msgstr "" - -#: doc/classes/InputFilter.xml:280 -msgid "" -"Notifies the [InputFilter] singleton that a connection has changed, to " -"update the state for the [code]device[/code] index.\n" -"This is used internally and should not have to be called from user scripts. " -"See [signal joy_connection_changed] for the signal emitted when this is " -"triggered internally." -msgstr "" - -#: doc/classes/InputFilter.xml:290 -msgid "" -"Feeds an [InputEvent] to the game. Can be used to artificially trigger input " -"events from code. Also generates [method Node._input] calls.\n" -"Example:\n" -"[codeblock]\n" -"var a = InputEventAction.new()\n" -"a.action = \"ui_cancel\"\n" -"a.pressed = true\n" -"InputFilter.parse_input_event(a)\n" -"[/codeblock]" -msgstr "" - -#: doc/classes/InputFilter.xml:306 -msgid "" -"Removes all mappings from the internal database that match the given GUID." -msgstr "" - -#: doc/classes/InputFilter.xml:319 -msgid "" -"Sets a custom mouse cursor image, which is only visible inside the game " -"window. The hotspot can also be specified. Passing [code]null[/code] to the " -"image parameter resets to the system cursor. See [enum CursorShape] for the " -"list of shapes.\n" -"[code]image[/code]'s size must be lower than 256×256.\n" -"[code]hotspot[/code] must be within [code]image[/code]'s size.\n" -"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If " -"using an [AnimatedTexture], only the first frame will be displayed.\n" -"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or " -"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] " -"compression mode can't be used for custom cursors." -msgstr "" - -#: doc/classes/InputFilter.xml:332 -msgid "" -"Sets the default cursor shape to be used in the viewport instead of " -"[constant CURSOR_ARROW].\n" -"[b]Note:[/b] If you want to change the default cursor shape for [Control]'s " -"nodes, use [member Control.mouse_default_cursor_shape] instead.\n" -"[b]Note:[/b] This method generates an [InputEventMouseMotion] to update " -"cursor immediately." -msgstr "" - -#: doc/classes/InputFilter.xml:343 -msgid "Sets the mouse mode. See the constants for more information." -msgstr "" - -#: doc/classes/InputFilter.xml:352 -msgid "" -"Enables or disables the accumulation of similar input events sent by the " -"operating system. When input accumulation is enabled, all input events " -"generated during a frame will be merged and emitted when the frame is done " -"rendering. Therefore, this limits the number of input method calls per " -"second to the rendering FPS.\n" -"Input accumulation is enabled by default. It can be disabled to get slightly " -"more precise/reactive input at the cost of increased CPU usage. In " -"applications where drawing freehand lines is required, input accumulation " -"should generally be disabled while the user is drawing the line to get " -"results that closely follow the actual input." -msgstr "" - -#: doc/classes/InputFilter.xml:368 -msgid "" -"Starts to vibrate the joypad. Joypads usually come with two rumble motors, a " -"strong and a weak one. [code]weak_magnitude[/code] is the strength of the " -"weak motor (between 0 and 1) and [code]strong_magnitude[/code] is the " -"strength of the strong motor (between 0 and 1). [code]duration[/code] is the " -"duration of the effect in seconds (a duration of 0 will try to play the " -"vibration indefinitely).\n" -"[b]Note:[/b] Not every hardware is compatible with long effect durations; it " -"is recommended to restart an effect if it has to be played for more than a " -"few seconds." -msgstr "" - -#: doc/classes/InputFilter.xml:378 -msgid "Stops the vibration of the joypad." -msgstr "" - -#: doc/classes/InputFilter.xml:387 -msgid "" -"Vibrate Android and iOS devices.\n" -"[b]Note:[/b] It needs VIBRATE permission for Android at export settings. iOS " -"does not support duration." -msgstr "" - -#: doc/classes/InputFilter.xml:397 -msgid "Sets the mouse position to the specified vector." -msgstr "" - -#: doc/classes/InputFilter.xml:408 -msgid "Emitted when a joypad device has been connected or disconnected." -msgstr "" - -#: doc/classes/InputFilter.xml:414 -msgid "Makes the mouse cursor visible if it is hidden." -msgstr "" - -#: doc/classes/InputFilter.xml:417 -msgid "Makes the mouse cursor hidden if it is visible." -msgstr "" - -#: doc/classes/InputFilter.xml:420 -msgid "" -"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." -msgstr "" - -#: doc/classes/InputFilter.xml:423 -msgid "Makes the mouse cursor visible but confines it to the game window." -msgstr "" - -#: doc/classes/InputFilter.xml:426 -msgid "Arrow cursor. Standard, default pointing cursor." -msgstr "" - -#: doc/classes/InputFilter.xml:429 -msgid "" -"I-beam cursor. Usually used to show where the text cursor will appear when " -"the mouse is clicked." -msgstr "" - -#: doc/classes/InputFilter.xml:432 -msgid "" -"Pointing hand cursor. Usually used to indicate the pointer is over a link or " -"other interactable item." -msgstr "" - -#: doc/classes/InputFilter.xml:435 -msgid "" -"Cross cursor. Typically appears over regions in which a drawing operation " -"can be performed or for selections." -msgstr "" - -#: doc/classes/InputFilter.xml:438 -msgid "" -"Wait cursor. Indicates that the application is busy performing an operation. " -"This cursor shape denotes that the application is still usable during the " -"operation." -msgstr "" - -#: doc/classes/InputFilter.xml:441 -msgid "" -"Busy cursor. Indicates that the application is busy performing an operation. " -"This cursor shape denotes that the application isn't usable during the " -"operation (e.g. something is blocking its main thread)." -msgstr "" - -#: doc/classes/InputFilter.xml:444 -msgid "Drag cursor. Usually displayed when dragging something." -msgstr "" - -#: doc/classes/InputFilter.xml:447 -msgid "" -"Can drop cursor. Usually displayed when dragging something to indicate that " -"it can be dropped at the current position." -msgstr "" - -#: doc/classes/InputFilter.xml:450 -msgid "" -"Forbidden cursor. Indicates that the current action is forbidden (for " -"example, when dragging something) or that the control at a position is " -"disabled." -msgstr "" - -#: doc/classes/InputFilter.xml:453 -msgid "" -"Vertical resize mouse cursor. A double-headed vertical arrow. It tells the " -"user they can resize the window or the panel vertically." -msgstr "" - -#: doc/classes/InputFilter.xml:456 -msgid "" -"Horizontal resize mouse cursor. A double-headed horizontal arrow. It tells " -"the user they can resize the window or the panel horizontally." -msgstr "" - -#: doc/classes/InputFilter.xml:459 -msgid "" -"Window resize mouse cursor. The cursor is a double-headed arrow that goes " -"from the bottom left to the top right. It tells the user they can resize the " -"window or the panel both horizontally and vertically." -msgstr "" - -#: doc/classes/InputFilter.xml:462 -msgid "" -"Window resize mouse cursor. The cursor is a double-headed arrow that goes " -"from the top left to the bottom right, the opposite of [constant " -"CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel " -"both horizontally and vertically." -msgstr "" - -#: doc/classes/InputFilter.xml:465 -msgid "Move cursor. Indicates that something can be moved." -msgstr "" - -#: doc/classes/InputFilter.xml:468 -msgid "" -"Vertical split mouse cursor. On Windows, it's the same as [constant " -"CURSOR_VSIZE]." -msgstr "" - -#: doc/classes/InputFilter.xml:471 -msgid "" -"Horizontal split mouse cursor. On Windows, it's the same as [constant " -"CURSOR_HSIZE]." -msgstr "" - -#: doc/classes/InputFilter.xml:474 -msgid "Help cursor. Usually a question mark." +msgid "State of the [kbd]Shift[/kbd] modifier." msgstr "" #: doc/classes/InputMap.xml:4 @@ -25886,14 +25720,6 @@ msgstr "" msgid "Address type: Any." msgstr "" -#: doc/classes/IP_Unix.xml:4 -msgid "UNIX IP support. See [IP]." -msgstr "" - -#: doc/classes/IP_Unix.xml:7 -msgid "UNIX-specific implementation of IP support functions. See [IP]." -msgstr "" - #: doc/classes/ItemList.xml:4 msgid "" "Control that provides a list of selectable items (and/or icons) in a single " @@ -25908,7 +25734,7 @@ msgid "" "Selectable items in the list may be selected or deselected and multiple " "selection may be enabled. Selection with right mouse button may also be " "enabled to allow use of popup context menus. Items may also be \"activated\" " -"by double-clicking them or by pressing Enter.\n" +"by double-clicking them or by pressing [kbd]Enter[/kbd].\n" "Item text only supports single-line strings, newline characters (e.g. " "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " @@ -26067,7 +25893,7 @@ msgstr "" msgid "" "Disables (or enables) the item at the specified index.\n" "Disabled items cannot be selected and do not trigger activation signals " -"(when double-clicking or pressing Enter)." +"(when double-clicking or pressing [kbd]Enter[/kbd])." msgstr "" #: doc/classes/ItemList.xml:292 @@ -26202,7 +26028,7 @@ msgstr "" #: doc/classes/ItemList.xml:455 msgid "" "Triggered when specified list item is activated via double-clicking or by " -"pressing Enter." +"pressing [kbd]Enter[/kbd]." msgstr "" #: doc/classes/ItemList.xml:464 @@ -26252,7 +26078,9 @@ msgid "Only allow selecting a single item." msgstr "" #: doc/classes/ItemList.xml:511 -msgid "Allows selecting multiple items by holding Ctrl or Shift." +msgid "" +"Allows selecting multiple items by holding [kbd]Ctrl[/kbd] or [kbd]Shift[/" +"kbd]." msgstr "" #: doc/classes/ItemList.xml:516 @@ -27243,59 +27071,91 @@ msgid "" msgstr "" #: doc/classes/Light3D.xml:39 -msgid "The light's bake mode. See [enum BakeMode]." +msgid "" +"Angular size of the light in degrees. Only available for " +"[DirectionalLight3D]s. For reference, the sun from earth is approximately " +"[code]0.5[/code]." msgstr "" #: doc/classes/Light3D.xml:42 -msgid "The light's color." +msgid "The light's bake mode. See [enum BakeMode]." msgstr "" #: doc/classes/Light3D.xml:45 -msgid "The light will affect objects in the selected layers." +msgid "The light's color." msgstr "" #: doc/classes/Light3D.xml:48 -msgid "The light's strength multiplier." +msgid "The light will affect objects in the selected layers." msgstr "" #: doc/classes/Light3D.xml:51 +msgid "The light's strength multiplier." +msgstr "" + +#: doc/classes/Light3D.xml:54 msgid "" "Secondary multiplier used with indirect light (light bounces). Used with " "[GIProbe]." msgstr "" -#: doc/classes/Light3D.xml:54 +#: doc/classes/Light3D.xml:57 msgid "" "If [code]true[/code], the light's effect is reversed, darkening areas and " "casting bright shadows." msgstr "" -#: doc/classes/Light3D.xml:57 +#: doc/classes/Light3D.xml:60 +msgid "" +"[Texture2D] projected by light. [member shadow_enabled] must be on for the " +"projector to work. Light projectors make the light appear as if it is " +"shining through a colored but transparent object, almost like light shining " +"through stained glass." +msgstr "" + +#: doc/classes/Light3D.xml:63 +msgid "" +"The size of the light in Godot units. Only available for [OmniLight3D]s and " +"[SpotLight3D]s." +msgstr "" + +#: doc/classes/Light3D.xml:66 msgid "" "The intensity of the specular blob in objects affected by the light. At " "[code]0[/code] the light becomes a pure diffuse light." msgstr "" -#: doc/classes/Light3D.xml:60 +#: doc/classes/Light3D.xml:69 msgid "" "Used to adjust shadow appearance. Too small a value results in self-" "shadowing, while too large a value causes shadows to separate from casters. " "Adjust as needed." msgstr "" -#: doc/classes/Light3D.xml:63 -msgid "The color of shadows cast by this light." +#: doc/classes/Light3D.xml:72 doc/classes/RenderingServer.xml:3374 +msgid "" +"Blurs the edges of the shadow. Can be used to hide pixel artifacts in low " +"resolution shadow maps. A high value can make shadows appear grainy and can " +"cause other unwanted artifacts. Try to keep as near default as possible." msgstr "" -#: doc/classes/Light3D.xml:66 -msgid "Attempts to reduce [member shadow_bias] gap." +#: doc/classes/Light3D.xml:75 +msgid "The color of shadows cast by this light." msgstr "" -#: doc/classes/Light3D.xml:69 +#: doc/classes/Light3D.xml:78 msgid "If [code]true[/code], the light will cast shadows." msgstr "" -#: doc/classes/Light3D.xml:72 +#: doc/classes/Light3D.xml:81 +msgid "" +"Offsets the lookup into the shadow map by the objects normal. This can be " +"used reduce self-shadowing artifacts without using [member shadow_bias]. In " +"practice, this value should be tweaked along with [member shadow_bias] to " +"reduce artifacts as much as possible." +msgstr "" + +#: doc/classes/Light3D.xml:84 msgid "" "If [code]true[/code], reverses the backface culling of the mesh. This can be " "useful when you have a flat mesh that has a light behind it. If you need to " @@ -27304,93 +27164,105 @@ msgid "" "SHADOW_CASTING_SETTING_DOUBLE_SIDED]." msgstr "" -#: doc/classes/Light3D.xml:77 +#: doc/classes/Light3D.xml:91 msgid "Constant for accessing [member light_energy]." msgstr "" -#: doc/classes/Light3D.xml:80 +#: doc/classes/Light3D.xml:94 msgid "Constant for accessing [member light_indirect_energy]." msgstr "" -#: doc/classes/Light3D.xml:83 +#: doc/classes/Light3D.xml:97 msgid "Constant for accessing [member light_specular]." msgstr "" -#: doc/classes/Light3D.xml:86 +#: doc/classes/Light3D.xml:100 msgid "" "Constant for accessing [member OmniLight3D.omni_range] or [member " "SpotLight3D.spot_range]." msgstr "" -#: doc/classes/Light3D.xml:89 +#: doc/classes/Light3D.xml:103 +msgid "Constant for accessing [member light_size]." +msgstr "" + +#: doc/classes/Light3D.xml:106 msgid "" "Constant for accessing [member OmniLight3D.omni_attenuation] or [member " "SpotLight3D.spot_attenuation]." msgstr "" -#: doc/classes/Light3D.xml:92 +#: doc/classes/Light3D.xml:109 msgid "Constant for accessing [member SpotLight3D.spot_angle]." msgstr "" -#: doc/classes/Light3D.xml:95 +#: doc/classes/Light3D.xml:112 msgid "Constant for accessing [member SpotLight3D.spot_angle_attenuation]." msgstr "" -#: doc/classes/Light3D.xml:98 -msgid "Constant for accessing [member shadow_contact]." -msgstr "" - -#: doc/classes/Light3D.xml:101 +#: doc/classes/Light3D.xml:115 msgid "" "Constant for accessing [member DirectionalLight3D." "directional_shadow_max_distance]." msgstr "" -#: doc/classes/Light3D.xml:104 +#: doc/classes/Light3D.xml:118 msgid "" "Constant for accessing [member DirectionalLight3D." "directional_shadow_split_1]." msgstr "" -#: doc/classes/Light3D.xml:107 +#: doc/classes/Light3D.xml:121 msgid "" "Constant for accessing [member DirectionalLight3D." "directional_shadow_split_2]." msgstr "" -#: doc/classes/Light3D.xml:110 +#: doc/classes/Light3D.xml:124 msgid "" "Constant for accessing [member DirectionalLight3D." "directional_shadow_split_3]." msgstr "" -#: doc/classes/Light3D.xml:115 +#: doc/classes/Light3D.xml:127 msgid "" "Constant for accessing [member DirectionalLight3D." -"directional_shadow_normal_bias]." +"directional_shadow_fade_start]." msgstr "" -#: doc/classes/Light3D.xml:118 +#: doc/classes/Light3D.xml:130 +msgid "Constant for accessing [member shadow_normal_bias]." +msgstr "" + +#: doc/classes/Light3D.xml:133 msgid "Constant for accessing [member shadow_bias]." msgstr "" -#: doc/classes/Light3D.xml:121 +#: doc/classes/Light3D.xml:136 msgid "" "Constant for accessing [member DirectionalLight3D." -"directional_shadow_bias_split_scale]." +"directional_shadow_pancake_size]." msgstr "" -#: doc/classes/Light3D.xml:127 +#: doc/classes/Light3D.xml:139 +msgid "Constant for accessing [member shadow_blur]." +msgstr "" + +#: doc/classes/Light3D.xml:142 +msgid "Constant for accessing [member shadow_transmittance_bias]." +msgstr "" + +#: doc/classes/Light3D.xml:148 msgid "" "Light is ignored when baking.\n" "[b]Note:[/b] Hiding a light does [i]not[/i] affect baking." msgstr "" -#: doc/classes/Light3D.xml:131 +#: doc/classes/Light3D.xml:152 msgid "Only indirect lighting will be baked (default)." msgstr "" -#: doc/classes/Light3D.xml:134 +#: doc/classes/Light3D.xml:155 msgid "" "Both direct and indirect light will be baked.\n" "[b]Note:[/b] You should hide the light if you don't want it to appear twice " @@ -27581,32 +27453,40 @@ msgstr "" msgid "" "LineEdit provides a single-line string editor, used for text fields.\n" "It features many built-in shortcuts which will always be available " -"([code]Ctrl[/code] here maps to [code]Command[/code] on macOS):\n" -"- Ctrl + C: Copy\n" -"- Ctrl + X: Cut\n" -"- Ctrl + V or Ctrl + Y: Paste/\"yank\"\n" -"- Ctrl + Z: Undo\n" -"- Ctrl + Shift + Z: Redo\n" -"- Ctrl + U: Delete text from the cursor position to the beginning of the " -"line\n" -"- Ctrl + K: Delete text from the cursor position to the end of the line\n" -"- Ctrl + A: Select all text\n" -"- Up/Down arrow: Move the cursor to the beginning/end of the line\n" -"On macOS, some extra keyboard shortcuts are available:\n" -"- Ctrl + F: Like the right arrow key, move the cursor one character right\n" -"- Ctrl + B: Like the left arrow key, move the cursor one character left\n" -"- Ctrl + P: Like the up arrow key, move the cursor to the previous line\n" -"- Ctrl + N: Like the down arrow key, move the cursor to the next line\n" -"- Ctrl + D: Like the Delete key, delete the character on the right side of " -"cursor\n" -"- Ctrl + H: Like the Backspace key, delete the character on the left side of " -"the cursor\n" -"- Ctrl + A: Like the Home key, move the cursor to the beginning of the line\n" -"- Ctrl + E: Like the End key, move the cursor to the end of the line\n" -"- Command + Left arrow: Like the Home key, move the cursor to the beginning " +"([kbd]Ctrl[/kbd] here maps to [kbd]Cmd[/kbd] on macOS):\n" +"- [kbd]Ctrl + C[/kbd]: Copy\n" +"- [kbd]Ctrl + X[/kbd]: Cut\n" +"- [kbd]Ctrl + V[/kbd] or [kbd]Ctrl + Y[/kbd]: Paste/\"yank\"\n" +"- [kbd]Ctrl + Z[/kbd]: Undo\n" +"- [kbd]Ctrl + Shift + Z[/kbd]: Redo\n" +"- [kbd]Ctrl + U[/kbd]: Delete text from the cursor position to the beginning " "of the line\n" -"- Command + Right arrow: Like the End key, move the cursor to the end of the " -"line" +"- [kbd]Ctrl + K[/kbd]: Delete text from the cursor position to the end of " +"the line\n" +"- [kbd]Ctrl + A[/kbd]: Select all text\n" +"- [kbd]Up Arrow[/kbd]/[kbd]Down Arrow[/kbd]: Move the cursor to the " +"beginning/end of the line\n" +"On macOS, some extra keyboard shortcuts are available:\n" +"- [kbd]Ctrl + F[/kbd]: Same as [kbd]Right Arrow[/kbd], move the cursor one " +"character right\n" +"- [kbd]Ctrl + B[/kbd]: Same as [kbd]Left Arrow[/kbd], move the cursor one " +"character left\n" +"- [kbd]Ctrl + P[/kbd]: Same as [kbd]Up Arrow[/kbd], move the cursor to the " +"previous line\n" +"- [kbd]Ctrl + N[/kbd]: Same as [kbd]Down Arrow[/kbd], move the cursor to the " +"next line\n" +"- [kbd]Ctrl + D[/kbd]: Same as [kbd]Delete[/kbd], delete the character on " +"the right side of cursor\n" +"- [kbd]Ctrl + H[/kbd]: Same as [kbd]Backspace[/kbd], delete the character on " +"the left side of the cursor\n" +"- [kbd]Ctrl + A[/kbd]: Same as [kbd]Home[/kbd], move the cursor to the " +"beginning of the line\n" +"- [kbd]Ctrl + E[/kbd]: Same as [kbd]End[/kbd], move the cursor to the end of " +"the line\n" +"- [kbd]Cmd + Left Arrow[/kbd]: Same as [kbd]Home[/kbd], move the cursor to " +"the beginning of the line\n" +"- [kbd]Cmd + Right Arrow[/kbd]: Same as [kbd]End[/kbd], move the cursor to " +"the end of the line" msgstr "" #: doc/classes/LineEdit.xml:39 @@ -27751,7 +27631,7 @@ msgid "" "max_length]." msgstr "" -#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:513 +#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:514 msgid "Emitted when the text changes." msgstr "" @@ -27775,11 +27655,11 @@ msgstr "" msgid "Stretches whitespaces to fit the [LineEdit]'s width." msgstr "" -#: doc/classes/LineEdit.xml:188 doc/classes/TextEdit.xml:534 +#: doc/classes/LineEdit.xml:188 doc/classes/TextEdit.xml:535 msgid "Cuts (copies and clears) the selected text." msgstr "" -#: doc/classes/LineEdit.xml:191 doc/classes/TextEdit.xml:537 +#: doc/classes/LineEdit.xml:191 doc/classes/TextEdit.xml:538 msgid "Copies the selected text." msgstr "" @@ -27799,7 +27679,7 @@ msgstr "" msgid "Selects the whole [LineEdit] text." msgstr "" -#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:549 +#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:550 msgid "Undoes the previous action." msgstr "" @@ -27807,7 +27687,7 @@ msgstr "" msgid "Reverse the last undo action." msgstr "" -#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:555 +#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:556 msgid "Represents the size of the [enum MenuItems] enum." msgstr "" @@ -28437,11 +28317,11 @@ msgstr "" msgid "Render array as triangle strips." msgstr "" -#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3254 +#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3306 msgid "Blend shapes are normalized." msgstr "" -#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3257 +#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3309 msgid "Blend shapes are relative to base weight." msgstr "" @@ -28483,37 +28363,37 @@ msgstr "" msgid "Mesh array uses indices." msgstr "" -#: doc/classes/Mesh.xml:159 doc/classes/RenderingServer.xml:3210 +#: doc/classes/Mesh.xml:159 doc/classes/RenderingServer.xml:3262 msgid "Flag used to mark a compressed (half float) normal array." msgstr "" -#: doc/classes/Mesh.xml:162 doc/classes/RenderingServer.xml:3213 +#: doc/classes/Mesh.xml:162 doc/classes/RenderingServer.xml:3265 msgid "Flag used to mark a compressed (half float) tangent array." msgstr "" -#: doc/classes/Mesh.xml:165 doc/classes/RenderingServer.xml:3216 +#: doc/classes/Mesh.xml:165 doc/classes/RenderingServer.xml:3268 msgid "Flag used to mark a compressed (half float) color array." msgstr "" -#: doc/classes/Mesh.xml:168 doc/classes/RenderingServer.xml:3219 +#: doc/classes/Mesh.xml:168 doc/classes/RenderingServer.xml:3271 msgid "Flag used to mark a compressed (half float) UV coordinates array." msgstr "" -#: doc/classes/Mesh.xml:171 doc/classes/RenderingServer.xml:3222 +#: doc/classes/Mesh.xml:171 doc/classes/RenderingServer.xml:3274 msgid "" "Flag used to mark a compressed (half float) UV coordinates array for the " "second UV coordinates." msgstr "" -#: doc/classes/Mesh.xml:174 doc/classes/RenderingServer.xml:3225 +#: doc/classes/Mesh.xml:174 doc/classes/RenderingServer.xml:3277 msgid "Flag used to mark a compressed index array." msgstr "" -#: doc/classes/Mesh.xml:177 doc/classes/RenderingServer.xml:3228 +#: doc/classes/Mesh.xml:177 doc/classes/RenderingServer.xml:3283 msgid "Flag used to mark that the array contains 2D vertices." msgstr "" -#: doc/classes/Mesh.xml:180 doc/classes/RenderingServer.xml:3233 +#: doc/classes/Mesh.xml:180 doc/classes/RenderingServer.xml:3280 msgid "" "Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " "ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " @@ -28578,67 +28458,72 @@ msgid "" " mdt.set_vertex(i, vertex)\n" "mesh.surface_remove(0)\n" "mdt.commit_to_surface(mesh)\n" -"[/codeblock]" +"[/codeblock]\n" +"See also [ArrayMesh], [ImmediateGeometry3D] and [SurfaceTool] for procedural " +"geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." msgstr "" -#: doc/classes/MeshDataTool.xml:28 +#: doc/classes/MeshDataTool.xml:30 msgid "Clears all data currently in MeshDataTool." msgstr "" -#: doc/classes/MeshDataTool.xml:37 +#: doc/classes/MeshDataTool.xml:39 msgid "Adds a new surface to specified [Mesh] with edited data." msgstr "" -#: doc/classes/MeshDataTool.xml:48 +#: doc/classes/MeshDataTool.xml:50 msgid "" "Uses specified surface of given [Mesh] to populate data for MeshDataTool.\n" "Requires [Mesh] with primitive type [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" -#: doc/classes/MeshDataTool.xml:56 +#: doc/classes/MeshDataTool.xml:58 msgid "Returns the number of edges in this [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:65 +#: doc/classes/MeshDataTool.xml:67 msgid "Returns array of faces that touch given edge." msgstr "" -#: doc/classes/MeshDataTool.xml:74 +#: doc/classes/MeshDataTool.xml:76 msgid "Returns meta information assigned to given edge." msgstr "" -#: doc/classes/MeshDataTool.xml:85 +#: doc/classes/MeshDataTool.xml:87 msgid "" "Returns index of specified vertex connected to given edge.\n" "Vertex argument can only be 0 or 1 because edges are comprised of two " "vertices." msgstr "" -#: doc/classes/MeshDataTool.xml:93 +#: doc/classes/MeshDataTool.xml:95 msgid "Returns the number of faces in this [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:104 +#: doc/classes/MeshDataTool.xml:106 msgid "" "Returns specified edge associated with given face.\n" "Edge argument must 2 or less because a face only has three edges." msgstr "" -#: doc/classes/MeshDataTool.xml:114 +#: doc/classes/MeshDataTool.xml:116 msgid "Returns the metadata associated with the given face." msgstr "" -#: doc/classes/MeshDataTool.xml:123 +#: doc/classes/MeshDataTool.xml:125 msgid "Calculates and returns the face normal of the given face." msgstr "" -#: doc/classes/MeshDataTool.xml:134 +#: doc/classes/MeshDataTool.xml:136 msgid "" "Returns the specified vertex of the given face.\n" "Vertex argument must be 2 or less because faces contain three vertices." msgstr "" -#: doc/classes/MeshDataTool.xml:142 +#: doc/classes/MeshDataTool.xml:144 msgid "" "Returns the [Mesh]'s format. Format is an integer made up of [Mesh] format " "flags combined together. For example, a mesh containing both vertices and " @@ -28648,103 +28533,103 @@ msgid "" "See [enum ArrayMesh.ArrayFormat] for a list of format flags." msgstr "" -#: doc/classes/MeshDataTool.xml:150 +#: doc/classes/MeshDataTool.xml:152 msgid "Returns the material assigned to the [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:159 +#: doc/classes/MeshDataTool.xml:161 msgid "Returns the vertex at given index." msgstr "" -#: doc/classes/MeshDataTool.xml:168 +#: doc/classes/MeshDataTool.xml:170 msgid "Returns the bones of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:177 +#: doc/classes/MeshDataTool.xml:179 msgid "Returns the color of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:184 +#: doc/classes/MeshDataTool.xml:186 msgid "Returns the total number of vertices in [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:193 +#: doc/classes/MeshDataTool.xml:195 msgid "Returns an array of edges that share the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:202 +#: doc/classes/MeshDataTool.xml:204 msgid "Returns an array of faces that share the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:211 +#: doc/classes/MeshDataTool.xml:213 msgid "Returns the metadata associated with the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:220 +#: doc/classes/MeshDataTool.xml:222 msgid "Returns the normal of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:229 +#: doc/classes/MeshDataTool.xml:231 msgid "Returns the tangent of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:238 +#: doc/classes/MeshDataTool.xml:240 msgid "Returns the UV of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:247 +#: doc/classes/MeshDataTool.xml:249 msgid "Returns the UV2 of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:256 +#: doc/classes/MeshDataTool.xml:258 msgid "Returns bone weights of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:267 +#: doc/classes/MeshDataTool.xml:269 msgid "Sets the metadata of the given edge." msgstr "" -#: doc/classes/MeshDataTool.xml:278 +#: doc/classes/MeshDataTool.xml:280 msgid "Sets the metadata of the given face." msgstr "" -#: doc/classes/MeshDataTool.xml:287 +#: doc/classes/MeshDataTool.xml:289 msgid "Sets the material to be used by newly-constructed [Mesh]." msgstr "" -#: doc/classes/MeshDataTool.xml:298 +#: doc/classes/MeshDataTool.xml:300 msgid "Sets the position of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:309 +#: doc/classes/MeshDataTool.xml:311 msgid "Sets the bones of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:320 +#: doc/classes/MeshDataTool.xml:322 msgid "Sets the color of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:331 +#: doc/classes/MeshDataTool.xml:333 msgid "Sets the metadata associated with the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:342 +#: doc/classes/MeshDataTool.xml:344 msgid "Sets the normal of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:353 +#: doc/classes/MeshDataTool.xml:355 msgid "Sets the tangent of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:364 +#: doc/classes/MeshDataTool.xml:366 msgid "Sets the UV of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:375 +#: doc/classes/MeshDataTool.xml:377 msgid "Sets the UV2 of the given vertex." msgstr "" -#: doc/classes/MeshDataTool.xml:386 +#: doc/classes/MeshDataTool.xml:388 msgid "Sets the bone weights of the given vertex." msgstr "" @@ -28990,9 +28875,9 @@ msgid "" "setting [member eye_height].\n" "You can initialise this interface as follows:\n" "[codeblock]\n" -"var interface = ARVRServer.find_interface(\"Native mobile\")\n" +"var interface = XRServer.find_interface(\"Native mobile\")\n" "if interface and interface.initialize():\n" -" get_viewport().arvr = true\n" +" get_viewport().xr = true\n" "[/codeblock]" msgstr "" @@ -29009,7 +28894,7 @@ msgstr "" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml:28 msgid "" "The height at which the camera is placed in relation to the ground (i.e. " -"[ARVROrigin] node)." +"[XROrigin3D] node)." msgstr "" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml:31 @@ -31489,7 +31374,7 @@ msgstr "" #: doc/classes/Node.xml:935 msgid "" "Notification received from the OS when a close request is sent (e.g. closing " -"the window with a \"Close\" button or Alt+F4).\n" +"the window with a \"Close\" button or [kbd]Alt + F4[/kbd]).\n" "Implemented on desktop platforms." msgstr "" @@ -31591,11 +31476,21 @@ msgid "" msgstr "" #: doc/classes/Node2D.xml:95 -msgid "Converts a local point's coordinates to global coordinates." +msgid "" +"Transforms the provided local position into a position in global coordinate " +"space. The input is expected to be local relative to the [Node2D] it is " +"called on. e.g. Applying this method to the positions of child nodes will " +"correctly transform their positions into the global coordinate space, but " +"applying it to a node's own position will give an incorrect result, as it " +"will incorporate the node's own transformation into its global position." msgstr "" #: doc/classes/Node2D.xml:104 -msgid "Converts a global point's coordinates to local coordinates." +msgid "" +"Transforms the provided global position into a position in local coordinate " +"space. The output will be local relative to the [Node2D] it is called on. e." +"g. It is appropriate for determining the positions of child nodes, but it is " +"not appropriate for determining its own position relative to its parent." msgstr "" #: doc/classes/Node2D.xml:113 @@ -31670,80 +31565,83 @@ msgid "" "operations in this coordinate system correspond to direct affine operations " "on the [Node3D]'s transform. The word local below refers to this coordinate " "system. The coordinate system that is attached to the [Node3D] object itself " -"is referred to as object-local coordinate system." +"is referred to as object-local coordinate system.\n" +"[b]Note:[/b] Unless otherwise specified, all methods that have angle " +"parameters must have angles specified as [i]radians[/i]. To convert degrees " +"to radians, use [method @GDScript.deg2rad]." msgstr "" -#: doc/classes/Node3D.xml:11 +#: doc/classes/Node3D.xml:12 msgid "" "https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html" msgstr "" -#: doc/classes/Node3D.xml:25 +#: doc/classes/Node3D.xml:26 msgid "" "Returns the parent [Node3D], or an empty [Object] if no parent exists or " "parent is not of type [Node3D]." msgstr "" -#: doc/classes/Node3D.xml:32 +#: doc/classes/Node3D.xml:33 msgid "" "Returns the current [World3D] resource this [Node3D] node is registered to." msgstr "" -#: doc/classes/Node3D.xml:43 +#: doc/classes/Node3D.xml:44 msgid "" "Rotates the global (world) transformation around axis, a unit [Vector3], by " "specified angle in radians. The rotation axis is in global coordinate system." msgstr "" -#: doc/classes/Node3D.xml:52 +#: doc/classes/Node3D.xml:53 msgid "" "Scales the global (world) transformation by the given [Vector3] scale " "factors." msgstr "" -#: doc/classes/Node3D.xml:61 +#: doc/classes/Node3D.xml:62 msgid "" "Moves the global (world) transformation by [Vector3] offset. The offset is " "in global coordinate system." msgstr "" -#: doc/classes/Node3D.xml:68 +#: doc/classes/Node3D.xml:69 msgid "" "Disables rendering of this node. Changes [member visible] to [code]false[/" "code]." msgstr "" -#: doc/classes/Node3D.xml:75 +#: doc/classes/Node3D.xml:76 msgid "" "Returns whether node notifies about its local transformation changes. " "[Node3D] will not propagate this by default." msgstr "" -#: doc/classes/Node3D.xml:82 +#: doc/classes/Node3D.xml:83 msgid "" "Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its " "local transformation scale." msgstr "" -#: doc/classes/Node3D.xml:89 +#: doc/classes/Node3D.xml:90 msgid "" "Returns whether this node is set as Toplevel, that is whether it ignores its " "parent nodes transformations." msgstr "" -#: doc/classes/Node3D.xml:96 +#: doc/classes/Node3D.xml:97 msgid "" "Returns whether the node notifies about its global and local transformation " "changes. [Node3D] will not propagate this by default." msgstr "" -#: doc/classes/Node3D.xml:103 +#: doc/classes/Node3D.xml:104 msgid "" "Returns whether the node is visible, taking into consideration that its " "parents visibility." msgstr "" -#: doc/classes/Node3D.xml:114 +#: doc/classes/Node3D.xml:115 msgid "" "Rotates itself so that the local -Z axis points towards the [code]target[/" "code] position.\n" @@ -31753,106 +31651,106 @@ msgid "" "Operations take place in global space." msgstr "" -#: doc/classes/Node3D.xml:129 +#: doc/classes/Node3D.xml:130 msgid "" "Moves the node to the specified [code]position[/code], and then rotates " "itself to point toward the [code]target[/code] as per [method look_at]. " "Operations take place in global space." msgstr "" -#: doc/classes/Node3D.xml:136 +#: doc/classes/Node3D.xml:137 msgid "" "Resets this node's transformations (like scale, skew and taper) preserving " "its rotation and translation by performing Gram-Schmidt orthonormalization " "on this node's [Transform]." msgstr "" -#: doc/classes/Node3D.xml:147 +#: doc/classes/Node3D.xml:148 msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians." msgstr "" -#: doc/classes/Node3D.xml:158 +#: doc/classes/Node3D.xml:159 msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians. The rotation axis is in object-local coordinate system." msgstr "" -#: doc/classes/Node3D.xml:167 +#: doc/classes/Node3D.xml:168 msgid "Rotates the local transformation around the X axis by angle in radians." msgstr "" -#: doc/classes/Node3D.xml:176 +#: doc/classes/Node3D.xml:177 msgid "Rotates the local transformation around the Y axis by angle in radians." msgstr "" -#: doc/classes/Node3D.xml:185 +#: doc/classes/Node3D.xml:186 msgid "Rotates the local transformation around the Z axis by angle in radians." msgstr "" -#: doc/classes/Node3D.xml:194 +#: doc/classes/Node3D.xml:195 msgid "" "Scales the local transformation by given 3D scale factors in object-local " "coordinate system." msgstr "" -#: doc/classes/Node3D.xml:203 +#: doc/classes/Node3D.xml:204 msgid "" "Makes the node ignore its parents transformations. Node transformations are " "only in global space." msgstr "" -#: doc/classes/Node3D.xml:212 +#: doc/classes/Node3D.xml:213 msgid "" "Sets whether the node uses a scale of [code](1, 1, 1)[/code] or its local " "transformation scale. Changes to the local transformation scale are " "preserved." msgstr "" -#: doc/classes/Node3D.xml:219 +#: doc/classes/Node3D.xml:220 msgid "" "Reset all transformations for this node (sets its [Transform] to the " "identity matrix)." msgstr "" -#: doc/classes/Node3D.xml:228 +#: doc/classes/Node3D.xml:229 msgid "" "Sets whether the node ignores notification that its transformation (global " "or local) changed." msgstr "" -#: doc/classes/Node3D.xml:237 +#: doc/classes/Node3D.xml:238 msgid "" "Sets whether the node notifies about its local transformation changes. " "[Node3D] will not propagate this by default." msgstr "" -#: doc/classes/Node3D.xml:246 +#: doc/classes/Node3D.xml:247 msgid "" "Sets whether the node notifies about its global and local transformation " "changes. [Node3D] will not propagate this by default." msgstr "" -#: doc/classes/Node3D.xml:253 +#: doc/classes/Node3D.xml:254 msgid "" "Enables rendering of this node. Changes [member visible] to [code]true[/" "code]." msgstr "" -#: doc/classes/Node3D.xml:262 +#: doc/classes/Node3D.xml:263 msgid "" "Transforms [code]local_point[/code] from this node's local space to world " "space." msgstr "" -#: doc/classes/Node3D.xml:271 +#: doc/classes/Node3D.xml:272 msgid "" "Transforms [code]global_point[/code] from world space to this node's local " "space." msgstr "" -#: doc/classes/Node3D.xml:280 +#: doc/classes/Node3D.xml:281 msgid "" "Changes the node's position by the given offset [Vector3].\n" "Note that the translation [code]offset[/code] is affected by the node's " @@ -31861,26 +31759,26 @@ msgid "" "to the X coordinate." msgstr "" -#: doc/classes/Node3D.xml:290 +#: doc/classes/Node3D.xml:291 msgid "" "Changes the node's position by the given offset [Vector3] in local space." msgstr "" -#: doc/classes/Node3D.xml:297 +#: doc/classes/Node3D.xml:298 msgid "Updates the [Node3DGizmo] of this node." msgstr "" -#: doc/classes/Node3D.xml:303 +#: doc/classes/Node3D.xml:304 msgid "" "The [Node3DGizmo] for this node. Used for example in [EditorNode3DGizmo] as " "custom visualization and editing handles in Editor." msgstr "" -#: doc/classes/Node3D.xml:306 +#: doc/classes/Node3D.xml:307 msgid "World3D space (global) [Transform] of this node." msgstr "" -#: doc/classes/Node3D.xml:309 +#: doc/classes/Node3D.xml:310 msgid "" "Rotation part of the local transformation in radians, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle).\n" @@ -31893,33 +31791,33 @@ msgid "" "\" is not meaningful." msgstr "" -#: doc/classes/Node3D.xml:313 +#: doc/classes/Node3D.xml:314 msgid "" "Rotation part of the local transformation in degrees, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle)." msgstr "" -#: doc/classes/Node3D.xml:316 +#: doc/classes/Node3D.xml:317 msgid "Scale part of the local transformation." msgstr "" -#: doc/classes/Node3D.xml:319 +#: doc/classes/Node3D.xml:320 msgid "Local space [Transform] of this node, with respect to the parent node." msgstr "" -#: doc/classes/Node3D.xml:322 +#: doc/classes/Node3D.xml:323 msgid "Local translation of this node." msgstr "" -#: doc/classes/Node3D.xml:325 +#: doc/classes/Node3D.xml:326 msgid "If [code]true[/code], this node is drawn." msgstr "" -#: doc/classes/Node3D.xml:331 +#: doc/classes/Node3D.xml:332 msgid "Emitted when node visibility changes." msgstr "" -#: doc/classes/Node3D.xml:337 +#: doc/classes/Node3D.xml:338 msgid "" "Node3D nodes receives this notification when their global transform changes. " "This means that either the current or a parent node changed its transform.\n" @@ -31927,19 +31825,19 @@ msgid "" "need to ask for it, with [method set_notify_transform]." msgstr "" -#: doc/classes/Node3D.xml:341 +#: doc/classes/Node3D.xml:342 msgid "" "Node3D nodes receives this notification when they are registered to new " "[World3D] resource." msgstr "" -#: doc/classes/Node3D.xml:344 +#: doc/classes/Node3D.xml:345 msgid "" "Node3D nodes receives this notification when they are unregistered from " "current [World3D] resource." msgstr "" -#: doc/classes/Node3D.xml:347 +#: doc/classes/Node3D.xml:348 msgid "Node3D nodes receives this notification when their visibility changes." msgstr "" @@ -33315,11 +33213,13 @@ msgid "" "code]. See [url=https://blog.escapecreative.com/customizing-mailto-" "links/]Customizing [code]mailto:[/code] Links[/url] for a list of fields " "that can be added.\n" +"Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] " +"or [code]user://[/code] path into a system path for use with this method.\n" "[b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS " "and Windows." msgstr "" -#: doc/classes/OS.xml:493 +#: doc/classes/OS.xml:494 msgid "" "The exit code passed to the OS when the main loop exits. By convention, an " "exit code of [code]0[/code] indicates success whereas a non-zero exit code " @@ -33329,133 +33229,133 @@ msgid "" "with an [code]exit_code[/code] argument passed." msgstr "" -#: doc/classes/OS.xml:497 +#: doc/classes/OS.xml:498 msgid "" "If [code]true[/code], the engine optimizes for low processor usage by only " "refreshing the screen if needed. Can improve battery consumption on mobile." msgstr "" -#: doc/classes/OS.xml:500 +#: doc/classes/OS.xml:501 msgid "" "The amount of sleeping between frames when the low-processor usage mode is " "enabled (in microseconds). Higher values will result in lower CPU usage." msgstr "" -#: doc/classes/OS.xml:505 +#: doc/classes/OS.xml:506 msgid "" "The GLES2 rendering backend. It uses OpenGL ES 2.0 on mobile devices, OpenGL " "2.1 on desktop platforms and WebGL 1.0 on the web." msgstr "" -#: doc/classes/OS.xml:508 +#: doc/classes/OS.xml:509 msgid "The Vulkan rendering backend." msgstr "" -#: doc/classes/OS.xml:511 +#: doc/classes/OS.xml:512 msgid "Sunday." msgstr "" -#: doc/classes/OS.xml:514 +#: doc/classes/OS.xml:515 msgid "Monday." msgstr "" -#: doc/classes/OS.xml:517 +#: doc/classes/OS.xml:518 msgid "Tuesday." msgstr "" -#: doc/classes/OS.xml:520 +#: doc/classes/OS.xml:521 msgid "Wednesday." msgstr "" -#: doc/classes/OS.xml:523 +#: doc/classes/OS.xml:524 msgid "Thursday." msgstr "" -#: doc/classes/OS.xml:526 +#: doc/classes/OS.xml:527 msgid "Friday." msgstr "" -#: doc/classes/OS.xml:529 +#: doc/classes/OS.xml:530 msgid "Saturday." msgstr "" -#: doc/classes/OS.xml:532 +#: doc/classes/OS.xml:533 msgid "January." msgstr "" -#: doc/classes/OS.xml:535 +#: doc/classes/OS.xml:536 msgid "February." msgstr "" -#: doc/classes/OS.xml:538 +#: doc/classes/OS.xml:539 msgid "March." msgstr "" -#: doc/classes/OS.xml:541 +#: doc/classes/OS.xml:542 msgid "April." msgstr "" -#: doc/classes/OS.xml:544 +#: doc/classes/OS.xml:545 msgid "May." msgstr "" -#: doc/classes/OS.xml:547 +#: doc/classes/OS.xml:548 msgid "June." msgstr "" -#: doc/classes/OS.xml:550 +#: doc/classes/OS.xml:551 msgid "July." msgstr "" -#: doc/classes/OS.xml:553 +#: doc/classes/OS.xml:554 msgid "August." msgstr "" -#: doc/classes/OS.xml:556 +#: doc/classes/OS.xml:557 msgid "September." msgstr "" -#: doc/classes/OS.xml:559 +#: doc/classes/OS.xml:560 msgid "October." msgstr "" -#: doc/classes/OS.xml:562 +#: doc/classes/OS.xml:563 msgid "November." msgstr "" -#: doc/classes/OS.xml:565 +#: doc/classes/OS.xml:566 msgid "December." msgstr "" -#: doc/classes/OS.xml:568 +#: doc/classes/OS.xml:569 msgid "Desktop directory path." msgstr "" -#: doc/classes/OS.xml:571 +#: doc/classes/OS.xml:572 msgid "DCIM (Digital Camera Images) directory path." msgstr "" -#: doc/classes/OS.xml:574 +#: doc/classes/OS.xml:575 msgid "Documents directory path." msgstr "" -#: doc/classes/OS.xml:577 +#: doc/classes/OS.xml:578 msgid "Downloads directory path." msgstr "" -#: doc/classes/OS.xml:580 +#: doc/classes/OS.xml:581 msgid "Movies directory path." msgstr "" -#: doc/classes/OS.xml:583 +#: doc/classes/OS.xml:584 msgid "Music directory path." msgstr "" -#: doc/classes/OS.xml:586 +#: doc/classes/OS.xml:587 msgid "Pictures directory path." msgstr "" -#: doc/classes/OS.xml:589 +#: doc/classes/OS.xml:590 msgid "Ringtones directory path." msgstr "" @@ -33727,49 +33627,52 @@ msgid "" "code] is owned by [code]node[/code] and [code]pack[/code] will therefore " "only save those two nodes, but not [code]collision[/code].\n" "[codeblock]\n" -"# Create the objects\n" +"# Create the objects.\n" "var node = Node2D.new()\n" "var rigid = RigidBody2D.new()\n" "var collision = CollisionShape2D.new()\n" "\n" -"# Create the object hierarchy\n" +"# Create the object hierarchy.\n" "rigid.add_child(collision)\n" "node.add_child(rigid)\n" "\n" -"# Change owner of rigid, but not of collision\n" +"# Change owner of `rigid`, but not of `collision`.\n" "rigid.owner = node\n" "\n" "var scene = PackedScene.new()\n" -"# Only node and rigid are now packed\n" +"# Only `node` and `rigid` are now packed.\n" "var result = scene.pack(node)\n" "if result == OK:\n" -" ResourceSaver.save(\"res://path/name.scn\", scene) # Or \"user://...\"\n" +" var error = ResourceSaver.save(\"res://path/name.scn\", scene) # Or " +"\"user://...\"\n" +" if error != OK:\n" +" push_error(\"An error occurred while saving the scene to disk.\")\n" "[/codeblock]" msgstr "" -#: doc/classes/PackedScene.xml:38 +#: doc/classes/PackedScene.xml:40 msgid "Returns [code]true[/code] if the scene file has nodes." msgstr "" -#: doc/classes/PackedScene.xml:45 +#: doc/classes/PackedScene.xml:47 msgid "" "Returns the [code]SceneState[/code] representing the scene file contents." msgstr "" -#: doc/classes/PackedScene.xml:54 +#: doc/classes/PackedScene.xml:56 msgid "" "Instantiates the scene's node hierarchy. Triggers child scene " "instantiation(s). Triggers a [constant Node.NOTIFICATION_INSTANCED] " "notification on the root node." msgstr "" -#: doc/classes/PackedScene.xml:63 +#: doc/classes/PackedScene.xml:65 msgid "" "Pack will ignore any sub-nodes not owned by given node. See [member Node." "owner]." msgstr "" -#: doc/classes/PackedScene.xml:69 +#: doc/classes/PackedScene.xml:71 msgid "" "A dictionary representation of the scene contents.\n" "Available keys include \"rnames\" and \"variants\" for resources, " @@ -33778,18 +33681,18 @@ msgid "" "connections, and \"version\" for the format style of the PackedScene." msgstr "" -#: doc/classes/PackedScene.xml:75 +#: doc/classes/PackedScene.xml:77 msgid "If passed to [method instance], blocks edits to the scene state." msgstr "" -#: doc/classes/PackedScene.xml:78 +#: doc/classes/PackedScene.xml:80 msgid "" "If passed to [method instance], provides local scene resources to the local " "scene.\n" "[b]Note:[/b] Only available in editor builds." msgstr "" -#: doc/classes/PackedScene.xml:82 +#: doc/classes/PackedScene.xml:84 msgid "" "If passed to [method instance], provides local scene resources to the local " "scene. Only the main scene should receive the main edit state.\n" @@ -34857,20 +34760,20 @@ msgstr "" msgid "Draw calls per frame. 3D only." msgstr "" -#: doc/classes/Performance.xml:77 doc/classes/RenderingServer.xml:3711 +#: doc/classes/Performance.xml:77 doc/classes/RenderingServer.xml:3922 msgid "" "The amount of video memory used, i.e. texture and vertex memory combined." msgstr "" -#: doc/classes/Performance.xml:80 doc/classes/RenderingServer.xml:3714 +#: doc/classes/Performance.xml:80 doc/classes/RenderingServer.xml:3925 msgid "The amount of texture memory used." msgstr "" -#: doc/classes/Performance.xml:83 doc/classes/RenderingServer.xml:3717 +#: doc/classes/Performance.xml:83 doc/classes/RenderingServer.xml:3928 msgid "The amount of vertex memory used." msgstr "" -#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3708 +#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3919 msgid "Unimplemented in the GLES2 rendering backend, always returns 0." msgstr "" @@ -34922,6 +34825,96 @@ msgid "" "resource." msgstr "" +#: doc/classes/PhysicalBone3D.xml:67 +msgid "Damps the body's rotation if greater than [code]0[/code]." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:70 doc/classes/RigidBody3D.xml:132 +msgid "Lock the body's rotation in the X axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:73 doc/classes/RigidBody3D.xml:135 +msgid "Lock the body's rotation in the Y axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:76 doc/classes/RigidBody3D.xml:138 +msgid "Lock the body's rotation in the Z axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:79 doc/classes/RigidBody3D.xml:141 +msgid "Lock the body's movement in the X axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:82 doc/classes/RigidBody3D.xml:144 +msgid "Lock the body's movement in the Y axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:85 doc/classes/RigidBody3D.xml:147 +msgid "Lock the body's movement in the Z axis." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:88 +msgid "Sets the body's transform." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:91 doc/classes/PhysicsMaterial.xml:17 +msgid "" +"The body's bounciness. Values range from [code]0[/code] (no bounce) to " +"[code]1[/code] (full bounciness)." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:94 doc/classes/RigidBody3D.xml:150 +msgid "" +"If [code]true[/code], the body is deactivated when there is no movement, so " +"it will not take part in the simulation until it is awaken by an external " +"force." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:97 +msgid "" +"The body's friction, from [code]0[/code] (frictionless) to [code]1[/code] " +"(max friction)." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:100 +msgid "" +"This is multiplied by the global 3D gravity setting found in [b]Project > " +"Project Settings > Physics > 3d[/b] to produce the body's gravity. For " +"example, a value of 1 will be normal gravity, 2 will apply double gravity, " +"and 0.5 will apply half gravity to this object." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:103 +msgid "Sets the joint's transform." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:106 +msgid "Sets the joint's rotation in radians." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:109 +msgid "Sets the joint's rotation in degrees." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:112 +msgid "Sets the joint type. See [enum JointType] for possible values." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:115 +msgid "Damps the body's movement if greater than [code]0[/code]." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:118 doc/classes/RigidBody2D.xml:158 +#: doc/classes/RigidBody3D.xml:175 +msgid "The body's mass." +msgstr "" + +#: doc/classes/PhysicalBone3D.xml:121 doc/classes/RigidBody3D.xml:188 +msgid "" +"The body's weight based on its mass and the global 3D gravity. Global values " +"are set in [b]Project > Project Settings > Physics > 3d[/b]." +msgstr "" + #: doc/classes/PhysicalSkyMaterial.xml:4 msgid "[Sky] [Material] used for a physically based sky." msgstr "" @@ -35255,17 +35248,6 @@ msgstr "" msgid "The body's transformation matrix." msgstr "" -#: doc/classes/PhysicsDirectBodyState2DSW.xml:4 -msgid "Software implementation of [PhysicsDirectBodyState2D]." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState2DSW.xml:7 -msgid "" -"Software implementation of [PhysicsDirectBodyState2D]. This object exposes " -"no new methods or properties and should not be used, as " -"[PhysicsDirectBodyState2D] selects the best implementation available." -msgstr "" - #: doc/classes/PhysicsDirectBodyState3D.xml:4 msgid "Direct access object to a physics body in the [PhysicsServer3D]." msgstr "" @@ -35278,7 +35260,7 @@ msgid "" "direct state of that body. See [method RigidBody3D._integrate_forces]." msgstr "" -#: doc/classes/PhysicsDirectBodyState3D.xml:18 doc/classes/RigidBody3D.xml:31 +#: doc/classes/PhysicsDirectBodyState3D.xml:18 msgid "" "Adds a constant directional force without affecting rotation.\n" "This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." @@ -35455,7 +35437,7 @@ msgid "" "will occur. If no collision is detected, the returned array will be [code]" "[1, 1][/code].\n" "If the shape can not move, the returned array will be [code][0, 0][/code] " -"under Bullet, and empty under GodotPhysics." +"under Bullet, and empty under GodotPhysics3D." msgstr "" #: doc/classes/PhysicsDirectSpaceState3D.xml:33 @@ -35526,12 +35508,6 @@ msgid "" "Provides a means of modifying the collision properties of a [PhysicsBody3D]." msgstr "" -#: doc/classes/PhysicsMaterial.xml:17 -msgid "" -"The body's bounciness. Values range from [code]0[/code] (no bounce) to " -"[code]1[/code] (full bounciness)." -msgstr "" - #: doc/classes/PhysicsMaterial.xml:20 msgid "" "The body's friction. Values range from [code]0[/code] (frictionless) to " @@ -35772,7 +35748,7 @@ msgid "" msgstr "" #: doc/classes/PhysicsServer2D.xml:620 doc/classes/PhysicsServer3D.xml:637 -#: doc/classes/RigidBody3D.xml:119 +#: doc/classes/RigidBody3D.xml:120 msgid "" "Sets an axis velocity. The velocity in the given vector axis will be set as " "the given vector length. This is useful for jumping behavior." @@ -36288,16 +36264,6 @@ msgid "" "Constant to get the number of space regions where a collision could occur." msgstr "" -#: doc/classes/PhysicsServer2DSW.xml:4 -msgid "Software implementation of [PhysicsServer2D]." -msgstr "" - -#: doc/classes/PhysicsServer2DSW.xml:7 -msgid "" -"This class exposes no new methods or properties and should not be used, as " -"[PhysicsServer2D] automatically selects the best implementation available." -msgstr "" - #: doc/classes/PhysicsServer3D.xml:4 msgid "Server interface for low-level physics access." msgstr "" @@ -37959,12 +37925,8 @@ msgid "Distance from center of sun where it fades out completely." msgstr "" #: doc/classes/ProceduralSkyMaterial.xml:44 -msgid "Distance from sun where it goes from solid to starting to fade." -msgstr "" - -#: doc/classes/ProceduralSkyMaterial.xml:47 msgid "" -"How quickly the sun fades away between [member sun_angle_min] and [member " +"How quickly the sun fades away between the edge of the sun disk and [member " "sun_angle_max]." msgstr "" @@ -38299,28 +38261,42 @@ msgstr "" #: doc/classes/ProjectSettings.xml:263 msgid "" -"Default compression level for gzip. Affects compressed scenes and resources." +"The default compression level for gzip. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level. " +"[code]-1[/code] uses the default gzip compression level, which is identical " +"to [code]6[/code] but could change in the future due to underlying zlib " +"updates." msgstr "" #: doc/classes/ProjectSettings.xml:266 msgid "" -"Default compression level for Zlib. Affects compressed scenes and resources." +"The default compression level for Zlib. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level. " +"[code]-1[/code] uses the default gzip compression level, which is identical " +"to [code]6[/code] but could change in the future due to underlying zlib " +"updates." msgstr "" #: doc/classes/ProjectSettings.xml:269 msgid "" -"Default compression level for Zstandard. Affects compressed scenes and " -"resources." +"The default compression level for Zstandard. Affects compressed scenes and " +"resources. Higher levels result in smaller files at the cost of compression " +"speed. Decompression speed is mostly unaffected by the compression level." msgstr "" #: doc/classes/ProjectSettings.xml:272 -msgid "Enables long-distance matching in Zstandard." +msgid "" +"Enables [url=https://github.com/facebook/zstd/releases/tag/v1.3.2]long-" +"distance matching[/url] in Zstandard." msgstr "" #: doc/classes/ProjectSettings.xml:275 msgid "" "Largest size limit (in power of 2) allowed when compressing using long-" -"distance matching with Zstandard." +"distance matching with Zstandard. Higher values can result in better " +"compression, but will require more memory when compressing and decompressing." msgstr "" #: doc/classes/ProjectSettings.xml:278 @@ -38701,37 +38677,37 @@ msgid "" "UWP to follow interface conventions." msgstr "" -#: doc/classes/ProjectSettings.xml:473 +#: doc/classes/ProjectSettings.xml:475 msgid "" "Path to a custom [Theme] resource file to use for the project ([code]theme[/" "code] or generic [code]tres[/code]/[code]res[/code] extension)." msgstr "" -#: doc/classes/ProjectSettings.xml:476 +#: doc/classes/ProjectSettings.xml:478 msgid "" "Path to a custom [Font] resource to use as default for all GUI elements of " "the project." msgstr "" -#: doc/classes/ProjectSettings.xml:479 +#: doc/classes/ProjectSettings.xml:481 msgid "If [code]true[/code], makes sure the theme used works with HiDPI." msgstr "" -#: doc/classes/ProjectSettings.xml:482 +#: doc/classes/ProjectSettings.xml:484 msgid "" "Timer setting for incremental search in [Tree], [ItemList], etc. controls " "(in milliseconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:485 +#: doc/classes/ProjectSettings.xml:487 msgid "Timer for detecting idle in [TextEdit] (in seconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:488 +#: doc/classes/ProjectSettings.xml:490 msgid "Default delay for tooltips (in seconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:491 +#: doc/classes/ProjectSettings.xml:493 msgid "" "Default [InputEventAction] to confirm a focused button, menu or list item, " "or validate input.\n" @@ -38740,7 +38716,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:495 +#: doc/classes/ProjectSettings.xml:497 msgid "" "Default [InputEventAction] to discard a modal or pending input.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38748,7 +38724,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:499 +#: doc/classes/ProjectSettings.xml:501 msgid "" "Default [InputEventAction] to move down in the UI.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38756,7 +38732,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:503 +#: doc/classes/ProjectSettings.xml:505 msgid "" "Default [InputEventAction] to go to the end position of a [Control] (e.g. " "last item in an [ItemList] or a [Tree]), matching the behavior of [constant " @@ -38766,7 +38742,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:507 +#: doc/classes/ProjectSettings.xml:509 msgid "" "Default [InputEventAction] to focus the next [Control] in the scene. The " "focus behavior can be configured via [member Control.focus_next].\n" @@ -38775,7 +38751,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:511 +#: doc/classes/ProjectSettings.xml:513 msgid "" "Default [InputEventAction] to focus the previous [Control] in the scene. The " "focus behavior can be configured via [member Control.focus_previous].\n" @@ -38784,7 +38760,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:515 +#: doc/classes/ProjectSettings.xml:517 msgid "" "Default [InputEventAction] to go to the start position of a [Control] (e.g. " "first item in an [ItemList] or a [Tree]), matching the behavior of [constant " @@ -38794,7 +38770,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:519 +#: doc/classes/ProjectSettings.xml:521 msgid "" "Default [InputEventAction] to move left in the UI.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38802,7 +38778,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:523 +#: doc/classes/ProjectSettings.xml:525 msgid "" "Default [InputEventAction] to go down a page in a [Control] (e.g. in an " "[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEDOWN] on " @@ -38812,7 +38788,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:527 +#: doc/classes/ProjectSettings.xml:529 msgid "" "Default [InputEventAction] to go up a page in a [Control] (e.g. in an " "[ItemList] or a [Tree]), matching the behavior of [constant KEY_PAGEUP] on " @@ -38822,7 +38798,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:531 +#: doc/classes/ProjectSettings.xml:533 msgid "" "Default [InputEventAction] to move right in the UI.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38830,7 +38806,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:535 +#: doc/classes/ProjectSettings.xml:537 msgid "" "Default [InputEventAction] to select an item in a [Control] (e.g. in an " "[ItemList] or a [Tree]).\n" @@ -38839,7 +38815,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:539 +#: doc/classes/ProjectSettings.xml:541 msgid "" "Default [InputEventAction] to move up in the UI.\n" "[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " @@ -38847,371 +38823,371 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:543 +#: doc/classes/ProjectSettings.xml:545 msgid "" "If [code]true[/code], sends mouse input events when tapping or swiping on " "the touchscreen." msgstr "" -#: doc/classes/ProjectSettings.xml:546 +#: doc/classes/ProjectSettings.xml:548 msgid "" "If [code]true[/code], sends touch input events when clicking or dragging the " "mouse." msgstr "" -#: doc/classes/ProjectSettings.xml:549 +#: doc/classes/ProjectSettings.xml:551 msgid "Optional name for the 2D physics layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:552 +#: doc/classes/ProjectSettings.xml:554 msgid "Optional name for the 2D physics layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:555 +#: doc/classes/ProjectSettings.xml:557 msgid "Optional name for the 2D physics layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:558 +#: doc/classes/ProjectSettings.xml:560 msgid "Optional name for the 2D physics layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:561 +#: doc/classes/ProjectSettings.xml:563 msgid "Optional name for the 2D physics layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:564 +#: doc/classes/ProjectSettings.xml:566 msgid "Optional name for the 2D physics layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:567 +#: doc/classes/ProjectSettings.xml:569 msgid "Optional name for the 2D physics layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:570 +#: doc/classes/ProjectSettings.xml:572 msgid "Optional name for the 2D physics layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:573 +#: doc/classes/ProjectSettings.xml:575 msgid "Optional name for the 2D physics layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:576 +#: doc/classes/ProjectSettings.xml:578 msgid "Optional name for the 2D physics layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:579 +#: doc/classes/ProjectSettings.xml:581 msgid "Optional name for the 2D physics layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:582 +#: doc/classes/ProjectSettings.xml:584 msgid "Optional name for the 2D physics layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:585 +#: doc/classes/ProjectSettings.xml:587 msgid "Optional name for the 2D physics layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:588 +#: doc/classes/ProjectSettings.xml:590 msgid "Optional name for the 2D physics layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:591 +#: doc/classes/ProjectSettings.xml:593 msgid "Optional name for the 2D physics layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:594 +#: doc/classes/ProjectSettings.xml:596 msgid "Optional name for the 2D physics layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:597 +#: doc/classes/ProjectSettings.xml:599 msgid "Optional name for the 2D physics layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:600 +#: doc/classes/ProjectSettings.xml:602 msgid "Optional name for the 2D physics layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:603 +#: doc/classes/ProjectSettings.xml:605 msgid "Optional name for the 2D physics layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:606 +#: doc/classes/ProjectSettings.xml:608 msgid "Optional name for the 2D physics layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:609 +#: doc/classes/ProjectSettings.xml:611 msgid "Optional name for the 2D render layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:612 +#: doc/classes/ProjectSettings.xml:614 msgid "Optional name for the 2D render layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:615 +#: doc/classes/ProjectSettings.xml:617 msgid "Optional name for the 2D render layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:618 +#: doc/classes/ProjectSettings.xml:620 msgid "Optional name for the 2D render layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:621 +#: doc/classes/ProjectSettings.xml:623 msgid "Optional name for the 2D render layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:624 +#: doc/classes/ProjectSettings.xml:626 msgid "Optional name for the 2D render layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:627 +#: doc/classes/ProjectSettings.xml:629 msgid "Optional name for the 2D render layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:630 +#: doc/classes/ProjectSettings.xml:632 msgid "Optional name for the 2D render layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:633 +#: doc/classes/ProjectSettings.xml:635 msgid "Optional name for the 2D render layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:636 +#: doc/classes/ProjectSettings.xml:638 msgid "Optional name for the 2D render layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:639 +#: doc/classes/ProjectSettings.xml:641 msgid "Optional name for the 2D render layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:642 +#: doc/classes/ProjectSettings.xml:644 msgid "Optional name for the 2D render layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:645 +#: doc/classes/ProjectSettings.xml:647 msgid "Optional name for the 2D render layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:648 +#: doc/classes/ProjectSettings.xml:650 msgid "Optional name for the 2D render layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:651 +#: doc/classes/ProjectSettings.xml:653 msgid "Optional name for the 2D render layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:654 +#: doc/classes/ProjectSettings.xml:656 msgid "Optional name for the 2D render layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:657 +#: doc/classes/ProjectSettings.xml:659 msgid "Optional name for the 2D render layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:660 +#: doc/classes/ProjectSettings.xml:662 msgid "Optional name for the 2D render layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:663 +#: doc/classes/ProjectSettings.xml:665 msgid "Optional name for the 2D render layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:666 +#: doc/classes/ProjectSettings.xml:668 msgid "Optional name for the 2D render layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:669 +#: doc/classes/ProjectSettings.xml:671 msgid "Optional name for the 3D physics layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:672 +#: doc/classes/ProjectSettings.xml:674 msgid "Optional name for the 3D physics layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:675 +#: doc/classes/ProjectSettings.xml:677 msgid "Optional name for the 3D physics layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:678 +#: doc/classes/ProjectSettings.xml:680 msgid "Optional name for the 3D physics layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:681 +#: doc/classes/ProjectSettings.xml:683 msgid "Optional name for the 3D physics layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:684 +#: doc/classes/ProjectSettings.xml:686 msgid "Optional name for the 3D physics layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:687 +#: doc/classes/ProjectSettings.xml:689 msgid "Optional name for the 3D physics layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:690 +#: doc/classes/ProjectSettings.xml:692 msgid "Optional name for the 3D physics layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:693 +#: doc/classes/ProjectSettings.xml:695 msgid "Optional name for the 3D physics layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:696 +#: doc/classes/ProjectSettings.xml:698 msgid "Optional name for the 3D physics layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:699 +#: doc/classes/ProjectSettings.xml:701 msgid "Optional name for the 3D physics layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:702 +#: doc/classes/ProjectSettings.xml:704 msgid "Optional name for the 3D physics layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:705 +#: doc/classes/ProjectSettings.xml:707 msgid "Optional name for the 3D physics layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:708 +#: doc/classes/ProjectSettings.xml:710 msgid "Optional name for the 3D physics layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:711 +#: doc/classes/ProjectSettings.xml:713 msgid "Optional name for the 3D physics layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:714 +#: doc/classes/ProjectSettings.xml:716 msgid "Optional name for the 3D physics layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:717 +#: doc/classes/ProjectSettings.xml:719 msgid "Optional name for the 3D physics layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:720 +#: doc/classes/ProjectSettings.xml:722 msgid "Optional name for the 3D physics layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:723 +#: doc/classes/ProjectSettings.xml:725 msgid "Optional name for the 3D physics layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:726 +#: doc/classes/ProjectSettings.xml:728 msgid "Optional name for the 3D physics layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:729 +#: doc/classes/ProjectSettings.xml:731 msgid "Optional name for the 3D render layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:732 +#: doc/classes/ProjectSettings.xml:734 msgid "Optional name for the 3D render layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:735 +#: doc/classes/ProjectSettings.xml:737 msgid "Optional name for the 3D render layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:738 +#: doc/classes/ProjectSettings.xml:740 msgid "Optional name for the 3D render layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:741 +#: doc/classes/ProjectSettings.xml:743 msgid "Optional name for the 3D render layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:744 +#: doc/classes/ProjectSettings.xml:746 msgid "Optional name for the 3D render layer 14" msgstr "" -#: doc/classes/ProjectSettings.xml:747 +#: doc/classes/ProjectSettings.xml:749 msgid "Optional name for the 3D render layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:750 +#: doc/classes/ProjectSettings.xml:752 msgid "Optional name for the 3D render layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:753 +#: doc/classes/ProjectSettings.xml:755 msgid "Optional name for the 3D render layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:756 +#: doc/classes/ProjectSettings.xml:758 msgid "Optional name for the 3D render layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:759 +#: doc/classes/ProjectSettings.xml:761 msgid "Optional name for the 3D render layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:762 +#: doc/classes/ProjectSettings.xml:764 msgid "Optional name for the 3D render layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:765 +#: doc/classes/ProjectSettings.xml:767 msgid "Optional name for the 3D render layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:768 +#: doc/classes/ProjectSettings.xml:770 msgid "Optional name for the 3D render layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:771 +#: doc/classes/ProjectSettings.xml:773 msgid "Optional name for the 3D render layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:774 +#: doc/classes/ProjectSettings.xml:776 msgid "Optional name for the 3D render layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:777 +#: doc/classes/ProjectSettings.xml:779 msgid "Optional name for the 3D render layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:780 +#: doc/classes/ProjectSettings.xml:782 msgid "Optional name for the 3D render layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:783 +#: doc/classes/ProjectSettings.xml:785 msgid "Optional name for the 3D render layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:786 +#: doc/classes/ProjectSettings.xml:788 msgid "Optional name for the 3D render layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:789 +#: doc/classes/ProjectSettings.xml:791 msgid "" "The locale to fall back to if a translation isn't available in a given " "language. If left empty, [code]en[/code] (English) will be used." msgstr "" -#: doc/classes/ProjectSettings.xml:792 +#: doc/classes/ProjectSettings.xml:794 msgid "" "If non-empty, this locale will be used when running the project from the " "editor." msgstr "" -#: doc/classes/ProjectSettings.xml:795 +#: doc/classes/ProjectSettings.xml:797 msgid "If [code]true[/code], logs all output to files." msgstr "" -#: doc/classes/ProjectSettings.xml:798 +#: doc/classes/ProjectSettings.xml:800 msgid "" "Path to logs within the project. Using an [code]user://[/code] path is " "recommended." msgstr "" -#: doc/classes/ProjectSettings.xml:801 +#: doc/classes/ProjectSettings.xml:803 msgid "Specifies the maximum amount of log files allowed (used for rotation)." msgstr "" -#: doc/classes/ProjectSettings.xml:804 +#: doc/classes/ProjectSettings.xml:806 msgid "" "Godot uses a message queue to defer some function calls. If you run out of " "space on it (you will see an error), you can increase the size here." msgstr "" -#: doc/classes/ProjectSettings.xml:807 +#: doc/classes/ProjectSettings.xml:809 msgid "" "This is used by servers when used in multi-threading mode (servers and " "visual). RIDs are preallocated to avoid stalling the server requesting them " @@ -39219,118 +39195,118 @@ msgid "" "thread, increase this number." msgstr "" -#: doc/classes/ProjectSettings.xml:822 +#: doc/classes/ProjectSettings.xml:824 msgid "" "Maximum amount of characters allowed to send as output from the debugger. " "Over this value, content is dropped. This helps not to stall the debugger " "connection." msgstr "" -#: doc/classes/ProjectSettings.xml:825 +#: doc/classes/ProjectSettings.xml:827 msgid "" "Maximum number of errors allowed to be sent from the debugger. Over this " "value, content is dropped. This helps not to stall the debugger connection." msgstr "" -#: doc/classes/ProjectSettings.xml:828 +#: doc/classes/ProjectSettings.xml:830 msgid "" "Maximum amount of messages in the debugger queue. Over this value, content " "is dropped. This helps to limit the debugger memory usage." msgstr "" -#: doc/classes/ProjectSettings.xml:831 +#: doc/classes/ProjectSettings.xml:833 msgid "" "Maximum number of warnings allowed to be sent from the debugger. Over this " "value, content is dropped. This helps not to stall the debugger connection." msgstr "" -#: doc/classes/ProjectSettings.xml:834 +#: doc/classes/ProjectSettings.xml:836 msgid "" "Default size of packet peer stream for deserializing Godot data. Over this " "size, data is dropped." msgstr "" -#: doc/classes/ProjectSettings.xml:837 +#: doc/classes/ProjectSettings.xml:839 msgid "Timeout (in seconds) for connection attempts using TCP." msgstr "" -#: doc/classes/ProjectSettings.xml:840 +#: doc/classes/ProjectSettings.xml:842 msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:843 +#: doc/classes/ProjectSettings.xml:845 msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:846 +#: doc/classes/ProjectSettings.xml:848 msgid "Maximum number of concurrent input packets for [WebSocketClient]." msgstr "" -#: doc/classes/ProjectSettings.xml:849 +#: doc/classes/ProjectSettings.xml:851 msgid "Maximum size (in kiB) for the [WebSocketClient] output buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:852 +#: doc/classes/ProjectSettings.xml:854 msgid "Maximum number of concurrent output packets for [WebSocketClient]." msgstr "" -#: doc/classes/ProjectSettings.xml:855 +#: doc/classes/ProjectSettings.xml:857 msgid "Maximum size (in kiB) for the [WebSocketServer] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:858 +#: doc/classes/ProjectSettings.xml:860 msgid "Maximum number of concurrent input packets for [WebSocketServer]." msgstr "" -#: doc/classes/ProjectSettings.xml:861 +#: doc/classes/ProjectSettings.xml:863 msgid "Maximum size (in kiB) for the [WebSocketServer] output buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:864 +#: doc/classes/ProjectSettings.xml:866 msgid "Maximum number of concurrent output packets for [WebSocketServer]." msgstr "" -#: doc/classes/ProjectSettings.xml:867 +#: doc/classes/ProjectSettings.xml:869 msgid "" "Amount of read ahead used by remote filesystem. Higher values decrease the " "effects of latency at the cost of higher bandwidth usage." msgstr "" -#: doc/classes/ProjectSettings.xml:870 +#: doc/classes/ProjectSettings.xml:872 msgid "Page size used by remote filesystem (in bytes)." msgstr "" -#: doc/classes/ProjectSettings.xml:873 +#: doc/classes/ProjectSettings.xml:875 msgid "" "CA certificates bundle to use for SSL connections. If not defined, Godot's " "internal CA certificates are used." msgstr "" -#: doc/classes/ProjectSettings.xml:876 +#: doc/classes/ProjectSettings.xml:878 msgid "" "When creating node names automatically, set the type of casing in this " "project. This is mostly an editor setting." msgstr "" -#: doc/classes/ProjectSettings.xml:879 +#: doc/classes/ProjectSettings.xml:881 msgid "" "What to use to separate node name from number. This is mostly an editor " "setting." msgstr "" -#: doc/classes/ProjectSettings.xml:882 +#: doc/classes/ProjectSettings.xml:884 msgid "Size of the hash table used for the broad-phase 2D hash grid algorithm." msgstr "" -#: doc/classes/ProjectSettings.xml:885 +#: doc/classes/ProjectSettings.xml:887 msgid "Cell size used for the broad-phase 2D hash grid algorithm." msgstr "" -#: doc/classes/ProjectSettings.xml:888 +#: doc/classes/ProjectSettings.xml:890 msgid "The default angular damp in 2D." msgstr "" -#: doc/classes/ProjectSettings.xml:891 +#: doc/classes/ProjectSettings.xml:893 msgid "" "The default gravity strength in 2D.\n" "[b]Note:[/b] This property is only read when the project starts. To change " @@ -39342,7 +39318,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:899 +#: doc/classes/ProjectSettings.xml:901 msgid "" "The default gravity direction in 2D.\n" "[b]Note:[/b] This property is only read when the project starts. To change " @@ -39354,38 +39330,38 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:907 +#: doc/classes/ProjectSettings.xml:909 msgid "The default linear damp in 2D." msgstr "" -#: doc/classes/ProjectSettings.xml:910 +#: doc/classes/ProjectSettings.xml:912 msgid "" "Threshold defining the surface size that constitutes a large object with " "regard to cells in the broad-phase 2D hash grid algorithm." msgstr "" -#: doc/classes/ProjectSettings.xml:913 +#: doc/classes/ProjectSettings.xml:915 msgid "" "Sets which physics engine to use for 2D physics.\n" -"\"DEFAULT\" and \"GodotPhysics\" are the same, as there is currently no " +"\"DEFAULT\" and \"GodotPhysics2D\" are the same, as there is currently no " "alternative 2D physics server implemented." msgstr "" -#: doc/classes/ProjectSettings.xml:917 +#: doc/classes/ProjectSettings.xml:919 msgid "" "Threshold angular velocity under which a 2D physics body will be considered " "inactive. See [constant PhysicsServer2D." "SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD]." msgstr "" -#: doc/classes/ProjectSettings.xml:920 +#: doc/classes/ProjectSettings.xml:922 msgid "" "Threshold linear velocity under which a 2D physics body will be considered " "inactive. See [constant PhysicsServer2D." "SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD]." msgstr "" -#: doc/classes/ProjectSettings.xml:923 +#: doc/classes/ProjectSettings.xml:925 msgid "" "Sets whether physics is run on the main thread or a separate one. Running " "the server on a thread increases performance, but restricts API access to " @@ -39395,23 +39371,23 @@ msgid "" "give you extra performance and no regressions when using it." msgstr "" -#: doc/classes/ProjectSettings.xml:927 +#: doc/classes/ProjectSettings.xml:929 msgid "" "Time (in seconds) of inactivity before which a 2D physics body will put to " "sleep. See [constant PhysicsServer2D.SPACE_PARAM_BODY_TIME_TO_SLEEP]." msgstr "" -#: doc/classes/ProjectSettings.xml:930 +#: doc/classes/ProjectSettings.xml:932 msgid "" "Sets whether the 3D physics world will be created with support for " "[SoftBody3D] physics. Only applies to the Bullet physics engine." msgstr "" -#: doc/classes/ProjectSettings.xml:933 +#: doc/classes/ProjectSettings.xml:935 msgid "The default angular damp in 3D." msgstr "" -#: doc/classes/ProjectSettings.xml:936 +#: doc/classes/ProjectSettings.xml:938 msgid "" "The default gravity strength in 3D.\n" "[b]Note:[/b] This property is only read when the project starts. To change " @@ -39423,7 +39399,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:944 +#: doc/classes/ProjectSettings.xml:946 msgid "" "The default gravity direction in 3D.\n" "[b]Note:[/b] This property is only read when the project starts. To change " @@ -39435,23 +39411,23 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:952 +#: doc/classes/ProjectSettings.xml:954 msgid "The default linear damp in 3D." msgstr "" -#: doc/classes/ProjectSettings.xml:955 +#: doc/classes/ProjectSettings.xml:957 msgid "" "Sets which physics engine to use for 3D physics.\n" "\"DEFAULT\" is currently the [url=https://bulletphysics.org]Bullet[/url] " -"physics engine. The \"GodotPhysics\" engine is still supported as an " +"physics engine. The \"GodotPhysics3D\" engine is still supported as an " "alternative." msgstr "" -#: doc/classes/ProjectSettings.xml:959 +#: doc/classes/ProjectSettings.xml:961 msgid "Enables [member Viewport.physics_object_picking] on the root viewport." msgstr "" -#: doc/classes/ProjectSettings.xml:962 +#: doc/classes/ProjectSettings.xml:964 msgid "" "The number of fixed iterations per second. This controls how often physics " "simulation and [method Node._physics_process] methods are run.\n" @@ -39460,7 +39436,7 @@ msgid "" "instead." msgstr "" -#: doc/classes/ProjectSettings.xml:966 +#: doc/classes/ProjectSettings.xml:968 msgid "" "Fix to improve physics jitter, specially on monitors where refresh rate is " "different than the physics FPS.\n" @@ -39468,7 +39444,7 @@ msgid "" "the physics FPS at runtime, set [member Engine.physics_jitter_fix] instead." msgstr "" -#: doc/classes/ProjectSettings.xml:970 +#: doc/classes/ProjectSettings.xml:972 msgid "" "Default background clear color. Overridable per [Viewport] using its " "[Environment]. See [member Environment.background_mode] and [member " @@ -39476,7 +39452,7 @@ msgid "" "programmatically, use [method RenderingServer.set_default_clear_color]." msgstr "" -#: doc/classes/ProjectSettings.xml:973 +#: doc/classes/ProjectSettings.xml:975 msgid "" "[Environment] that will be used as a fallback environment in case a scene " "does not specify its own environment. The default environment is loaded in " @@ -39486,14 +39462,14 @@ msgid "" "here." msgstr "" -#: doc/classes/ProjectSettings.xml:976 +#: doc/classes/ProjectSettings.xml:980 msgid "" "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." msgstr "" -#: doc/classes/ProjectSettings.xml:979 +#: doc/classes/ProjectSettings.xml:985 msgid "" "Some NVIDIA GPU drivers have a bug which produces flickering issues for the " "[code]draw_rect[/code] method, especially as used in [TileMap]. Refer to " @@ -39505,39 +39481,73 @@ msgid "" "using the Vulkan backend." msgstr "" -#: doc/classes/ProjectSettings.xml:983 +#: doc/classes/ProjectSettings.xml:989 msgid "" "If [code]true[/code], forces snapping of polygons to pixels in 2D rendering. " "May help in some pixel art styles." msgstr "" -#: doc/classes/ProjectSettings.xml:986 +#: doc/classes/ProjectSettings.xml:992 +msgid "" +"Sets the quality of the depth of field effect. Higher quality takes more " +"samples, which is slower but looks smoother." +msgstr "" + +#: doc/classes/ProjectSettings.xml:995 +msgid "" +"Sets the depth of field shape. Can be Box, Hexagon, or Circle. Box is the " +"fastest. Circle is the most realistic, but also the most expensive to " +"compute." +msgstr "" + +#: doc/classes/ProjectSettings.xml:998 +msgid "" +"If [code]true[/code], jitters DOF samples to make effect slightly blurrier " +"and hide lines created from low sample rates. This can result in a slightly " +"grainy appearance when used with a low number of samples." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1001 msgid "" "Disables depth pre-pass for some GPU vendors (usually mobile), as their " "architecture already does this." msgstr "" -#: doc/classes/ProjectSettings.xml:989 +#: doc/classes/ProjectSettings.xml:1004 msgid "" "If [code]true[/code], performs a previous depth pass before rendering " "materials. This increases performance in scenes with high overdraw, when " "complex materials and lighting are used." msgstr "" -#: doc/classes/ProjectSettings.xml:992 +#: doc/classes/ProjectSettings.xml:1007 msgid "" "The directional shadow's size in pixels. Higher values will result in " "sharper shadows, at the cost of performance. The value will be rounded up to " "the nearest power of 2." msgstr "" -#: doc/classes/ProjectSettings.xml:995 +#: doc/classes/ProjectSettings.xml:1010 msgid "" "Lower-end override for [member rendering/quality/directional_shadow/size] on " "mobile devices, due to performance concerns or driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:998 +#: doc/classes/ProjectSettings.xml:1013 +msgid "" +"Quality setting for shadows cast by [DirectionalLight3D]s. Higher quality " +"settings use more samples when reading from shadow maps and are thus slower. " +"Low quality settings may result in shadows looking grainy." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1016 +msgid "" +"Lower-end override for [member rendering/quality/directional_shadow/" +"soft_shadow_quality] on mobile devices, due to performance concerns or " +"driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1019 msgid "" "The video driver to use (\"GLES2\" or \"Vulkan\").\n" "[b]Note:[/b] The backend in use can be overridden at runtime via the [code]--" @@ -39547,25 +39557,33 @@ msgid "" "get_current_video_driver[/code] to query it at run-time." msgstr "" -#: doc/classes/ProjectSettings.xml:1012 +#: doc/classes/ProjectSettings.xml:1025 msgid "" -"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing " -"around the edges of polygons. A higher MSAA value results in smoother edges " -"but can be significantly slower on some hardware.\n" -"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend." +"If [code]true[/code], take additional samples when rendering objects " +"affected by a [GIProbe] to reduce artifacts from only sampling in one " +"direction." msgstr "" -#: doc/classes/ProjectSettings.xml:1020 +#: doc/classes/ProjectSettings.xml:1028 msgid "" -"If [code]true[/code], uses nearest-neighbor mipmap filtering when using " -"mipmaps (also called \"bilinear filtering\"), which will result in visible " -"seams appearing between mipmap stages. This may increase performance in " -"mobile as less memory bandwidth is used. If [code]false[/code], linear " -"mipmap filtering (also called \"trilinear filtering\") is used." +"Sets the number of cone samples taken when rendering objects affected by " +"[GIProbe]s." msgstr "" #: doc/classes/ProjectSettings.xml:1031 msgid "" +"Sets how the glow effect is upscaled before being copied onto the screen. " +"Linear is faster, but looks blocky. Bicubic is slower but looks smooth." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1034 +msgid "" +"Lower-end override for [member rendering/quality/glow/upscale_mode] on " +"mobile devices, due to performance concerns or driver support." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1037 +msgid "" "Strategy used for framebuffer allocation. The simpler it is, the less " "resources it uses (but the less features it supports). If set to \"2D " "Without Sampling\" or \"3D Without Effects\", sample buffers will not be " @@ -39574,41 +39592,41 @@ msgid "" "be available in the [Environment]." msgstr "" -#: doc/classes/ProjectSettings.xml:1034 +#: doc/classes/ProjectSettings.xml:1040 msgid "" "Lower-end override for [member rendering/quality/intended_usage/" "framebuffer_allocation] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1037 +#: doc/classes/ProjectSettings.xml:1043 msgid "" "Number of cubemaps to store in the reflection atlas. The number of " "[ReflectionProbe]s in a scene will be limited by this amount. A higher " "number requires more VRAM." msgstr "" -#: doc/classes/ProjectSettings.xml:1040 +#: doc/classes/ProjectSettings.xml:1046 msgid "" "Size of cubemap faces for [ReflectionProbe]s. A higher number requires more " "VRAM and may make reflection probe updating slower." msgstr "" -#: doc/classes/ProjectSettings.xml:1043 +#: doc/classes/ProjectSettings.xml:1049 msgid "" "Lower-end override for [member rendering/quality/reflection_atlas/" "reflection_size] on mobile devices, due to performance concerns or driver " "support." msgstr "" -#: doc/classes/ProjectSettings.xml:1046 +#: doc/classes/ProjectSettings.xml:1052 msgid "" "Use a higher quality variant of the fast filtering algorithm. Significantly " "slower than using default quality, but results in smoother reflections. " "Should only be used when the scene is especially detailed." msgstr "" -#: doc/classes/ProjectSettings.xml:1049 +#: doc/classes/ProjectSettings.xml:1055 msgid "" "Sets the number of samples to take when using importance sampling for [Sky]s " "and [ReflectionProbe]s. A higher value will result in smoother, higher " @@ -39618,19 +39636,19 @@ msgid "" "environments with a high level of detail." msgstr "" -#: doc/classes/ProjectSettings.xml:1052 +#: doc/classes/ProjectSettings.xml:1058 msgid "" "Lower-end override for [member rendering/quality/reflections/ggx_samples] on " "mobile devices, due to performance concerns or driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1055 +#: doc/classes/ProjectSettings.xml:1061 msgid "" "Limits the number of layers to use in radiance maps when using importance " "sampling. A lower number will be slightly faster and take up less VRAM." msgstr "" -#: doc/classes/ProjectSettings.xml:1058 +#: doc/classes/ProjectSettings.xml:1064 msgid "" "If [code]true[/code], uses texture arrays instead of mipmaps for reflection " "probes and panorama backgrounds (sky). This reduces jitter noise and " @@ -39639,128 +39657,229 @@ msgid "" "memory." msgstr "" -#: doc/classes/ProjectSettings.xml:1061 +#: doc/classes/ProjectSettings.xml:1067 msgid "" "Lower-end override for [member rendering/quality/reflections/" "texture_array_reflections] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1066 +#: doc/classes/ProjectSettings.xml:1070 +msgid "" +"Sets the number of MSAA samples to use. MSAA is used to reduce aliasing " +"around the edges of polygons. A higher MSAA value results in smoother edges " +"but can be significantly slower on some hardware.\n" +"[b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1074 +msgid "" +"Sets the screen-space antialiasing mode for the default screen [Viewport]. " +"Screen-space antialiasing works by selectively blurring edges in a post-" +"process shader. It differs from MSAA which takes multiple coverage samples " +"while rendering objects. Screen-space AA methods are typically faster than " +"MSAA and will smooth out specular aliasing, but tend to make scenes appear " +"blurry.\n" +"Another way to combat specular aliasing is to enable [member rendering/" +"quality/screen_filters/screen_space_roughness_limiter]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1078 +msgid "" +"Enables the screen-space roughness limiter which increases material " +"roughness in areas with a high normal frequency (i.e. when normals change a " +"lot from pixel to pixel). This helps to reduce the amount of specular " +"aliasing in a scene. Specular aliasing looks like random bright pixels that " +"occur in reflections." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1081 +msgid "" +"Curves the amount of the roughness limited effect. A higher value limits the " +"effect to very sharply curved surfaces, while a lower threshold extends the " +"effect to smoother surfaces." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1084 +msgid "" +"Sets the quality for rough screen-space reflections. Turning off will make " +"all screen space reflections sharp, while higher values make rough " +"reflections look better." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1087 msgid "" "If [code]true[/code], uses faster but lower-quality Blinn model to generate " "blurred reflections instead of the GGX model." msgstr "" -#: doc/classes/ProjectSettings.xml:1069 +#: doc/classes/ProjectSettings.xml:1090 msgid "" "Lower-end override for [member rendering/quality/shading/" "force_blinn_over_ggx] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1072 +#: doc/classes/ProjectSettings.xml:1093 msgid "" "If [code]true[/code], uses faster but lower-quality Lambert material " "lighting model instead of Burley." msgstr "" -#: doc/classes/ProjectSettings.xml:1075 +#: doc/classes/ProjectSettings.xml:1096 msgid "" "Lower-end override for [member rendering/quality/shading/" "force_lambert_over_burley] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1078 +#: doc/classes/ProjectSettings.xml:1099 msgid "" "If [code]true[/code], forces vertex shading for all rendering. This can " "increase performance a lot, but also reduces quality immensely. Can be used " "to optimize performance on low-end mobile devices." msgstr "" -#: doc/classes/ProjectSettings.xml:1081 +#: doc/classes/ProjectSettings.xml:1102 msgid "" "Lower-end override for [member rendering/quality/shading/" "force_vertex_shading] on mobile devices, due to performance concerns or " "driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1084 doc/classes/ProjectSettings.xml:1087 -#: doc/classes/ProjectSettings.xml:1090 doc/classes/ProjectSettings.xml:1093 +#: doc/classes/ProjectSettings.xml:1105 doc/classes/ProjectSettings.xml:1108 +#: doc/classes/ProjectSettings.xml:1111 doc/classes/ProjectSettings.xml:1114 msgid "" "Subdivision quadrant size for shadow mapping. See shadow mapping " "documentation." msgstr "" -#: doc/classes/ProjectSettings.xml:1096 +#: doc/classes/ProjectSettings.xml:1117 msgid "" "Size for shadow atlas (used for OmniLights and SpotLights). See " "documentation." msgstr "" -#: doc/classes/ProjectSettings.xml:1099 +#: doc/classes/ProjectSettings.xml:1120 msgid "" "Lower-end override for [member rendering/quality/shadow_atlas/size] on " "mobile devices, due to performance concerns or driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1102 +#: doc/classes/ProjectSettings.xml:1123 msgid "" -"Shadow filter mode. Higher-quality settings result in smoother shadows that " -"flicker less when moving. \"Disabled\" is the fastest option, but also has " -"the lowest quality. \"PCF5\" is smoother but is also slower. \"PCF13\" is " -"the smoothest option, but is also the slowest." +"Quality setting for shadows cast by [OmniLight3D]s and [SpotLight3D]s. " +"Higher quality settings use more samples when reading from shadow maps and " +"are thus slower. Low quality settings may result in shadows looking grainy." msgstr "" -#: doc/classes/ProjectSettings.xml:1105 +#: doc/classes/ProjectSettings.xml:1126 msgid "" -"Lower-end override for [member rendering/quality/shadows/filter_mode] on " -"mobile devices, due to performance concerns or driver support." +"Lower-end override for [member rendering/quality/shadows/" +"soft_shadow_quality] on mobile devices, due to performance concerns or " +"driver support." msgstr "" -#: doc/classes/ProjectSettings.xml:1118 +#: doc/classes/ProjectSettings.xml:1129 +msgid "" +"If [code]true[/code], screen-space ambient occlusion will be rendered at " +"half size and then upscaled before being added to the scene. This is " +"significantly faster but may miss small details." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1132 +msgid "" +"Sets the quality of the screen-space ambient occlusion effect. Higher values " +"take more samples and so will result in better quality, at the cost of " +"performance." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1135 +msgid "" +"Scales the depth over which the subsurface scattering effect is applied. A " +"high value may allow light to scatter into a part of the mesh or another " +"mesh that is close in screen space but far in depth." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1138 +msgid "" +"Sets the quality of the subsurface scattering effect. Higher values are " +"slower but look nicer." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1141 +msgid "" +"Scales the distance over which samples are taken for subsurface scattering " +"effect. Changing this does not impact performance, but higher values will " +"result in significant artifacts as the samples will become obviously spread " +"out. A lower value results in a smaller spread of scattered light." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1144 +msgid "" +"Sets the maximum number of samples to take when using anisotropic filtering " +"on textures. A higher sample count will result in sharper textures at " +"oblique angles, but is more expensive to compute.\n" +"Only power of two values are valid ([code]1[/code], [code]2[/code], [code]4[/" +"code], [code]8[/code], [code]16[/code]). A value of [code]1[/code] forcibly " +"disables anisotropic filtering, even on materials where it is enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1148 +msgid "" +"If [code]true[/code], uses nearest-neighbor mipmap filtering when using " +"mipmaps (also called \"bilinear filtering\"), which will result in visible " +"seams appearing between mipmap stages. This may increase performance in " +"mobile as less memory bandwidth is used. If [code]false[/code], linear " +"mipmap filtering (also called \"trilinear filtering\") is used." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1151 msgid "" "Thread model for rendering. Rendering on a thread can vastly improve " "performance, but synchronizing to the main thread can cause a bit more " "jitter." msgstr "" -#: doc/classes/ProjectSettings.xml:1121 +#: doc/classes/ProjectSettings.xml:1154 msgid "" "If [code]true[/code], the texture importer will import VRAM-compressed " "textures using the BPTC algorithm. This texture compression algorithm is " "only supported on desktop platforms, and only when using the Vulkan renderer." msgstr "" -#: doc/classes/ProjectSettings.xml:1124 +#: doc/classes/ProjectSettings.xml:1157 msgid "" "If [code]true[/code], the texture importer will import VRAM-compressed " "textures using the Ericsson Texture Compression algorithm. This algorithm " "doesn't support alpha channels in textures." msgstr "" -#: doc/classes/ProjectSettings.xml:1127 +#: doc/classes/ProjectSettings.xml:1160 msgid "" "If [code]true[/code], the texture importer will import VRAM-compressed " "textures using the Ericsson Texture Compression 2 algorithm. This texture " "compression algorithm is only supported when using the Vulkan renderer." msgstr "" -#: doc/classes/ProjectSettings.xml:1130 +#: doc/classes/ProjectSettings.xml:1163 msgid "" "If [code]true[/code], the texture importer will import VRAM-compressed " "textures using the PowerVR Texture Compression algorithm. This texture " "compression algorithm is only supported on iOS." msgstr "" -#: doc/classes/ProjectSettings.xml:1133 +#: doc/classes/ProjectSettings.xml:1166 msgid "" "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." msgstr "" +#: doc/classes/ProjectSettings.xml:1177 +msgid "Cell size used for the 2D hash grid that [VisibilityNotifier2D] uses." +msgstr "" + #: doc/classes/ProximityGroup3D.xml:4 doc/classes/ProximityGroup3D.xml:7 msgid "General-purpose proximity detection node." msgstr "" @@ -40861,11 +40980,11 @@ msgstr "" #: doc/classes/RenderingServer.xml:7 msgid "" -"Server for anything visible. The visual server is the API backend for " +"Server for anything visible. The rendering server is the API backend for " "everything visible. The whole scene system mounts on it to display.\n" -"The visual server is completely opaque, the internals are entirely " +"The rendering server is completely opaque, the internals are entirely " "implementation specific and cannot be accessed.\n" -"The visual server can be used to bypass the scene system entirely.\n" +"The rendering server can be used to bypass the scene system entirely.\n" "Resources are created using the [code]*_create[/code] functions.\n" "All objects are drawn to a viewport. You can use the [Viewport] attached to " "the [SceneTree] or you can create one yourself with [method " @@ -40873,10 +40992,10 @@ msgid "" "canvas needs to be attached to the viewport using [method " "viewport_set_scenario] or [method viewport_attach_canvas].\n" "In 3D, all visual objects must be associated with a scenario. The scenario " -"is a visual representation of the world. If accessing the visual server from " -"a running game, the scenario can be accessed from the scene tree from any " -"[Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can be " -"created with [method scenario_create].\n" +"is a visual representation of the world. If accessing the rendering server " +"from a running game, the scenario can be accessed from the scene tree from " +"any [Node3D] node with [method Node3D.get_world]. Otherwise, a scenario can " +"be created with [method scenario_create].\n" "Similarly in 2D, a canvas is needed to draw all canvas items.\n" "In 3D, all visible objects are comprised of a resource and an instance. A " "resource can be a mesh, a particle system, a light, or any other 3D object. " @@ -41302,42 +41421,42 @@ msgstr "" msgid "Returns the id of a white texture. Creates one if none exists." msgstr "" -#: doc/classes/RenderingServer.xml:954 +#: doc/classes/RenderingServer.xml:1006 msgid "" "Returns [code]true[/code] if changes have been made to the RenderingServer's " "data. [method force_draw] is usually called if this happens." msgstr "" -#: doc/classes/RenderingServer.xml:963 +#: doc/classes/RenderingServer.xml:1015 msgid "Not yet implemented. Always returns [code]false[/code]." msgstr "" -#: doc/classes/RenderingServer.xml:972 +#: doc/classes/RenderingServer.xml:1024 msgid "" "Returns [code]true[/code] if the OS supports a certain feature. Features " "might be [code]s3tc[/code], [code]etc[/code], [code]etc2[/code] and " "[code]pvrtc[/code]." msgstr "" -#: doc/classes/RenderingServer.xml:985 +#: doc/classes/RenderingServer.xml:1037 msgid "" "Sets up [ImmediateGeometry3D] internals to prepare for drawing. Equivalent " "to [method ImmediateGeometry3D.begin]." msgstr "" -#: doc/classes/RenderingServer.xml:994 +#: doc/classes/RenderingServer.xml:1046 msgid "" "Clears everything that was set up between [method immediate_begin] and " "[method immediate_end]. Equivalent to [method ImmediateGeometry3D.clear]." msgstr "" -#: doc/classes/RenderingServer.xml:1005 +#: doc/classes/RenderingServer.xml:1057 msgid "" "Sets the color to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_color]." msgstr "" -#: doc/classes/RenderingServer.xml:1012 +#: doc/classes/RenderingServer.xml:1064 msgid "" "Creates an immediate geometry and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41348,78 +41467,78 @@ msgid "" "[method instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:1023 +#: doc/classes/RenderingServer.xml:1075 msgid "" "Ends drawing the [ImmediateGeometry3D] and displays it. Equivalent to " "[method ImmediateGeometry3D.end]." msgstr "" -#: doc/classes/RenderingServer.xml:1032 +#: doc/classes/RenderingServer.xml:1084 msgid "Returns the material assigned to the [ImmediateGeometry3D]." msgstr "" -#: doc/classes/RenderingServer.xml:1043 +#: doc/classes/RenderingServer.xml:1095 msgid "" "Sets the normal to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_normal]." msgstr "" -#: doc/classes/RenderingServer.xml:1054 +#: doc/classes/RenderingServer.xml:1106 msgid "Sets the material to be used to draw the [ImmediateGeometry3D]." msgstr "" -#: doc/classes/RenderingServer.xml:1065 +#: doc/classes/RenderingServer.xml:1117 msgid "" "Sets the tangent to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_tangent]." msgstr "" -#: doc/classes/RenderingServer.xml:1076 +#: doc/classes/RenderingServer.xml:1128 msgid "" "Sets the UV to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_uv]." msgstr "" -#: doc/classes/RenderingServer.xml:1087 +#: doc/classes/RenderingServer.xml:1139 msgid "" "Sets the UV2 to be used with next vertex. Equivalent to [method " "ImmediateGeometry3D.set_uv2]." msgstr "" -#: doc/classes/RenderingServer.xml:1098 +#: doc/classes/RenderingServer.xml:1150 msgid "" "Adds the next vertex using the information provided in advance. Equivalent " "to [method ImmediateGeometry3D.add_vertex]." msgstr "" -#: doc/classes/RenderingServer.xml:1109 +#: doc/classes/RenderingServer.xml:1161 msgid "" "Adds the next vertex using the information provided in advance. This is a " "helper class that calls [method immediate_vertex] under the hood. Equivalent " "to [method ImmediateGeometry3D.add_vertex]." msgstr "" -#: doc/classes/RenderingServer.xml:1116 +#: doc/classes/RenderingServer.xml:1168 msgid "" -"Initializes the visual server. This function is called internally by " +"Initializes the rendering server. This function is called internally by " "platform-dependent code during engine initialization. If called from a " "running game, it will not do anything." msgstr "" -#: doc/classes/RenderingServer.xml:1127 +#: doc/classes/RenderingServer.xml:1179 msgid "" "Attaches a unique Object ID to instance. Object ID must be attached to " "instance for proper culling with [method instances_cull_aabb], [method " "instances_cull_convex], and [method instances_cull_ray]." msgstr "" -#: doc/classes/RenderingServer.xml:1138 +#: doc/classes/RenderingServer.xml:1190 msgid "" "Attaches a skeleton to an instance. Removes the previous skeleton from the " "instance." msgstr "" -#: doc/classes/RenderingServer.xml:1145 +#: doc/classes/RenderingServer.xml:1197 msgid "" "Creates a visual instance and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41431,7 +41550,7 @@ msgid "" "instance to be visible in the scenario using [method instance_set_base]." msgstr "" -#: doc/classes/RenderingServer.xml:1158 +#: doc/classes/RenderingServer.xml:1210 msgid "" "Creates a visual instance, adds it to the RenderingServer, and sets both " "base and scenario. It can be accessed with the RID that is returned. This " @@ -41440,31 +41559,31 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:1170 doc/classes/RenderingServer.xml:1198 -#: doc/classes/RenderingServer.xml:1488 +#: doc/classes/RenderingServer.xml:1222 doc/classes/RenderingServer.xml:1250 +#: doc/classes/RenderingServer.xml:1540 msgid "Not implemented in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:1181 +#: doc/classes/RenderingServer.xml:1233 msgid "" "Sets the shadow casting setting to one of [enum ShadowCastingSetting]. " "Equivalent to [member GeometryInstance3D.cast_shadow]." msgstr "" -#: doc/classes/RenderingServer.xml:1211 +#: doc/classes/RenderingServer.xml:1263 msgid "" "Sets the flag for a given [enum InstanceFlags]. See [enum InstanceFlags] for " "more details." msgstr "" -#: doc/classes/RenderingServer.xml:1222 +#: doc/classes/RenderingServer.xml:1274 msgid "" "Sets a material that will override the material for all surfaces on the mesh " "associated with this instance. Equivalent to [member GeometryInstance3D." "material_override]." msgstr "" -#: doc/classes/RenderingServer.xml:1233 +#: doc/classes/RenderingServer.xml:1285 msgid "" "Sets the base of the instance. A base can be any of the 3D objects that are " "created in the RenderingServer that can be displayed. For example, any of " @@ -41473,62 +41592,62 @@ msgid "" "be set as the base of an instance in order to be displayed in the scenario." msgstr "" -#: doc/classes/RenderingServer.xml:1246 +#: doc/classes/RenderingServer.xml:1298 msgid "Sets the weight for a given blend shape associated with this instance." msgstr "" -#: doc/classes/RenderingServer.xml:1257 +#: doc/classes/RenderingServer.xml:1309 msgid "" "Sets a custom AABB to use when culling objects from the view frustum. " "Equivalent to [method GeometryInstance3D.set_custom_aabb]." msgstr "" -#: doc/classes/RenderingServer.xml:1268 +#: doc/classes/RenderingServer.xml:1320 msgid "Function not implemented in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:1279 +#: doc/classes/RenderingServer.xml:1331 msgid "" "Sets a margin to increase the size of the AABB when culling objects from the " "view frustum. This allows you avoid culling objects that fall outside the " "view frustum. Equivalent to [member GeometryInstance3D.extra_cull_margin]." msgstr "" -#: doc/classes/RenderingServer.xml:1290 +#: doc/classes/RenderingServer.xml:1342 msgid "" "Sets the render layers that this instance will be drawn to. Equivalent to " "[member VisualInstance3D.layers]." msgstr "" -#: doc/classes/RenderingServer.xml:1301 +#: doc/classes/RenderingServer.xml:1353 msgid "" "Sets the scenario that the instance is in. The scenario is the 3D world that " "the objects will be displayed in." msgstr "" -#: doc/classes/RenderingServer.xml:1314 +#: doc/classes/RenderingServer.xml:1366 msgid "" "Sets the material of a specific surface. Equivalent to [method " "MeshInstance3D.set_surface_material]." msgstr "" -#: doc/classes/RenderingServer.xml:1325 +#: doc/classes/RenderingServer.xml:1377 msgid "" "Sets the world space transform of the instance. Equivalent to [member Node3D." "transform]." msgstr "" -#: doc/classes/RenderingServer.xml:1338 +#: doc/classes/RenderingServer.xml:1390 msgid "Sets the lightmap to use with this instance." msgstr "" -#: doc/classes/RenderingServer.xml:1349 +#: doc/classes/RenderingServer.xml:1401 msgid "" "Sets whether an instance is drawn or not. Equivalent to [member Node3D." "visible]." msgstr "" -#: doc/classes/RenderingServer.xml:1360 +#: doc/classes/RenderingServer.xml:1412 msgid "" "Returns an array of object IDs intersecting with the provided AABB. Only " "visual 3D nodes are considered, such as [MeshInstance3D] or " @@ -41540,7 +41659,7 @@ msgid "" "game use cases, prefer physics collision." msgstr "" -#: doc/classes/RenderingServer.xml:1372 +#: doc/classes/RenderingServer.xml:1424 msgid "" "Returns an array of object IDs intersecting with the provided convex shape. " "Only visual 3D nodes are considered, such as [MeshInstance3D] or " @@ -41552,7 +41671,7 @@ msgid "" "game use cases, prefer physics collision." msgstr "" -#: doc/classes/RenderingServer.xml:1386 +#: doc/classes/RenderingServer.xml:1438 msgid "" "Returns an array of object IDs intersecting with the provided 3D ray. Only " "visual 3D nodes are considered, such as [MeshInstance3D] or " @@ -41564,58 +41683,58 @@ msgid "" "game use cases, prefer physics collision." msgstr "" -#: doc/classes/RenderingServer.xml:1398 +#: doc/classes/RenderingServer.xml:1450 msgid "" "If [code]true[/code], this directional light will blend between shadow map " "splits resulting in a smoother transition between them. Equivalent to " "[member DirectionalLight3D.directional_shadow_blend_splits]." msgstr "" -#: doc/classes/RenderingServer.xml:1409 +#: doc/classes/RenderingServer.xml:1461 msgid "" "Sets the shadow depth range mode for this directional light. Equivalent to " "[member DirectionalLight3D.directional_shadow_depth_range]. See [enum " "LightDirectionalShadowDepthRangeMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:1420 +#: doc/classes/RenderingServer.xml:1472 msgid "" "Sets the shadow mode for this directional light. Equivalent to [member " "DirectionalLight3D.directional_shadow_mode]. See [enum " "LightDirectionalShadowMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:1431 +#: doc/classes/RenderingServer.xml:1483 msgid "" "Sets whether to use a dual paraboloid or a cubemap for the shadow map. Dual " "paraboloid is faster but may suffer from artifacts. Equivalent to [member " "OmniLight3D.omni_shadow_mode]." msgstr "" -#: doc/classes/RenderingServer.xml:1442 +#: doc/classes/RenderingServer.xml:1494 msgid "" "Sets the color of the light. Equivalent to [member Light3D.light_color]." msgstr "" -#: doc/classes/RenderingServer.xml:1453 +#: doc/classes/RenderingServer.xml:1505 msgid "" "Sets the cull mask for this Light3D. Lights only affect objects in the " "selected layers. Equivalent to [member Light3D.light_cull_mask]." msgstr "" -#: doc/classes/RenderingServer.xml:1464 +#: doc/classes/RenderingServer.xml:1516 msgid "" "If [code]true[/code], light will subtract light instead of adding light. " "Equivalent to [member Light3D.light_negative]." msgstr "" -#: doc/classes/RenderingServer.xml:1477 +#: doc/classes/RenderingServer.xml:1529 msgid "" "Sets the specified light parameter. See [enum LightParam] for options. " "Equivalent to [method Light3D.set_param]." msgstr "" -#: doc/classes/RenderingServer.xml:1499 +#: doc/classes/RenderingServer.xml:1551 msgid "" "If [code]true[/code], reverses the backface culling of the mesh. This can be " "useful when you have a flat mesh that has a light behind it. If you need to " @@ -41624,23 +41743,23 @@ msgid "" "to [member Light3D.shadow_reverse_cull_face]." msgstr "" -#: doc/classes/RenderingServer.xml:1510 +#: doc/classes/RenderingServer.xml:1562 msgid "" "If [code]true[/code], light will cast shadows. Equivalent to [member Light3D." "shadow_enabled]." msgstr "" -#: doc/classes/RenderingServer.xml:1521 +#: doc/classes/RenderingServer.xml:1573 msgid "" "Sets the color of the shadow cast by the light. Equivalent to [member " "Light3D.shadow_color]." msgstr "" -#: doc/classes/RenderingServer.xml:1532 +#: doc/classes/RenderingServer.xml:1584 msgid "Sets whether GI probes capture light information from this light." msgstr "" -#: doc/classes/RenderingServer.xml:1539 +#: doc/classes/RenderingServer.xml:1591 msgid "" "Creates a lightmap capture and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41651,54 +41770,54 @@ msgid "" "[method instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:1550 +#: doc/classes/RenderingServer.xml:1602 msgid "Returns the size of the lightmap capture area." msgstr "" -#: doc/classes/RenderingServer.xml:1559 +#: doc/classes/RenderingServer.xml:1611 msgid "Returns the energy multiplier used by the lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1568 +#: doc/classes/RenderingServer.xml:1620 msgid "Returns the octree used by the lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1577 +#: doc/classes/RenderingServer.xml:1629 msgid "" "Returns the cell subdivision amount used by this lightmap capture's octree." msgstr "" -#: doc/classes/RenderingServer.xml:1586 +#: doc/classes/RenderingServer.xml:1638 msgid "Returns the cell transform for this lightmap capture's octree." msgstr "" -#: doc/classes/RenderingServer.xml:1597 +#: doc/classes/RenderingServer.xml:1649 msgid "Sets the size of the area covered by the lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1608 +#: doc/classes/RenderingServer.xml:1660 msgid "Sets the energy multiplier for this lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1619 +#: doc/classes/RenderingServer.xml:1671 msgid "Sets the octree to be used by this lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:1630 +#: doc/classes/RenderingServer.xml:1682 msgid "Sets the subdivision level of this lightmap capture's octree." msgstr "" -#: doc/classes/RenderingServer.xml:1641 +#: doc/classes/RenderingServer.xml:1693 msgid "Sets the octree cell transform for this lightmap capture's octree." msgstr "" -#: doc/classes/RenderingServer.xml:1654 +#: doc/classes/RenderingServer.xml:1706 msgid "" "Returns a mesh of a sphere with the given amount of horizontal and vertical " "subdivisions." msgstr "" -#: doc/classes/RenderingServer.xml:1661 +#: doc/classes/RenderingServer.xml:1713 msgid "" "Creates an empty material and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41707,31 +41826,31 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:1673 +#: doc/classes/RenderingServer.xml:1725 msgid "Returns the value of a certain material's parameter." msgstr "" -#: doc/classes/RenderingServer.xml:1684 +#: doc/classes/RenderingServer.xml:1736 msgid "Sets an object's next material." msgstr "" -#: doc/classes/RenderingServer.xml:1697 +#: doc/classes/RenderingServer.xml:1749 msgid "Sets a material's parameter." msgstr "" -#: doc/classes/RenderingServer.xml:1708 +#: doc/classes/RenderingServer.xml:1760 msgid "Sets a material's render priority." msgstr "" -#: doc/classes/RenderingServer.xml:1719 +#: doc/classes/RenderingServer.xml:1771 msgid "Sets a shader material's shader." msgstr "" -#: doc/classes/RenderingServer.xml:1748 +#: doc/classes/RenderingServer.xml:1800 msgid "Removes all surfaces from a mesh." msgstr "" -#: doc/classes/RenderingServer.xml:1755 +#: doc/classes/RenderingServer.xml:1807 msgid "" "Creates a new mesh and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID will be used in all [code]mesh_*[/" @@ -41742,58 +41861,58 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:1766 +#: doc/classes/RenderingServer.xml:1818 msgid "Returns a mesh's blend shape count." msgstr "" -#: doc/classes/RenderingServer.xml:1775 +#: doc/classes/RenderingServer.xml:1827 msgid "Returns a mesh's blend shape mode." msgstr "" -#: doc/classes/RenderingServer.xml:1784 +#: doc/classes/RenderingServer.xml:1836 msgid "Returns a mesh's custom aabb." msgstr "" -#: doc/classes/RenderingServer.xml:1793 +#: doc/classes/RenderingServer.xml:1845 msgid "Returns a mesh's number of surfaces." msgstr "" -#: doc/classes/RenderingServer.xml:1804 +#: doc/classes/RenderingServer.xml:1856 msgid "Sets a mesh's blend shape mode." msgstr "" -#: doc/classes/RenderingServer.xml:1815 +#: doc/classes/RenderingServer.xml:1867 msgid "Sets a mesh's custom aabb." msgstr "" -#: doc/classes/RenderingServer.xml:1826 +#: doc/classes/RenderingServer.xml:1878 msgid "Returns a mesh's surface's buffer arrays." msgstr "" -#: doc/classes/RenderingServer.xml:1837 +#: doc/classes/RenderingServer.xml:1889 msgid "Returns a mesh's surface's arrays for blend shapes." msgstr "" -#: doc/classes/RenderingServer.xml:1852 doc/classes/RenderingServer.xml:1865 +#: doc/classes/RenderingServer.xml:1904 doc/classes/RenderingServer.xml:1917 msgid "Function is unused in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:1876 +#: doc/classes/RenderingServer.xml:1928 msgid "Returns a mesh's surface's material." msgstr "" -#: doc/classes/RenderingServer.xml:1889 +#: doc/classes/RenderingServer.xml:1941 msgid "Sets a mesh's surface's material." msgstr "" -#: doc/classes/RenderingServer.xml:1904 +#: doc/classes/RenderingServer.xml:1956 msgid "" "Updates a specific region of a vertex buffer for the specified surface. " "Warning: this function alters the vertex buffer directly with no safety " "mechanisms, you can easily corrupt your mesh." msgstr "" -#: doc/classes/RenderingServer.xml:1927 +#: doc/classes/RenderingServer.xml:1979 msgid "" "Creates a new multimesh on the RenderingServer and returns an [RID] handle. " "This RID will be used in all [code]multimesh_*[/code] RenderingServer " @@ -41804,82 +41923,82 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:1938 +#: doc/classes/RenderingServer.xml:1990 msgid "" "Calculates and returns the axis-aligned bounding box that encloses all " "instances within the multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:1955 +#: doc/classes/RenderingServer.xml:2007 msgid "Returns the number of instances allocated for this multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:1964 +#: doc/classes/RenderingServer.xml:2016 msgid "" "Returns the RID of the mesh that will be used in drawing this multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:1973 +#: doc/classes/RenderingServer.xml:2025 msgid "Returns the number of visible instances for this multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:1984 +#: doc/classes/RenderingServer.xml:2036 msgid "Returns the color by which the specified instance will be modulated." msgstr "" -#: doc/classes/RenderingServer.xml:1995 +#: doc/classes/RenderingServer.xml:2047 msgid "Returns the custom data associated with the specified instance." msgstr "" -#: doc/classes/RenderingServer.xml:2006 +#: doc/classes/RenderingServer.xml:2058 msgid "Returns the [Transform] of the specified instance." msgstr "" -#: doc/classes/RenderingServer.xml:2017 +#: doc/classes/RenderingServer.xml:2069 msgid "" "Returns the [Transform2D] of the specified instance. For use when the " "multimesh is set to use 2D transforms." msgstr "" -#: doc/classes/RenderingServer.xml:2030 +#: doc/classes/RenderingServer.xml:2082 msgid "" "Sets the color by which this instance will be modulated. Equivalent to " "[method MultiMesh.set_instance_color]." msgstr "" -#: doc/classes/RenderingServer.xml:2043 +#: doc/classes/RenderingServer.xml:2095 msgid "" "Sets the custom data for this instance. Custom data is passed as a [Color], " "but is interpreted as a [code]vec4[/code] in the shader. Equivalent to " "[method MultiMesh.set_instance_custom_data]." msgstr "" -#: doc/classes/RenderingServer.xml:2056 +#: doc/classes/RenderingServer.xml:2108 msgid "" "Sets the [Transform] for this instance. Equivalent to [method MultiMesh." "set_instance_transform]." msgstr "" -#: doc/classes/RenderingServer.xml:2069 +#: doc/classes/RenderingServer.xml:2121 msgid "" "Sets the [Transform2D] for this instance. For use when multimesh is used in " "2D. Equivalent to [method MultiMesh.set_instance_transform_2d]." msgstr "" -#: doc/classes/RenderingServer.xml:2090 +#: doc/classes/RenderingServer.xml:2142 msgid "" "Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh." "mesh]." msgstr "" -#: doc/classes/RenderingServer.xml:2101 +#: doc/classes/RenderingServer.xml:2153 msgid "" "Sets the number of instances visible at a given time. If -1, all instances " "that have been allocated are drawn. Equivalent to [member MultiMesh." "visible_instance_count]." msgstr "" -#: doc/classes/RenderingServer.xml:2108 +#: doc/classes/RenderingServer.xml:2160 msgid "" "Creates a new omni light and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID can be used in most " @@ -41890,7 +42009,7 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:2117 +#: doc/classes/RenderingServer.xml:2169 msgid "" "Creates a particle system and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -41901,23 +42020,23 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:2128 +#: doc/classes/RenderingServer.xml:2180 msgid "" "Calculates and returns the axis-aligned bounding box that contains all the " "particles. Equivalent to [method GPUParticles3D.capture_aabb]." msgstr "" -#: doc/classes/RenderingServer.xml:2137 +#: doc/classes/RenderingServer.xml:2189 msgid "Returns [code]true[/code] if particles are currently set to emitting." msgstr "" -#: doc/classes/RenderingServer.xml:2146 +#: doc/classes/RenderingServer.xml:2198 msgid "" "Returns [code]true[/code] if particles are not emitting and particles are " "set to inactive." msgstr "" -#: doc/classes/RenderingServer.xml:2155 +#: doc/classes/RenderingServer.xml:2207 msgid "" "Add particle system to list of particle systems that need to be updated. " "Update will take place on the next frame, or on the next call to [method " @@ -41925,121 +42044,121 @@ msgid "" "instances_cull_ray]." msgstr "" -#: doc/classes/RenderingServer.xml:2164 +#: doc/classes/RenderingServer.xml:2216 msgid "" "Reset the particles on the next update. Equivalent to [method GPUParticles3D." "restart]." msgstr "" -#: doc/classes/RenderingServer.xml:2175 +#: doc/classes/RenderingServer.xml:2227 msgid "" "Sets the number of particles to be drawn and allocates the memory for them. " "Equivalent to [member GPUParticles3D.amount]." msgstr "" -#: doc/classes/RenderingServer.xml:2186 +#: doc/classes/RenderingServer.xml:2238 msgid "" "Sets a custom axis-aligned bounding box for the particle system. Equivalent " "to [member GPUParticles3D.visibility_aabb]." msgstr "" -#: doc/classes/RenderingServer.xml:2197 +#: doc/classes/RenderingServer.xml:2249 msgid "" "Sets the draw order of the particles to one of the named enums from [enum " "ParticlesDrawOrder]. See [enum ParticlesDrawOrder] for options. Equivalent " "to [member GPUParticles3D.draw_order]." msgstr "" -#: doc/classes/RenderingServer.xml:2210 +#: doc/classes/RenderingServer.xml:2262 msgid "" "Sets the mesh to be used for the specified draw pass. Equivalent to [member " "GPUParticles3D.draw_pass_1], [member GPUParticles3D.draw_pass_2], [member " "GPUParticles3D.draw_pass_3], and [member GPUParticles3D.draw_pass_4]." msgstr "" -#: doc/classes/RenderingServer.xml:2221 +#: doc/classes/RenderingServer.xml:2273 msgid "" "Sets the number of draw passes to use. Equivalent to [member GPUParticles3D." "draw_passes]." msgstr "" -#: doc/classes/RenderingServer.xml:2232 +#: doc/classes/RenderingServer.xml:2284 msgid "" "Sets the [Transform] that will be used by the particles when they first emit." msgstr "" -#: doc/classes/RenderingServer.xml:2243 +#: doc/classes/RenderingServer.xml:2295 msgid "" "If [code]true[/code], particles will emit over time. Setting to false does " "not reset the particles, but only stops their emission. Equivalent to " "[member GPUParticles3D.emitting]." msgstr "" -#: doc/classes/RenderingServer.xml:2254 +#: doc/classes/RenderingServer.xml:2306 msgid "" "Sets the explosiveness ratio. Equivalent to [member GPUParticles3D." "explosiveness]." msgstr "" -#: doc/classes/RenderingServer.xml:2265 +#: doc/classes/RenderingServer.xml:2317 msgid "" "Sets the frame rate that the particle system rendering will be fixed to. " "Equivalent to [member GPUParticles3D.fixed_fps]." msgstr "" -#: doc/classes/RenderingServer.xml:2276 +#: doc/classes/RenderingServer.xml:2328 msgid "" "If [code]true[/code], uses fractional delta which smooths the movement of " "the particles. Equivalent to [member GPUParticles3D.fract_delta]." msgstr "" -#: doc/classes/RenderingServer.xml:2287 +#: doc/classes/RenderingServer.xml:2339 msgid "" "Sets the lifetime of each particle in the system. Equivalent to [member " "GPUParticles3D.lifetime]." msgstr "" -#: doc/classes/RenderingServer.xml:2298 +#: doc/classes/RenderingServer.xml:2350 msgid "" "If [code]true[/code], particles will emit once and then stop. Equivalent to " "[member GPUParticles3D.one_shot]." msgstr "" -#: doc/classes/RenderingServer.xml:2309 +#: doc/classes/RenderingServer.xml:2361 msgid "" "Sets the preprocess time for the particles animation. This lets you delay " "starting an animation until after the particles have begun emitting. " "Equivalent to [member GPUParticles3D.preprocess]." msgstr "" -#: doc/classes/RenderingServer.xml:2320 +#: doc/classes/RenderingServer.xml:2372 msgid "" "Sets the material for processing the particles. Note: this is not the " "material used to draw the materials. Equivalent to [member GPUParticles3D." "process_material]." msgstr "" -#: doc/classes/RenderingServer.xml:2331 +#: doc/classes/RenderingServer.xml:2383 msgid "" "Sets the emission randomness ratio. This randomizes the emission of " "particles within their phase. Equivalent to [member GPUParticles3D." "randomness]." msgstr "" -#: doc/classes/RenderingServer.xml:2342 +#: doc/classes/RenderingServer.xml:2394 msgid "" "Sets the speed scale of the particle system. Equivalent to [member " "GPUParticles3D.speed_scale]." msgstr "" -#: doc/classes/RenderingServer.xml:2353 +#: doc/classes/RenderingServer.xml:2405 msgid "" "If [code]true[/code], particles use local coordinates. If [code]false[/code] " "they use global coordinates. Equivalent to [member GPUParticles3D." "local_coords]." msgstr "" -#: doc/classes/RenderingServer.xml:2360 +#: doc/classes/RenderingServer.xml:2412 msgid "" "Creates a reflection probe and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -42050,59 +42169,59 @@ msgid "" "[method instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:2373 +#: doc/classes/RenderingServer.xml:2425 msgid "" "If [code]true[/code], reflections will ignore sky contribution. Equivalent " "to [member ReflectionProbe.interior_enable]." msgstr "" -#: doc/classes/RenderingServer.xml:2384 +#: doc/classes/RenderingServer.xml:2436 msgid "" "Sets the render cull mask for this reflection probe. Only instances with a " "matching cull mask will be rendered by this probe. Equivalent to [member " "ReflectionProbe.cull_mask]." msgstr "" -#: doc/classes/RenderingServer.xml:2395 +#: doc/classes/RenderingServer.xml:2447 msgid "" "If [code]true[/code], uses box projection. This can make reflections look " "more correct in certain situations. Equivalent to [member ReflectionProbe." "box_projection]." msgstr "" -#: doc/classes/RenderingServer.xml:2406 +#: doc/classes/RenderingServer.xml:2458 msgid "" "If [code]true[/code], computes shadows in the reflection probe. This makes " "the reflection much slower to compute. Equivalent to [member ReflectionProbe." "enable_shadows]." msgstr "" -#: doc/classes/RenderingServer.xml:2417 +#: doc/classes/RenderingServer.xml:2469 msgid "" "Sets the size of the area that the reflection probe will capture. Equivalent " "to [member ReflectionProbe.extents]." msgstr "" -#: doc/classes/RenderingServer.xml:2428 +#: doc/classes/RenderingServer.xml:2480 msgid "" "Sets the intensity of the reflection probe. Intensity modulates the strength " "of the reflection. Equivalent to [member ReflectionProbe.intensity]." msgstr "" -#: doc/classes/RenderingServer.xml:2439 +#: doc/classes/RenderingServer.xml:2491 msgid "" "Sets the ambient light color for this reflection probe when set to interior " "mode. Equivalent to [member ReflectionProbe.interior_ambient_color]." msgstr "" -#: doc/classes/RenderingServer.xml:2450 +#: doc/classes/RenderingServer.xml:2502 msgid "" "Sets the energy multiplier for this reflection probes ambient light " "contribution when set to interior mode. Equivalent to [member " "ReflectionProbe.interior_ambient_energy]." msgstr "" -#: doc/classes/RenderingServer.xml:2461 +#: doc/classes/RenderingServer.xml:2513 msgid "" "Sets the contribution value for how much the reflection affects the ambient " "light for this reflection probe when set to interior mode. Useful so that " @@ -42110,25 +42229,25 @@ msgid "" "ReflectionProbe.interior_ambient_contrib]." msgstr "" -#: doc/classes/RenderingServer.xml:2472 +#: doc/classes/RenderingServer.xml:2524 msgid "" "Sets the max distance away from the probe an object can be before it is " "culled. Equivalent to [member ReflectionProbe.max_distance]." msgstr "" -#: doc/classes/RenderingServer.xml:2483 +#: doc/classes/RenderingServer.xml:2535 msgid "" "Sets the origin offset to be used when this reflection probe is in box " "project mode. Equivalent to [member ReflectionProbe.origin_offset]." msgstr "" -#: doc/classes/RenderingServer.xml:2494 +#: doc/classes/RenderingServer.xml:2546 msgid "" "Sets how often the reflection probe updates. Can either be once or every " "frame. See [enum ReflectionProbeUpdateMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:2507 +#: doc/classes/RenderingServer.xml:2559 msgid "" "Schedules a callback to the corresponding named [code]method[/code] on " "[code]where[/code] after a frame has been drawn.\n" @@ -42136,7 +42255,7 @@ msgid "" "[code]userdata[/code]." msgstr "" -#: doc/classes/RenderingServer.xml:2515 +#: doc/classes/RenderingServer.xml:2567 msgid "" "Creates a scenario and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID will be used in all " @@ -42146,24 +42265,24 @@ msgid "" "The scenario is the 3D world that all the visual instances exist in." msgstr "" -#: doc/classes/RenderingServer.xml:2528 +#: doc/classes/RenderingServer.xml:2580 msgid "" "Sets the [enum ScenarioDebugMode] for this scenario. See [enum " "ScenarioDebugMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:2539 +#: doc/classes/RenderingServer.xml:2591 msgid "Sets the environment that will be used with this scenario." msgstr "" -#: doc/classes/RenderingServer.xml:2550 +#: doc/classes/RenderingServer.xml:2602 msgid "" "Sets the fallback environment to be used by this scenario. The fallback " "environment is used if no environment is set. Internally, this is used by " "the editor to provide a default environment." msgstr "" -#: doc/classes/RenderingServer.xml:2565 +#: doc/classes/RenderingServer.xml:2617 msgid "" "Sets a boot image. The color defines the background color. If [code]scale[/" "code] is [code]true[/code], the image will be scaled to fit the screen size. " @@ -42172,19 +42291,19 @@ msgid "" "the image will be scaled with nearest-neighbor interpolation." msgstr "" -#: doc/classes/RenderingServer.xml:2574 +#: doc/classes/RenderingServer.xml:2626 msgid "" "If [code]true[/code], the engine will generate wireframes for use with the " "wireframe debug mode." msgstr "" -#: doc/classes/RenderingServer.xml:2583 +#: doc/classes/RenderingServer.xml:2635 msgid "" "Sets the default clear color which is used when a specific clear color has " "not been selected." msgstr "" -#: doc/classes/RenderingServer.xml:2590 +#: doc/classes/RenderingServer.xml:2642 msgid "" "Creates an empty shader and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -42193,47 +42312,47 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:2600 +#: doc/classes/RenderingServer.xml:2652 msgid "Returns a shader's code." msgstr "" -#: doc/classes/RenderingServer.xml:2611 +#: doc/classes/RenderingServer.xml:2663 msgid "Returns a default texture from a shader searched by name." msgstr "" -#: doc/classes/RenderingServer.xml:2630 +#: doc/classes/RenderingServer.xml:2682 msgid "Returns the parameters of a shader." msgstr "" -#: doc/classes/RenderingServer.xml:2641 +#: doc/classes/RenderingServer.xml:2693 msgid "Sets a shader's code." msgstr "" -#: doc/classes/RenderingServer.xml:2654 +#: doc/classes/RenderingServer.xml:2706 msgid "Sets a shader's default texture. Overwrites the texture given by name." msgstr "" -#: doc/classes/RenderingServer.xml:2667 +#: doc/classes/RenderingServer.xml:2719 msgid "Allocates the GPU buffers for this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2678 +#: doc/classes/RenderingServer.xml:2730 msgid "Returns the [Transform] set for a specific bone of this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2689 +#: doc/classes/RenderingServer.xml:2741 msgid "Returns the [Transform2D] set for a specific bone of this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2702 +#: doc/classes/RenderingServer.xml:2754 msgid "Sets the [Transform] for a specific bone of this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2715 +#: doc/classes/RenderingServer.xml:2767 msgid "Sets the [Transform2D] for a specific bone of this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2722 +#: doc/classes/RenderingServer.xml:2774 msgid "" "Creates a skeleton and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID will be used in all " @@ -42242,11 +42361,11 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:2732 +#: doc/classes/RenderingServer.xml:2784 msgid "Returns the number of bones allocated for this skeleton." msgstr "" -#: doc/classes/RenderingServer.xml:2739 +#: doc/classes/RenderingServer.xml:2791 msgid "" "Creates an empty sky and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID will be used in all [code]sky_*[/" @@ -42255,13 +42374,13 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:2751 +#: doc/classes/RenderingServer.xml:2803 msgid "" "Sets the material that the sky uses to render the background and reflection " "maps." msgstr "" -#: doc/classes/RenderingServer.xml:2758 +#: doc/classes/RenderingServer.xml:2810 msgid "" "Creates a spot light and adds it to the RenderingServer. It can be accessed " "with the RID that is returned. This RID can be used in most [code]light_*[/" @@ -42272,15 +42391,15 @@ msgid "" "instance_set_base] using the returned RID." msgstr "" -#: doc/classes/RenderingServer.xml:2787 +#: doc/classes/RenderingServer.xml:2839 msgid "Sets a viewport's camera." msgstr "" -#: doc/classes/RenderingServer.xml:2798 +#: doc/classes/RenderingServer.xml:2850 msgid "Sets a viewport's canvas." msgstr "" -#: doc/classes/RenderingServer.xml:2811 +#: doc/classes/RenderingServer.xml:2863 msgid "" "Copies the viewport to a region of the screen specified by [code]rect[/" "code]. If [method viewport_set_render_direct_to_screen] is [code]true[/" @@ -42302,7 +42421,7 @@ msgid "" "viewport_set_render_direct_to_screen]." msgstr "" -#: doc/classes/RenderingServer.xml:2825 +#: doc/classes/RenderingServer.xml:2877 msgid "" "Creates an empty viewport and adds it to the RenderingServer. It can be " "accessed with the RID that is returned. This RID will be used in all " @@ -42311,72 +42430,72 @@ msgid "" "RenderingServer's [method free_rid] static method." msgstr "" -#: doc/classes/RenderingServer.xml:2837 +#: doc/classes/RenderingServer.xml:2889 msgid "" "Returns a viewport's render information. For options, see the [enum " "ViewportRenderInfo] constants." msgstr "" -#: doc/classes/RenderingServer.xml:2846 +#: doc/classes/RenderingServer.xml:2898 msgid "Returns the viewport's last rendered frame." msgstr "" -#: doc/classes/RenderingServer.xml:2857 +#: doc/classes/RenderingServer.xml:2909 msgid "Detaches a viewport from a canvas and vice versa." msgstr "" -#: doc/classes/RenderingServer.xml:2868 +#: doc/classes/RenderingServer.xml:2920 msgid "If [code]true[/code], sets the viewport active, else sets it inactive." msgstr "" -#: doc/classes/RenderingServer.xml:2883 +#: doc/classes/RenderingServer.xml:2935 msgid "" "Sets the stacking order for a viewport's canvas.\n" "[code]layer[/code] is the actual canvas layer, while [code]sublayer[/code] " "specifies the stacking order of the canvas among those in the same layer." msgstr "" -#: doc/classes/RenderingServer.xml:2897 +#: doc/classes/RenderingServer.xml:2949 msgid "Sets the transformation of a viewport's canvas." msgstr "" -#: doc/classes/RenderingServer.xml:2908 +#: doc/classes/RenderingServer.xml:2960 msgid "" "Sets the clear mode of a viewport. See [enum ViewportClearMode] for options." msgstr "" -#: doc/classes/RenderingServer.xml:2919 +#: doc/classes/RenderingServer.xml:2971 msgid "" "Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for " "options." msgstr "" -#: doc/classes/RenderingServer.xml:2930 +#: doc/classes/RenderingServer.xml:2982 msgid "" "If [code]true[/code], rendering of a viewport's environment is disabled." msgstr "" -#: doc/classes/RenderingServer.xml:2941 +#: doc/classes/RenderingServer.xml:2993 msgid "Sets the viewport's global transformation matrix." msgstr "" -#: doc/classes/RenderingServer.xml:2952 +#: doc/classes/RenderingServer.xml:3004 msgid "If [code]true[/code], the viewport's canvas is not rendered." msgstr "" -#: doc/classes/RenderingServer.xml:2963 +#: doc/classes/RenderingServer.xml:3015 msgid "Currently unimplemented in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:2974 +#: doc/classes/RenderingServer.xml:3026 msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options." msgstr "" -#: doc/classes/RenderingServer.xml:2985 +#: doc/classes/RenderingServer.xml:3037 msgid "Sets the viewport's parent to another viewport." msgstr "" -#: doc/classes/RenderingServer.xml:2996 +#: doc/classes/RenderingServer.xml:3048 msgid "" "If [code]true[/code], render the contents of the viewport directly to " "screen. This allows a low-level optimization where you can skip drawing a " @@ -42392,708 +42511,864 @@ msgid "" "significantly larger than the window size." msgstr "" -#: doc/classes/RenderingServer.xml:3007 +#: doc/classes/RenderingServer.xml:3059 msgid "" "Sets a viewport's scenario.\n" "The scenario contains information about the [enum ScenarioDebugMode], " "environment information, reflection atlas etc." msgstr "" -#: doc/classes/RenderingServer.xml:3021 +#: doc/classes/RenderingServer.xml:3073 msgid "Sets the shadow atlas quadrant's subdivision." msgstr "" -#: doc/classes/RenderingServer.xml:3032 +#: doc/classes/RenderingServer.xml:3084 msgid "" "Sets the size of the shadow atlas's images (used for omni and spot lights). " "The value will be rounded up to the nearest power of 2." msgstr "" -#: doc/classes/RenderingServer.xml:3045 +#: doc/classes/RenderingServer.xml:3097 msgid "Sets the viewport's width and height." msgstr "" -#: doc/classes/RenderingServer.xml:3056 +#: doc/classes/RenderingServer.xml:3108 msgid "" "If [code]true[/code], the viewport renders its background as transparent." msgstr "" -#: doc/classes/RenderingServer.xml:3067 +#: doc/classes/RenderingServer.xml:3119 msgid "" "Sets when the viewport should be updated. See [enum ViewportUpdateMode] " "constants for options." msgstr "" -#: doc/classes/RenderingServer.xml:3078 +#: doc/classes/RenderingServer.xml:3130 msgid "" "If [code]true[/code], the viewport uses augmented or virtual reality " -"technologies. See [ARVRInterface]." +"technologies. See [XRInterface]." msgstr "" -#: doc/classes/RenderingServer.xml:3085 +#: doc/classes/RenderingServer.xml:3137 msgid "" "Emitted at the end of the frame, after the RenderingServer has finished " "updating all the Viewports." msgstr "" -#: doc/classes/RenderingServer.xml:3090 +#: doc/classes/RenderingServer.xml:3142 msgid "" "Emitted at the beginning of the frame, before the RenderingServer updates " "all the Viewports." msgstr "" -#: doc/classes/RenderingServer.xml:3096 +#: doc/classes/RenderingServer.xml:3148 msgid "Marks an error that shows that the index array is empty." msgstr "" -#: doc/classes/RenderingServer.xml:3099 +#: doc/classes/RenderingServer.xml:3151 msgid "Number of weights/bones per vertex." msgstr "" -#: doc/classes/RenderingServer.xml:3102 +#: doc/classes/RenderingServer.xml:3154 msgid "The minimum Z-layer for canvas items." msgstr "" -#: doc/classes/RenderingServer.xml:3105 +#: doc/classes/RenderingServer.xml:3157 msgid "The maximum Z-layer for canvas items." msgstr "" -#: doc/classes/RenderingServer.xml:3108 +#: doc/classes/RenderingServer.xml:3160 msgid "" "Max number of glow levels that can be used with glow post-process effect." msgstr "" -#: doc/classes/RenderingServer.xml:3111 +#: doc/classes/RenderingServer.xml:3163 msgid "Unused enum in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:3114 -msgid "The minimum renderpriority of all materials." -msgstr "" - -#: doc/classes/RenderingServer.xml:3117 -msgid "The maximum renderpriority of all materials." -msgstr "" - -#: doc/classes/RenderingServer.xml:3138 +#: doc/classes/RenderingServer.xml:3184 msgid "Shader is a 3D shader." msgstr "" -#: doc/classes/RenderingServer.xml:3141 +#: doc/classes/RenderingServer.xml:3187 msgid "Shader is a 2D shader." msgstr "" -#: doc/classes/RenderingServer.xml:3144 +#: doc/classes/RenderingServer.xml:3190 msgid "Shader is a particle shader." msgstr "" -#: doc/classes/RenderingServer.xml:3147 +#: doc/classes/RenderingServer.xml:3193 msgid "Shader is a sky shader." msgstr "" -#: doc/classes/RenderingServer.xml:3150 +#: doc/classes/RenderingServer.xml:3196 msgid "Represents the size of the [enum ShaderMode] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3153 +#: doc/classes/RenderingServer.xml:3199 +msgid "The minimum renderpriority of all materials." +msgstr "" + +#: doc/classes/RenderingServer.xml:3202 +msgid "The maximum renderpriority of all materials." +msgstr "" + +#: doc/classes/RenderingServer.xml:3205 msgid "Array is a vertex array." msgstr "" -#: doc/classes/RenderingServer.xml:3156 +#: doc/classes/RenderingServer.xml:3208 msgid "Array is a normal array." msgstr "" -#: doc/classes/RenderingServer.xml:3159 +#: doc/classes/RenderingServer.xml:3211 msgid "Array is a tangent array." msgstr "" -#: doc/classes/RenderingServer.xml:3162 +#: doc/classes/RenderingServer.xml:3214 msgid "Array is a color array." msgstr "" -#: doc/classes/RenderingServer.xml:3165 +#: doc/classes/RenderingServer.xml:3217 msgid "Array is an UV coordinates array." msgstr "" -#: doc/classes/RenderingServer.xml:3168 +#: doc/classes/RenderingServer.xml:3220 msgid "Array is an UV coordinates array for the second UV coordinates." msgstr "" -#: doc/classes/RenderingServer.xml:3171 +#: doc/classes/RenderingServer.xml:3223 msgid "Array contains bone information." msgstr "" -#: doc/classes/RenderingServer.xml:3174 +#: doc/classes/RenderingServer.xml:3226 msgid "Array is weight information." msgstr "" -#: doc/classes/RenderingServer.xml:3177 +#: doc/classes/RenderingServer.xml:3229 msgid "Array is index array." msgstr "" -#: doc/classes/RenderingServer.xml:3183 +#: doc/classes/RenderingServer.xml:3235 msgid "Flag used to mark a vertex array." msgstr "" -#: doc/classes/RenderingServer.xml:3186 +#: doc/classes/RenderingServer.xml:3238 msgid "Flag used to mark a normal array." msgstr "" -#: doc/classes/RenderingServer.xml:3189 +#: doc/classes/RenderingServer.xml:3241 msgid "Flag used to mark a tangent array." msgstr "" -#: doc/classes/RenderingServer.xml:3192 +#: doc/classes/RenderingServer.xml:3244 msgid "Flag used to mark a color array." msgstr "" -#: doc/classes/RenderingServer.xml:3195 +#: doc/classes/RenderingServer.xml:3247 msgid "Flag used to mark an UV coordinates array." msgstr "" -#: doc/classes/RenderingServer.xml:3198 +#: doc/classes/RenderingServer.xml:3250 msgid "" "Flag used to mark an UV coordinates array for the second UV coordinates." msgstr "" -#: doc/classes/RenderingServer.xml:3201 +#: doc/classes/RenderingServer.xml:3253 msgid "Flag used to mark a bone information array." msgstr "" -#: doc/classes/RenderingServer.xml:3204 +#: doc/classes/RenderingServer.xml:3256 msgid "Flag used to mark a weights array." msgstr "" -#: doc/classes/RenderingServer.xml:3207 +#: doc/classes/RenderingServer.xml:3259 msgid "Flag used to mark an index array." msgstr "" -#: doc/classes/RenderingServer.xml:3236 +#: doc/classes/RenderingServer.xml:3288 msgid "Primitive to draw consists of points." msgstr "" -#: doc/classes/RenderingServer.xml:3239 +#: doc/classes/RenderingServer.xml:3291 msgid "Primitive to draw consists of lines." msgstr "" -#: doc/classes/RenderingServer.xml:3242 +#: doc/classes/RenderingServer.xml:3294 msgid "Primitive to draw consists of a line strip from start to end." msgstr "" -#: doc/classes/RenderingServer.xml:3245 +#: doc/classes/RenderingServer.xml:3297 msgid "Primitive to draw consists of triangles." msgstr "" -#: doc/classes/RenderingServer.xml:3248 +#: doc/classes/RenderingServer.xml:3300 msgid "" "Primitive to draw consists of a triangle strip (the last 3 vertices are " "always combined to make a triangle)." msgstr "" -#: doc/classes/RenderingServer.xml:3251 +#: doc/classes/RenderingServer.xml:3303 msgid "Represents the size of the [enum PrimitiveType] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3260 +#: doc/classes/RenderingServer.xml:3312 msgid "Use [Transform2D] to store MultiMesh transform." msgstr "" -#: doc/classes/RenderingServer.xml:3263 +#: doc/classes/RenderingServer.xml:3315 msgid "Use [Transform] to store MultiMesh transform." msgstr "" -#: doc/classes/RenderingServer.xml:3266 +#: doc/classes/RenderingServer.xml:3318 msgid "Is a directional (sun) light." msgstr "" -#: doc/classes/RenderingServer.xml:3269 +#: doc/classes/RenderingServer.xml:3321 msgid "Is an omni light." msgstr "" -#: doc/classes/RenderingServer.xml:3272 +#: doc/classes/RenderingServer.xml:3324 msgid "Is a spot light." msgstr "" -#: doc/classes/RenderingServer.xml:3275 +#: doc/classes/RenderingServer.xml:3327 msgid "The light's energy." msgstr "" -#: doc/classes/RenderingServer.xml:3280 +#: doc/classes/RenderingServer.xml:3332 msgid "The light's influence on specularity." msgstr "" -#: doc/classes/RenderingServer.xml:3283 +#: doc/classes/RenderingServer.xml:3335 msgid "The light's range." msgstr "" -#: doc/classes/RenderingServer.xml:3286 +#: doc/classes/RenderingServer.xml:3338 +msgid "" +"The size of the light when using spot light or omni light. The angular size " +"of the light when using directional light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3341 msgid "The light's attenuation." msgstr "" -#: doc/classes/RenderingServer.xml:3289 +#: doc/classes/RenderingServer.xml:3344 msgid "The spotlight's angle." msgstr "" -#: doc/classes/RenderingServer.xml:3292 +#: doc/classes/RenderingServer.xml:3347 msgid "The spotlight's attenuation." msgstr "" -#: doc/classes/RenderingServer.xml:3295 -msgid "Scales the shadow color." -msgstr "" - -#: doc/classes/RenderingServer.xml:3298 +#: doc/classes/RenderingServer.xml:3350 msgid "Max distance that shadows will be rendered." msgstr "" -#: doc/classes/RenderingServer.xml:3301 +#: doc/classes/RenderingServer.xml:3353 msgid "Proportion of shadow atlas occupied by the first split." msgstr "" -#: doc/classes/RenderingServer.xml:3304 +#: doc/classes/RenderingServer.xml:3356 msgid "Proportion of shadow atlas occupied by the second split." msgstr "" -#: doc/classes/RenderingServer.xml:3307 +#: doc/classes/RenderingServer.xml:3359 msgid "" "Proportion of shadow atlas occupied by the third split. The fourth split " "occupies the rest." msgstr "" -#: doc/classes/RenderingServer.xml:3312 +#: doc/classes/RenderingServer.xml:3362 +msgid "" +"Proportion of shadow max distance where the shadow will start to fade out." +msgstr "" + +#: doc/classes/RenderingServer.xml:3365 msgid "" "Normal bias used to offset shadow lookup by object normal. Can be used to " "fix self-shadowing artifacts." msgstr "" -#: doc/classes/RenderingServer.xml:3315 +#: doc/classes/RenderingServer.xml:3368 msgid "Bias the shadow lookup to fix self-shadowing artifacts." msgstr "" -#: doc/classes/RenderingServer.xml:3318 -msgid "" -"Increases bias on further splits to fix self-shadowing that only occurs far " -"away from the camera." -msgstr "" - -#: doc/classes/RenderingServer.xml:3321 +#: doc/classes/RenderingServer.xml:3379 msgid "Represents the size of the [enum LightParam] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3324 +#: doc/classes/RenderingServer.xml:3382 msgid "Use a dual paraboloid shadow map for omni lights." msgstr "" -#: doc/classes/RenderingServer.xml:3327 +#: doc/classes/RenderingServer.xml:3385 msgid "" "Use a cubemap shadow map for omni lights. Slower but better quality than " "dual paraboloid." msgstr "" -#: doc/classes/RenderingServer.xml:3330 +#: doc/classes/RenderingServer.xml:3388 msgid "Use orthogonal shadow projection for directional light." msgstr "" -#: doc/classes/RenderingServer.xml:3333 +#: doc/classes/RenderingServer.xml:3391 msgid "Use 2 splits for shadow projection when using directional light." msgstr "" -#: doc/classes/RenderingServer.xml:3336 +#: doc/classes/RenderingServer.xml:3394 msgid "Use 4 splits for shadow projection when using directional light." msgstr "" -#: doc/classes/RenderingServer.xml:3339 +#: doc/classes/RenderingServer.xml:3397 msgid "" "Keeps shadows stable as camera moves but has lower effective resolution." msgstr "" -#: doc/classes/RenderingServer.xml:3342 +#: doc/classes/RenderingServer.xml:3400 msgid "" "Optimize use of shadow maps, increasing the effective resolution. But may " "result in shadows moving or flickering slightly." msgstr "" -#: doc/classes/RenderingServer.xml:3345 +#: doc/classes/RenderingServer.xml:3403 msgid "Reflection probe will update reflections once and then stop." msgstr "" -#: doc/classes/RenderingServer.xml:3348 +#: doc/classes/RenderingServer.xml:3406 msgid "" "Reflection probe will update each frame. This mode is necessary to capture " "moving objects." msgstr "" -#: doc/classes/RenderingServer.xml:3351 +#: doc/classes/RenderingServer.xml:3419 msgid "Draw particles in the order that they appear in the particles array." msgstr "" -#: doc/classes/RenderingServer.xml:3354 +#: doc/classes/RenderingServer.xml:3422 msgid "Sort particles based on their lifetime." msgstr "" -#: doc/classes/RenderingServer.xml:3357 +#: doc/classes/RenderingServer.xml:3425 msgid "Sort particles based on their distance to the camera." msgstr "" -#: doc/classes/RenderingServer.xml:3360 +#: doc/classes/RenderingServer.xml:3428 msgid "Do not update the viewport." msgstr "" -#: doc/classes/RenderingServer.xml:3363 +#: doc/classes/RenderingServer.xml:3431 msgid "Update the viewport once then set to disabled." msgstr "" -#: doc/classes/RenderingServer.xml:3366 +#: doc/classes/RenderingServer.xml:3434 msgid "Update the viewport whenever it is visible." msgstr "" -#: doc/classes/RenderingServer.xml:3371 +#: doc/classes/RenderingServer.xml:3439 msgid "Always update the viewport." msgstr "" -#: doc/classes/RenderingServer.xml:3374 +#: doc/classes/RenderingServer.xml:3442 msgid "The viewport is always cleared before drawing." msgstr "" -#: doc/classes/RenderingServer.xml:3377 +#: doc/classes/RenderingServer.xml:3445 msgid "The viewport is never cleared before drawing." msgstr "" -#: doc/classes/RenderingServer.xml:3380 +#: doc/classes/RenderingServer.xml:3448 msgid "" "The viewport is cleared once, then the clear mode is set to [constant " "VIEWPORT_CLEAR_NEVER]." msgstr "" -#: doc/classes/RenderingServer.xml:3383 +#: doc/classes/RenderingServer.xml:3451 msgid "Multisample antialiasing is disabled." msgstr "" -#: doc/classes/RenderingServer.xml:3386 -msgid "Multisample antialiasing is set to 2×." -msgstr "" - -#: doc/classes/RenderingServer.xml:3389 -msgid "Multisample antialiasing is set to 4×." -msgstr "" - -#: doc/classes/RenderingServer.xml:3392 -msgid "Multisample antialiasing is set to 8×." +#: doc/classes/RenderingServer.xml:3454 +msgid "Multisample antialiasing uses 2 samples per pixel." msgstr "" -#: doc/classes/RenderingServer.xml:3395 -msgid "Multisample antialiasing is set to 16×." +#: doc/classes/RenderingServer.xml:3457 +msgid "Multisample antialiasing uses 4 samples per pixel." msgstr "" -#: doc/classes/RenderingServer.xml:3398 -msgid "" -"Multisample antialiasing is set to 2× on external texture. Special mode for " -"GLES2 Android VR (Oculus Quest and Go)." +#: doc/classes/RenderingServer.xml:3460 +msgid "Multisample antialiasing uses 8 samples per pixel." msgstr "" -#: doc/classes/RenderingServer.xml:3401 -msgid "" -"Multisample antialiasing is set to 4× on external texture. Special mode for " -"GLES2 Android VR (Oculus Quest and Go)." +#: doc/classes/RenderingServer.xml:3463 +msgid "Multisample antialiasing uses 16 samples per pixel." msgstr "" -#: doc/classes/RenderingServer.xml:3404 +#: doc/classes/RenderingServer.xml:3474 msgid "Number of objects drawn in a single frame." msgstr "" -#: doc/classes/RenderingServer.xml:3407 +#: doc/classes/RenderingServer.xml:3477 msgid "Number of vertices drawn in a single frame." msgstr "" -#: doc/classes/RenderingServer.xml:3410 +#: doc/classes/RenderingServer.xml:3480 msgid "Number of material changes during this frame." msgstr "" -#: doc/classes/RenderingServer.xml:3413 +#: doc/classes/RenderingServer.xml:3483 msgid "Number of shader changes during this frame." msgstr "" -#: doc/classes/RenderingServer.xml:3416 +#: doc/classes/RenderingServer.xml:3486 msgid "Number of surface changes during this frame." msgstr "" -#: doc/classes/RenderingServer.xml:3419 +#: doc/classes/RenderingServer.xml:3489 msgid "Number of draw calls during this frame." msgstr "" -#: doc/classes/RenderingServer.xml:3422 +#: doc/classes/RenderingServer.xml:3492 msgid "Represents the size of the [enum ViewportRenderInfo] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3425 +#: doc/classes/RenderingServer.xml:3495 msgid "Debug draw is disabled. Default setting." msgstr "" -#: doc/classes/RenderingServer.xml:3428 -msgid "Debug draw sets objects to unshaded." +#: doc/classes/RenderingServer.xml:3498 doc/classes/Viewport.xml:348 +msgid "Objects are displayed without light information." msgstr "" -#: doc/classes/RenderingServer.xml:3433 -msgid "Overwrites clear color to [code](0,0,0,0)[/code]." +#: doc/classes/RenderingServer.xml:3501 +msgid "Objects are displayed with only light information." +msgstr "" + +#: doc/classes/RenderingServer.xml:3504 doc/classes/Viewport.xml:353 +msgid "" +"Objects are displayed semi-transparent with additive blending so you can see " +"where they are drawing over top of one another. A higher overdraw means you " +"are wasting performance on drawing pixels that are being hidden behind " +"others." msgstr "" -#: doc/classes/RenderingServer.xml:3436 +#: doc/classes/RenderingServer.xml:3507 msgid "Debug draw draws objects in wireframe." msgstr "" -#: doc/classes/RenderingServer.xml:3461 +#: doc/classes/RenderingServer.xml:3510 +msgid "" +"Normal buffer is drawn instead of regular scene so you can see the per-pixel " +"normals that will be used by post-processing effects." +msgstr "" + +#: doc/classes/RenderingServer.xml:3513 doc/classes/Viewport.xml:361 +msgid "Objects are displayed with only the albedo value from [GIProbe]s." +msgstr "" + +#: doc/classes/RenderingServer.xml:3516 doc/classes/Viewport.xml:364 +msgid "Objects are displayed with only the lighting value from [GIProbe]s." +msgstr "" + +#: doc/classes/RenderingServer.xml:3519 doc/classes/Viewport.xml:367 +msgid "Objects are displayed with only the emission color from [GIProbe]s." +msgstr "" + +#: doc/classes/RenderingServer.xml:3522 doc/classes/Viewport.xml:370 +msgid "" +"Draws the shadow atlas that stores shadows from [OmniLight3D]s and " +"[SpotLight3D]s in the upper left quadrant of the [Viewport]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3525 doc/classes/Viewport.xml:373 +msgid "" +"Draws the shadow atlas that stores shadows from [DirectionalLight3D]s in the " +"upper left quadrant of the [Viewport]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3530 +msgid "" +"Draws the screen space ambient occlusion texture instead of the scene so " +"that you can clearly see how it is affecting objects. In order for this " +"display mode to work, you must have [member Environment.ssao_enabled] set in " +"your [WorldEnvironment]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3533 doc/classes/Viewport.xml:381 +msgid "" +"Draws the roughness limiter post process over the Viewport so you can see " +"where it has an effect. It must be enabled in [member ProjectSettings." +"rendering/quality/screen_filters/screen_space_roughness_limiter] to work." +msgstr "" + +#: doc/classes/RenderingServer.xml:3536 +msgid "" +"Colors each PSSM split for the [DirectionalLight3D]s in the scene a " +"different color so you can see where the splits are. In order they will be " +"colored red, green, blue, yellow." +msgstr "" + +#: doc/classes/RenderingServer.xml:3541 +msgid "" +"Uses high quality importance sampling to process the radiance map. In " +"general, this results in much higher quality than [constant Sky." +"PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be " +"used if you plan on changing the sky at runtime. If you are finding that the " +"reflection is not blurry enough and is showing sparkles or fireflies, try " +"increasing [member ProjectSettings.rendering/quality/reflections/" +"ggx_samples]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3544 +msgid "" +"Uses the fast filtering algorithm to process the radiance map. In general " +"this results in lower quality, but substantially faster run times.\n" +"[b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so " +"[member Sky.radiance_size] must be set to [constant Sky.RADIANCE_SIZE_256]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3548 msgid "Use the clear color as background." msgstr "" -#: doc/classes/RenderingServer.xml:3464 +#: doc/classes/RenderingServer.xml:3551 msgid "Use a specified color as the background." msgstr "" -#: doc/classes/RenderingServer.xml:3467 +#: doc/classes/RenderingServer.xml:3554 msgid "Use a sky resource for the background." msgstr "" -#: doc/classes/RenderingServer.xml:3470 +#: doc/classes/RenderingServer.xml:3557 msgid "" "Use a specified canvas layer as the background. This can be useful for " "instantiating a 2D scene in a 3D world." msgstr "" -#: doc/classes/RenderingServer.xml:3473 +#: doc/classes/RenderingServer.xml:3560 msgid "" "Do not clear the background, use whatever was rendered last frame as the " "background." msgstr "" -#: doc/classes/RenderingServer.xml:3479 +#: doc/classes/RenderingServer.xml:3566 msgid "Represents the size of the [enum EnvironmentBG] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3506 +#: doc/classes/RenderingServer.xml:3605 msgid "Output color as they came in." msgstr "" -#: doc/classes/RenderingServer.xml:3509 +#: doc/classes/RenderingServer.xml:3608 msgid "Use the Reinhard tonemapper." msgstr "" -#: doc/classes/RenderingServer.xml:3512 +#: doc/classes/RenderingServer.xml:3611 msgid "Use the filmic tonemapper." msgstr "" -#: doc/classes/RenderingServer.xml:3515 +#: doc/classes/RenderingServer.xml:3614 msgid "Use the ACES tonemapper." msgstr "" -#: doc/classes/RenderingServer.xml:3518 +#: doc/classes/RenderingServer.xml:3625 msgid "Disables the blur set for SSAO. Will make SSAO look noisier." msgstr "" -#: doc/classes/RenderingServer.xml:3521 +#: doc/classes/RenderingServer.xml:3628 msgid "Perform a 1x1 blur on the SSAO output." msgstr "" -#: doc/classes/RenderingServer.xml:3524 +#: doc/classes/RenderingServer.xml:3631 msgid "Performs a 2x2 blur on the SSAO output." msgstr "" -#: doc/classes/RenderingServer.xml:3527 +#: doc/classes/RenderingServer.xml:3634 msgid "Performs a 3x3 blur on the SSAO output. Use this for smoothest SSAO." msgstr "" -#: doc/classes/RenderingServer.xml:3530 +#: doc/classes/RenderingServer.xml:3637 msgid "Lowest quality of screen space ambient occlusion." msgstr "" -#: doc/classes/RenderingServer.xml:3533 +#: doc/classes/RenderingServer.xml:3640 msgid "Medium quality screen space ambient occlusion." msgstr "" -#: doc/classes/RenderingServer.xml:3536 +#: doc/classes/RenderingServer.xml:3643 +msgid "High quality screen space ambient occlusion." +msgstr "" + +#: doc/classes/RenderingServer.xml:3646 msgid "Highest quality screen space ambient occlusion." msgstr "" -#: doc/classes/RenderingServer.xml:3555 +#: doc/classes/RenderingServer.xml:3657 +msgid "" +"Lowest quality DOF blur. This is the fastest setting, but you may be able to " +"see filtering artifacts." +msgstr "" + +#: doc/classes/RenderingServer.xml:3660 +msgid "Low quality DOF blur." +msgstr "" + +#: doc/classes/RenderingServer.xml:3663 +msgid "Medium quality DOF blur." +msgstr "" + +#: doc/classes/RenderingServer.xml:3666 +msgid "" +"Highest quality DOF blur. Results in the smoothest looking blur by taking " +"the most samples, but is also significantly slower." +msgstr "" + +#: doc/classes/RenderingServer.xml:3669 +msgid "" +"Calculate the DOF blur using a box filter. The fastest option, but results " +"in obvious lines in blur pattern." +msgstr "" + +#: doc/classes/RenderingServer.xml:3672 +msgid "Calculates DOF blur using a hexagon shaped filter." +msgstr "" + +#: doc/classes/RenderingServer.xml:3675 +msgid "" +"Calculates DOF blur using a circle shaped filter. Best quality and most " +"realistic, but slowest. Use only for areas where a lot of performance can be " +"dedicated to post-processing (e.g. cutscenes)." +msgstr "" + +#: doc/classes/RenderingServer.xml:3690 msgid "Do not use a debug mode." msgstr "" -#: doc/classes/RenderingServer.xml:3558 +#: doc/classes/RenderingServer.xml:3693 msgid "Draw all objects as wireframe models." msgstr "" -#: doc/classes/RenderingServer.xml:3561 +#: doc/classes/RenderingServer.xml:3696 msgid "" "Draw all objects in a way that displays how much overdraw is occurring. " "Overdraw occurs when a section of pixels is drawn and shaded and then " "another object covers it up. To optimize a scene, you should reduce overdraw." msgstr "" -#: doc/classes/RenderingServer.xml:3564 +#: doc/classes/RenderingServer.xml:3699 msgid "" "Draw all objects without shading. Equivalent to setting all objects shaders " "to [code]unshaded[/code]." msgstr "" -#: doc/classes/RenderingServer.xml:3567 +#: doc/classes/RenderingServer.xml:3702 msgid "The instance does not have a type." msgstr "" -#: doc/classes/RenderingServer.xml:3570 +#: doc/classes/RenderingServer.xml:3705 msgid "The instance is a mesh." msgstr "" -#: doc/classes/RenderingServer.xml:3573 +#: doc/classes/RenderingServer.xml:3708 msgid "The instance is a multimesh." msgstr "" -#: doc/classes/RenderingServer.xml:3576 +#: doc/classes/RenderingServer.xml:3711 msgid "The instance is an immediate geometry." msgstr "" -#: doc/classes/RenderingServer.xml:3579 +#: doc/classes/RenderingServer.xml:3714 msgid "The instance is a particle emitter." msgstr "" -#: doc/classes/RenderingServer.xml:3582 +#: doc/classes/RenderingServer.xml:3717 msgid "The instance is a light." msgstr "" -#: doc/classes/RenderingServer.xml:3585 +#: doc/classes/RenderingServer.xml:3720 msgid "The instance is a reflection probe." msgstr "" -#: doc/classes/RenderingServer.xml:3588 +#: doc/classes/RenderingServer.xml:3723 +msgid "The instance is a decal." +msgstr "" + +#: doc/classes/RenderingServer.xml:3726 msgid "The instance is a GI probe." msgstr "" -#: doc/classes/RenderingServer.xml:3591 +#: doc/classes/RenderingServer.xml:3729 msgid "The instance is a lightmap capture." msgstr "" -#: doc/classes/RenderingServer.xml:3594 +#: doc/classes/RenderingServer.xml:3732 msgid "Represents the size of the [enum InstanceType] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3597 +#: doc/classes/RenderingServer.xml:3735 msgid "" "A combination of the flags of geometry instances (mesh, multimesh, immediate " "and particles)." msgstr "" -#: doc/classes/RenderingServer.xml:3600 +#: doc/classes/RenderingServer.xml:3738 msgid "Allows the instance to be used in baked lighting." msgstr "" -#: doc/classes/RenderingServer.xml:3605 +#: doc/classes/RenderingServer.xml:3741 +msgid "Allows the instance to be used with dynamic global illumination." +msgstr "" + +#: doc/classes/RenderingServer.xml:3744 msgid "When set, manually requests to draw geometry on next frame." msgstr "" -#: doc/classes/RenderingServer.xml:3608 +#: doc/classes/RenderingServer.xml:3747 msgid "Represents the size of the [enum InstanceFlags] enum." msgstr "" -#: doc/classes/RenderingServer.xml:3611 +#: doc/classes/RenderingServer.xml:3750 msgid "Disable shadows from this instance." msgstr "" -#: doc/classes/RenderingServer.xml:3614 +#: doc/classes/RenderingServer.xml:3753 msgid "Cast shadows from this instance." msgstr "" -#: doc/classes/RenderingServer.xml:3617 +#: doc/classes/RenderingServer.xml:3756 msgid "" "Disable backface culling when rendering the shadow of the object. This is " "slightly slower but may result in more correct shadows." msgstr "" -#: doc/classes/RenderingServer.xml:3620 +#: doc/classes/RenderingServer.xml:3759 msgid "" "Only render the shadows from the object. The object itself will not be drawn." msgstr "" -#: doc/classes/RenderingServer.xml:3623 +#: doc/classes/RenderingServer.xml:3762 msgid "The nine patch gets stretched where needed." msgstr "" -#: doc/classes/RenderingServer.xml:3626 +#: doc/classes/RenderingServer.xml:3765 msgid "The nine patch gets filled with tiles where needed." msgstr "" -#: doc/classes/RenderingServer.xml:3629 +#: doc/classes/RenderingServer.xml:3768 msgid "" "The nine patch gets filled with tiles where needed and stretches them a bit " "if needed." msgstr "" -#: doc/classes/RenderingServer.xml:3658 +#: doc/classes/RenderingServer.xml:3771 +msgid "Uses the default filter mode for this [Viewport]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3783 doc/classes/Viewport.xml:399 +msgid "" +"The texture filter blends between the nearest 4 pixels and between the " +"nearest 2 mipmaps." +msgstr "" + +#: doc/classes/RenderingServer.xml:3792 +msgid "Max value for [enum CanvasItemTextureFilter] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3795 +msgid "Uses the default repeat mode for this [Viewport]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3798 doc/classes/Viewport.xml:405 +msgid "" +"Disables textures repeating. Instead, when reading UVs outside the 0-1 " +"range, the value will be clamped to the edge of the texture, resulting in a " +"stretched out look at the borders of the texture." +msgstr "" + +#: doc/classes/RenderingServer.xml:3804 doc/classes/Viewport.xml:411 +msgid "" +"Flip the texture when repeating so that the edge lines up instead of " +"abruptly changing." +msgstr "" + +#: doc/classes/RenderingServer.xml:3807 +msgid "Max value for [enum CanvasItemTextureRepeat] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3810 msgid "Adds light color additive to the canvas." msgstr "" -#: doc/classes/RenderingServer.xml:3661 +#: doc/classes/RenderingServer.xml:3813 msgid "Adds light color subtractive to the canvas." msgstr "" -#: doc/classes/RenderingServer.xml:3664 +#: doc/classes/RenderingServer.xml:3816 msgid "The light adds color depending on transparency." msgstr "" -#: doc/classes/RenderingServer.xml:3667 +#: doc/classes/RenderingServer.xml:3819 msgid "The light adds color depending on mask." msgstr "" -#: doc/classes/RenderingServer.xml:3670 +#: doc/classes/RenderingServer.xml:3822 msgid "Do not apply a filter to canvas light shadows." msgstr "" -#: doc/classes/RenderingServer.xml:3673 +#: doc/classes/RenderingServer.xml:3825 msgid "Use PCF5 filtering to filter canvas light shadows." msgstr "" -#: doc/classes/RenderingServer.xml:3676 +#: doc/classes/RenderingServer.xml:3828 msgid "Use PCF13 filtering to filter canvas light shadows." msgstr "" -#: doc/classes/RenderingServer.xml:3681 +#: doc/classes/RenderingServer.xml:3831 +msgid "Max value of the [enum CanvasLightShadowFilter] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3834 msgid "Culling of the canvas occluder is disabled." msgstr "" -#: doc/classes/RenderingServer.xml:3684 +#: doc/classes/RenderingServer.xml:3837 msgid "Culling of the canvas occluder is clockwise." msgstr "" -#: doc/classes/RenderingServer.xml:3687 +#: doc/classes/RenderingServer.xml:3840 msgid "Culling of the canvas occluder is counterclockwise." msgstr "" -#: doc/classes/RenderingServer.xml:3690 +#: doc/classes/RenderingServer.xml:3901 msgid "The amount of objects in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3693 +#: doc/classes/RenderingServer.xml:3904 msgid "The amount of vertices in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3696 +#: doc/classes/RenderingServer.xml:3907 msgid "The amount of modified materials in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3699 +#: doc/classes/RenderingServer.xml:3910 msgid "The amount of shader rebinds in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3702 +#: doc/classes/RenderingServer.xml:3913 msgid "The amount of surface changes in the frame." msgstr "" -#: doc/classes/RenderingServer.xml:3705 +#: doc/classes/RenderingServer.xml:3916 msgid "The amount of draw calls in frame." msgstr "" -#: doc/classes/RenderingServer.xml:3720 +#: doc/classes/RenderingServer.xml:3931 msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x." msgstr "" -#: doc/classes/RenderingServer.xml:3723 +#: doc/classes/RenderingServer.xml:3934 msgid "" "Hardware supports multithreading. This enum is currently unused in Godot 3.x." msgstr "" @@ -44091,15 +44366,11 @@ msgid "" "Physics > 2d[/b]." msgstr "" -#: doc/classes/RigidBody2D.xml:158 doc/classes/RigidBody3D.xml:174 -msgid "The body's mass." -msgstr "" - #: doc/classes/RigidBody2D.xml:161 msgid "The body's mode. See [enum Mode] for possible values." msgstr "" -#: doc/classes/RigidBody2D.xml:164 doc/classes/RigidBody3D.xml:180 +#: doc/classes/RigidBody2D.xml:164 doc/classes/RigidBody3D.xml:181 #: doc/classes/StaticBody2D.xml:22 doc/classes/StaticBody3D.xml:22 msgid "" "The physics material override for the body.\n" @@ -44228,22 +44499,32 @@ msgid "" "for a body." msgstr "" +#: doc/classes/RigidBody3D.xml:31 +msgid "" +"Adds a constant directional force (i.e. acceleration) without affecting " +"rotation.\n" +"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." +msgstr "" + #: doc/classes/RigidBody3D.xml:43 -msgid "Adds a constant force (i.e. acceleration)." +msgid "" +"Adds a constant directional force (i.e. acceleration).\n" +"The position uses the rotation of the global coordinate system, but is " +"centered at the object's origin." msgstr "" -#: doc/classes/RigidBody3D.xml:52 +#: doc/classes/RigidBody3D.xml:53 msgid "" "Adds a constant rotational force (i.e. a motor) without affecting position." msgstr "" -#: doc/classes/RigidBody3D.xml:61 +#: doc/classes/RigidBody3D.xml:62 msgid "" "Applies a directional impulse without affecting rotation.\n" "This is equivalent to [code]apply_impulse(Vector3(0,0,0), impulse)[/code]." msgstr "" -#: doc/classes/RigidBody3D.xml:73 +#: doc/classes/RigidBody3D.xml:74 msgid "" "Applies a positioned impulse to the body. An impulse is time independent! " "Applying an impulse every frame would result in a framerate-dependent force. " @@ -44252,19 +44533,19 @@ msgid "" "at the object's origin." msgstr "" -#: doc/classes/RigidBody3D.xml:82 +#: doc/classes/RigidBody3D.xml:83 msgid "" "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." msgstr "" -#: doc/classes/RigidBody3D.xml:91 +#: doc/classes/RigidBody3D.xml:92 msgid "" "Returns [code]true[/code] if the specified linear or rotational axis is " "locked." msgstr "" -#: doc/classes/RigidBody3D.xml:98 +#: doc/classes/RigidBody3D.xml:99 msgid "" "Returns a list of the bodies colliding with this one. By default, number of " "max contacts reported is at 0, see the [member contacts_reported] property " @@ -44274,64 +44555,32 @@ msgid "" "physics step. Consider using signals instead." msgstr "" -#: doc/classes/RigidBody3D.xml:110 +#: doc/classes/RigidBody3D.xml:111 msgid "Locks the specified linear or rotational axis." msgstr "" -#: doc/classes/RigidBody3D.xml:125 +#: doc/classes/RigidBody3D.xml:126 msgid "Damps RigidBody3D's rotational forces." msgstr "" -#: doc/classes/RigidBody3D.xml:128 +#: doc/classes/RigidBody3D.xml:129 msgid "RigidBody3D's rotational velocity." msgstr "" -#: doc/classes/RigidBody3D.xml:131 -msgid "Lock the body's rotation in the X axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:134 -msgid "Lock the body's rotation in the Y axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:137 -msgid "Lock the body's rotation in the Z axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:140 -msgid "Lock the body's movement in the X axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:143 -msgid "Lock the body's movement in the Y axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:146 -msgid "Lock the body's movement in the Z axis." -msgstr "" - -#: doc/classes/RigidBody3D.xml:149 -msgid "" -"If [code]true[/code], the RigidBody3D will not calculate forces and will act " -"as a static body while there is no movement. It will wake up when forces are " -"applied through other collisions or when the [code]apply_impulse[/code] " -"method is used." -msgstr "" - -#: doc/classes/RigidBody3D.xml:152 +#: doc/classes/RigidBody3D.xml:153 msgid "" "If [code]true[/code], the RigidBody3D will emit signals when it collides " "with another RigidBody3D." msgstr "" -#: doc/classes/RigidBody3D.xml:155 +#: doc/classes/RigidBody3D.xml:156 msgid "" "The maximum contacts to report. Bodies can keep a log of the contacts with " "other bodies, this is enabled by setting the maximum amount of contacts " "reported to a number greater than 0." msgstr "" -#: doc/classes/RigidBody3D.xml:158 +#: doc/classes/RigidBody3D.xml:159 msgid "" "If [code]true[/code], continuous collision detection is used.\n" "Continuous collision detection tries to predict where a moving body will " @@ -44341,7 +44590,7 @@ msgid "" "faster to compute, but can miss small, fast-moving objects." msgstr "" -#: doc/classes/RigidBody3D.xml:162 +#: doc/classes/RigidBody3D.xml:163 msgid "" "If [code]true[/code], internal force integration will be disabled (like " "gravity or air friction) for this body. Other than collision response, the " @@ -44349,7 +44598,7 @@ msgid "" "function, if defined." msgstr "" -#: doc/classes/RigidBody3D.xml:165 +#: doc/classes/RigidBody3D.xml:166 msgid "" "This is multiplied by the global 3D gravity setting found in [b]Project > " "Project Settings > Physics > 3d[/b] to produce RigidBody3D's gravity. For " @@ -44357,14 +44606,14 @@ msgid "" "and 0.5 will apply half gravity to this object." msgstr "" -#: doc/classes/RigidBody3D.xml:168 +#: doc/classes/RigidBody3D.xml:169 msgid "" "The body's linear damp. Cannot be less than -1.0. If this value is different " "from -1.0, any linear damp derived from the world or areas will be " "overridden." msgstr "" -#: doc/classes/RigidBody3D.xml:171 +#: doc/classes/RigidBody3D.xml:172 msgid "" "The body's linear velocity. Can be used sporadically, but [b]don't set this " "every frame[/b], because physics may run in another thread and runs at a " @@ -44372,35 +44621,29 @@ msgid "" "for precise control of the body state." msgstr "" -#: doc/classes/RigidBody3D.xml:177 +#: doc/classes/RigidBody3D.xml:178 msgid "The body mode. See [enum Mode] for possible values." msgstr "" -#: doc/classes/RigidBody3D.xml:184 +#: doc/classes/RigidBody3D.xml:185 msgid "" "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." msgstr "" -#: doc/classes/RigidBody3D.xml:187 -msgid "" -"The body's weight based on its mass and the global 3D gravity. Global values " -"are set in [b]Project > Project Settings > Physics > 3d[/b]." -msgstr "" - -#: doc/classes/RigidBody3D.xml:195 +#: doc/classes/RigidBody3D.xml:196 msgid "" "Emitted when a body enters into contact with this one. Contact monitor and " "contacts reported must be enabled for this to work." msgstr "" -#: doc/classes/RigidBody3D.xml:202 +#: doc/classes/RigidBody3D.xml:203 msgid "" "Emitted when a body shape exits contact with this one. Contact monitor and " "contacts reported must be enabled for this to work." msgstr "" -#: doc/classes/RigidBody3D.xml:215 +#: doc/classes/RigidBody3D.xml:216 msgid "" "Emitted when a body enters into contact with this one. Contact monitor and " "contacts reported must be enabled for this to work.\n" @@ -44410,7 +44653,7 @@ msgid "" "([code]local_shape[/code]) the other body collided with." msgstr "" -#: doc/classes/RigidBody3D.xml:229 +#: doc/classes/RigidBody3D.xml:230 msgid "" "Emitted when a body shape exits contact with this one. Contact monitor and " "contacts reported must be enabled for this to work.\n" @@ -44420,30 +44663,30 @@ msgid "" "([code]local_shape[/code]) the other body stopped colliding with." msgstr "" -#: doc/classes/RigidBody3D.xml:235 +#: doc/classes/RigidBody3D.xml:236 msgid "" "Emitted when the body changes its sleeping state. Either by sleeping or " "waking up." msgstr "" -#: doc/classes/RigidBody3D.xml:241 +#: doc/classes/RigidBody3D.xml:242 msgid "" "Rigid body mode. This is the \"natural\" state of a rigid body. It is " "affected by forces, and can move, rotate, and be affected by user code." msgstr "" -#: doc/classes/RigidBody3D.xml:244 +#: doc/classes/RigidBody3D.xml:245 msgid "" "Static mode. The body behaves like a [StaticBody3D], and can only move by " "user code." msgstr "" -#: doc/classes/RigidBody3D.xml:247 +#: doc/classes/RigidBody3D.xml:248 msgid "" "Character body mode. This behaves like a rigid body, but can not rotate." msgstr "" -#: doc/classes/RigidBody3D.xml:250 +#: doc/classes/RigidBody3D.xml:251 msgid "" "Kinematic body mode. The body behaves like a [KinematicBody3D], and can only " "move by user code." @@ -45067,27 +45310,33 @@ msgstr "" msgid "Godot editor's script editor." msgstr "" -#: doc/classes/ScriptEditor.xml:39 +#: doc/classes/ScriptEditor.xml:7 +msgid "" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_script_editor]." +msgstr "" + +#: doc/classes/ScriptEditor.xml:40 msgid "Returns a [Script] that is currently active in editor." msgstr "" -#: doc/classes/ScriptEditor.xml:56 +#: doc/classes/ScriptEditor.xml:57 msgid "" "Returns an array with all [Script] objects which are currently open in " "editor." msgstr "" -#: doc/classes/ScriptEditor.xml:65 +#: doc/classes/ScriptEditor.xml:66 msgid "Goes to the specified line in the current script." msgstr "" -#: doc/classes/ScriptEditor.xml:84 +#: doc/classes/ScriptEditor.xml:85 msgid "" "Emitted when user changed active script. Argument is a freshly activated " "[Script]." msgstr "" -#: doc/classes/ScriptEditor.xml:91 +#: doc/classes/ScriptEditor.xml:92 msgid "" "Emitted when editor is about to close the active script. Argument is a " "[Script] that is going to be closed." @@ -45149,7 +45398,7 @@ msgid "" "visible." msgstr "" -#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:441 +#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:442 msgid "The current horizontal scroll value." msgstr "" @@ -45157,7 +45406,7 @@ msgstr "" msgid "If [code]true[/code], enables horizontal scrolling." msgstr "" -#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:444 +#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:445 msgid "The current vertical scroll value." msgstr "" @@ -45687,7 +45936,10 @@ msgid "" "Uses high quality importance sampling to process the radiance map. In " "general, this results in much higher quality than [constant " "PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be " -"used if you plan on changing the sky at runtime." +"used if you plan on changing the sky at runtime. If you are finding that the " +"reflection is not blurry enough and is showing sparkles or fireflies, try " +"increasing [member ProjectSettings.rendering/quality/reflections/" +"ggx_samples]." msgstr "" #: doc/classes/Sky.xml:55 @@ -47881,65 +48133,65 @@ msgid "" msgstr "" #: doc/classes/SubViewport.xml:13 -msgid "If [code]true[/code], the sub-viewport will be used in AR/VR process." -msgstr "" - -#: doc/classes/SubViewport.xml:16 msgid "The clear mode when the sub-viewport is used as a render target." msgstr "" -#: doc/classes/SubViewport.xml:19 +#: doc/classes/SubViewport.xml:16 msgid "The update mode when the sub-viewport is used as a render target." msgstr "" -#: doc/classes/SubViewport.xml:22 +#: doc/classes/SubViewport.xml:19 msgid "The width and height of the sub-viewport." msgstr "" -#: doc/classes/SubViewport.xml:25 +#: doc/classes/SubViewport.xml:22 msgid "" "The 2D size override of the sub-viewport. If either the width or height is " "[code]0[/code], the override is disabled." msgstr "" -#: doc/classes/SubViewport.xml:28 +#: doc/classes/SubViewport.xml:25 msgid "If [code]true[/code], the 2D size override affects stretch as well." msgstr "" +#: doc/classes/SubViewport.xml:28 +msgid "If [code]true[/code], the sub-viewport will be used in AR/VR process." +msgstr "" + #: doc/classes/SubViewport.xml:33 -msgid "Do not update the render target." +msgid "Always clear the render target before drawing." msgstr "" #: doc/classes/SubViewport.xml:36 -msgid "" -"Update the render target once, then switch to [constant UPDATE_DISABLED]." +msgid "Never clear the render target." msgstr "" #: doc/classes/SubViewport.xml:39 msgid "" -"Update the render target only when it is visible. This is the default value." +"Clear the render target next frame, then switch to [constant " +"CLEAR_MODE_NEVER]." msgstr "" #: doc/classes/SubViewport.xml:42 -msgid "Update the render target only when the its parent is visible." +msgid "Do not update the render target." msgstr "" #: doc/classes/SubViewport.xml:45 -msgid "Always update the render target." +msgid "" +"Update the render target once, then switch to [constant UPDATE_DISABLED]." msgstr "" #: doc/classes/SubViewport.xml:48 -msgid "Always clear the render target before drawing." +msgid "" +"Update the render target only when it is visible. This is the default value." msgstr "" #: doc/classes/SubViewport.xml:51 -msgid "Never clear the render target." +msgid "Update the render target only when the its parent is visible." msgstr "" #: doc/classes/SubViewport.xml:54 -msgid "" -"Clear the render target next frame, then switch to [constant " -"CLEAR_MODE_NEVER]." +msgid "Always update the render target." msgstr "" #: doc/classes/SubViewportContainer.xml:4 @@ -47994,85 +48246,90 @@ msgid "" "information to a mesh.\n" "Additionally, the attributes used before the first vertex is added determine " "the format of the mesh. For example, if you only add UVs to the first " -"vertex, you cannot add color to any of the subsequent vertices." +"vertex, you cannot add color to any of the subsequent vertices.\n" +"See also [ArrayMesh], [ImmediateGeometry3D] and [MeshDataTool] for " +"procedural geometry generation.\n" +"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" +"OpenGL/Face-culling]winding order[/url] for front faces of triangle " +"primitive modes." msgstr "" -#: doc/classes/SurfaceTool.xml:28 +#: doc/classes/SurfaceTool.xml:30 msgid "" "Adds an array of bones for the next vertex to use. [code]bones[/code] must " "contain 4 integers." msgstr "" -#: doc/classes/SurfaceTool.xml:37 +#: doc/classes/SurfaceTool.xml:39 msgid "Specifies a [Color] for the next vertex to use." msgstr "" -#: doc/classes/SurfaceTool.xml:46 +#: doc/classes/SurfaceTool.xml:48 msgid "" "Adds an index to index array if you are using indexed vertices. Does not " "need to be called before adding vertices." msgstr "" -#: doc/classes/SurfaceTool.xml:55 +#: doc/classes/SurfaceTool.xml:57 msgid "Specifies a normal for the next vertex to use." msgstr "" -#: doc/classes/SurfaceTool.xml:64 +#: doc/classes/SurfaceTool.xml:66 msgid "" "Specifies whether the current vertex (if using only vertex arrays) or " "current index (if also using index arrays) should use smooth normals for " "normal calculation." msgstr "" -#: doc/classes/SurfaceTool.xml:73 +#: doc/classes/SurfaceTool.xml:75 msgid "Specifies a tangent for the next vertex to use." msgstr "" -#: doc/classes/SurfaceTool.xml:92 +#: doc/classes/SurfaceTool.xml:94 msgid "" "Inserts a triangle fan made of array data into [Mesh] being constructed.\n" "Requires the primitive type be set to [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" -#: doc/classes/SurfaceTool.xml:102 +#: doc/classes/SurfaceTool.xml:104 msgid "Specifies a set of UV coordinates to use for the next vertex." msgstr "" -#: doc/classes/SurfaceTool.xml:111 +#: doc/classes/SurfaceTool.xml:113 msgid "" "Specifies an optional second set of UV coordinates to use for the next " "vertex." msgstr "" -#: doc/classes/SurfaceTool.xml:120 +#: doc/classes/SurfaceTool.xml:122 msgid "" "Specifies the position of current vertex. Should be called after specifying " "other vertex properties (e.g. Color, UV)." msgstr "" -#: doc/classes/SurfaceTool.xml:129 +#: doc/classes/SurfaceTool.xml:131 msgid "" "Specifies weight values for next vertex to use. [code]weights[/code] must " "contain 4 values." msgstr "" -#: doc/classes/SurfaceTool.xml:142 +#: doc/classes/SurfaceTool.xml:144 msgid "" "Append vertices from a given [Mesh] surface onto the current vertex array " "with specified [Transform]." msgstr "" -#: doc/classes/SurfaceTool.xml:151 +#: doc/classes/SurfaceTool.xml:153 msgid "" "Called before adding any vertices. Takes the primitive type as an argument " "(e.g. [constant Mesh.PRIMITIVE_TRIANGLES])." msgstr "" -#: doc/classes/SurfaceTool.xml:158 +#: doc/classes/SurfaceTool.xml:160 msgid "Clear all information passed into the surface tool so far." msgstr "" -#: doc/classes/SurfaceTool.xml:169 +#: doc/classes/SurfaceTool.xml:171 msgid "" "Returns a constructed [ArrayMesh] from current information passed in. If an " "existing [ArrayMesh] is passed in as an argument, will add an extra surface " @@ -48082,28 +48339,28 @@ msgid "" "flags." msgstr "" -#: doc/classes/SurfaceTool.xml:177 +#: doc/classes/SurfaceTool.xml:179 msgid "" "Commits the data to the same format used by [method ArrayMesh." "add_surface_from_arrays]. This way you can further process the mesh data " "using the [ArrayMesh] API." msgstr "" -#: doc/classes/SurfaceTool.xml:188 +#: doc/classes/SurfaceTool.xml:190 msgid "Creates a vertex array from an existing [Mesh]." msgstr "" -#: doc/classes/SurfaceTool.xml:201 +#: doc/classes/SurfaceTool.xml:203 msgid "" "Creates a vertex array from the specified blend shape of an existing [Mesh]. " "This can be used to extract a specific pose from a blend shape." msgstr "" -#: doc/classes/SurfaceTool.xml:208 +#: doc/classes/SurfaceTool.xml:210 msgid "Removes the index array by expanding the vertex array." msgstr "" -#: doc/classes/SurfaceTool.xml:217 +#: doc/classes/SurfaceTool.xml:219 msgid "" "Generates normals from vertices so you do not have to do it manually. If " "[code]flip[/code] is [code]true[/code], the resulting normals will be " @@ -48111,19 +48368,19 @@ msgid "" "Requires the primitive type to be set to [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" -#: doc/classes/SurfaceTool.xml:225 +#: doc/classes/SurfaceTool.xml:227 msgid "" "Generates a tangent vector for each vertex. Requires that each vertex have " "UVs and normals set already." msgstr "" -#: doc/classes/SurfaceTool.xml:232 +#: doc/classes/SurfaceTool.xml:234 msgid "" "Shrinks the vertex array by creating an index array (avoids reusing " "vertices)." msgstr "" -#: doc/classes/SurfaceTool.xml:241 +#: doc/classes/SurfaceTool.xml:243 msgid "Sets [Material] to be used by the [Mesh] you are constructing." msgstr "" @@ -48157,7 +48414,7 @@ msgid "Returns the previously active tab index." msgstr "" #: doc/classes/TabContainer.xml:42 -msgid "Returns the currently visible tab's [Control] node." +msgid "Returns the [Control] node from the tab at index [code]tab_idx[/code]." msgstr "" #: doc/classes/TabContainer.xml:49 doc/classes/Tabs.xml:50 @@ -48826,151 +49083,163 @@ msgstr "" msgid "If [code]true[/code], the line containing the cursor is highlighted." msgstr "" -#: doc/classes/TextEdit.xml:438 +#: doc/classes/TextEdit.xml:436 +msgid "" +"If [code]true[/code], custom [code]font_color_selected[/code] will be used " +"for selected text." +msgstr "" + +#: doc/classes/TextEdit.xml:439 msgid "" "If [code]true[/code], read-only mode is enabled. Existing text cannot be " "modified and new text cannot be added." msgstr "" -#: doc/classes/TextEdit.xml:451 +#: doc/classes/TextEdit.xml:452 msgid "" "If [code]true[/code], line numbers are displayed to the left of the text." msgstr "" -#: doc/classes/TextEdit.xml:454 +#: doc/classes/TextEdit.xml:455 msgid "" "If [code]true[/code], sets the [code]step[/code] of the scrollbars to " "[code]0.25[/code] which results in smoother scrolling." msgstr "" -#: doc/classes/TextEdit.xml:457 +#: doc/classes/TextEdit.xml:458 msgid "" "If [code]true[/code], any custom color properties that have been set for " "this [TextEdit] will be visible." msgstr "" -#: doc/classes/TextEdit.xml:460 +#: doc/classes/TextEdit.xml:461 msgid "String value of the [TextEdit]." msgstr "" -#: doc/classes/TextEdit.xml:463 +#: doc/classes/TextEdit.xml:464 msgid "Vertical scroll sensitivity." msgstr "" -#: doc/classes/TextEdit.xml:466 +#: doc/classes/TextEdit.xml:467 msgid "" "If [code]true[/code], enables text wrapping when it goes beyond the edge of " "what is visible." msgstr "" -#: doc/classes/TextEdit.xml:474 +#: doc/classes/TextEdit.xml:475 msgid "Emitted when a breakpoint is placed via the breakpoint gutter." msgstr "" -#: doc/classes/TextEdit.xml:479 +#: doc/classes/TextEdit.xml:480 msgid "Emitted when the cursor changes." msgstr "" -#: doc/classes/TextEdit.xml:488 +#: doc/classes/TextEdit.xml:489 msgid "Emitted when the info icon is clicked." msgstr "" -#: doc/classes/TextEdit.xml:519 +#: doc/classes/TextEdit.xml:520 msgid "Match case when searching." msgstr "" -#: doc/classes/TextEdit.xml:522 +#: doc/classes/TextEdit.xml:523 msgid "Match whole words when searching." msgstr "" -#: doc/classes/TextEdit.xml:525 +#: doc/classes/TextEdit.xml:526 msgid "Search from end to beginning." msgstr "" -#: doc/classes/TextEdit.xml:528 +#: doc/classes/TextEdit.xml:529 msgid "Used to access the result column from [method search]." msgstr "" -#: doc/classes/TextEdit.xml:531 +#: doc/classes/TextEdit.xml:532 msgid "Used to access the result line from [method search]." msgstr "" -#: doc/classes/TextEdit.xml:540 +#: doc/classes/TextEdit.xml:541 msgid "" "Pastes the clipboard text over the selected text (or at the cursor's " "position)." msgstr "" -#: doc/classes/TextEdit.xml:543 +#: doc/classes/TextEdit.xml:544 msgid "Erases the whole [TextEdit] text." msgstr "" -#: doc/classes/TextEdit.xml:546 +#: doc/classes/TextEdit.xml:547 msgid "Selects the whole [TextEdit] text." msgstr "" -#: doc/classes/TextEdit.xml:552 +#: doc/classes/TextEdit.xml:553 msgid "Redoes the previous action." msgstr "" -#: doc/classes/TextEdit.xml:560 +#: doc/classes/TextEdit.xml:561 msgid "" "Sets the background [Color] of this [TextEdit]. [member syntax_highlighting] " "has to be enabled." msgstr "" -#: doc/classes/TextEdit.xml:563 +#: doc/classes/TextEdit.xml:564 msgid "" "Sets the [Color] of the bookmark marker. [member syntax_highlighting] has to " "be enabled." msgstr "" -#: doc/classes/TextEdit.xml:568 doc/classes/TextEdit.xml:595 +#: doc/classes/TextEdit.xml:569 doc/classes/TextEdit.xml:596 msgid "" "Sets the [Color] of the breakpoints. [member breakpoint_gutter] has to be " "enabled." msgstr "" -#: doc/classes/TextEdit.xml:606 +#: doc/classes/TextEdit.xml:607 msgid "Sets the default [Font]." msgstr "" -#: doc/classes/TextEdit.xml:609 +#: doc/classes/TextEdit.xml:610 msgid "Sets the font [Color]." msgstr "" -#: doc/classes/TextEdit.xml:618 +#: doc/classes/TextEdit.xml:615 +msgid "" +"Sets the [Color] of the selected text. [member override_selected_font_color] " +"has to be enabled." +msgstr "" + +#: doc/classes/TextEdit.xml:620 msgid "" "Sets the [Color] of the line numbers. [member show_line_numbers] has to be " "enabled." msgstr "" -#: doc/classes/TextEdit.xml:621 +#: doc/classes/TextEdit.xml:623 msgid "Sets the spacing between the lines." msgstr "" -#: doc/classes/TextEdit.xml:624 +#: doc/classes/TextEdit.xml:626 msgid "Sets the [Color] of marked text." msgstr "" -#: doc/classes/TextEdit.xml:629 +#: doc/classes/TextEdit.xml:631 msgid "Sets the [StyleBox] of this [TextEdit]." msgstr "" -#: doc/classes/TextEdit.xml:634 +#: doc/classes/TextEdit.xml:636 msgid "" "Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled." msgstr "" -#: doc/classes/TextEdit.xml:639 +#: doc/classes/TextEdit.xml:641 msgid "Sets the highlight [Color] of text selections." msgstr "" -#: doc/classes/TextEdit.xml:646 +#: doc/classes/TextEdit.xml:648 msgid "Sets a custom [Texture2D] for tab text characters." msgstr "" -#: doc/classes/TextEdit.xml:649 +#: doc/classes/TextEdit.xml:651 msgid "" "Sets the highlight [Color] of multiple occurrences. [member " "highlight_all_occurrences] has to be enabled." @@ -49642,8 +49911,8 @@ msgstr "" #: doc/classes/TileMap.xml:46 msgid "" -"Returns the coordinate of the autotile variation in the tileset. Returns a " -"zero vector if the cell doesn't have autotiling." +"Returns the coordinate (subtile column and row) of the autotile variation in " +"the tileset. Returns a zero vector if the cell doesn't have autotiling." msgstr "" #: doc/classes/TileMap.xml:55 @@ -49700,7 +49969,8 @@ msgid "" "Sets the tile index for the cell given by a Vector2.\n" "An index of [code]-1[/code] clears the cell.\n" "Optionally, the tile can also be flipped, transposed, or given autotile " -"coordinates.\n" +"coordinates. The autotile coordinate refers to the column and row of the " +"subtile.\n" "[b]Note:[/b] Data such as navigation polygons and collision shapes are not " "immediately updated for performance reasons.\n" "If you need these to be immediately updated, you can call [method " @@ -50507,9 +50777,10 @@ msgid "" "using matrix multiplication. The axis must be a normalized vector." msgstr "" -#: doc/classes/Transform.xml:138 doc/classes/Transform2D.xml:140 +#: doc/classes/Transform.xml:138 msgid "" -"Scales the transform by the given scale factor, using matrix multiplication." +"Scales basis and origin of the transform by the given scale factor, using " +"matrix multiplication." msgstr "" #: doc/classes/Transform.xml:147 doc/classes/Transform2D.xml:149 @@ -50619,6 +50890,11 @@ msgid "" "multiplication." msgstr "" +#: doc/classes/Transform2D.xml:140 +msgid "" +"Scales the transform by the given scale factor, using matrix multiplication." +msgstr "" + #: doc/classes/Transform2D.xml:159 msgid "" "Transforms the given [Vector2], [Rect2], or [PackedVector2Array] by this " @@ -50776,7 +51052,8 @@ msgid "" "[/codeblock]\n" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " -"through [method get_root]." +"through [method get_root]. You can use [method Object.free] on a [TreeItem] " +"to remove it from the [Tree]." msgstr "" #: doc/classes/Tree.xml:28 @@ -51262,10 +51539,11 @@ msgstr "" #: doc/classes/TreeItem.xml:7 msgid "" "Control for a single item inside a [Tree]. May have child [TreeItem]s and be " -"styled as well as contain buttons." +"styled as well as contain buttons.\n" +"You can remove a [TreeItem] by using [method Object.free]." msgstr "" -#: doc/classes/TreeItem.xml:26 +#: doc/classes/TreeItem.xml:27 msgid "" "Adds a button with [Texture2D] [code]button[/code] at column [code]column[/" "code]. The [code]button_idx[/code] index is used to identify the button when " @@ -51275,89 +51553,89 @@ msgid "" "have a [code]tooltip[/code]." msgstr "" -#: doc/classes/TreeItem.xml:35 +#: doc/classes/TreeItem.xml:36 msgid "" "Calls the [code]method[/code] on the actual TreeItem and its children " "recursively. Pass parameters as a comma separated list." msgstr "" -#: doc/classes/TreeItem.xml:44 +#: doc/classes/TreeItem.xml:45 msgid "Resets the background color for the given column to default." msgstr "" -#: doc/classes/TreeItem.xml:53 +#: doc/classes/TreeItem.xml:54 msgid "Resets the color for the given column to default." msgstr "" -#: doc/classes/TreeItem.xml:62 +#: doc/classes/TreeItem.xml:63 msgid "Deselects the given column." msgstr "" -#: doc/classes/TreeItem.xml:73 +#: doc/classes/TreeItem.xml:74 msgid "" "Removes the button at index [code]button_idx[/code] in column [code]column[/" "code]." msgstr "" -#: doc/classes/TreeItem.xml:84 +#: doc/classes/TreeItem.xml:85 msgid "" "Returns the [Texture2D] of the button at index [code]button_idx[/code] in " "column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:93 +#: doc/classes/TreeItem.xml:94 msgid "" "Returns the number of buttons in column [code]column[/code]. May be used to " "get the most recently added button's index, if no index was specified." msgstr "" -#: doc/classes/TreeItem.xml:104 +#: doc/classes/TreeItem.xml:105 msgid "" "Returns the tooltip string for the button at index [code]button_idx[/code] " "in column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:113 +#: doc/classes/TreeItem.xml:114 msgid "Returns the column's cell mode." msgstr "" -#: doc/classes/TreeItem.xml:120 +#: doc/classes/TreeItem.xml:121 msgid "Returns the TreeItem's child items." msgstr "" -#: doc/classes/TreeItem.xml:129 +#: doc/classes/TreeItem.xml:130 msgid "Returns the custom background color of column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:138 +#: doc/classes/TreeItem.xml:139 msgid "Returns the custom color of column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:147 +#: doc/classes/TreeItem.xml:148 msgid "Returns [code]true[/code] if [code]expand_right[/code] is set." msgstr "" -#: doc/classes/TreeItem.xml:156 +#: doc/classes/TreeItem.xml:157 msgid "Returns the given column's icon [Texture2D]. Error if no icon is set." msgstr "" -#: doc/classes/TreeItem.xml:165 +#: doc/classes/TreeItem.xml:166 msgid "Returns the column's icon's maximum width." msgstr "" -#: doc/classes/TreeItem.xml:174 +#: doc/classes/TreeItem.xml:175 msgid "Returns the [Color] modulating the column's icon." msgstr "" -#: doc/classes/TreeItem.xml:183 +#: doc/classes/TreeItem.xml:184 msgid "Returns the icon [Texture2D] region as [Rect2]." msgstr "" -#: doc/classes/TreeItem.xml:198 +#: doc/classes/TreeItem.xml:199 msgid "Returns the next TreeItem in the tree." msgstr "" -#: doc/classes/TreeItem.xml:207 +#: doc/classes/TreeItem.xml:208 msgid "" "Returns the next visible TreeItem in the tree.\n" "If [code]wrap[/code] is enabled, the method will wrap around to the first " @@ -51365,15 +51643,15 @@ msgid "" "otherwise it returns [code]null[/code]." msgstr "" -#: doc/classes/TreeItem.xml:215 +#: doc/classes/TreeItem.xml:216 msgid "Returns the parent TreeItem." msgstr "" -#: doc/classes/TreeItem.xml:222 +#: doc/classes/TreeItem.xml:223 msgid "Returns the previous TreeItem in the tree." msgstr "" -#: doc/classes/TreeItem.xml:231 +#: doc/classes/TreeItem.xml:232 msgid "" "Returns the previous visible TreeItem in the tree.\n" "If [code]wrap[/code] is enabled, the method will wrap around to the last " @@ -51381,89 +51659,92 @@ msgid "" "otherwise it returns [code]null[/code]." msgstr "" -#: doc/classes/TreeItem.xml:257 +#: doc/classes/TreeItem.xml:258 msgid "Returns the given column's text." msgstr "" -#: doc/classes/TreeItem.xml:266 +#: doc/classes/TreeItem.xml:267 msgid "Returns the given column's text alignment." msgstr "" -#: doc/classes/TreeItem.xml:275 +#: doc/classes/TreeItem.xml:276 msgid "Returns the given column's tooltip." msgstr "" -#: doc/classes/TreeItem.xml:286 +#: doc/classes/TreeItem.xml:287 msgid "" "Returns [code]true[/code] if the button at index [code]button_idx[/code] for " "the given column is disabled." msgstr "" -#: doc/classes/TreeItem.xml:295 +#: doc/classes/TreeItem.xml:296 msgid "Returns [code]true[/code] if the given column is checked." msgstr "" -#: doc/classes/TreeItem.xml:312 +#: doc/classes/TreeItem.xml:313 msgid "Returns [code]true[/code] if column [code]column[/code] is editable." msgstr "" -#: doc/classes/TreeItem.xml:321 +#: doc/classes/TreeItem.xml:322 msgid "Returns [code]true[/code] if column [code]column[/code] is selectable." msgstr "" -#: doc/classes/TreeItem.xml:330 +#: doc/classes/TreeItem.xml:331 msgid "Returns [code]true[/code] if column [code]column[/code] is selected." msgstr "" -#: doc/classes/TreeItem.xml:337 +#: doc/classes/TreeItem.xml:338 msgid "Moves this TreeItem to the bottom in the [Tree] hierarchy." msgstr "" -#: doc/classes/TreeItem.xml:344 +#: doc/classes/TreeItem.xml:345 msgid "Moves this TreeItem to the top in the [Tree] hierarchy." msgstr "" -#: doc/classes/TreeItem.xml:353 -msgid "Removes the given child TreeItem." +#: doc/classes/TreeItem.xml:354 +msgid "" +"Removes the given child [TreeItem] and all its children from the [Tree]. " +"Note that it doesn't free the item from memory, so it can be reused later. " +"To completely remove a [TreeItem] use [method Object.free]." msgstr "" -#: doc/classes/TreeItem.xml:362 +#: doc/classes/TreeItem.xml:363 msgid "Selects the column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:375 +#: doc/classes/TreeItem.xml:376 msgid "" "Sets the given column's button [Texture2D] at index [code]button_idx[/code] " "to [code]button[/code]." msgstr "" -#: doc/classes/TreeItem.xml:388 +#: doc/classes/TreeItem.xml:389 msgid "" "If [code]true[/code], disables the button at index [code]button_idx[/code] " "in column [code]column[/code]." msgstr "" -#: doc/classes/TreeItem.xml:399 +#: doc/classes/TreeItem.xml:400 msgid "" "Sets the given column's cell mode to [code]mode[/code]. See [enum " "TreeCellMode] constants." msgstr "" -#: doc/classes/TreeItem.xml:410 +#: doc/classes/TreeItem.xml:411 msgid "If [code]true[/code], the column [code]column[/code] is checked." msgstr "" -#: doc/classes/TreeItem.xml:433 +#: doc/classes/TreeItem.xml:434 msgid "" "Sets the given column's custom background color and whether to just use it " "as an outline." msgstr "" -#: doc/classes/TreeItem.xml:444 +#: doc/classes/TreeItem.xml:445 msgid "Sets the given column's custom color." msgstr "" -#: doc/classes/TreeItem.xml:457 +#: doc/classes/TreeItem.xml:458 msgid "" "Sets the given column's custom draw callback to [code]callback[/code] method " "on [code]object[/code].\n" @@ -51471,82 +51752,82 @@ msgid "" "is drawn and its position and size as a [Rect2]." msgstr "" -#: doc/classes/TreeItem.xml:469 +#: doc/classes/TreeItem.xml:470 msgid "If [code]true[/code], column [code]column[/code] is editable." msgstr "" -#: doc/classes/TreeItem.xml:480 +#: doc/classes/TreeItem.xml:481 msgid "" "If [code]true[/code], column [code]column[/code] is expanded to the right." msgstr "" -#: doc/classes/TreeItem.xml:491 +#: doc/classes/TreeItem.xml:492 msgid "Sets the given column's icon [Texture2D]." msgstr "" -#: doc/classes/TreeItem.xml:502 +#: doc/classes/TreeItem.xml:503 msgid "Sets the given column's icon's maximum width." msgstr "" -#: doc/classes/TreeItem.xml:513 +#: doc/classes/TreeItem.xml:514 msgid "Modulates the given column's icon with [code]modulate[/code]." msgstr "" -#: doc/classes/TreeItem.xml:524 +#: doc/classes/TreeItem.xml:525 msgid "Sets the given column's icon's texture region." msgstr "" -#: doc/classes/TreeItem.xml:571 +#: doc/classes/TreeItem.xml:572 msgid "If [code]true[/code], the given column is selectable." msgstr "" -#: doc/classes/TreeItem.xml:592 +#: doc/classes/TreeItem.xml:593 msgid "" "Sets the given column's text alignment. See [enum TextAlign] for possible " "values." msgstr "" -#: doc/classes/TreeItem.xml:603 +#: doc/classes/TreeItem.xml:604 msgid "Sets the given column's tooltip text." msgstr "" -#: doc/classes/TreeItem.xml:609 +#: doc/classes/TreeItem.xml:610 msgid "If [code]true[/code], the TreeItem is collapsed." msgstr "" -#: doc/classes/TreeItem.xml:612 +#: doc/classes/TreeItem.xml:613 msgid "The custom minimum height." msgstr "" -#: doc/classes/TreeItem.xml:615 +#: doc/classes/TreeItem.xml:616 msgid "If [code]true[/code], folding is disabled for this TreeItem." msgstr "" -#: doc/classes/TreeItem.xml:620 +#: doc/classes/TreeItem.xml:621 msgid "Cell contains a string." msgstr "" -#: doc/classes/TreeItem.xml:623 +#: doc/classes/TreeItem.xml:624 msgid "Cell can be checked." msgstr "" -#: doc/classes/TreeItem.xml:626 +#: doc/classes/TreeItem.xml:627 msgid "Cell contains a range." msgstr "" -#: doc/classes/TreeItem.xml:629 +#: doc/classes/TreeItem.xml:630 msgid "Cell contains an icon." msgstr "" -#: doc/classes/TreeItem.xml:634 +#: doc/classes/TreeItem.xml:635 msgid "Align text to the left. See [code]set_text_align()[/code]." msgstr "" -#: doc/classes/TreeItem.xml:637 +#: doc/classes/TreeItem.xml:638 msgid "Center text. See [code]set_text_align()[/code]." msgstr "" -#: doc/classes/TreeItem.xml:640 +#: doc/classes/TreeItem.xml:641 msgid "Align text to the right. See [code]set_text_align()[/code]." msgstr "" @@ -51572,8 +51853,8 @@ msgid "" "know the final values in advance. For example, interpolating a dynamically-" "chosen camera zoom value is best done with a [Tween] node; it would be " "difficult to do the same thing with an [AnimationPlayer] node.\n" -"Here is a brief usage example that causes a 2D node to move smoothly between " -"two positions:\n" +"Here is a brief usage example that makes a 2D node move smoothly between two " +"positions:\n" "[codeblock]\n" "var tween = get_node(\"Tween\")\n" "tween.interpolate_property($Node2D, \"position\",\n" @@ -51588,15 +51869,18 @@ msgid "" "where it would only apply to that particular component.\n" "Many of the methods accept [code]trans_type[/code] and [code]ease_type[/" "code]. The first accepts an [enum TransitionType] constant, and refers to " -"the way the timing of the animation is handled (see [code]http://easings.net/" -"[/code] for some examples). The second accepts an [enum EaseType] constant, " -"and controls the where [code]trans_type[/code] is applied to the " -"interpolation (in the beginning, the end, or both). If you don't know which " -"transition and easing to pick, you can try different [enum TransitionType] " -"constants with [constant EASE_IN_OUT], and use the one that looks best." +"the way the timing of the animation is handled (see [url=https://easings." +"net/]easings.net[/url] for some examples). The second accepts an [enum " +"EaseType] constant, and controls the where [code]trans_type[/code] is " +"applied to the interpolation (in the beginning, the end, or both). If you " +"don't know which transition and easing to pick, you can try different [enum " +"TransitionType] constants with [constant EASE_IN_OUT], and use the one that " +"looks best.\n" +"[b][url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url][/b]" msgstr "" -#: doc/classes/Tween.xml:45 +#: doc/classes/Tween.xml:46 msgid "" "Follows [code]method[/code] of [code]object[/code] and applies the returned " "value on [code]target_method[/code] of [code]target[/code], beginning from " @@ -51608,7 +51892,7 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:71 +#: doc/classes/Tween.xml:72 msgid "" "Follows [code]property[/code] of [code]object[/code] and applies it on " "[code]target_property[/code] of [code]target[/code], beginning from " @@ -51620,21 +51904,21 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:79 +#: doc/classes/Tween.xml:80 msgid "" "Returns the total time needed for all tweens to end. If you have two tweens, " "one lasting 10 seconds and the other 20 seconds, it would return 20 seconds, " "as by that time all tweens would have finished." msgstr "" -#: doc/classes/Tween.xml:102 +#: doc/classes/Tween.xml:103 msgid "" "Calls [code]callback[/code] of [code]object[/code] after [code]duration[/" "code]. [code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the " "callback." msgstr "" -#: doc/classes/Tween.xml:125 +#: doc/classes/Tween.xml:126 msgid "" "Calls [code]callback[/code] of [code]object[/code] after [code]duration[/" "code] on the main thread (similar to [method Object.call_deferred]). " @@ -51642,7 +51926,7 @@ msgid "" "callback." msgstr "" -#: doc/classes/Tween.xml:148 +#: doc/classes/Tween.xml:149 msgid "" "Animates [code]method[/code] of [code]object[/code] from [code]initial_val[/" "code] to [code]final_val[/code] for [code]duration[/code] seconds, " @@ -51654,7 +51938,7 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:172 +#: doc/classes/Tween.xml:173 msgid "" "Animates [code]property[/code] of [code]object[/code] from " "[code]initial_val[/code] to [code]final_val[/code] for [code]duration[/code] " @@ -51666,72 +51950,72 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:180 +#: doc/classes/Tween.xml:181 msgid "" "Returns [code]true[/code] if any tweens are currently running.\n" "[b]Note:[/b] This method doesn't consider tweens that have ended." msgstr "" -#: doc/classes/Tween.xml:192 +#: doc/classes/Tween.xml:193 msgid "" "Stops animation and removes a tween, given its object and property/method " "pair. By default, all tweens are removed, unless [code]key[/code] is " "specified." msgstr "" -#: doc/classes/Tween.xml:199 +#: doc/classes/Tween.xml:200 msgid "Stops animation and removes all tweens." msgstr "" -#: doc/classes/Tween.xml:210 +#: doc/classes/Tween.xml:211 msgid "" "Resets a tween to its initial value (the one given, not the one before the " "tween), given its object and property/method pair. By default, all tweens " "are removed, unless [code]key[/code] is specified." msgstr "" -#: doc/classes/Tween.xml:217 +#: doc/classes/Tween.xml:218 msgid "" "Resets all tweens to their initial values (the ones given, not those before " "the tween)." msgstr "" -#: doc/classes/Tween.xml:228 +#: doc/classes/Tween.xml:229 msgid "" "Continues animating a stopped tween, given its object and property/method " "pair. By default, all tweens are resumed, unless [code]key[/code] is " "specified." msgstr "" -#: doc/classes/Tween.xml:235 +#: doc/classes/Tween.xml:236 msgid "Continues animating all stopped tweens." msgstr "" -#: doc/classes/Tween.xml:244 +#: doc/classes/Tween.xml:245 msgid "Sets the interpolation to the given [code]time[/code] in seconds." msgstr "" -#: doc/classes/Tween.xml:253 +#: doc/classes/Tween.xml:254 msgid "" "Activates/deactivates the tween. See also [method stop_all] and [method " "resume_all]." msgstr "" -#: doc/classes/Tween.xml:260 +#: doc/classes/Tween.xml:261 msgid "Starts the tween. You can define animations both before and after this." msgstr "" -#: doc/classes/Tween.xml:271 +#: doc/classes/Tween.xml:272 msgid "" "Stops a tween, given its object and property/method pair. By default, all " "tweens are stopped, unless [code]key[/code] is specified." msgstr "" -#: doc/classes/Tween.xml:278 +#: doc/classes/Tween.xml:279 msgid "Stops animating all tweens." msgstr "" -#: doc/classes/Tween.xml:303 +#: doc/classes/Tween.xml:304 msgid "" "Animates [code]method[/code] of [code]object[/code] from the value returned " "by [code]initial_method[/code] to [code]final_val[/code] for [code]duration[/" @@ -51743,7 +52027,7 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:329 +#: doc/classes/Tween.xml:330 msgid "" "Animates [code]property[/code] of [code]object[/code] from the current value " "of the [code]initial_val[/code] property of [code]initial[/code] to " @@ -51755,15 +52039,15 @@ msgid "" "information." msgstr "" -#: doc/classes/Tween.xml:337 +#: doc/classes/Tween.xml:338 msgid "Returns the current time of the tween." msgstr "" -#: doc/classes/Tween.xml:343 +#: doc/classes/Tween.xml:344 msgid "The tween's animation process thread. See [enum TweenProcessMode]." msgstr "" -#: doc/classes/Tween.xml:346 +#: doc/classes/Tween.xml:347 msgid "" "The tween's speed multiplier. For example, set it to [code]1.0[/code] for " "normal speed, [code]2.0[/code] for two times normal speed, or [code]0.5[/" @@ -51771,100 +52055,100 @@ msgid "" "animation, but see also [method set_active] or [method stop_all] for this." msgstr "" -#: doc/classes/Tween.xml:349 +#: doc/classes/Tween.xml:350 msgid "If [code]true[/code], the tween loops." msgstr "" -#: doc/classes/Tween.xml:355 +#: doc/classes/Tween.xml:356 msgid "Emitted when all processes in a tween end." msgstr "" -#: doc/classes/Tween.xml:364 +#: doc/classes/Tween.xml:365 msgid "Emitted when a tween ends." msgstr "" -#: doc/classes/Tween.xml:373 +#: doc/classes/Tween.xml:374 msgid "Emitted when a tween starts." msgstr "" -#: doc/classes/Tween.xml:386 +#: doc/classes/Tween.xml:387 msgid "Emitted at each step of the animation." msgstr "" -#: doc/classes/Tween.xml:392 +#: doc/classes/Tween.xml:393 msgid "The tween updates with the [code]_physics_process[/code] callback." msgstr "" -#: doc/classes/Tween.xml:395 +#: doc/classes/Tween.xml:396 msgid "The tween updates with the [code]_process[/code] callback." msgstr "" -#: doc/classes/Tween.xml:398 +#: doc/classes/Tween.xml:399 msgid "The animation is interpolated linearly." msgstr "" -#: doc/classes/Tween.xml:401 +#: doc/classes/Tween.xml:402 msgid "The animation is interpolated using a sine function." msgstr "" -#: doc/classes/Tween.xml:404 +#: doc/classes/Tween.xml:405 msgid "" "The animation is interpolated with a quintic (to the power of 5) function." msgstr "" -#: doc/classes/Tween.xml:407 +#: doc/classes/Tween.xml:408 msgid "" "The animation is interpolated with a quartic (to the power of 4) function." msgstr "" -#: doc/classes/Tween.xml:410 +#: doc/classes/Tween.xml:411 msgid "" "The animation is interpolated with a quadratic (to the power of 2) function." msgstr "" -#: doc/classes/Tween.xml:413 +#: doc/classes/Tween.xml:414 msgid "" "The animation is interpolated with an exponential (to the power of x) " "function." msgstr "" -#: doc/classes/Tween.xml:416 +#: doc/classes/Tween.xml:417 msgid "" "The animation is interpolated with elasticity, wiggling around the edges." msgstr "" -#: doc/classes/Tween.xml:419 +#: doc/classes/Tween.xml:420 msgid "" "The animation is interpolated with a cubic (to the power of 3) function." msgstr "" -#: doc/classes/Tween.xml:422 +#: doc/classes/Tween.xml:423 msgid "The animation is interpolated with a function using square roots." msgstr "" -#: doc/classes/Tween.xml:425 +#: doc/classes/Tween.xml:426 msgid "The animation is interpolated by bouncing at the end." msgstr "" -#: doc/classes/Tween.xml:428 +#: doc/classes/Tween.xml:429 msgid "The animation is interpolated backing out at ends." msgstr "" -#: doc/classes/Tween.xml:431 +#: doc/classes/Tween.xml:432 msgid "The interpolation starts slowly and speeds up towards the end." msgstr "" -#: doc/classes/Tween.xml:434 +#: doc/classes/Tween.xml:435 msgid "The interpolation starts quickly and slows down towards the end." msgstr "" -#: doc/classes/Tween.xml:437 +#: doc/classes/Tween.xml:438 msgid "" "A combination of [constant EASE_IN] and [constant EASE_OUT]. The " "interpolation is slowest at both ends." msgstr "" -#: doc/classes/Tween.xml:440 +#: doc/classes/Tween.xml:441 msgid "" "A combination of [constant EASE_IN] and [constant EASE_OUT]. The " "interpolation is fastest at both ends." @@ -53468,69 +53752,90 @@ msgstr "" msgid "If [code]true[/code], the viewport will process 3D audio streams." msgstr "" -#: doc/classes/Viewport.xml:199 +#: doc/classes/Viewport.xml:195 +msgid "" +"Sets the default filter mode used by [CanvasItem]s in this Viewport. See " +"[enum DefaultCanvasItemTextureFilter] for options." +msgstr "" + +#: doc/classes/Viewport.xml:198 +msgid "" +"Sets the default repeat mode used by [CanvasItem]s in this Viewport. See " +"[enum DefaultCanvasItemTextureRepeat] for options." +msgstr "" + +#: doc/classes/Viewport.xml:201 msgid "" "The canvas transform of the viewport, useful for changing the on-screen " "positions of all child [CanvasItem]s. This is relative to the global canvas " "transform of the viewport." msgstr "" -#: doc/classes/Viewport.xml:202 +#: doc/classes/Viewport.xml:204 msgid "The overlay mode for test rendered geometry in debug purposes." msgstr "" -#: doc/classes/Viewport.xml:205 +#: doc/classes/Viewport.xml:207 msgid "" "The global canvas transform of the viewport. The canvas transform is " "relative to this." msgstr "" -#: doc/classes/Viewport.xml:208 +#: doc/classes/Viewport.xml:210 msgid "If [code]true[/code], the viewport will not receive input event." msgstr "" -#: doc/classes/Viewport.xml:213 +#: doc/classes/Viewport.xml:215 msgid "" "If [code]true[/code], the GUI controls on the viewport will lay pixel " "perfectly." msgstr "" -#: doc/classes/Viewport.xml:218 +#: doc/classes/Viewport.xml:220 msgid "" "The multisample anti-aliasing mode. A higher number results in smoother " "edges at the cost of significantly worse performance. A value of 4 is best " "unless targeting very high-end systems." msgstr "" -#: doc/classes/Viewport.xml:221 +#: doc/classes/Viewport.xml:223 msgid "" "If [code]true[/code], the viewport will use [World3D] defined in " "[code]world[/code] property." msgstr "" -#: doc/classes/Viewport.xml:224 +#: doc/classes/Viewport.xml:226 msgid "" "If [code]true[/code], the objects rendered by viewport become subjects of " "mouse picking process." msgstr "" -#: doc/classes/Viewport.xml:227 +#: doc/classes/Viewport.xml:229 +msgid "" +"Sets the screen-space antialiasing method used. Screen-space antialiasing " +"works by selectively blurring edges in a post-process shader. It differs " +"from MSAA which takes multiple coverage samples while rendering objects. " +"Screen-space AA methods are typically faster than MSAA and will smooth out " +"specular aliasing, but tend to make scenes appear blurry." +msgstr "" + +#: doc/classes/Viewport.xml:232 msgid "The subdivision amount of the first quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:230 +#: doc/classes/Viewport.xml:235 msgid "The subdivision amount of the second quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:233 +#: doc/classes/Viewport.xml:238 msgid "The subdivision amount of the third quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:236 +#: doc/classes/Viewport.xml:241 msgid "The subdivision amount of the fourth quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:239 +#: doc/classes/Viewport.xml:244 msgid "" "The shadow atlas' resolution (used for omni and spot lights). The value will " "be rounded up to the nearest power of 2.\n" @@ -53539,136 +53844,177 @@ msgid "" "manually." msgstr "" -#: doc/classes/Viewport.xml:243 +#: doc/classes/Viewport.xml:248 msgid "" "If [code]true[/code], the viewport should render its background as " "transparent." msgstr "" -#: doc/classes/Viewport.xml:246 +#: doc/classes/Viewport.xml:251 msgid "The custom [World3D] which can be used as 3D environment source." msgstr "" -#: doc/classes/Viewport.xml:249 +#: doc/classes/Viewport.xml:254 msgid "The custom [World2D] which can be used as 2D environment source." msgstr "" -#: doc/classes/Viewport.xml:257 +#: doc/classes/Viewport.xml:262 msgid "Emitted when a Control node grabs keyboard focus." msgstr "" -#: doc/classes/Viewport.xml:262 +#: doc/classes/Viewport.xml:267 msgid "" "Emitted when the size of the viewport is changed, whether by resizing of " "window, or some other means." msgstr "" -#: doc/classes/Viewport.xml:268 +#: doc/classes/Viewport.xml:273 msgid "This quadrant will not be used." msgstr "" -#: doc/classes/Viewport.xml:271 +#: doc/classes/Viewport.xml:276 msgid "This quadrant will only be used by one shadow map." msgstr "" -#: doc/classes/Viewport.xml:274 +#: doc/classes/Viewport.xml:279 msgid "This quadrant will be split in 4 and used by up to 4 shadow maps." msgstr "" -#: doc/classes/Viewport.xml:277 +#: doc/classes/Viewport.xml:282 msgid "This quadrant will be split 16 ways and used by up to 16 shadow maps." msgstr "" -#: doc/classes/Viewport.xml:280 +#: doc/classes/Viewport.xml:285 msgid "This quadrant will be split 64 ways and used by up to 64 shadow maps." msgstr "" -#: doc/classes/Viewport.xml:283 +#: doc/classes/Viewport.xml:288 msgid "" "This quadrant will be split 256 ways and used by up to 256 shadow maps. " "Unless the [member shadow_atlas_size] is very high, the shadows in this " "quadrant will be very low resolution." msgstr "" -#: doc/classes/Viewport.xml:286 +#: doc/classes/Viewport.xml:291 msgid "" "This quadrant will be split 1024 ways and used by up to 1024 shadow maps. " "Unless the [member shadow_atlas_size] is very high, the shadows in this " "quadrant will be very low resolution." msgstr "" -#: doc/classes/Viewport.xml:289 +#: doc/classes/Viewport.xml:294 msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum." msgstr "" -#: doc/classes/Viewport.xml:292 -msgid "Amount of objects in frame." +#: doc/classes/Viewport.xml:297 +msgid "" +"Multisample antialiasing mode disabled. This is the default value, and also " +"the fastest setting." msgstr "" -#: doc/classes/Viewport.xml:295 -msgid "Amount of vertices in frame." +#: doc/classes/Viewport.xml:300 +msgid "Use 2x Multisample Antialiasing." msgstr "" -#: doc/classes/Viewport.xml:298 -msgid "Amount of material changes in frame." +#: doc/classes/Viewport.xml:303 +msgid "Use 4x Multisample Antialiasing." msgstr "" -#: doc/classes/Viewport.xml:301 -msgid "Amount of shader changes in frame." +#: doc/classes/Viewport.xml:306 +msgid "" +"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older " +"hardware." msgstr "" -#: doc/classes/Viewport.xml:304 -msgid "Amount of surface changes in frame." +#: doc/classes/Viewport.xml:309 +msgid "" +"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end " +"hardware." msgstr "" -#: doc/classes/Viewport.xml:307 -msgid "Amount of draw calls in frame." +#: doc/classes/Viewport.xml:312 +msgid "Represents the size of the [enum MSAA] enum." msgstr "" -#: doc/classes/Viewport.xml:310 -msgid "Represents the size of the [enum RenderInfo] enum." +#: doc/classes/Viewport.xml:315 +msgid "Do not perform any antialiasing in the full screen post-process." msgstr "" -#: doc/classes/Viewport.xml:313 -msgid "Objects are displayed normally." +#: doc/classes/Viewport.xml:318 +msgid "" +"Use fast approximate antialiasing. FXAA is a popular screen-space " +"antialising method, which is fast but will make the image look blurry, " +"especially at lower resolutions. It can still work relatively well at large " +"resolutions such as 1440p and 4K." msgstr "" -#: doc/classes/Viewport.xml:316 -msgid "Objects are displayed without light information." +#: doc/classes/Viewport.xml:321 +msgid "Represents the size of the [enum ScreenSpaceAA] enum." msgstr "" -#: doc/classes/Viewport.xml:319 -msgid "" -"Objected are displayed semi-transparent with additive blending so you can " -"see where they intersect." +#: doc/classes/Viewport.xml:324 +msgid "Amount of objects in frame." msgstr "" -#: doc/classes/Viewport.xml:322 -msgid "Objects are displayed in wireframe style." +#: doc/classes/Viewport.xml:327 +msgid "Amount of vertices in frame." +msgstr "" + +#: doc/classes/Viewport.xml:330 +msgid "Amount of material changes in frame." +msgstr "" + +#: doc/classes/Viewport.xml:333 +msgid "Amount of shader changes in frame." +msgstr "" + +#: doc/classes/Viewport.xml:336 +msgid "Amount of surface changes in frame." msgstr "" #: doc/classes/Viewport.xml:339 -msgid "Multisample anti-aliasing mode disabled. This is the default value." +msgid "Amount of draw calls in frame." msgstr "" #: doc/classes/Viewport.xml:342 -msgid "Use 2x Multisample Antialiasing." +msgid "Represents the size of the [enum RenderInfo] enum." msgstr "" #: doc/classes/Viewport.xml:345 -msgid "Use 4x Multisample Antialiasing." +msgid "Objects are displayed normally." msgstr "" -#: doc/classes/Viewport.xml:348 +#: doc/classes/Viewport.xml:356 +msgid "Objects are displayed in wireframe style." +msgstr "" + +#: doc/classes/Viewport.xml:378 msgid "" -"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older " -"hardware." +"Draws the screen-space ambient occlusion texture instead of the scene so " +"that you can clearly see how it is affecting objects. In order for this " +"display mode to work, you must have [member Environment.ssao_enabled] set in " +"your [WorldEnvironment]." msgstr "" -#: doc/classes/Viewport.xml:351 +#: doc/classes/Viewport.xml:384 msgid "" -"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end " -"hardware." +"Colors each PSSM split for the [DirectionalLight3D]s in the scene a " +"different color so you can see where the splits are. In order, they will be " +"colored red, green, blue, and yellow." +msgstr "" + +#: doc/classes/Viewport.xml:387 +msgid "" +"Draws the decal atlas used by [Decal]s and light projector textures in the " +"upper left quadrant of the [Viewport]." +msgstr "" + +#: doc/classes/Viewport.xml:402 +msgid "Max value for [enum DefaultCanvasItemTextureFilter] enum." +msgstr "" + +#: doc/classes/Viewport.xml:414 +msgid "Max value for [enum DefaultCanvasItemTextureRepeat] enum." msgstr "" #: doc/classes/ViewportTexture.xml:4 @@ -53690,7 +54036,7 @@ msgid "" msgstr "" #: doc/classes/VisibilityEnabler2D.xml:4 doc/classes/VisibilityEnabler3D.xml:4 -msgid "Enables certain nodes only when visible." +msgid "Enables certain nodes only when approximately visible." msgstr "" #: doc/classes/VisibilityEnabler2D.xml:7 @@ -53698,78 +54044,82 @@ msgid "" "The VisibilityEnabler2D will disable [RigidBody2D], [AnimationPlayer], and " "other nodes when they are not visible. It will only affect nodes with the " "same root node as the VisibilityEnabler2D, and the root node itself.\n" -"Note that VisibilityEnabler2D will not affect nodes added after scene " +"[b]Note:[/b] For performance reasons, VisibilityEnabler2D uses an " +"approximate heuristic with precision determined by [member ProjectSettings." +"world/2d/cell_size]. If you need exact visibility checking, use another " +"method such as adding an [Area2D] node as a child of a [Camera2D] node.\n" +"[b]Note:[/b] VisibilityEnabler2D will not affect nodes added after scene " "initialization." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:19 -#: doc/classes/VisibilityEnabler3D.xml:19 +#: doc/classes/VisibilityEnabler2D.xml:20 +#: doc/classes/VisibilityEnabler3D.xml:20 msgid "" "Returns whether the enabler identified by given [enum Enabler] constant is " "active." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:30 -#: doc/classes/VisibilityEnabler3D.xml:30 +#: doc/classes/VisibilityEnabler2D.xml:31 +#: doc/classes/VisibilityEnabler3D.xml:31 msgid "" "Sets active state of the enabler identified by given [enum Enabler] constant." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:36 +#: doc/classes/VisibilityEnabler2D.xml:37 msgid "If [code]true[/code], [RigidBody2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:39 +#: doc/classes/VisibilityEnabler2D.xml:40 msgid "If [code]true[/code], [AnimatedSprite2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:42 -#: doc/classes/VisibilityEnabler3D.xml:39 +#: doc/classes/VisibilityEnabler2D.xml:43 +#: doc/classes/VisibilityEnabler3D.xml:40 msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:45 +#: doc/classes/VisibilityEnabler2D.xml:46 msgid "If [code]true[/code], [GPUParticles2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:48 +#: doc/classes/VisibilityEnabler2D.xml:49 msgid "" "If [code]true[/code], the parent's [method Node._physics_process] will be " "stopped." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:51 +#: doc/classes/VisibilityEnabler2D.xml:52 msgid "" "If [code]true[/code], the parent's [method Node._process] will be stopped." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:56 -#: doc/classes/VisibilityEnabler3D.xml:44 +#: doc/classes/VisibilityEnabler2D.xml:57 +#: doc/classes/VisibilityEnabler3D.xml:45 msgid "This enabler will pause [AnimationPlayer] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:59 +#: doc/classes/VisibilityEnabler2D.xml:60 msgid "This enabler will freeze [RigidBody2D] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:62 +#: doc/classes/VisibilityEnabler2D.xml:63 msgid "This enabler will stop [GPUParticles2D] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:65 +#: doc/classes/VisibilityEnabler2D.xml:66 msgid "This enabler will stop the parent's _process function." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:68 +#: doc/classes/VisibilityEnabler2D.xml:69 msgid "This enabler will stop the parent's _physics_process function." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:71 +#: doc/classes/VisibilityEnabler2D.xml:72 msgid "This enabler will stop [AnimatedSprite2D] nodes animations." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:74 -#: doc/classes/VisibilityEnabler3D.xml:50 +#: doc/classes/VisibilityEnabler2D.xml:75 +#: doc/classes/VisibilityEnabler3D.xml:51 msgid "Represents the size of the [enum Enabler] enum." msgstr "" @@ -53778,31 +54128,39 @@ msgid "" "The VisibilityEnabler3D will disable [RigidBody3D] and [AnimationPlayer] " "nodes when they are not visible. It will only affect other nodes within the " "same scene as the VisibilityEnabler3D itself.\n" -"Note that VisibilityEnabler3D will not affect nodes added after scene " +"[b]Note:[/b] VisibilityEnabler3D uses an approximate heuristic for " +"performance reasons. It doesn't take walls and other occlusion into account. " +"If you need exact visibility checking, use another method such as adding an " +"[Area3D] node as a child of a [Camera3D] node.\n" +"[b]Note:[/b] VisibilityEnabler3D will not affect nodes added after scene " "initialization." msgstr "" -#: doc/classes/VisibilityEnabler3D.xml:36 +#: doc/classes/VisibilityEnabler3D.xml:37 msgid "If [code]true[/code], [RigidBody3D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler3D.xml:47 +#: doc/classes/VisibilityEnabler3D.xml:48 msgid "This enabler will freeze [RigidBody3D] nodes." msgstr "" #: doc/classes/VisibilityNotifier2D.xml:4 #: doc/classes/VisibilityNotifier3D.xml:4 -msgid "Detects when the node is visible on screen." +msgid "Detects approximately when the node is visible on screen." msgstr "" #: doc/classes/VisibilityNotifier2D.xml:7 msgid "" "The VisibilityNotifier2D detects when it is visible on the screen. It also " "notifies when its bounding rectangle enters or exits the screen or a " -"viewport." +"viewport.\n" +"[b]Note:[/b] For performance reasons, VisibilityNotifier2D uses an " +"approximate heuristic with precision determined by [member ProjectSettings." +"world/2d/cell_size]. If you need exact visibility checking, use another " +"method such as adding an [Area2D] node as a child of a [Camera2D] node." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:16 +#: doc/classes/VisibilityNotifier2D.xml:17 msgid "" "If [code]true[/code], the bounding rectangle is on the screen.\n" "[b]Note:[/b] It takes one frame for the node's visibility to be assessed " @@ -53811,23 +54169,23 @@ msgid "" "pass." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:23 +#: doc/classes/VisibilityNotifier2D.xml:24 msgid "The VisibilityNotifier2D's bounding rectangle." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:29 +#: doc/classes/VisibilityNotifier2D.xml:30 msgid "Emitted when the VisibilityNotifier2D enters the screen." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:34 +#: doc/classes/VisibilityNotifier2D.xml:35 msgid "Emitted when the VisibilityNotifier2D exits the screen." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:41 +#: doc/classes/VisibilityNotifier2D.xml:42 msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:48 +#: doc/classes/VisibilityNotifier2D.xml:49 msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view." msgstr "" @@ -53835,10 +54193,14 @@ msgstr "" msgid "" "The VisibilityNotifier3D detects when it is visible on the screen. It also " "notifies when its bounding rectangle enters or exits the screen or a " -"[Camera3D]'s view." +"[Camera3D]'s view.\n" +"[b]Note:[/b] VisibilityNotifier3D uses an approximate heuristic for " +"performance reasons. It doesn't take walls and other occlusion into account. " +"If you need exact visibility checking, use another method such as adding an " +"[Area3D] node as a child of a [Camera3D] node." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:16 +#: doc/classes/VisibilityNotifier3D.xml:17 msgid "" "If [code]true[/code], the bounding box is on the screen.\n" "[b]Note:[/b] It takes one frame for the node's visibility to be assessed " @@ -53847,23 +54209,23 @@ msgid "" "pass." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:23 +#: doc/classes/VisibilityNotifier3D.xml:24 msgid "The VisibilityNotifier3D's bounding box." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:31 +#: doc/classes/VisibilityNotifier3D.xml:32 msgid "Emitted when the VisibilityNotifier3D enters a [Camera3D]'s view." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:38 +#: doc/classes/VisibilityNotifier3D.xml:39 msgid "Emitted when the VisibilityNotifier3D exits a [Camera3D]'s view." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:43 +#: doc/classes/VisibilityNotifier3D.xml:44 msgid "Emitted when the VisibilityNotifier3D enters the screen." msgstr "" -#: doc/classes/VisibilityNotifier3D.xml:48 +#: doc/classes/VisibilityNotifier3D.xml:49 msgid "Emitted when the VisibilityNotifier3D exits the screen." msgstr "" @@ -56455,7 +56817,7 @@ msgstr "" msgid "The background of the area below the grabber." msgstr "" -#: doc/classes/VSlider.xml:33 +#: doc/classes/VSlider.xml:35 msgid "" "The background for the whole slider. Determines the width of the " "[code]grabber_area[/code]." @@ -57437,6 +57799,667 @@ msgstr "" msgid "Unknown node." msgstr "" +#: doc/classes/XRAnchor3D.xml:4 +msgid "An anchor point in AR space." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:7 +msgid "" +"The [XRAnchor3D] point is a spatial node that maps a real world location " +"identified by the AR platform to a position within the game world. For " +"example, as long as plane detection in ARKit is on, ARKit will identify and " +"update the position of planes (tables, floors, etc) and create anchors for " +"them.\n" +"This node is mapped to one of the anchors through its unique ID. When you " +"receive a signal that a new anchor is available, you should add this node to " +"your scene for that anchor. You can predefine nodes and set the ID; the " +"nodes will simply remain on 0,0,0 until a plane is recognized.\n" +"Keep in mind that, as long as plane detection is enabled, the size, placing " +"and orientation of an anchor will be updated as the detection logic learns " +"more about the real world out there especially if only part of the surface " +"is in view." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:18 +msgid "Returns the name given to this anchor." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:25 +msgid "" +"Returns [code]true[/code] if the anchor is being tracked and [code]false[/" +"code] if no anchor with this ID is currently known." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:32 +msgid "" +"If provided by the [XRInterface], this returns a mesh object for the anchor. " +"For an anchor, this can be a shape related to the object being tracked or it " +"can be a mesh that provides topology related to the anchor and can be used " +"to create shadows/reflections on surfaces or for generating collision shapes." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:39 +msgid "" +"Returns a plane aligned with our anchor; handy for intersection testing." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:46 +msgid "" +"Returns the estimated size of the plane that was detected. Say when the " +"anchor relates to a table in the real world, this is the estimated size of " +"the surface of that table." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:52 +msgid "" +"The anchor's ID. You can set this before the anchor itself exists. The first " +"anchor gets an ID of [code]1[/code], the second an ID of [code]2[/code], " +"etc. When anchors get removed, the engine can then assign the corresponding " +"ID to new anchors. The most common situation where anchors \"disappear\" is " +"when the AR server identifies that two anchors represent different parts of " +"the same plane and merges them." +msgstr "" + +#: doc/classes/XRAnchor3D.xml:60 +msgid "" +"Emitted when the mesh associated with the anchor changes or when one becomes " +"available. This is especially important for topology that is constantly " +"being [code]mesh_updated[/code]." +msgstr "" + +#: doc/classes/XRCamera3D.xml:4 +msgid "" +"A camera node with a few overrules for AR/VR applied, such as location " +"tracking." +msgstr "" + +#: doc/classes/XRCamera3D.xml:7 +msgid "" +"This is a helper spatial node for our camera; note that, if stereoscopic " +"rendering is applicable (VR-HMD), most of the camera properties are ignored, " +"as the HMD information overrides them. The only properties that can be " +"trusted are the near and far planes.\n" +"The position and orientation of this node is automatically updated by the XR " +"Server to represent the location of the HMD if such tracking is available " +"and can thus be used by game logic. Note that, in contrast to the XR " +"Controller, the render thread has access to the most up-to-date tracking " +"data of the HMD and the location of the XRCamera3D can lag a few " +"milliseconds behind what is used for rendering as a result." +msgstr "" + +#: doc/classes/XRCamera3D.xml:11 doc/classes/XRController3D.xml:12 +#: doc/classes/XRInterface.xml:11 doc/classes/XROrigin3D.xml:13 +#: doc/classes/XRPositionalTracker.xml:12 doc/classes/XRServer.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/vr/index.html" +msgstr "" + +#: doc/classes/XRController3D.xml:4 +msgid "A spatial node representing a spatially-tracked controller." +msgstr "" + +#: doc/classes/XRController3D.xml:7 +msgid "" +"This is a helper spatial node that is linked to the tracking of controllers. " +"It also offers several handy passthroughs to the state of buttons and such " +"on the controllers.\n" +"Controllers are linked by their ID. You can create controller nodes before " +"the controllers are available. If your game always uses two controllers (one " +"for each hand), you can predefine the controllers with ID 1 and 2; they will " +"become active as soon as the controllers are identified. If you expect " +"additional controllers to be used, you should react to the signals and add " +"XRController3D nodes to your scene.\n" +"The position of the controller node is automatically updated by the " +"[XRServer]. This makes this node ideal to add child nodes to visualize the " +"controller." +msgstr "" + +#: doc/classes/XRController3D.xml:19 +msgid "" +"If active, returns the name of the associated controller if provided by the " +"AR/VR SDK used." +msgstr "" + +#: doc/classes/XRController3D.xml:26 +msgid "" +"Returns the hand holding this controller, if known. See [enum " +"XRPositionalTracker.TrackerHand]." +msgstr "" + +#: doc/classes/XRController3D.xml:33 +msgid "" +"Returns [code]true[/code] if the bound controller is active. XR systems " +"attempt to track active controllers." +msgstr "" + +#: doc/classes/XRController3D.xml:42 +msgid "" +"Returns the value of the given axis for things like triggers, touchpads, " +"etc. that are embedded into the controller." +msgstr "" + +#: doc/classes/XRController3D.xml:49 +msgid "" +"Returns the ID of the joystick object bound to this. Every controller " +"tracked by the [XRServer] that has buttons and axis will also be registered " +"as a joystick within Godot. This means that all the normal joystick tracking " +"and input mapping will work for buttons and axis found on the AR/VR " +"controllers. This ID is purely offered as information so you can link up the " +"controller with its joystick entry." +msgstr "" + +#: doc/classes/XRController3D.xml:56 +msgid "" +"If provided by the [XRInterface], this returns a mesh associated with the " +"controller. This can be used to visualize the controller." +msgstr "" + +#: doc/classes/XRController3D.xml:65 +msgid "" +"Returns [code]true[/code] if the button at index [code]button[/code] is " +"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " +"constants." +msgstr "" + +#: doc/classes/XRController3D.xml:71 +msgid "" +"The controller's ID.\n" +"A controller ID of 0 is unbound and will always result in an inactive node. " +"Controller ID 1 is reserved for the first controller that identifies itself " +"as the left-hand controller and ID 2 is reserved for the first controller " +"that identifies itself as the right-hand controller.\n" +"For any other controller that the [XRServer] detects, we continue with " +"controller ID 3.\n" +"When a controller is turned off, its slot is freed. This ensures controllers " +"will keep the same ID even when controllers with lower IDs are turned off." +msgstr "" + +#: doc/classes/XRController3D.xml:77 +msgid "" +"The degree to which the controller vibrates. Ranges from [code]0.0[/code] to " +"[code]1.0[/code] with precision [code].01[/code]. If changed, updates " +"[member XRPositionalTracker.rumble] accordingly.\n" +"This is a useful property to animate if you want the controller to vibrate " +"for a limited duration." +msgstr "" + +#: doc/classes/XRController3D.xml:86 +msgid "Emitted when a button on this controller is pressed." +msgstr "" + +#: doc/classes/XRController3D.xml:93 +msgid "Emitted when a button on this controller is released." +msgstr "" + +#: doc/classes/XRController3D.xml:100 +msgid "" +"Emitted when the mesh associated with the controller changes or when one " +"becomes available. Generally speaking this will be a static mesh after " +"becoming available." +msgstr "" + +#: doc/classes/XRInterface.xml:4 +msgid "Base class for an AR/VR interface implementation." +msgstr "" + +#: doc/classes/XRInterface.xml:7 +msgid "" +"This class needs to be implemented to make an AR or VR platform available to " +"Godot and these should be implemented as C++ modules or GDNative modules " +"(note that for GDNative the subclass XRScriptInterface should be used). Part " +"of the interface is exposed to GDScript so you can detect, enable and " +"configure an AR or VR platform.\n" +"Interfaces should be written in such a way that simply enabling them will " +"give us a working setup. You can query the available interfaces through " +"[XRServer]." +msgstr "" + +#: doc/classes/XRInterface.xml:18 +msgid "" +"If this is an AR interface that requires displaying a camera feed as the " +"background, this method returns the feed ID in the [CameraServer] for this " +"interface." +msgstr "" + +#: doc/classes/XRInterface.xml:25 +msgid "" +"Returns a combination of [enum Capabilities] flags providing information " +"about the capabilities of this interface." +msgstr "" + +#: doc/classes/XRInterface.xml:32 +msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." +msgstr "" + +#: doc/classes/XRInterface.xml:39 +msgid "" +"Returns the resolution at which we should render our intermediate results " +"before things like lens distortion are applied by the VR platform." +msgstr "" + +#: doc/classes/XRInterface.xml:46 +msgid "" +"If supported, returns the status of our tracking. This will allow you to " +"provide feedback to the user whether there are issues with positional " +"tracking." +msgstr "" + +#: doc/classes/XRInterface.xml:53 +msgid "" +"Call this to initialize this interface. The first interface that is " +"initialized is identified as the primary interface and it will be used for " +"rendering output.\n" +"After initializing the interface you want to use you then need to enable the " +"AR/VR mode of a viewport and rendering should commence.\n" +"[b]Note:[/b] You must enable the AR/VR mode on the main viewport for any " +"device that uses the main output of Godot, such as for mobile VR.\n" +"If you do this for a platform that handles its own output (such as OpenVR) " +"Godot will show just one eye without distortion on screen. Alternatively, " +"you can add a separate viewport node to your scene and enable AR/VR on that " +"viewport. It will be used to output to the HMD, leaving you free to do " +"anything you like in the main window, such as using a separate camera as a " +"spectator camera or rendering something completely different.\n" +"While currently not used, you can activate additional interfaces. You may " +"wish to do this if you want to track controllers from other platforms. " +"However, at this point in time only one interface can render to an HMD." +msgstr "" + +#: doc/classes/XRInterface.xml:64 +msgid "" +"Returns [code]true[/code] if the current output of this interface is in " +"stereo." +msgstr "" + +#: doc/classes/XRInterface.xml:71 +msgid "Turns the interface off." +msgstr "" + +#: doc/classes/XRInterface.xml:77 +msgid "On an AR interface, [code]true[/code] if anchor detection is enabled." +msgstr "" + +#: doc/classes/XRInterface.xml:80 +msgid "[code]true[/code] if this interface been initialized." +msgstr "" + +#: doc/classes/XRInterface.xml:83 +msgid "[code]true[/code] if this is the primary interface." +msgstr "" + +#: doc/classes/XRInterface.xml:88 +msgid "No XR capabilities." +msgstr "" + +#: doc/classes/XRInterface.xml:91 +msgid "" +"This interface can work with normal rendering output (non-HMD based AR)." +msgstr "" + +#: doc/classes/XRInterface.xml:94 +msgid "This interface supports stereoscopic rendering." +msgstr "" + +#: doc/classes/XRInterface.xml:97 +msgid "This interface supports AR (video background and real world tracking)." +msgstr "" + +#: doc/classes/XRInterface.xml:100 +msgid "" +"This interface outputs to an external device. If the main viewport is used, " +"the on screen output is an unmodified buffer of either the left or right eye " +"(stretched if the viewport size is not changed to the same aspect ratio of " +"[method get_render_targetsize]). Using a separate viewport node frees up the " +"main viewport for other purposes." +msgstr "" + +#: doc/classes/XRInterface.xml:103 +msgid "" +"Mono output, this is mostly used internally when retrieving positioning " +"information for our camera node or when stereo scopic rendering is not " +"supported." +msgstr "" + +#: doc/classes/XRInterface.xml:106 +msgid "" +"Left eye output, this is mostly used internally when rendering the image for " +"the left eye and obtaining positioning and projection information." +msgstr "" + +#: doc/classes/XRInterface.xml:109 +msgid "" +"Right eye output, this is mostly used internally when rendering the image " +"for the right eye and obtaining positioning and projection information." +msgstr "" + +#: doc/classes/XRInterface.xml:112 +msgid "Tracking is behaving as expected." +msgstr "" + +#: doc/classes/XRInterface.xml:115 +msgid "" +"Tracking is hindered by excessive motion (the player is moving faster than " +"tracking can keep up)." +msgstr "" + +#: doc/classes/XRInterface.xml:118 +msgid "" +"Tracking is hindered by insufficient features, it's too dark (for camera-" +"based tracking), player is blocked, etc." +msgstr "" + +#: doc/classes/XRInterface.xml:121 +msgid "" +"We don't know the status of the tracking or this interface does not provide " +"feedback." +msgstr "" + +#: doc/classes/XRInterface.xml:124 +msgid "" +"Tracking is not functional (camera not plugged in or obscured, lighthouses " +"turned off, etc.)." +msgstr "" + +#: modules/gdnative/doc_classes/XRInterfaceGDNative.xml:4 +msgid "GDNative wrapper for an XR interface." +msgstr "" + +#: modules/gdnative/doc_classes/XRInterfaceGDNative.xml:7 +msgid "" +"This is a wrapper class for GDNative implementations of the XR interface. To " +"use a GDNative XR interface, simply instantiate this object and set your " +"GDNative library containing the XR interface implementation." +msgstr "" + +#: doc/classes/XROrigin3D.xml:4 +msgid "The origin point in AR/VR." +msgstr "" + +#: doc/classes/XROrigin3D.xml:7 +msgid "" +"This is a special node within the AR/VR system that maps the physical " +"location of the center of our tracking space to the virtual location within " +"our game world.\n" +"There should be only one of these nodes in your scene and you must have one. " +"All the XRCamera3D, XRController3D and XRAnchor3D nodes should be direct " +"children of this node for spatial tracking to work correctly.\n" +"It is the position of this node that you update when your character needs to " +"move through your game world while we're not moving in the real world. " +"Movement in the real world is always in relation to this origin point.\n" +"For example, if your character is driving a car, the XROrigin3D node should " +"be a child node of this car. Or, if you're implementing a teleport system to " +"move your character, you should change the position of this node." +msgstr "" + +#: doc/classes/XROrigin3D.xml:19 +msgid "" +"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.\n" +"[b]Note:[/b] This method is a passthrough to the [XRServer] itself." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:4 +msgid "A tracked object." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:7 +msgid "" +"An instance of this object represents a device that is tracked, such as a " +"controller or anchor point. HMDs aren't represented here as they are handled " +"internally.\n" +"As controllers are turned on and the AR/VR interface detects them, instances " +"of this object are automatically added to this list of active tracking " +"objects accessible through the [XRServer].\n" +"The [XRController3D] and [XRAnchor3D] both consume objects of this type and " +"should be used in your project. The positional trackers are just under-the-" +"hood objects that make this all work. These are mostly exposed so that " +"GDNative-based interfaces can interact with them." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:19 +msgid "" +"Returns the hand holding this tracker, if known. See [enum TrackerHand] " +"constants." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:26 +msgid "" +"If this is a controller that is being tracked, the controller will also be " +"represented by a joystick entry with this ID." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:33 +msgid "" +"Returns the mesh related to a controller or anchor point if one is available." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:40 +msgid "Returns the controller or anchor point's name if available." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:47 +msgid "Returns the controller's orientation matrix." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:54 +msgid "Returns the world-space controller position." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:61 +msgid "" +"Returns the internal tracker ID. This uniquely identifies the tracker per " +"tracker type and matches the ID you need to specify for nodes such as the " +"[XRController3D] and [XRAnchor3D] nodes." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:68 +msgid "Returns [code]true[/code] if this device tracks orientation." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:75 +msgid "Returns [code]true[/code] if this device tracks position." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:84 +msgid "Returns the transform combining this device's orientation and position." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:91 +msgid "Returns the tracker's type." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:97 +msgid "" +"The degree to which the tracker rumbles. Ranges from [code]0.0[/code] to " +"[code]1.0[/code] with precision [code].01[/code]." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:102 +msgid "The hand this tracker is held in is unknown or not applicable." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:105 +msgid "This tracker is the left hand controller." +msgstr "" + +#: doc/classes/XRPositionalTracker.xml:108 +msgid "This tracker is the right hand controller." +msgstr "" + +#: doc/classes/XRServer.xml:4 +msgid "Server for AR and VR features." +msgstr "" + +#: doc/classes/XRServer.xml:7 +msgid "" +"The AR/VR server is the heart of our Advanced and Virtual Reality solution " +"and handles all the processing." +msgstr "" + +#: doc/classes/XRServer.xml:21 +msgid "" +"This is an important function to understand correctly. AR and VR platforms " +"all handle positioning slightly differently.\n" +"For platforms that do not offer spatial tracking, our origin point (0,0,0) " +"is the location of our HMD, but you have little control over the direction " +"the player is facing in the real world.\n" +"For platforms that do offer spatial tracking, our origin point depends very " +"much on the system. For OpenVR, our origin point is usually the center of " +"the tracking space, on the ground. For other platforms, it's often the " +"location of the tracking camera.\n" +"This method allows you to center your tracker on the location of the HMD. It " +"will take the current location of the HMD and use that to adjust all your " +"tracking data; in essence, realigning the real world to your player's " +"current position in the game world.\n" +"For this method to produce usable results, tracking information must be " +"available. This often takes a few frames after starting your game.\n" +"You should call this method after a few seconds have passed. For instance, " +"when the user requests a realignment of the display holding a designated " +"button on a controller for a short period of time, or when implementing a " +"teleport mechanism." +msgstr "" + +#: doc/classes/XRServer.xml:35 +msgid "" +"Finds an interface by its name. For instance, if your project uses " +"capabilities of an AR/VR platform, you can find the interface for that " +"platform by name and initialize it." +msgstr "" + +#: doc/classes/XRServer.xml:42 +msgid "Returns the primary interface's transformation." +msgstr "" + +#: doc/classes/XRServer.xml:51 +msgid "" +"Returns the interface registered at a given index in our list of interfaces." +msgstr "" + +#: doc/classes/XRServer.xml:58 +msgid "" +"Returns the number of interfaces currently registered with the AR/VR server. " +"If your project supports multiple AR/VR platforms, you can look through the " +"available interface, and either present the user with a selection or simply " +"try to initialize each interface and use the first one that returns " +"[code]true[/code]." +msgstr "" + +#: doc/classes/XRServer.xml:65 +msgid "" +"Returns a list of available interfaces the ID and name of each interface." +msgstr "" + +#: doc/classes/XRServer.xml:72 +msgid "" +"Returns the absolute timestamp (in μs) of the last [XRServer] commit of the " +"AR/VR eyes to [RenderingServer]. The value comes from an internal call to " +"[method OS.get_ticks_usec]." +msgstr "" + +#: doc/classes/XRServer.xml:79 +msgid "" +"Returns the duration (in μs) of the last frame. This is computed as the " +"difference between [method get_last_commit_usec] and [method " +"get_last_process_usec] when committing." +msgstr "" + +#: doc/classes/XRServer.xml:86 +msgid "" +"Returns the absolute timestamp (in μs) of the last [XRServer] process " +"callback. The value comes from an internal call to [method OS." +"get_ticks_usec]." +msgstr "" + +#: doc/classes/XRServer.xml:93 +msgid "" +"Returns the reference frame transform. Mostly used internally and exposed " +"for GDNative build interfaces." +msgstr "" + +#: doc/classes/XRServer.xml:102 +msgid "Returns the positional tracker at the given ID." +msgstr "" + +#: doc/classes/XRServer.xml:109 +msgid "Returns the number of trackers currently registered." +msgstr "" + +#: doc/classes/XRServer.xml:115 +msgid "The primary [XRInterface] currently bound to the [XRServer]." +msgstr "" + +#: doc/classes/XRServer.xml:118 +msgid "" +"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." +msgstr "" + +#: doc/classes/XRServer.xml:126 +msgid "Emitted when a new interface has been added." +msgstr "" + +#: doc/classes/XRServer.xml:133 +msgid "Emitted when an interface is removed." +msgstr "" + +#: doc/classes/XRServer.xml:144 +msgid "" +"Emitted when a new tracker has been added. If you don't use a fixed number " +"of controllers or if you're using [XRAnchor3D]s for an AR solution, it is " +"important to react to this signal to add the appropriate [XRController3D] or " +"[XRAnchor3D] nodes related to this new tracker." +msgstr "" + +#: doc/classes/XRServer.xml:155 +msgid "" +"Emitted when a tracker is removed. You should remove any [XRController3D] or " +"[XRAnchor3D] points if applicable. This is not mandatory, the nodes simply " +"become inactive and will be made active again when a new tracker becomes " +"available (i.e. a new controller is switched on that takes the place of the " +"previous one)." +msgstr "" + +#: doc/classes/XRServer.xml:161 +msgid "The tracker tracks the location of a controller." +msgstr "" + +#: doc/classes/XRServer.xml:164 +msgid "The tracker tracks the location of a base station." +msgstr "" + +#: doc/classes/XRServer.xml:167 +msgid "The tracker tracks the location and size of an AR anchor." +msgstr "" + +#: doc/classes/XRServer.xml:170 +msgid "Used internally to filter trackers of any known type." +msgstr "" + +#: doc/classes/XRServer.xml:173 +msgid "Used internally if we haven't set the tracker type yet." +msgstr "" + +#: doc/classes/XRServer.xml:176 +msgid "Used internally to select all trackers." +msgstr "" + +#: doc/classes/XRServer.xml:179 +msgid "" +"Fully reset the orientation of the HMD. Regardless of what direction the " +"user is looking to in the real world. The user will look dead ahead in the " +"virtual world." +msgstr "" + +#: doc/classes/XRServer.xml:182 +msgid "" +"Resets the orientation but keeps the tilt of the device. So if we're looking " +"down, we keep looking down but heading will be reset." +msgstr "" + +#: doc/classes/XRServer.xml:185 +msgid "" +"Does not reset the orientation of the HMD, only the position of the player " +"gets centered." +msgstr "" + #: doc/classes/YSort.xml:4 msgid "Sort all child nodes based on their Y positions." msgstr "" diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index 37b729d568..28f06f939c 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -277,9 +277,8 @@ void RasterizerGLES2::begin_frame(double frame_step) { frame_step = 0.001; } - // double time_roll_over = GLOBAL_GET("rendering/limits/time/time_rollover_secs"); - // if (time_total > time_roll_over) - // time_total = 0; //roll over every day (should be customz + double time_roll_over = GLOBAL_GET("rendering/limits/time/time_rollover_secs"); + time_total = Math::fmod(time_total, time_roll_over); storage->frame.time[0] = time_total; storage->frame.time[1] = Math::fmod(time_total, 3600); diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index e6a020bf41..57c63dd40d 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -162,7 +162,7 @@ void AnimationBezierTrackEdit::_draw_track(int p_track, const Color &p_color) { float c = (t - low_pos.x) / (high_pos.x - low_pos.x); - h = low_pos.linear_interpolate(high_pos, c).y; + h = low_pos.lerp(high_pos, c).y; } h = _bezier_h_to_pixel(h); @@ -201,12 +201,12 @@ void AnimationBezierTrackEdit::_draw_line_clipped(const Vector2 &p_from, const V if (to.x > p_clip_right) { float c = (p_clip_right - from.x) / (to.x - from.x); - to = from.linear_interpolate(to, c); + to = from.lerp(to, c); } if (from.x < p_clip_left) { float c = (p_clip_left - from.x) / (to.x - from.x); - from = from.linear_interpolate(to, c); + from = from.lerp(to, c); } draw_line(from, to, p_color); diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp index 695c294ad2..0ce3ab292e 100644 --- a/editor/animation_track_editor_plugins.cpp +++ b/editor/animation_track_editor_plugins.cpp @@ -112,13 +112,13 @@ void AnimationTrackEditColor::draw_key_link(int p_index, float p_pixels_sec, int if (x_from < p_clip_left) { float c = float(p_clip_left - x_from) / (x_to - x_from); - color = color.linear_interpolate(color_next, c); + color = color.lerp(color_next, c); x_from = p_clip_left; } if (x_to > p_clip_right) { float c = float(p_clip_right - x_from) / (x_to - x_from); - color_next = color.linear_interpolate(color_next, c); + color_next = color.lerp(color_next, c); x_to = p_clip_right; } diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index 1577e24ac0..c7d4e9128a 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -136,7 +136,7 @@ Color EditorProfiler::_get_color_from_signature(const StringName &p_signature) c double rot = ABS(double(p_signature.hash()) / double(0x7FFFFFFF)); Color c; c.set_hsv(rot, bc.get_s(), bc.get_v()); - return c.linear_interpolate(get_theme_color("base_color", "Editor"), 0.07); + return c.lerp(get_theme_color("base_color", "Editor"), 0.07); } void EditorProfiler::_item_edited() { diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp index d2edba5970..7d2822b1c9 100644 --- a/editor/debugger/editor_visual_profiler.cpp +++ b/editor/debugger/editor_visual_profiler.cpp @@ -132,7 +132,7 @@ Color EditorVisualProfiler::_get_color_from_signature(const StringName &p_signat double rot = ABS(double(p_signature.hash()) / double(0x7FFFFFFF)); Color c; c.set_hsv(rot, bc.get_s(), bc.get_v()); - return c.linear_interpolate(get_theme_color("base_color", "Editor"), 0.07); + return c.lerp(get_theme_color("base_color", "Editor"), 0.07); } void EditorVisualProfiler::_item_selected() { diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index 81a7d85b18..152989f90b 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -31,6 +31,7 @@ #include "script_editor_debugger.h" #include "core/debugger/debugger_marshalls.h" +#include "core/debugger/remote_debugger.h" #include "core/io/marshalls.h" #include "core/project_settings.h" #include "core/ustring.h" @@ -396,10 +397,33 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da inspector->add_stack_variable(p_data); } else if (p_msg == "output") { - ERR_FAIL_COND(p_data.size() < 1); + ERR_FAIL_COND(p_data.size() != 2); + ERR_FAIL_COND(p_data[0].get_type() != Variant::PACKED_STRING_ARRAY); - Vector<String> strings = p_data[0]; - EditorNode::get_log()->add_message(String("\n").join(strings)); + Vector<String> output_strings = p_data[0]; + + ERR_FAIL_COND(p_data[1].get_type() != Variant::PACKED_INT32_ARRAY); + Vector<int> output_types = p_data[1]; + + ERR_FAIL_COND(output_strings.size() != output_types.size()); + + for (int i = 0; i < output_strings.size(); i++) { + RemoteDebugger::MessageType type = (RemoteDebugger::MessageType)(int)(output_types[i]); + EditorLog::MessageType msg_type; + switch (type) { + case RemoteDebugger::MESSAGE_TYPE_LOG: { + msg_type = EditorLog::MSG_TYPE_STD; + } break; + case RemoteDebugger::MESSAGE_TYPE_ERROR: { + msg_type = EditorLog::MSG_TYPE_ERROR; + } break; + default: { + WARN_PRINT("Unhandled script debugger message type: " + itos(type)); + msg_type = EditorLog::MSG_TYPE_STD; + } break; + } + EditorNode::get_log()->add_message(output_strings[i], msg_type); + } } else if (p_msg == "performance:profile_frame") { Vector<float> p; p.resize(p_data.size()); diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index 75d1b2595a..b566ad0fa4 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -47,12 +47,12 @@ void EditorHelp::_init_colors() { title_color = get_theme_color("accent_color", "Editor"); text_color = get_theme_color("default_color", "RichTextLabel"); headline_color = get_theme_color("headline_color", "EditorHelp"); - base_type_color = title_color.linear_interpolate(text_color, 0.5); + base_type_color = title_color.lerp(text_color, 0.5); comment_color = text_color * Color(1, 1, 1, 0.6); symbol_color = comment_color; value_color = text_color * Color(1, 1, 1, 0.6); qualifier_color = text_color * Color(1, 1, 1, 0.8); - type_color = get_theme_color("accent_color", "Editor").linear_interpolate(text_color, 0.5); + type_color = get_theme_color("accent_color", "Editor").lerp(text_color, 0.5); class_desc->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4)); class_desc->add_theme_constant_override("line_separation", Math::round(5 * EDSCALE)); } @@ -196,7 +196,7 @@ void EditorHelp::_add_type(const String &p_type, const String &p_enum) { } } const Color text_color = get_theme_color("default_color", "RichTextLabel"); - const Color type_color = get_theme_color("accent_color", "Editor").linear_interpolate(text_color, 0.5); + const Color type_color = get_theme_color("accent_color", "Editor").lerp(text_color, 0.5); class_desc->push_color(type_color); bool add_array = false; if (can_ref) { @@ -1052,6 +1052,7 @@ void EditorHelp::_update_doc() { class_desc->pop(); // color class_desc->pop(); // font class_desc->pop(); // cell + method_line[cd.properties[i].setter] = property_line[cd.properties[i].name]; } if (cd.properties[i].getter != "") { @@ -1069,6 +1070,7 @@ void EditorHelp::_update_doc() { class_desc->pop(); //color class_desc->pop(); //font class_desc->pop(); //cell + method_line[cd.properties[i].getter] = property_line[cd.properties[i].name]; } class_desc->pop(); // table @@ -1227,9 +1229,9 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { Color font_color_hl = p_rt->get_theme_color("headline_color", "EditorHelp"); Color accent_color = p_rt->get_theme_color("accent_color", "Editor"); Color property_color = p_rt->get_theme_color("property_color", "Editor"); - Color link_color = accent_color.linear_interpolate(font_color_hl, 0.8); - Color code_color = accent_color.linear_interpolate(font_color_hl, 0.6); - Color kbd_color = accent_color.linear_interpolate(property_color, 0.6); + Color link_color = accent_color.lerp(font_color_hl, 0.8); + Color code_color = accent_color.lerp(font_color_hl, 0.6); + Color kbd_color = accent_color.lerp(property_color, 0.6); String bbcode = p_bbcode.dedent().replace("\t", "").replace("\r", "").strip_edges(); diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index 8fcd5bacb6..6adc640651 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -501,18 +501,20 @@ bool EditorPropertyRevert::can_property_revert(Object *p_object, const StringNam } } - if (p_object->call("property_can_revert", p_property).operator bool()) { - - has_revert = true; - } - - if (!has_revert && !p_object->get_script().is_null()) { - Ref<Script> scr = p_object->get_script(); - if (scr.is_valid()) { - Variant orig_value; - if (scr->get_property_default_value(p_property, orig_value)) { - if (orig_value != p_object->get(p_property)) { - has_revert = true; + // If the object implements property_can_revert, rely on that completely + // (i.e. don't then try to revert to default value - the property_get_revert implementation + // can do that if so desired) + if (p_object->has_method("property_can_revert")) { + has_revert = p_object->call("property_can_revert", p_property).operator bool(); + } else { + if (!has_revert && !p_object->get_script().is_null()) { + Ref<Script> scr = p_object->get_script(); + if (scr.is_valid()) { + Variant orig_value; + if (scr->get_property_default_value(p_property, orig_value)) { + if (orig_value != p_object->get(p_property)) { + has_revert = true; + } } } } diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index ea2009ab58..90cea06439 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -1747,7 +1747,7 @@ void EditorNode::push_item(Object *p_object, const String &p_property, bool p_in void EditorNode::_save_default_environment() { - Ref<Environment> fallback = get_tree()->get_root()->get_world()->get_fallback_environment(); + Ref<Environment> fallback = get_tree()->get_root()->get_world_3d()->get_fallback_environment(); if (fallback.is_valid() && fallback->get_path().is_resource_file()) { Map<RES, bool> processed; diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index 1506c574dd..2c70e16610 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -36,6 +36,9 @@ #include "editor_scale.h" String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const { + if (grabber->is_visible()) { + return rtos(get_value()) + "\n\n" + TTR("Hold Ctrl to round to integers. Hold Shift for more precise changes."); + } return rtos(get_value()); } @@ -111,7 +114,21 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { } if (grabbing_spinner) { + // Don't make the user scroll all the way back to 'in range' if they went off the end. + if (pre_grab_value < get_min() && !is_lesser_allowed()) { + pre_grab_value = get_min(); + } + if (pre_grab_value > get_max() && !is_greater_allowed()) { + pre_grab_value = get_max(); + } + if (mm->get_control()) { + // If control was just pressed, don't make the value do a huge jump in magnitude. + if (grabbing_spinner_dist_cache != 0) { + pre_grab_value += grabbing_spinner_dist_cache * get_step(); + grabbing_spinner_dist_cache = 0; + } + set_value(Math::round(pre_grab_value + get_step() * grabbing_spinner_dist_cache * 10)); } else { set_value(pre_grab_value + get_step() * grabbing_spinner_dist_cache); diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 576ee436de..0ef173f074 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -337,24 +337,24 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { //Colors bool dark_theme = EditorSettings::get_singleton()->is_dark_theme(); - const Color dark_color_1 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast); - const Color dark_color_2 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast * 1.5); - const Color dark_color_3 = base_color.linear_interpolate(Color(0, 0, 0, 1), contrast * 2); + const Color dark_color_1 = base_color.lerp(Color(0, 0, 0, 1), contrast); + const Color dark_color_2 = base_color.lerp(Color(0, 0, 0, 1), contrast * 1.5); + const Color dark_color_3 = base_color.lerp(Color(0, 0, 0, 1), contrast * 2); const Color background_color = dark_color_2; // white (dark theme) or black (light theme), will be used to generate the rest of the colors const Color mono_color = dark_theme ? Color(1, 1, 1) : Color(0, 0, 0); - const Color contrast_color_1 = base_color.linear_interpolate(mono_color, MAX(contrast, default_contrast)); - const Color contrast_color_2 = base_color.linear_interpolate(mono_color, MAX(contrast * 1.5, default_contrast * 1.5)); + const Color contrast_color_1 = base_color.lerp(mono_color, MAX(contrast, default_contrast)); + const Color contrast_color_2 = base_color.lerp(mono_color, MAX(contrast * 1.5, default_contrast * 1.5)); - const Color font_color = mono_color.linear_interpolate(base_color, 0.25); - const Color font_color_hl = mono_color.linear_interpolate(base_color, 0.15); + const Color font_color = mono_color.lerp(base_color, 0.25); + const Color font_color_hl = mono_color.lerp(base_color, 0.15); const Color font_color_disabled = Color(mono_color.r, mono_color.g, mono_color.b, 0.3); const Color font_color_selection = accent_color * Color(1, 1, 1, 0.4); - const Color color_disabled = mono_color.inverted().linear_interpolate(base_color, 0.7); - const Color color_disabled_bg = mono_color.inverted().linear_interpolate(base_color, 0.9); + const Color color_disabled = mono_color.inverted().lerp(base_color, 0.7); + const Color color_disabled_bg = mono_color.inverted().lerp(base_color, 0.9); Color icon_color_hover = Color(1, 1, 1) * (dark_theme ? 1.15 : 1.45); icon_color_hover.a = 1.0; @@ -391,13 +391,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Color success_color = Color(0.45, 0.95, 0.5); Color warning_color = Color(1, 0.87, 0.4); Color error_color = Color(1, 0.47, 0.42); - Color property_color = font_color.linear_interpolate(Color(0.5, 0.5, 0.5), 0.5); + Color property_color = font_color.lerp(Color(0.5, 0.5, 0.5), 0.5); if (!dark_theme) { // Darken some colors to be readable on a light background - success_color = success_color.linear_interpolate(mono_color, 0.35); - warning_color = warning_color.linear_interpolate(mono_color, 0.35); - error_color = error_color.linear_interpolate(mono_color, 0.25); + success_color = success_color.lerp(mono_color, 0.35); + warning_color = warning_color.lerp(mono_color, 0.35); + error_color = error_color.lerp(mono_color, 0.25); } theme->set_color("success_color", "Editor", success_color); @@ -434,7 +434,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { editor_register_fonts(theme); // Highlighted tabs and border width - Color tab_color = highlight_tabs ? base_color.linear_interpolate(font_color, contrast) : base_color; + Color tab_color = highlight_tabs ? base_color.lerp(font_color, contrast) : base_color; const int border_width = CLAMP(border_size, 0, 3) * EDSCALE; const int default_margin_size = 4; @@ -686,7 +686,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_icon("visibility_xray", "PopupMenu", theme->get_icon("GuiVisibilityXray", "EditorIcons")); theme->set_constant("vseparation", "PopupMenu", (extra_spacing + default_margin_size + 1) * EDSCALE); - Ref<StyleBoxFlat> sub_inspector_bg = make_flat_stylebox(dark_color_1.linear_interpolate(accent_color, 0.08), 2, 0, 2, 2); + Ref<StyleBoxFlat> sub_inspector_bg = make_flat_stylebox(dark_color_1.lerp(accent_color, 0.08), 2, 0, 2, 2); sub_inspector_bg->set_border_width(MARGIN_LEFT, 2); sub_inspector_bg->set_border_width(MARGIN_RIGHT, 2); sub_inspector_bg->set_border_width(MARGIN_BOTTOM, 2); @@ -763,9 +763,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("title_button_hover", "Tree", style_tree_title); theme->set_stylebox("title_button_pressed", "Tree", style_tree_title); - Color prop_category_color = dark_color_1.linear_interpolate(mono_color, 0.12); - Color prop_section_color = dark_color_1.linear_interpolate(mono_color, 0.09); - Color prop_subsection_color = dark_color_1.linear_interpolate(mono_color, 0.06); + Color prop_category_color = dark_color_1.lerp(mono_color, 0.12); + Color prop_section_color = dark_color_1.lerp(mono_color, 0.09); + Color prop_subsection_color = dark_color_1.lerp(mono_color, 0.06); theme->set_color("prop_category", "Editor", prop_category_color); theme->set_color("prop_section", "Editor", prop_section_color); theme->set_color("prop_subsection", "Editor", prop_subsection_color); @@ -1124,7 +1124,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_icon("toggle_hidden", "FileDialog", theme->get_icon("GuiVisibilityVisible", "EditorIcons")); // Use a different color for folder icons to make them easier to distinguish from files. // On a light theme, the icon will be dark, so we need to lighten it before blending it with the accent color. - theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).linear_interpolate(accent_color, 0.7)); + theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).lerp(accent_color, 0.7)); theme->set_color("files_disabled", "FileDialog", font_color_disabled); // color picker @@ -1158,13 +1158,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // editor main color const Color main_color = dark_theme ? Color(0.34, 0.7, 1.0) : Color(0.02, 0.5, 1.0); - const Color symbol_color = Color(0.34, 0.57, 1.0).linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3); + const Color symbol_color = Color(0.34, 0.57, 1.0).lerp(mono_color, dark_theme ? 0.5 : 0.3); const Color keyword_color = Color(1.0, 0.44, 0.52); const Color basetype_color = dark_theme ? Color(0.26, 1.0, 0.76) : Color(0.0, 0.76, 0.38); - const Color type_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.4 : 0.3); - const Color usertype_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.7 : 0.5); + const Color type_color = basetype_color.lerp(mono_color, dark_theme ? 0.4 : 0.3); + const Color usertype_color = basetype_color.lerp(mono_color, dark_theme ? 0.7 : 0.5); const Color comment_color = dim_color; - const Color string_color = (dark_theme ? Color(1.0, 0.85, 0.26) : Color(1.0, 0.82, 0.09)).linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3); + const Color string_color = (dark_theme ? Color(1.0, 0.85, 0.26) : Color(1.0, 0.82, 0.09)).lerp(mono_color, dark_theme ? 0.5 : 0.3); const Color te_background_color = dark_theme ? background_color : base_color; const Color completion_background_color = dark_theme ? base_color : background_color; @@ -1183,9 +1183,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color current_line_color = alpha1; const Color line_length_guideline_color = dark_theme ? base_color : background_color; const Color word_highlighted_color = alpha1; - const Color number_color = basetype_color.linear_interpolate(mono_color, dark_theme ? 0.5 : 0.3); + const Color number_color = basetype_color.lerp(mono_color, dark_theme ? 0.5 : 0.3); const Color function_color = main_color; - const Color member_variable_color = main_color.linear_interpolate(mono_color, 0.6); + const Color member_variable_color = main_color.lerp(mono_color, 0.6); const Color mark_color = Color(error_color.r, error_color.g, error_color.b, 0.3); const Color bookmark_color = Color(0.08, 0.49, 0.98); const Color breakpoint_color = error_color; diff --git a/editor/node_3d_editor_gizmos.cpp b/editor/node_3d_editor_gizmos.cpp index 31a8320209..c321e85546 100644 --- a/editor/node_3d_editor_gizmos.cpp +++ b/editor/node_3d_editor_gizmos.cpp @@ -169,7 +169,7 @@ void EditorNode3DGizmo::set_spatial_node(Node3D *p_node) { void EditorNode3DGizmo::Instance::create_instance(Node3D *p_base, bool p_hidden) { - instance = RS::get_singleton()->instance_create2(mesh->get_rid(), p_base->get_world()->get_scenario()); + instance = RS::get_singleton()->instance_create2(mesh->get_rid(), p_base->get_world_3d()->get_scenario()); RS::get_singleton()->instance_attach_object_instance_id(instance, p_base->get_instance_id()); if (skin_reference.is_valid()) { RS::get_singleton()->instance_attach_skeleton(instance, skin_reference->get_skeleton()); @@ -486,11 +486,12 @@ bool EditorNode3DGizmo::intersect_frustum(const Camera3D *p_camera, const Vector Vector<Plane> transformed_frustum; - for (int i = 0; i < 4; i++) { + for (int i = 0; i < p_frustum.size(); i++) { transformed_frustum.push_back(it.xform(p_frustum[i])); } - if (collision_mesh->inside_convex_shape(transformed_frustum.ptr(), transformed_frustum.size(), mesh_scale)) { + Vector<Vector3> convex_points = Geometry::compute_convex_mesh_points(p_frustum.ptr(), p_frustum.size()); + if (collision_mesh->inside_convex_shape(transformed_frustum.ptr(), transformed_frustum.size(), convex_points.ptr(), convex_points.size(), mesh_scale)) { return true; } } @@ -2827,10 +2828,10 @@ void DecalGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { lines.push_back(a); lines.push_back(b); } else { - Vector3 ah = a.linear_interpolate(b, 0.2); + Vector3 ah = a.lerp(b, 0.2); lines.push_back(a); lines.push_back(ah); - Vector3 bh = b.linear_interpolate(a, 0.2); + Vector3 bh = b.lerp(a, 0.2); lines.push_back(b); lines.push_back(bh); } diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index c28f533958..ed51a2d2cf 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -885,7 +885,7 @@ void AnimationNodeStateMachineEditor::_state_machine_pos_draw() { state_machine_play_pos->draw_line(from, to, bg, 2); - to = from.linear_interpolate(to, c); + to = from.lerp(to, c); state_machine_play_pos->draw_line(from, to, fg, 2); } diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 79111762b2..e882b3a8d7 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1437,13 +1437,13 @@ void CanvasItemEditor::_solve_IK(Node2D *leaf_node, Point2 target_position) { Vector2 direction = (joints_pos[node_id + 1] - joints_pos[node_id]).normalized(); int len = E->get(); if (E == se->pre_drag_bones_length.front()) { - joints_pos[1] = joints_pos[1].linear_interpolate(joints_pos[0] + len * direction, solver_k); + joints_pos[1] = joints_pos[1].lerp(joints_pos[0] + len * direction, solver_k); } else if (E == se->pre_drag_bones_length.back()) { - joints_pos[node_id] = joints_pos[node_id].linear_interpolate(joints_pos[node_id + 1] - len * direction, solver_k); + joints_pos[node_id] = joints_pos[node_id].lerp(joints_pos[node_id + 1] - len * direction, solver_k); } else { Vector2 center = (joints_pos[node_id + 1] + joints_pos[node_id]) / 2.0; - joints_pos[node_id] = joints_pos[node_id].linear_interpolate(center - (direction * len) / 2.0, solver_k); - joints_pos[node_id + 1] = joints_pos[node_id + 1].linear_interpolate(center + (direction * len) / 2.0, solver_k); + joints_pos[node_id] = joints_pos[node_id].lerp(center - (direction * len) / 2.0, solver_k); + joints_pos[node_id + 1] = joints_pos[node_id + 1].lerp(center + (direction * len) / 2.0, solver_k); } node_id++; } @@ -2698,7 +2698,7 @@ void CanvasItemEditor::_draw_smart_snapping() { void CanvasItemEditor::_draw_rulers() { Color bg_color = get_theme_color("dark_color_2", "Editor"); - Color graduation_color = get_theme_color("font_color", "Editor").linear_interpolate(bg_color, 0.5); + Color graduation_color = get_theme_color("font_color", "Editor").lerp(bg_color, 0.5); Color font_color = get_theme_color("font_color", "Editor"); font_color.a = 0.8; Ref<Font> font = get_theme_font("rulers", "EditorFonts"); @@ -3072,8 +3072,8 @@ void CanvasItemEditor::_draw_control_helpers(Control *control) { Vector2 line_ends[4]; for (int i = 0; i < 4; i++) { float anchor_val = (i >= 2) ? ANCHOR_END - anchors_values[i] : anchors_values[i]; - line_starts[i] = Vector2::linear_interpolate(corners_pos[i], corners_pos[(i + 1) % 4], anchor_val); - line_ends[i] = Vector2::linear_interpolate(corners_pos[(i + 3) % 4], corners_pos[(i + 2) % 4], anchor_val); + line_starts[i] = corners_pos[i].lerp(corners_pos[(i + 1) % 4], anchor_val); + line_ends[i] = corners_pos[(i + 3) % 4].lerp(corners_pos[(i + 2) % 4], anchor_val); anchor_snapped = anchors_values[i] == 0.0 || anchors_values[i] == 0.5 || anchors_values[i] == 1.0; viewport->draw_line(line_starts[i], line_ends[i], anchor_snapped ? color_snapped : color_base, (i == dragged_anchor || (i + 3) % 4 == dragged_anchor) ? 2 : 1); } diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp index eb14495b9c..f63bcb69b8 100644 --- a/editor/plugins/material_editor_plugin.cpp +++ b/editor/plugins/material_editor_plugin.cpp @@ -117,9 +117,9 @@ MaterialEditor::MaterialEditor() { add_child(vc); vc->set_anchors_and_margins_preset(PRESET_WIDE); viewport = memnew(SubViewport); - Ref<World3D> world; - world.instance(); - viewport->set_world(world); //use own world + Ref<World3D> world_3d; + world_3d.instance(); + viewport->set_world_3d(world_3d); //use own world vc->add_child(viewport); viewport->set_disable_input(true); viewport->set_transparent_background(true); diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp index 5e657c3b71..3e603fa499 100644 --- a/editor/plugins/mesh_editor_plugin.cpp +++ b/editor/plugins/mesh_editor_plugin.cpp @@ -116,9 +116,9 @@ void MeshEditor::_bind_methods() { MeshEditor::MeshEditor() { viewport = memnew(SubViewport); - Ref<World3D> world; - world.instance(); - viewport->set_world(world); //use own world + Ref<World3D> world_3d; + world_3d.instance(); + viewport->set_world_3d(world_3d); //use own world add_child(viewport); viewport->set_disable_input(true); viewport->set_msaa(Viewport::MSAA_2X); diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index e0b0fe6b53..55b50f526c 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -268,7 +268,7 @@ void Node3DEditorViewport::_update_camera(float p_interp_delta) { real_t factor = (1.0 / inertia) * p_interp_delta; // We interpolate a different point here, because in freelook mode the focus point (cursor.pos) orbits around eye_pos - camera_cursor.eye_pos = old_camera_cursor.eye_pos.linear_interpolate(cursor.eye_pos, CLAMP(factor, 0, 1)); + camera_cursor.eye_pos = old_camera_cursor.eye_pos.lerp(cursor.eye_pos, CLAMP(factor, 0, 1)); float orbit_inertia = EDITOR_GET("editors/3d/navigation_feel/orbit_inertia"); orbit_inertia = MAX(0.0001, orbit_inertia); @@ -318,7 +318,7 @@ void Node3DEditorViewport::_update_camera(float p_interp_delta) { camera_cursor.y_rot = cursor.y_rot; } - camera_cursor.pos = old_camera_cursor.pos.linear_interpolate(cursor.pos, MIN(1.f, p_interp_delta * (1 / translation_inertia))); + camera_cursor.pos = old_camera_cursor.pos.lerp(cursor.pos, MIN(1.f, p_interp_delta * (1 / translation_inertia))); camera_cursor.distance = Math::lerp(old_camera_cursor.distance, cursor.distance, MIN(1.f, p_interp_delta * (1 / zoom_inertia))); } } @@ -496,7 +496,7 @@ ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos, bool p_append, b Vector3 pos = _get_ray_pos(p_pos); Vector2 shrinked_pos = p_pos / subviewport_container->get_stretch_shrink(); - Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world()->get_scenario()); + Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world_3d()->get_scenario()); Set<Ref<EditorNode3DGizmo>> found_gizmos; Node *edited_scene = get_tree()->get_edited_scene_root(); @@ -563,7 +563,7 @@ void Node3DEditorViewport::_find_items_at_pos(const Point2 &p_pos, bool &r_inclu Vector3 ray = _get_ray(p_pos); Vector3 pos = _get_ray_pos(p_pos); - Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world()->get_scenario()); + Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world_3d()->get_scenario()); Set<Ref<EditorNode3DGizmo>> found_gizmos; r_includes_current = false; @@ -674,19 +674,15 @@ void Node3DEditorViewport::_select_region() { } } - if (!orthogonal) { - Plane near(cam_pos, -_get_camera_normal()); - near.d -= get_znear(); + Plane near(cam_pos, -_get_camera_normal()); + near.d -= get_znear(); + frustum.push_back(near); - frustum.push_back(near); + Plane far = -near; + far.d += get_zfar(); + frustum.push_back(far); - Plane far = -near; - far.d += get_zfar(); - - frustum.push_back(far); - } - - Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_convex(frustum, get_tree()->get_root()->get_world()->get_scenario()); + Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_convex(frustum, get_tree()->get_root()->get_world_3d()->get_scenario()); Vector<Node *> selected; Node *edited_scene = get_tree()->get_edited_scene_root(); @@ -2882,7 +2878,6 @@ void Node3DEditorViewport::_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: { @@ -3141,35 +3136,35 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) { for (int i = 0; i < 3; i++) { move_gizmo_instance[i] = RS::get_singleton()->instance_create(); RS::get_singleton()->instance_set_base(move_gizmo_instance[i], spatial_editor->get_move_gizmo(i)->get_rid()); - RS::get_singleton()->instance_set_scenario(move_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(move_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_visible(move_gizmo_instance[i], false); RS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); RS::get_singleton()->instance_set_layer_mask(move_gizmo_instance[i], layer); move_plane_gizmo_instance[i] = RS::get_singleton()->instance_create(); RS::get_singleton()->instance_set_base(move_plane_gizmo_instance[i], spatial_editor->get_move_plane_gizmo(i)->get_rid()); - RS::get_singleton()->instance_set_scenario(move_plane_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(move_plane_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], false); RS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); RS::get_singleton()->instance_set_layer_mask(move_plane_gizmo_instance[i], layer); rotate_gizmo_instance[i] = RS::get_singleton()->instance_create(); RS::get_singleton()->instance_set_base(rotate_gizmo_instance[i], spatial_editor->get_rotate_gizmo(i)->get_rid()); - RS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false); RS::get_singleton()->instance_geometry_set_cast_shadows_setting(rotate_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); RS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[i], layer); scale_gizmo_instance[i] = RS::get_singleton()->instance_create(); RS::get_singleton()->instance_set_base(scale_gizmo_instance[i], spatial_editor->get_scale_gizmo(i)->get_rid()); - RS::get_singleton()->instance_set_scenario(scale_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(scale_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false); RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); RS::get_singleton()->instance_set_layer_mask(scale_gizmo_instance[i], layer); scale_plane_gizmo_instance[i] = RS::get_singleton()->instance_create(); RS::get_singleton()->instance_set_base(scale_plane_gizmo_instance[i], spatial_editor->get_scale_plane_gizmo(i)->get_rid()); - RS::get_singleton()->instance_set_scenario(scale_plane_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(scale_plane_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false); RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); RS::get_singleton()->instance_set_layer_mask(scale_plane_gizmo_instance[i], layer); @@ -3535,7 +3530,7 @@ Vector3 Node3DEditorViewport::_get_instance_position(const Point2 &p_pos) const Vector3 world_ray = _get_ray(p_pos); Vector3 world_pos = _get_ray_pos(p_pos); - Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(world_pos, world_ray, get_tree()->get_root()->get_world()->get_scenario()); + Vector<ObjectID> instances = RenderingServer::get_singleton()->instances_cull_ray(world_pos, world_ray, get_tree()->get_root()->get_world_3d()->get_scenario()); Set<Ref<EditorNode3DGizmo>> found_gizmos; float closest_dist = MAX_DISTANCE; @@ -4548,7 +4543,7 @@ Object *Node3DEditor::_get_editor_data(Object *p_what) { Node3DEditorSelectedItem *si = memnew(Node3DEditorSelectedItem); si->sp = sp; - si->sbox_instance = RenderingServer::get_singleton()->instance_create2(selection_box->get_rid(), sp->get_world()->get_scenario()); + si->sbox_instance = RenderingServer::get_singleton()->instance_create2(selection_box->get_rid(), sp->get_world_3d()->get_scenario()); RS::get_singleton()->instance_geometry_set_cast_shadows_setting(si->sbox_instance, RS::SHADOW_CASTING_SETTING_OFF); return si; @@ -4570,10 +4565,10 @@ void Node3DEditor::_generate_selection_box() { st->add_color(Color(1.0, 1.0, 0.8, 0.8)); st->add_vertex(a); st->add_color(Color(1.0, 1.0, 0.8, 0.4)); - st->add_vertex(a.linear_interpolate(b, 0.2)); + st->add_vertex(a.lerp(b, 0.2)); st->add_color(Color(1.0, 1.0, 0.8, 0.4)); - st->add_vertex(a.linear_interpolate(b, 0.8)); + st->add_vertex(a.lerp(b, 0.8)); st->add_color(Color(1.0, 1.0, 0.8, 0.8)); st->add_vertex(b); } @@ -5202,7 +5197,7 @@ void Node3DEditor::_init_indicators() { RenderingServer::get_singleton()->mesh_add_surface_from_arrays(origin, RenderingServer::PRIMITIVE_LINES, d); RenderingServer::get_singleton()->mesh_surface_set_material(origin, 0, indicator_mat->get_rid()); - origin_instance = RenderingServer::get_singleton()->instance_create2(origin, get_tree()->get_root()->get_world()->get_scenario()); + origin_instance = RenderingServer::get_singleton()->instance_create2(origin, get_tree()->get_root()->get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_layer_mask(origin_instance, 1 << Node3DEditorViewport::GIZMO_GRID_LAYER); RenderingServer::get_singleton()->instance_geometry_set_cast_shadows_setting(origin_instance, RS::SHADOW_CASTING_SETTING_OFF); @@ -5577,7 +5572,7 @@ void Node3DEditor::_init_grid() { d[RenderingServer::ARRAY_COLOR] = grid_colors[i]; RenderingServer::get_singleton()->mesh_add_surface_from_arrays(grid[i], RenderingServer::PRIMITIVE_LINES, d); RenderingServer::get_singleton()->mesh_surface_set_material(grid[i], 0, indicator_mat->get_rid()); - grid_instance[i] = RenderingServer::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world()->get_scenario()); + grid_instance[i] = RenderingServer::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world_3d()->get_scenario()); RenderingServer::get_singleton()->instance_set_visible(grid_instance[i], grid_visible[i]); RenderingServer::get_singleton()->instance_geometry_set_cast_shadows_setting(grid_instance[i], RS::SHADOW_CASTING_SETTING_OFF); @@ -5722,7 +5717,7 @@ void Node3DEditor::snap_selected_nodes_to_floor() { } } - PhysicsDirectSpaceState3D *ss = get_tree()->get_root()->get_world()->get_direct_space_state(); + PhysicsDirectSpaceState3D *ss = get_tree()->get_root()->get_world_3d()->get_direct_space_state(); PhysicsDirectSpaceState3D::RayResult result; Array keys = snap_data.keys(); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 80d97e7fa9..e6d3f17f12 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -1742,7 +1742,7 @@ void ScriptEditor::_update_script_colors() { int non_zero_hist_size = (hist_size == 0) ? 1 : hist_size; float v = Math::ease((edit_pass - pass) / float(non_zero_hist_size), 0.4); - script_list->set_item_custom_fg_color(i, hot_color.linear_interpolate(cold_color, v)); + script_list->set_item_custom_fg_color(i, hot_color.lerp(cold_color, v)); } } } @@ -3190,7 +3190,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_as", TTR("Save As...")), FILE_SAVE_AS); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/save_all", TTR("Save All"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_MASK_ALT | KEY_S), FILE_SAVE_ALL); file_menu->get_popup()->add_separator(); - file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R), FILE_TOOL_RELOAD_SOFT); + file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/reload_script_soft", TTR("Soft Reload Script"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_R), FILE_TOOL_RELOAD_SOFT); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/copy_path", TTR("Copy Script Path")), FILE_COPY_PATH); file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/show_in_file_system", TTR("Show in FileSystem")), SHOW_IN_FILE_SYSTEM); file_menu->get_popup()->add_separator(); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 1a77eeb9de..c79c97737a 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -978,6 +978,26 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c emit_signal("go_to_help", "class_global:" + result.class_name + ":" + result.class_member); } break; } + } else if (ProjectSettings::get_singleton()->has_setting("autoload/" + p_symbol)) { + //check for Autoload scenes + String path = ProjectSettings::get_singleton()->get("autoload/" + p_symbol); + if (path.begins_with("*")) { + path = path.substr(1, path.length()); + EditorNode::get_singleton()->load_scene(path); + } + } else if (p_symbol.is_rel_path()) { + // Every symbol other than absolute path is relative path so keep this condition at last. + String path = _get_absolute_path(p_symbol); + if (FileAccess::exists(path)) { + List<String> scene_extensions; + ResourceLoader::get_recognized_extensions_for_type("PackedScene", &scene_extensions); + + if (scene_extensions.find(path.get_extension())) { + EditorNode::get_singleton()->load_scene(path); + } else { + EditorNode::get_singleton()->load_resource(path); + } + } } } @@ -991,13 +1011,28 @@ void ScriptTextEditor::_validate_symbol(const String &p_symbol) { } ScriptLanguage::LookupResult result; - if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK) { + if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK || ProjectSettings::get_singleton()->has_setting("autoload/" + p_symbol)) { text_edit->set_highlighted_word(p_symbol); + } else if (p_symbol.is_rel_path()) { + + String path = _get_absolute_path(p_symbol); + if (FileAccess::exists(path)) { + text_edit->set_highlighted_word(p_symbol); + } else { + text_edit->set_highlighted_word(String()); + } + } else { text_edit->set_highlighted_word(String()); } } +String ScriptTextEditor::_get_absolute_path(const String &rel_path) { + String base_path = script->get_path().get_base_dir(); + String path = base_path.plus_file(rel_path); + return path.replace("///", "//").simplify_path(); +} + void ScriptTextEditor::update_toggle_scripts_button() { if (code_editor != nullptr) { code_editor->update_toggle_scripts_button(); diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index 51ce30c831..a0dfba6cc8 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -188,6 +188,8 @@ protected: bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + String _get_absolute_path(const String &rel_path); + public: void _update_connected_methods(); diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index 76e60bb014..34ff34d45b 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -154,14 +154,21 @@ void SpriteFramesEditor::_sheet_add_frames() { int fc = frames->get_frame_count(edited_anim); + AtlasTexture *atlas_source = Object::cast_to<AtlasTexture>(*split_sheet_preview->get_texture()); + + Rect2 region_rect = Rect2(); + + if (atlas_source && atlas_source->get_atlas().is_valid()) + region_rect = atlas_source->get_region(); + for (Set<int>::Element *E = frames_selected.front(); E; E = E->next()) { int idx = E->get(); int width = size.width / h; int height = size.height / v; int xp = idx % h; int yp = (idx - xp) / h; - int x = xp * width; - int y = yp * height; + int x = (xp * width) + region_rect.position.x; + int y = (yp * height) + region_rect.position.y; Ref<AtlasTexture> at; at.instance(); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index a7e737fdd2..35ed29f562 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -546,6 +546,10 @@ void VisualShaderEditor::_update_graph() { Ref<VisualShaderNodeUniform> uniform = vsnode; Ref<VisualShaderNodeFloatUniform> float_uniform = vsnode; Ref<VisualShaderNodeIntUniform> int_uniform = vsnode; + Ref<VisualShaderNodeVec3Uniform> vec3_uniform = vsnode; + Ref<VisualShaderNodeColorUniform> color_uniform = vsnode; + Ref<VisualShaderNodeBooleanUniform> bool_uniform = vsnode; + Ref<VisualShaderNodeTransformUniform> transform_uniform = vsnode; if (uniform.is_valid()) { graph->add_child(node); _update_created_node(node); @@ -571,7 +575,7 @@ void VisualShaderEditor::_update_graph() { //shortcut VisualShaderNode::PortType port_right = vsnode->get_output_port_type(0); node->set_slot(0, false, VisualShaderNode::PORT_TYPE_SCALAR, Color(), true, port_right, type_color[port_right]); - if (!float_uniform.is_valid() && !int_uniform.is_valid()) { + if (!float_uniform.is_valid() && !int_uniform.is_valid() && !vec3_uniform.is_valid() && !color_uniform.is_valid() && !bool_uniform.is_valid() && !transform_uniform.is_valid()) { continue; } } @@ -585,13 +589,16 @@ void VisualShaderEditor::_update_graph() { } } - if (custom_editor && !float_uniform.is_valid() && !int_uniform.is_valid() && vsnode->get_output_port_count() > 0 && vsnode->get_output_port_name(0) == "" && (vsnode->get_input_port_count() == 0 || vsnode->get_input_port_name(0) == "")) { + if (custom_editor && !float_uniform.is_valid() && !int_uniform.is_valid() && !vec3_uniform.is_valid() && !bool_uniform.is_valid() && !transform_uniform.is_valid() && vsnode->get_output_port_count() > 0 && vsnode->get_output_port_name(0) == "" && (vsnode->get_input_port_count() == 0 || vsnode->get_input_port_name(0) == "")) { //will be embedded in first port } else if (custom_editor) { port_offset++; node->add_child(custom_editor); - if (float_uniform.is_valid() || int_uniform.is_valid()) { + if (color_uniform.is_valid()) { + custom_editor->call_deferred("_show_prop_names", true); + } + if (float_uniform.is_valid() || int_uniform.is_valid() || vec3_uniform.is_valid() || bool_uniform.is_valid() || transform_uniform.is_valid()) { custom_editor->call_deferred("_show_prop_names", true); continue; } @@ -2650,7 +2657,7 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Texture", "Input", "Fragment", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), "texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_FRAGMENT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("FragCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "fragcoord"), "fragcoord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); - add_options.push_back(AddOption("LightAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_alpha"), "light_alpha", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("LightAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_alpha"), "light_alpha", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("LightColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_color"), "light_color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("LightHeight", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_height"), "light_height", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("LightUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "light_uv"), "light_uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); @@ -2658,7 +2665,9 @@ VisualShaderEditor::VisualShaderEditor() { add_options.push_back(AddOption("Normal", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "normal"), "normal", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("PointCoord", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "point_coord"), "point_coord", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("ScreenUV", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "screen_uv"), "screen_uv", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ShadowAlpha", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_alpha"), "shadow_alpha", VisualShaderNode::PORT_TYPE_SCALAR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("ShadowColor", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_color"), "shadow_color", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); + add_options.push_back(AddOption("ShadowVec", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_light_shader_mode, "shadow_vec"), "shadow_vec", VisualShaderNode::PORT_TYPE_VECTOR, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("Texture", "Input", "Light", "VisualShaderNodeInput", vformat(input_param_for_fragment_and_light_shader_modes, "texture"), "texture", VisualShaderNode::PORT_TYPE_SAMPLER, VisualShader::TYPE_LIGHT, Shader::MODE_CANVAS_ITEM)); add_options.push_back(AddOption("Extra", "Input", "Vertex", "VisualShaderNodeInput", vformat(input_param_for_vertex_shader_mode, "extra"), "extra", VisualShaderNode::PORT_TYPE_TRANSFORM, VisualShader::TYPE_VERTEX, Shader::MODE_CANVAS_ITEM)); diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index 0266ef6a2b..8ae8d0991d 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -403,7 +403,7 @@ void RenameDialog::_update_preview(String new_text) { // New name is identical to the old one. Don't color it as much to avoid distracting the user. const Color accent_color = EditorNode::get_singleton()->get_gui_base()->get_theme_color("accent_color", "Editor"); const Color text_color = EditorNode::get_singleton()->get_gui_base()->get_theme_color("default_color", "RichTextLabel"); - lbl_preview->add_theme_color_override("font_color", accent_color.linear_interpolate(text_color, 0.5)); + lbl_preview->add_theme_color_override("font_color", accent_color.lerp(text_color, 0.5)); } else { lbl_preview->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("success_color", "Editor")); } diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 92f899a35d..a8aeb05150 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -553,11 +553,12 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { selection.sort_custom<Node::Comparator>(); - for (List<Node *>::Element *E = selection.back(); E; E = E->prev()) { + Node *add_below_node = selection.back()->get(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { Node *node = E->get(); Node *parent = node->get_parent(); - Node *selection_tail = _get_selection_group_tail(node, selection); List<Node *> owned; node->get_owned_by(node->get_owner(), &owned); @@ -575,7 +576,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { dup->set_name(parent->validate_child_name(dup)); - editor_data->get_undo_redo().add_do_method(parent, "add_child_below_node", selection_tail, dup); + editor_data->get_undo_redo().add_do_method(parent, "add_child_below_node", add_below_node, dup); for (List<Node *>::Element *F = owned.front(); F; F = F->next()) { if (!duplimap.has(F->get())) { @@ -583,7 +584,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { continue; } Node *d = duplimap[F->get()]; - editor_data->get_undo_redo().add_do_method(d, "set_owner", selection_tail->get_owner()); + editor_data->get_undo_redo().add_do_method(d, "set_owner", node->get_owner()); } editor_data->get_undo_redo().add_do_method(editor_selection, "add_node", dup); editor_data->get_undo_redo().add_undo_method(parent, "remove_child", dup); @@ -593,6 +594,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { editor_data->get_undo_redo().add_do_method(ed, "live_debug_duplicate_node", edited_scene->get_path_to(node), dup->get_name()); editor_data->get_undo_redo().add_undo_method(ed, "live_debug_remove_node", NodePath(String(edited_scene->get_path_to(parent)).plus_file(dup->get_name()))); + + add_below_node = dup; } editor_data->get_undo_redo().commit_action(); @@ -600,7 +603,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (dupsingle) editor->push_item(dupsingle); - for (List<Node *>::Element *E = editable_children.front(); E; E = E->next()) + for (List<Node *>::Element *E = editable_children.back(); E; E = E->prev()) _toggle_editable_children(E->get()); } break; diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 6181580a68..22358973a0 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -7,7 +7,7 @@ # Basil Al-Khateeb <basil.y.alkhateeb@gmail.com>, 2017. # Jamal Alyafei <jamal.qassim@gmail.com>, 2017. # john lennon <khoanantonio@outlook.com>, 2017. -# Mohammmad Khashashneh <mohammad.rasmi@gmail.com>, 2016. +# Mohammmad Khashashneh <mohammad.rasmi@gmail.com>, 2016, 2020. # Mr ChaosXD <mrchaosxd3@gmail.com>, 2018. # Mrwan Ashraf <mrwan.ashraf94@gmail.com>, 2017. # noureldin sharaf <sharaf.noureldin@yahoo.com>, 2017. @@ -35,12 +35,14 @@ # hshw <shw@tutanota.com>, 2020. # Youssef Harmal <the.coder.crab@gmail.com>, 2020. # Nabeel20 <nabeelandnizam@gmail.com>, 2020. +# merouche djallal <kbordora@gmail.com>, 2020. +# Airbus5717 <Abdussamadf350@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-27 08:24+0000\n" -"Last-Translator: Nabeel20 <nabeelandnizam@gmail.com>\n" +"PO-Revision-Date: 2020-05-05 14:01+0000\n" +"Last-Translator: Anonymous <noreply@weblate.org>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -49,12 +51,12 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "نوع معامل خاطئ للدالة convert()ØŒ إستخدم ثوابت TYPE_*." +msgstr "معامل type خاطئ لدالة Convert, استخدم اØدى الثوابت من مجموعة TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -344,7 +346,7 @@ msgstr "التÙا٠الØلقة المثبتة" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "أدخل Ù…ÙتاØ" +msgstr "أدخل المÙتاØ" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" @@ -594,11 +596,11 @@ msgstr "Ø¥Øد٠المØدد (المجموعة المختارة)" #: editor/animation_track_editor.cpp msgid "Go to Next Step" -msgstr "إذهب إلي الخطوة التالية" +msgstr "إذهب إلى الخطوة التالية" #: editor/animation_track_editor.cpp msgid "Go to Previous Step" -msgstr "إذهب إلي الخطوة السابقة" +msgstr "إذهب إلى الخطوة السابقة" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -671,7 +673,7 @@ msgstr "إختر المقاطع المراد نسخها" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" -msgstr "أنسخ" +msgstr "نسخ" #: editor/animation_track_editor.cpp msgid "Select All/None" @@ -754,13 +756,13 @@ msgstr "تØديد التبويب البرمجي" #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom In" -msgstr "تقريب" +msgstr "تكبير" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom Out" -msgstr "إبعاد" +msgstr "تصغير" #: editor/code_editor.cpp msgid "Reset Zoom" @@ -869,7 +871,7 @@ msgstr "إشارة غير قادر على الاتصال" #: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Close" -msgstr "اغلاق" +msgstr "إغلاق" #: editor/connections_dialog.cpp msgid "Connect" @@ -1100,7 +1102,7 @@ msgstr "متصÙØ Ø§Ù„Ù…ÙˆØ§Ø±Ø¯ أورÙان" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp #: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "مسØ" +msgstr "ØØ°Ù" #: editor/dependency_editor.cpp msgid "Owns" @@ -1716,9 +1718,8 @@ msgid "Current Profile:" msgstr "المل٠(النسخة) الØالية:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Make Current" -msgstr "الØالي:" +msgstr "إجعل الØالي" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp @@ -1838,15 +1839,15 @@ msgstr "ØÙظ ملÙ" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "إرجع للخلÙ" +msgstr "الرجوع للخلÙ" #: editor/editor_file_dialog.cpp msgid "Go Forward" -msgstr "إذهب للأمام" +msgstr "الذهاب للأمام" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "إذهب للأعلي" +msgstr "إذهب للأعلى" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" @@ -1866,51 +1867,43 @@ msgstr "مسار التركيز" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "Øرك المÙÙضلة للأعلي" +msgstr "Øرك المÙÙضلة للأعلى" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" msgstr "Øرك المÙÙضلة للأسÙÙ„" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to previous folder." -msgstr "إذهب إلي المجلد السابق" +msgstr "إرجع إلي المجلد السابق." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "إذهب إلي المجلد السابق" +msgstr "إذهب إلي المجلد التالي." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Go to parent folder." -msgstr "إذهب إلي المجلد السابق" +msgstr "إذهب إلي مجلد الأصل." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Refresh files." -msgstr "إبØØ« ÙÙŠ الأصناÙ" +msgstr "ØَدّÙØ« الملÙات." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "(Un)favorite current folder." -msgstr "لا يمكن إنشاء المجلد." +msgstr "إضاÙØ© المجلد إلى المÙضلة / إخراجه من المÙضلة." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Toggle the visibility of hidden files." -msgstr "أظهر الملÙات المخÙية" +msgstr "إظهار/إخÙاء الملÙات المخÙية." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "View items as a grid of thumbnails." -msgstr "أظهر العناصر كشبكة من الصور المصغرة" +msgstr "أظهر العناصر كشبكة من الصور المصغرة." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "View items as a list." -msgstr "أظهر العناصر كقائمة" +msgstr "أظهر العناصر كقائمة." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -1963,12 +1956,11 @@ msgstr "مورث بواسطة:" #: editor/editor_help.cpp msgid "Description" -msgstr "الوصÙ:" +msgstr "الوصÙ" #: editor/editor_help.cpp -#, fuzzy msgid "Online Tutorials" -msgstr "الدورس علي الإنترنت:" +msgstr "التعليمات على الإنترنت" #: editor/editor_help.cpp msgid "Properties" @@ -1979,9 +1971,8 @@ msgid "override:" msgstr "يتجاوز:" #: editor/editor_help.cpp -#, fuzzy msgid "default:" -msgstr "الإÙتراضي" +msgstr "الاÙتراضي:" #: editor/editor_help.cpp msgid "Methods" @@ -2000,14 +1991,12 @@ msgid "Constants" msgstr "الثوابت" #: editor/editor_help.cpp -#, fuzzy msgid "Property Descriptions" -msgstr "وص٠الملكية:" +msgstr "أوصا٠المÙلكية" #: editor/editor_help.cpp -#, fuzzy msgid "(value)" -msgstr "القيمة:" +msgstr "(القيمة)" #: editor/editor_help.cpp msgid "" @@ -2018,9 +2007,8 @@ msgstr "" "المساهمة واØد [color=$color][url=$url]!" #: editor/editor_help.cpp -#, fuzzy msgid "Method Descriptions" -msgstr "وص٠الطريقة:" +msgstr "أوصا٠الدوال Method" #: editor/editor_help.cpp msgid "" @@ -2033,16 +2021,15 @@ msgstr "" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "إبØØ« ÙÙŠ المساعدة" +msgstr "ابØØ« ÙÙŠ المساعدة" #: editor/editor_help_search.cpp msgid "Case Sensitive" msgstr "Øساسة Ù„Øالة الأØرÙ" #: editor/editor_help_search.cpp -#, fuzzy msgid "Show Hierarchy" -msgstr "أظهر المساعدات" +msgstr "اظهر التراتبية" #: editor/editor_help_search.cpp msgid "Display All" @@ -2069,9 +2056,8 @@ msgid "Properties Only" msgstr "خصائص Ùقط" #: editor/editor_help_search.cpp -#, fuzzy msgid "Theme Properties Only" -msgstr "خصائص" +msgstr "خصائص الموضوع Theme Ùقط" #: editor/editor_help_search.cpp msgid "Member Type" @@ -2079,35 +2065,31 @@ msgstr "نوع العضو" #: editor/editor_help_search.cpp msgid "Class" -msgstr "الصنÙ" +msgstr "الصÙ" #: editor/editor_help_search.cpp -#, fuzzy msgid "Method" -msgstr "قائمة الطرق" +msgstr "دالة" #: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" -msgstr "إشارات" +msgstr "الإشاراة" #: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" msgstr "ثابت" #: editor/editor_help_search.cpp -#, fuzzy msgid "Property" -msgstr "خصيصة:" +msgstr "خاصية" #: editor/editor_help_search.cpp -#, fuzzy msgid "Theme Property" -msgstr "خصائص الثمة" +msgstr "خاصية الموضوع Theme" #: editor/editor_inspector.cpp editor/project_settings_editor.cpp msgid "Property:" -msgstr "خصيصة:" +msgstr "خاصية:" #: editor/editor_inspector.cpp msgid "Set" @@ -2119,12 +2101,11 @@ msgstr "تØديد التكرار:" #: editor/editor_log.cpp msgid "Output:" -msgstr "الخرج:" +msgstr "المÙخرجات:" #: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Copy Selection" -msgstr "Øذ٠المÙØدد" +msgstr "نسخ المÙØدد" #: editor/editor_log.cpp editor/editor_network_profiler.cpp #: editor/editor_profiler.cpp editor/editor_properties.cpp @@ -2134,11 +2115,11 @@ msgstr "Øذ٠المÙØدد" #: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Clear" -msgstr "خالي" +msgstr "مسØ" #: editor/editor_log.cpp msgid "Clear Output" -msgstr "أخلاء الخرج" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ùخرجات" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: editor/editor_profiler.cpp @@ -2147,23 +2128,20 @@ msgstr "إيقاÙ" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp -#, fuzzy msgid "Start" -msgstr "بدء!" +msgstr "بدء" #: editor/editor_network_profiler.cpp -#, fuzzy msgid "%s/s" msgstr "%s/s" #: editor/editor_network_profiler.cpp -#, fuzzy msgid "Down" -msgstr "تنزيل" +msgstr "أسÙÙ„" #: editor/editor_network_profiler.cpp msgid "Up" -msgstr "Ùوق" +msgstr "أعلى" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" @@ -2260,7 +2238,7 @@ msgstr "ينشئ الصورة المصغرة" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." -msgstr "هذه العملية لا يمكنها الإكتمال من غير شجرة رئيسة." +msgstr "هذه العملية لا يمكنها الإكتمال من غير جذر شجرة ." #: editor/editor_node.cpp msgid "" @@ -2323,7 +2301,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." @@ -2340,7 +2317,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" @@ -2353,13 +2329,12 @@ msgstr "" "هذا النظام." #: editor/editor_node.cpp -#, fuzzy msgid "" "This is a remote object, so changes to it won't be kept.\n" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"هذا المصدر ينتمي إلي مشهد قد تم إستيراده، إذا لا يمكن تعديله.\n" +"هذا المصدر ينتمي إلي مشهد قد تم إستيراده، التعديلات لن تØÙظ.\n" "من Ùضلك إقرأ التوثيق المرتبط بإستيراد المشاهد لكي تÙهم بشكل Ø£Ùضل كيÙية عمل " "هذا النظام." @@ -2384,9 +2359,8 @@ msgid "Open Base Scene" msgstr "ÙØªØ Ù…Ø´Ù‡Ø¯ أساسي" #: editor/editor_node.cpp -#, fuzzy msgid "Quick Open..." -msgstr "ÙØªØ Ø³Ø±ÙŠØ¹ للمشهد..." +msgstr "ÙØªØ Ø³Ø±ÙŠØ¹ ..." #: editor/editor_node.cpp msgid "Quick Open Scene..." @@ -2405,9 +2379,8 @@ msgid "Save changes to '%s' before closing?" msgstr "هل تريد ØÙظ التغييرات إلي'%s' قبل الإغلاق؟" #: editor/editor_node.cpp -#, fuzzy msgid "Saved %s modified resource(s)." -msgstr "Ùشل تØميل المورد." +msgstr "ØÙظت %s الموارد المعدلة." #: editor/editor_node.cpp msgid "A root node is required to save the scene." @@ -2471,7 +2444,7 @@ msgstr "تشغيل مشهد بسرعة..." #: editor/editor_node.cpp msgid "Quit" -msgstr "خروج" +msgstr "إنهاء" #: editor/editor_node.cpp msgid "Exit the editor?" @@ -2512,9 +2485,8 @@ msgid "Close Scene" msgstr "اغلاق المشهد" #: editor/editor_node.cpp -#, fuzzy msgid "Reopen Closed Scene" -msgstr "اغلاق المشهد" +msgstr "إعادة ÙØªØ Ø§Ù„Ù…Ø´Ù‡Ø¯" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." @@ -2530,19 +2502,19 @@ msgid "Unable to load addon script from path: '%s'." msgstr "غير قادر علي تØميل كود الإضاÙØ© من المسار: '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." msgstr "" -"غير قادر علي تØميل كود الإضاÙØ© من المسار: '%s' الكود ليس ÙÙŠ وضع الأداة." +"غير قادر علي تØميل كود الإضاÙØ© من المسار: '%s' يبدو أن الكود يوجد Ùيه " +"أخطاء , الرجاء مراجعة الكود." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" "غير قادر علي تØميل كود الإضاÙØ© من المسار: '%s' النوع الأساسي ليس إضاÙØ© " -"للمÙعدل." +"المÙعدل." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." @@ -2615,24 +2587,20 @@ msgstr "الإÙتراضي" #: editor/editor_node.cpp editor/editor_properties.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp -#, fuzzy msgid "Show in FileSystem" msgstr "أظهر ÙÙŠ مدير الملÙات" #: editor/editor_node.cpp -#, fuzzy msgid "Play This Scene" msgstr "تشغيل المشهد" #: editor/editor_node.cpp -#, fuzzy msgid "Close Tab" -msgstr "اغلاق" +msgstr "اغلاق التبويب" #: editor/editor_node.cpp -#, fuzzy msgid "Undo Close Tab" -msgstr "اغلاق" +msgstr "تراجع عن â€â€¬Ø¥ØºÙ„اق التبويب" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" @@ -2643,9 +2611,8 @@ msgid "Close Tabs to the Right" msgstr "أغلق التبويبات على اليمين" #: editor/editor_node.cpp -#, fuzzy msgid "Close All Tabs" -msgstr "اغلاق" +msgstr "اغلاق جميع نواÙØ° التبويب" #: editor/editor_node.cpp msgid "Switch Scene Tab" @@ -2688,9 +2655,8 @@ msgid "Go to previously opened scene." msgstr "اذهب الي المشهد المÙØªÙˆØ Ù…Ø³Ø¨Ù‚Ø§." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "نسخ المسار" +msgstr "نسخ النص" #: editor/editor_node.cpp msgid "Next tab" @@ -2729,7 +2695,6 @@ msgid "Save Scene" msgstr "ØÙظ المشهد" #: editor/editor_node.cpp -#, fuzzy msgid "Save All Scenes" msgstr "ØÙظ جميع المشاهد" @@ -2753,7 +2718,7 @@ msgstr "تراجع" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Redo" -msgstr "إعادة" +msgstr "إعادة تراجع" #: editor/editor_node.cpp msgid "Revert Scene" @@ -2769,14 +2734,12 @@ msgid "Project" msgstr "مشروع" #: editor/editor_node.cpp -#, fuzzy msgid "Project Settings..." -msgstr "إعدادات المشروع" +msgstr "إعدادات المشروع..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Version Control" -msgstr "النسخة:" +msgstr "التØكم ÙÙŠ الإصدار" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" @@ -2787,31 +2750,28 @@ msgid "Shut Down Version Control" msgstr "إطÙاء التØكم بالنسخة Version Control" #: editor/editor_node.cpp -#, fuzzy msgid "Export..." -msgstr "تصدير" +msgstr "تصدير..." #: editor/editor_node.cpp msgid "Install Android Build Template..." msgstr "تØميل قالب البناء للأندرويد..." #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Data Folder" -msgstr "ÙØªØ Ù…Ø¯ÙŠØ± المشروع؟" +msgstr "ÙØªØ Ù…Ø¬Ù„Ø¯ بيانات المشروع" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" msgstr "ادوات" #: editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer..." -msgstr "متصÙØ Ø§Ù„Ù…ÙˆØ§Ø±Ø¯ أورÙان" +msgstr "متصÙØ Ø§Ù„Ù…ÙˆØ§Ø±Ø¯ أورÙان..." #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "غادر الي قائمه المشاريع" +msgstr "غادر إلى قائمه المشاريع" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp @@ -2908,56 +2868,48 @@ msgid "Editor" msgstr "المÙعدل" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "إعدادات المÙعدل" +msgstr "إعدادات المØرّر" #: editor/editor_node.cpp msgid "Editor Layout" msgstr "نسق المÙعدل" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "ØÙظ المشهد" +msgstr "أخذ صورة للشاشة" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "إعدادات المÙعدل" +msgstr "لقطات الشاشة تكون Ù…ØÙوظة ÙÙŠ مجلّد البيانات/الإعدادت داخل المØرّر" #: editor/editor_node.cpp msgid "Toggle Fullscreen" msgstr "إلغاء/تÙعيل وضع الشاشة الكاملة" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "أظهر المود" +msgstr "إظهار/إخÙاء ÙˆØدة التØكم بالنظام" #: editor/editor_node.cpp -#, fuzzy msgid "Open Editor Data/Settings Folder" -msgstr "إعدادات المÙعدل" +msgstr "ÙØªØ Ù…Ø¬Ù„Ù‘Ø¯ البيانات/الإعدادت المØرّر" #: editor/editor_node.cpp msgid "Open Editor Data Folder" msgstr "اÙØªØ Ù…Ù„Ù Ø¨ÙŠØ§Ù†Ø§Øª المØرر" #: editor/editor_node.cpp -#, fuzzy msgid "Open Editor Settings Folder" -msgstr "إعدادات المÙعدل" +msgstr "ÙØªØ Ù…Ø¬Ù„Ù‘Ø¯ إعدادات المØرّر" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features..." -msgstr "إدارة قوالب التصدير" +msgstr "إدارة ميّزات المØرّر" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Export Templates..." -msgstr "إدارة قوالب التصدير" +msgstr "إدارة قوالب التصدير..." #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" @@ -2982,9 +2934,8 @@ msgid "Q&A" msgstr "الأسئلة Ùˆ الأجوبة" #: editor/editor_node.cpp -#, fuzzy msgid "Report a Bug" -msgstr "إعادة إستيراد" +msgstr "إرسال تقرير عن bug أو خلل ÙÙŠ شيء ما" #: editor/editor_node.cpp msgid "Send Docs Feedback" @@ -3040,24 +2991,20 @@ msgstr "تعديل معرّ٠الÙيديو video driver يتطلب إعادة #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Save & Restart" -msgstr "ØÙظ Ùˆ خروج" +msgstr "ØÙظ Ùˆ إعادة تشغيل" #: editor/editor_node.cpp -#, fuzzy msgid "Spins when the editor window redraws." -msgstr "يدور Øينما ناÙذة المÙعدل يتم إعادة دهانة!" +msgstr "يدور Øينما يتم إعادة رسم ناÙذة المØرّر" #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "متواصل" +msgstr "تØديث متواصل" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "تØديث التغييرات" +msgstr "تØديث عند التغيير" #: editor/editor_node.cpp #, fuzzy @@ -3073,9 +3020,8 @@ msgid "Inspector" msgstr "Ù…Ùراقب" #: editor/editor_node.cpp -#, fuzzy msgid "Expand Bottom Panel" -msgstr "توسيع الكل" +msgstr "توسيع التبويب السÙلي" #: editor/editor_node.cpp msgid "Output" @@ -3090,9 +3036,8 @@ msgid "Android build template is missing, please install relevant templates." msgstr "قالب البناء الخاص بالأندرويد Ù…Ùقود، من Ùضلك نزل قوالب ذات صلة." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Templates" -msgstr "إدارة قوالب التصدير" +msgstr "إدارة القوالب" #: editor/editor_node.cpp msgid "" @@ -3128,9 +3073,8 @@ msgid "Import Templates From ZIP File" msgstr "إستيراد القوالب من مل٠مضغوط بصيغة Zip" #: editor/editor_node.cpp -#, fuzzy msgid "Template Package" -msgstr "‌تصدير مدير القوالب" +msgstr "رزمة القوالب" #: editor/editor_node.cpp msgid "Export Library" @@ -3181,12 +3125,10 @@ msgid "Open the previous Editor" msgstr "Ø¥ÙØªØ Ø§Ù„Ù…Ùعدل السابق" #: editor/editor_node.h -#, fuzzy msgid "Warning!" -msgstr "تØذيرات" +msgstr "تØذيرات!" #: editor/editor_path.cpp -#, fuzzy msgid "No sub-resources found." msgstr "لا مصدر Ù„Ù„Ø³Ø·Ø ØªÙ… تØديده." @@ -3199,14 +3141,12 @@ msgid "Thumbnail..." msgstr "الصورة المصغرة..." #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Main Script:" -msgstr "ÙØªØ Ø§Ù„ÙƒÙˆØ¯" +msgstr "النص البرمجي الأصلي :" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Edit Plugin" -msgstr "تعديل البولي" +msgstr "تعديل الإضاÙØ©" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" @@ -3230,9 +3170,8 @@ msgid "Status:" msgstr "الØالة:" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Edit:" -msgstr "المÙعدل" +msgstr "تØرير:" #: editor/editor_profiler.cpp msgid "Measure:" @@ -5709,7 +5648,7 @@ msgstr "نص٠المÙØدد" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "إملئ الشاشة بالمØدد" +msgstr "تØديد الإطار" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -6144,6 +6083,10 @@ msgid "" "This can be used instead of the SpatialMaterial Grow property when using " "that property isn't possible." msgstr "" +"ÙŠÙنشى سطØاً مخططاً outline mesh سكونياً. هذا Ø§Ù„Ø³Ø·Ø ØªÙƒÙˆÙ† قيمه الطبيعية مقلوبة " +"بصورة تلقائية.\n" +"يمكن أن يستخدم بدلاً من خاصية التمدد (Grow ) لمادة الØيز المكاني " +"SpatialMaterial عندما يكون استخدام هذه الخاصية غير مقدور عليه." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "View UV1" @@ -6865,7 +6808,7 @@ msgstr "%s مرجعية الص٠Class" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find Next" -msgstr "ابØØ« عن التالي" +msgstr "إيجاد التالي" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -6898,7 +6841,7 @@ msgstr "تØريك لأعلى" #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Move Down" -msgstr "تØرك لأسÙÙ„" +msgstr "تØريك لأسÙÙ„" #: editor/plugins/script_editor_plugin.cpp msgid "Next script" @@ -6922,7 +6865,7 @@ msgstr "إعادة ÙØªØ Ø§Ù„Ù†Øµ البرمجي المÙغلق" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" -msgstr "اØÙظ الكل" +msgstr "Ø¥ØÙظ الكل" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" @@ -6934,11 +6877,11 @@ msgstr "نسخ مسار النص البرمجي" #: editor/plugins/script_editor_plugin.cpp msgid "History Previous" -msgstr "التأريخ السابق" +msgstr "التاريخ السابق" #: editor/plugins/script_editor_plugin.cpp msgid "History Next" -msgstr "التأريخ التالي" +msgstr "التاريخ التالي" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -6971,11 +6914,11 @@ msgstr "تشغيل" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "خطوة ضمن" +msgstr "اخط خطوة ضمن" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" -msgstr "خطوة متجاوزة" +msgstr "اخط خطوة متجاوزة" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" @@ -7473,7 +7416,7 @@ msgstr "عرض المÙخطط Wireframe" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Overdraw" -msgstr "" +msgstr "عرض تراكبات الرسم Overdraw" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Unshaded" @@ -7651,27 +7594,27 @@ msgstr "ناÙذة التØويلات ..." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "إطار عرض واØد 1" +msgstr "ساØØ© رؤية واØدة" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "إطاري عرض" +msgstr "ساØتان للرؤية" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "إطاري عرض (Alt)" +msgstr "ساØتان للرؤية (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "3 إطارات عرض" +msgstr "3 ساØات للرؤية" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "3 إطارات عرض (Alt)" +msgstr "3 ساØات للرؤية (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "4 إطارات عرض" +msgstr "4 ساØات للرؤية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" @@ -8283,7 +8226,7 @@ msgstr "القلب Ø£Ùقياً" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Vertically" -msgstr "القلب شاقولياً" +msgstr "القلب عموديًا" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8322,7 +8265,7 @@ msgstr "أطلس جديد" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Next Coordinate" -msgstr "الإØداثات التالية" +msgstr "الإØداثيات التالية" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the next shape, subtile, or Tile." @@ -8704,11 +8647,11 @@ msgstr "إظهار آخر تعديلات المل٠قبل قبولهم ÙÙŠ Ø¢Ø #: editor/plugins/version_control_editor_plugin.cpp msgid "No file diff is active" -msgstr "" +msgstr "لا مل٠Ùروق نشط" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect changes in file diff" -msgstr "" +msgstr "الكش٠عن التغييرات ÙÙŠ مل٠الÙروق" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -8861,7 +8804,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." @@ -9438,7 +9381,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "" +msgstr "ÙŠÙقسّم المÙتجه (الشعاع) على المÙتجه." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." @@ -9863,10 +9806,10 @@ msgid "" "Incompatible with older hardware\n" "Not recommended for web games" msgstr "" -"قيمة بصرية أعلى\n" -"جميع المزايا متواÙرة\n" -"غير متواÙÙ‚ مع العتاد القديم\n" -"ليس نصØية بالنسبة لألعاب الويب" +"جودة بصرية أعلى\n" +"جميع الميزات المتاØØ©\n" +"غير متواÙÙ‚ مع الأجهزة القديمة\n" +"لا ÙŠÙ†ØµØ Ø¨Ù‡ لألعاب الويب" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" @@ -9879,15 +9822,14 @@ msgid "" "Works on most hardware\n" "Recommended for web games" msgstr "" -"قيمة بصرية أقل\n" -"بعض المزايا غير متواÙرة \n" -"يعمل على أغلب العتاد\n" -"نصيØØ© لألعاب الويب" +"جودة بصرية أقل\n" +"بعض الميزات غير متوÙرة \n" +"يعمل على معظم الأجهزة\n" +"يوصى به لألعاب الويب" #: editor/project_manager.cpp msgid "Renderer can be changed later, but scenes may need to be adjusted." -msgstr "" -"Ù…ÙØرك الإخراج البصري يمكن تغييره لاØقاً، ولكن قد تØتاج إلى تعديل المشاهد." +msgstr "يمكن تعديل جهاز العرض لاØقاً، ولكن قد تØتاج المشاهد إلى تعديل." #: editor/project_manager.cpp msgid "Unnamed Project" @@ -9899,7 +9841,7 @@ msgstr "مشروع Ù…Ùقود" #: editor/project_manager.cpp msgid "Error: Project is missing on the filesystem." -msgstr "خطأ: المشروع Ù…Ùقود ÙÙŠ ملÙات النظام." +msgstr "خطأ: المشروع Ù…Ùقود ÙÙŠ نظام الملÙات." #: editor/project_manager.cpp msgid "Can't open project at '%s'." @@ -10168,11 +10110,11 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Erase Input Action Event" -msgstr "" +msgstr "Ù…Ø³Ø Øدث إجراء الإضاÙØ©" #: editor/project_settings_editor.cpp msgid "Add Event" -msgstr "" +msgstr "إضاÙØ© Øَدث" #: editor/project_settings_editor.cpp msgid "Button" @@ -10180,61 +10122,63 @@ msgstr "زر" #: editor/project_settings_editor.cpp msgid "Left Button." -msgstr "" +msgstr "الزر الأيسر." #: editor/project_settings_editor.cpp msgid "Right Button." -msgstr "" +msgstr "الزر الأيمن." #: editor/project_settings_editor.cpp msgid "Middle Button." -msgstr "" +msgstr "الزر الأوسط." #: editor/project_settings_editor.cpp msgid "Wheel Up." -msgstr "" +msgstr "العجلة Ù†ØÙˆ الأقصى." #: editor/project_settings_editor.cpp msgid "Wheel Down." -msgstr "" +msgstr "العجلة Ù†ØÙˆ الأدنى." #: editor/project_settings_editor.cpp msgid "Add Global Property" -msgstr "" +msgstr "إضاÙØ© خاصية شمولية" #: editor/project_settings_editor.cpp msgid "Select a setting item first!" -msgstr "" +msgstr "اختر عنصر إعدادات بدايةً!" #: editor/project_settings_editor.cpp msgid "No property '%s' exists." -msgstr "" +msgstr "لا خاصية '%s' موجودة." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." -msgstr "" +msgstr "الإعداد '%s' ضمني، ولا يمكن ØØ°ÙÙ‡." #: editor/project_settings_editor.cpp msgid "Delete Item" -msgstr "" +msgstr "Øذ٠العÙنصر" #: editor/project_settings_editor.cpp msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'." msgstr "" +"اسم إجراء غير صالØ. لا يجوز أن يكون الاسم Ùارغاً أو متضمناً '/'ØŒ ':'ØŒ'='ØŒ '\\' " +"أو'\"'." #: editor/project_settings_editor.cpp msgid "Add Input Action" -msgstr "" +msgstr "إضاÙØ© إجراء إدخال" #: editor/project_settings_editor.cpp msgid "Error saving settings." -msgstr "" +msgstr "خطأ ÙÙŠ ØÙظ الإعدادات." #: editor/project_settings_editor.cpp msgid "Settings saved OK." -msgstr "" +msgstr "تيسّر ØÙظ الإعدادات." #: editor/project_settings_editor.cpp #, fuzzy @@ -10243,19 +10187,19 @@ msgstr "Øرك النقطة داخل المنØنى" #: editor/project_settings_editor.cpp msgid "Override for Feature" -msgstr "" +msgstr "التجاوز للميزة" #: editor/project_settings_editor.cpp msgid "Add Translation" -msgstr "" +msgstr "إضاÙØ© ترجمة" #: editor/project_settings_editor.cpp msgid "Remove Translation" -msgstr "" +msgstr "إزالة الترجمة" #: editor/project_settings_editor.cpp msgid "Add Remapped Path" -msgstr "" +msgstr "إضاÙØ© مسار Ù…Ùعاد تعيينه Remapped" #: editor/project_settings_editor.cpp msgid "Resource Remap Add Remap" @@ -10275,7 +10219,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter" -msgstr "" +msgstr "Ù…ÙØ±Ø´Ø Ù…Øلي Ù…Ùعدّل" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" @@ -10283,7 +10227,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" -msgstr "" +msgstr "إعدادات المشروع (project.godot)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" @@ -10291,47 +10235,47 @@ msgstr "بشكل عام" #: editor/project_settings_editor.cpp msgid "Override For..." -msgstr "" +msgstr "تجاوز لأجل..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "The editor must be restarted for changes to take effect." -msgstr "" +msgstr "لكي يظهر تأثير التغييرات ينبغي إعادة تشغيل المÙØرر." #: editor/project_settings_editor.cpp msgid "Input Map" -msgstr "" +msgstr "خريطة الإدخال" #: editor/project_settings_editor.cpp msgid "Action:" -msgstr "" +msgstr "إجراء:" #: editor/project_settings_editor.cpp msgid "Action" -msgstr "الÙعل" +msgstr "إجراء" #: editor/project_settings_editor.cpp msgid "Deadzone" -msgstr "" +msgstr "الØيز الميّت" #: editor/project_settings_editor.cpp msgid "Device:" -msgstr "" +msgstr "الجهاز:" #: editor/project_settings_editor.cpp msgid "Index:" -msgstr "" +msgstr "الÙهرس:" #: editor/project_settings_editor.cpp msgid "Localization" -msgstr "" +msgstr "توطين" #: editor/project_settings_editor.cpp msgid "Translations" -msgstr "" +msgstr "الترجمات" #: editor/project_settings_editor.cpp msgid "Translations:" -msgstr "" +msgstr "الترجمات:" #: editor/project_settings_editor.cpp msgid "Remaps" @@ -10339,41 +10283,39 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Resources:" -msgstr "" +msgstr "الموارد:" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" -msgstr "" +msgstr "إعادة تعيين الخرائط Ù…Øلياً:" #: editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "Ù…Øلي" #: editor/project_settings_editor.cpp msgid "Locales Filter" -msgstr "" +msgstr "Ù…ÙØ±Ø´Ø Ø§Ù„Ù…Øليّات Locales" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" -msgstr "إظهار العظام" +msgstr "إظهار جميع المَØليّات Locales" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show Selected Locales Only" -msgstr "المØدد Ùقط" +msgstr "إظهار المَØليّات المÙختارة ÙØسب" #: editor/project_settings_editor.cpp msgid "Filter mode:" -msgstr "وضع المÙصÙÙŠ:" +msgstr "وضع المÙرشØ:" #: editor/project_settings_editor.cpp msgid "Locales:" -msgstr "" +msgstr "Ù…ÙŽØليّات:" #: editor/project_settings_editor.cpp msgid "AutoLoad" -msgstr "" +msgstr "تØميل تلقائي" #: editor/project_settings_editor.cpp msgid "Plugins" @@ -10385,19 +10327,19 @@ msgstr "إعداد Ù…Ùسبق..." #: editor/property_editor.cpp msgid "Zero" -msgstr "" +msgstr "صÙر" #: editor/property_editor.cpp msgid "Easing In-Out" -msgstr "" +msgstr "تسارع بعد بداية بطيئة" #: editor/property_editor.cpp msgid "Easing Out-In" -msgstr "" +msgstr "تباطؤ بعد بداية سريعة" #: editor/property_editor.cpp msgid "File..." -msgstr "" +msgstr "ملÙ..." #: editor/property_editor.cpp msgid "Dir..." @@ -10405,31 +10347,31 @@ msgstr "" #: editor/property_editor.cpp msgid "Assign" -msgstr "" +msgstr "ألØÙ‚" #: editor/property_editor.cpp msgid "Select Node" -msgstr "" +msgstr "اختر عÙقدة" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" -msgstr "" +msgstr "خطأ ÙÙŠ تØميل الملÙ: ليس مورداً!" #: editor/property_editor.cpp msgid "Pick a Node" -msgstr "" +msgstr "اختر عÙقدة" #: editor/property_editor.cpp msgid "Bit %d, val %d." -msgstr "" +msgstr "Bit %dØŒ قيمة%d." #: editor/property_selector.cpp msgid "Select Property" -msgstr "" +msgstr "انتقاء الخاصية" #: editor/property_selector.cpp msgid "Select Virtual Method" -msgstr "إختر طريقة Ø¥Ùتراضية" +msgstr "اختر الطريقة الإÙتراضية" #: editor/property_selector.cpp msgid "Select Method" @@ -10442,24 +10384,23 @@ msgstr "إعادة التسمية" #: editor/rename_dialog.cpp msgid "Prefix" -msgstr "" +msgstr "بادئة" #: editor/rename_dialog.cpp msgid "Suffix" -msgstr "" +msgstr "لاØقة" #: editor/rename_dialog.cpp msgid "Use Regular Expressions" msgstr "استخدام التعبيرات الاعتيادية Regular Expressions" #: editor/rename_dialog.cpp -#, fuzzy msgid "Advanced Options" -msgstr "إعدادات الكبس" +msgstr "إعدادات Ù…Ùتقدمة" #: editor/rename_dialog.cpp msgid "Substitute" -msgstr "" +msgstr "استبدال" #: editor/rename_dialog.cpp #, fuzzy @@ -10468,40 +10409,39 @@ msgstr "إسم العقدة:" #: editor/rename_dialog.cpp msgid "Node's parent name, if available" -msgstr "" +msgstr "اسم العÙقدة الأب، إن تواÙر" #: editor/rename_dialog.cpp -#, fuzzy msgid "Node type" -msgstr "إسم العقدة:" +msgstr "نوع العÙقدة" #: editor/rename_dialog.cpp -#, fuzzy msgid "Current scene name" -msgstr "لم يتم ØÙظ المشهد الØالي. Ø¥ÙتØÙ‡ علي أية Øال؟" +msgstr "اسم المشهد الØالي" #: editor/rename_dialog.cpp -#, fuzzy msgid "Root node name" -msgstr "إعادة التسمية" +msgstr "اسم العÙقدة الرئيسة (الجذر)" #: editor/rename_dialog.cpp msgid "" "Sequential integer counter.\n" "Compare counter options." msgstr "" +"عداد الأعداد الصØÙŠØØ© التسلسلية.\n" +"يقارن إعدادات العداد." #: editor/rename_dialog.cpp msgid "Per-level Counter" -msgstr "" +msgstr "العداد ÙˆÙÙ‚-المستوى" #: editor/rename_dialog.cpp msgid "If set the counter restarts for each group of child nodes" -msgstr "" +msgstr "إذا تم تØديده Ùإن العداد سيعيد البدء لكل مجموعة من العÙقد الأبناء" #: editor/rename_dialog.cpp msgid "Initial value for the counter" -msgstr "" +msgstr "القيمة المبدئية للعداد" #: editor/rename_dialog.cpp #, fuzzy @@ -10510,7 +10450,7 @@ msgstr "خطوة (ثانية):" #: editor/rename_dialog.cpp msgid "Amount by which counter is incremented for each node" -msgstr "" +msgstr "مقدار الزيادة للعداد لكل عÙقدة" #: editor/rename_dialog.cpp msgid "Padding" @@ -10524,31 +10464,31 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Post-Process" -msgstr "" +msgstr "المعالجة-اللاØقة Post-Process" #: editor/rename_dialog.cpp msgid "Keep" -msgstr "" +msgstr "اØتÙظ" #: editor/rename_dialog.cpp msgid "PascalCase to snake_case" -msgstr "" +msgstr "Øالة Ø£Øر٠PascalCase إلى snake_case" #: editor/rename_dialog.cpp msgid "snake_case to PascalCase" -msgstr "" +msgstr "Øالة Ø£Øر٠snake_case إلى PascalCase" #: editor/rename_dialog.cpp msgid "Case" -msgstr "" +msgstr "Øالة" #: editor/rename_dialog.cpp msgid "To Lowercase" -msgstr "" +msgstr "لأØر٠صغيرة Lowercase" #: editor/rename_dialog.cpp msgid "To Uppercase" -msgstr "" +msgstr "لأØر٠كبيرة Uppercase" #: editor/rename_dialog.cpp #, fuzzy @@ -10557,7 +10497,7 @@ msgstr "إرجاع التكبير" #: editor/rename_dialog.cpp msgid "Regular Expression Error" -msgstr "" +msgstr "خطأ ذو علاقة بالتعبير الاعتيادي Regular Expression" #: editor/rename_dialog.cpp msgid "At character %s" @@ -10565,65 +10505,65 @@ msgstr "عند الØر٠%s" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" -msgstr "" +msgstr "إعادة اختيار أبوة العÙقدة" #: editor/reparent_dialog.cpp msgid "Reparent Location (Select new Parent):" -msgstr "" +msgstr "إعادة اختيار أبوة المكان (اختر أب جديد):" #: editor/reparent_dialog.cpp msgid "Keep Global Transform" -msgstr "" +msgstr "الاØتÙاظ بالتØوّل الشمولي Global" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent" -msgstr "" +msgstr "إعادة اختيار الأبوة" #: editor/run_settings_dialog.cpp msgid "Run Mode:" -msgstr "" +msgstr "وضع التشغيل:" #: editor/run_settings_dialog.cpp msgid "Current Scene" -msgstr "" +msgstr "المشهد الØالي" #: editor/run_settings_dialog.cpp msgid "Main Scene" -msgstr "" +msgstr "المشهد الرئيس" #: editor/run_settings_dialog.cpp msgid "Main Scene Arguments:" -msgstr "" +msgstr "معاملات المشهد الرئيس:" #: editor/run_settings_dialog.cpp msgid "Scene Run Settings" -msgstr "" +msgstr "إعدادت تشغيل المشهد" #: editor/scene_tree_dock.cpp msgid "No parent to instance the scenes at." -msgstr "" +msgstr "لا أب لنمذجة المشاهد عنده." #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" -msgstr "" +msgstr "خطأ ÙÙŠ تØميل المشهد من %s" #: editor/scene_tree_dock.cpp msgid "" "Cannot instance the scene '%s' because the current scene exists within one " "of its nodes." -msgstr "" +msgstr "لا يمكن نمذجة المشهد '%s' لأن المشهد الØالي Ù…Ùتضَمن ÙÙŠ واØد من عÙقده." #: editor/scene_tree_dock.cpp msgid "Instance Scene(s)" -msgstr "" +msgstr "نمذجة المشهد(المشاهد)" #: editor/scene_tree_dock.cpp msgid "Replace with Branch Scene" -msgstr "" +msgstr "استبدال بمشهد Ùرعي" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" -msgstr "" +msgstr "نمذجة المشهد الابن" #: editor/scene_tree_dock.cpp msgid "Clear Script" @@ -10631,31 +10571,33 @@ msgstr "إخلاء الكود" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." -msgstr "" +msgstr "لا يمكن إجراء هذه العملية على جذر الشجرة." #: editor/scene_tree_dock.cpp msgid "Move Node In Parent" -msgstr "" +msgstr "نقل العÙقدة عند الأب" #: editor/scene_tree_dock.cpp msgid "Move Nodes In Parent" -msgstr "" +msgstr "تØريك العÙقد عند الأب" #: editor/scene_tree_dock.cpp msgid "Duplicate Node(s)" -msgstr "" +msgstr "مضاعÙØ© العÙقدة(العÙقد)" #: editor/scene_tree_dock.cpp msgid "Can't reparent nodes in inherited scenes, order of nodes can't change." msgstr "" +"لا يمكن إعادة اختيار أبوة العÙقدة ÙÙŠ المشاهد الموروثة، لا يمكن تغيير ترتيب " +"العÙقد." #: editor/scene_tree_dock.cpp msgid "Node must belong to the edited scene to become root." -msgstr "" +msgstr "لكي ØªØµØ¨Ø Ù‡Ø°Ù‡ العÙقدة رئيسة (جذر) عليها أن تنتمي إلى المشهد المÙØرر." #: editor/scene_tree_dock.cpp msgid "Instantiated scenes can't become root" -msgstr "" +msgstr "لا يمكن أن ØªØµØ¨Ø Ø§Ù„Ù…Ø´Ø§Ù‡Ø¯ المنمذجة مشاهد رئيسة (جذر)" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10669,11 +10611,11 @@ msgstr "إنشاء عقدة" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" -msgstr "" +msgstr "Øذ٠العÙقدة الرئيسة (الجذر) \"%s\"ØŸ" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\" and its children?" -msgstr "" +msgstr "Øذ٠العÙقدة \"%s\" مع جميع أبنائها؟" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10682,56 +10624,56 @@ msgstr "إنشاء عقدة" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "لا يمكن التنÙيذ مع العÙقدة الرئيسة (الجذر)." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." -msgstr "" +msgstr "لا يمكن تنÙيذ هذا الإجراء على المشاهد المÙنمذجة." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." -msgstr "" +msgstr "اØÙظ المشهد الجديد كـ..." #: editor/scene_tree_dock.cpp msgid "" "Disabling \"editable_instance\" will cause all properties of the node to be " "reverted to their default." msgstr "" +"سيسبب تعطيل خاصية \"النمذجة_المÙØررة\" \"editable_instance\" عودة قيم العÙقد " +"إلى القيم الاÙتراضية لها." #: editor/scene_tree_dock.cpp msgid "" "Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " "cause all properties of the node to be reverted to their default." msgstr "" +"سيسبب تمكين \"التØميل كعنصر نائب\" \"Load As Placeholder\" تعطيل \"ابن قابل " +"للتØرير\" \"Editable Children\" والذي ينجم عنه عودة قيم جميع العÙقد إلى قيمها " +"الاÙتراضية." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Make Local" -msgstr "أنشئ عظام" +msgstr "اجعله Ù…Øلياً" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "New Scene Root" -msgstr "ØÙظ المشهد" +msgstr "مشهد رئيس (جذر) جديد" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Create Root Node:" -msgstr "إنشاء عقدة" +msgstr "إنشاء العÙقدة الرئيسة (الجذر):" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "2D Scene" -msgstr "مشهد" +msgstr "مشهد ثنائي البÙعد" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "3D Scene" -msgstr "مشهد" +msgstr "مشهد ثلاثي الأبعاد" #: editor/scene_tree_dock.cpp msgid "User Interface" -msgstr "" +msgstr "واجهة المستخدم" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10740,37 +10682,37 @@ msgstr "إنشاء عقدة" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" -msgstr "" +msgstr "لا يمكن تنÙيذ الإجراء على عÙقدة من مشهد أجنبي!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes the current scene inherits from!" -msgstr "" +msgstr "لا يمكن تنÙيذ الإجراء على عÙقد يرثها المشهد الØالي!" #: editor/scene_tree_dock.cpp msgid "Attach Script" -msgstr "" +msgstr "إلØاق نص برمجي" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" -msgstr "" +msgstr "إزالة عÙقدة (عÙقد)" #: editor/scene_tree_dock.cpp msgid "Change type of node(s)" -msgstr "" +msgstr "تغيير نوع العÙقدة(العÙقد)" #: editor/scene_tree_dock.cpp msgid "" "Couldn't save new scene. Likely dependencies (instances) couldn't be " "satisfied." -msgstr "" +msgstr "لم ÙŠÙ†Ø¬Ø ØÙظ المشهد الجديد. غالباً لا يمكن إشباع التبعات (النماذج)." #: editor/scene_tree_dock.cpp msgid "Error saving scene." -msgstr "" +msgstr "خطأ ÙÙŠ ØÙظ المشهد." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "" +msgstr "خطأ ÙÙŠ مضاعÙØ© المشهد Ù„ØÙظه." #: editor/scene_tree_dock.cpp msgid "Sub-Resources" @@ -10778,15 +10720,15 @@ msgstr "مورد Ùرعي" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙŠØ±Ø§Ø«" #: editor/scene_tree_dock.cpp msgid "Editable Children" -msgstr "" +msgstr "أبناء قابلين للتعديل" #: editor/scene_tree_dock.cpp msgid "Load As Placeholder" -msgstr "" +msgstr "تØميله كعنصر نائب" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10795,7 +10737,7 @@ msgstr "ÙÙØªØ Ù…Ø¤Ø®Ø±Ø§Ù‹" #: editor/scene_tree_dock.cpp msgid "Add Child Node" -msgstr "" +msgstr "إضاÙØ© عÙقدة ابن" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10804,7 +10746,7 @@ msgstr "طوي الكل" #: editor/scene_tree_dock.cpp msgid "Change Type" -msgstr "" +msgstr "تغيير النوع" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10818,19 +10760,19 @@ msgstr "ØÙظ المشهد" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "" +msgstr "دمج من المشهد" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Save Branch as Scene" -msgstr "" +msgstr "ØÙظ الÙرع كمشهد" #: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp msgid "Copy Node Path" -msgstr "" +msgstr "نسخ مسار العÙقدة" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" -msgstr "" +msgstr "ØØ°Ù (دون تأكيد)" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10842,14 +10784,16 @@ msgid "" "Instance a scene file as a Node. Creates an inherited scene if no root node " "exists." msgstr "" +"نمذجة مل٠المشهد كعÙقدة. إن لم يكن هناك عÙقدة رئيسة (جذر) سيتم إنشاء مشهد " +"موروث." #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." -msgstr "" +msgstr "إلØاق نص برمجي موجود أو جديد للعÙقدة المختارة." #: editor/scene_tree_dock.cpp msgid "Clear a script for the selected node." -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„Ù†Øµ البرمجي للعÙقدة المختارة." #: editor/scene_tree_dock.cpp msgid "Remote" @@ -10857,11 +10801,11 @@ msgstr "عن بعد" #: editor/scene_tree_dock.cpp msgid "Local" -msgstr "" +msgstr "Ù…Øلي" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance? (No Undo!)" -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ±ÙˆØ«ØŸ (لا تراجع!)" #: editor/scene_tree_editor.cpp #, fuzzy @@ -11235,11 +11179,11 @@ msgstr "" #: editor/script_editor_debugger.cpp msgid "Set From Tree" -msgstr "" +msgstr "التØديد من الشجرة" #: editor/script_editor_debugger.cpp msgid "Export measures as CSV" -msgstr "" +msgstr "تصدير القياسات Ùƒ CSV" #: editor/settings_config_dialog.cpp #, fuzzy @@ -11248,7 +11192,7 @@ msgstr "تخÙي٠للخارج" #: editor/settings_config_dialog.cpp msgid "Restore Shortcut" -msgstr "" +msgstr "إعادة تعيين الاختصارات" #: editor/settings_config_dialog.cpp #, fuzzy @@ -11261,15 +11205,15 @@ msgstr "إعدادات المÙعدل" #: editor/settings_config_dialog.cpp msgid "Shortcuts" -msgstr "" +msgstr "الاختصارات" #: editor/settings_config_dialog.cpp msgid "Binding" -msgstr "" +msgstr "الربط" #: editor/spatial_editor_gizmos.cpp msgid "Change Light Radius" -msgstr "" +msgstr "تغيير نص٠قطر الإنارة" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -11555,9 +11499,8 @@ msgid "Clear Selection" msgstr "إخلاء المØدد" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Fill Selection" -msgstr "ÙƒÙÙ„ المÙØدد" +msgstr "تعبئة المÙØدد" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 3f5c140428..aaa46da54d 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -7,12 +7,13 @@ # Tahmid Karim <tahmidk15@gmail.com>, 2016. # Tawhid H. <Tawhidk757@yahoo.com>, 2019. # Hasibul Hasan <hasibeng78@gmail.com>, 2019. +# Oymate <dhruboadittya96@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-12-13 09:38+0000\n" -"Last-Translator: Hasibul Hasan <hasibeng78@gmail.com>\n" +"PO-Revision-Date: 2020-05-04 15:11+0000\n" +"Last-Translator: Anonymous <noreply@weblate.org>\n" "Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/" "godot/bn/>\n" "Language: bn\n" @@ -20,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 3.10-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -29,7 +30,7 @@ msgstr "অবৈধ পà§à¦°à¦•à¦¾à¦° রূপানà§à¦¤à¦° করার ঠ#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "" +msgstr "১ (à¦à¦•à¦Ÿà¦¿ অকà§à¦·à¦°) দৈরà§à¦˜à§à¦¯ à¦à¦° সà§à¦Ÿà§à¦°à¦¿à¦‚ পà§à¦°à¦¤à§à¦¯à¦¾à¦¶à¦¿à¦¤à¥¤" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp diff --git a/editor/translations/de.po b/editor/translations/de.po index 86e7d09671..c3b2d6ee58 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -53,8 +53,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-20 05:51+0000\n" -"Last-Translator: anonymous <noreply@weblate.org>\n" +"PO-Revision-Date: 2020-05-04 15:11+0000\n" +"Last-Translator: Anonymous <noreply@weblate.org>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -62,7 +62,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -3001,7 +3001,7 @@ msgstr "Dokumentationsvorschläge senden" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" -msgstr "Community" +msgstr "Gemeinschaft" #: editor/editor_node.cpp msgid "About" @@ -10002,6 +10002,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"Die Suchmaske filtert Projekte nach ihrem Namen oder der letzten Komponente " +"ihres Pfadnamens.\n" +"Um den Filter auf den gesamten Pfadnamen anzuwenden muss mindestens ein ‚/‘-" +"Zeichen in der Suchanfrage vorhanden sein." #: editor/project_settings_editor.cpp msgid "Key " @@ -11123,9 +11127,8 @@ msgid "Total:" msgstr "Insgesamt:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Profil exportieren" +msgstr "Liste als CSV-Datei exportieren" #: editor/script_editor_debugger.cpp msgid "Resource Path" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index dc10209d18..d75cb88920 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -7,18 +7,19 @@ # Teashrock <kajitsu22@gmail.com>, 2019. # Brandon Dyer <brandondyer64@gmail.com>, 2019. # Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com>, 2019. +# Sr Half <flavio05@outlook.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2019-11-11 14:19+0000\n" -"Last-Translator: Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com>\n" +"PO-Revision-Date: 2020-05-01 11:43+0000\n" +"Last-Translator: Sr Half <flavio05@outlook.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/" "godot/eo/>\n" "Language: eo\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.10-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -27,7 +28,7 @@ msgstr "Nevalida tip-argumento por funkcio convert(). Uzu konstantojn TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "" +msgstr "Atendas ĉenon de longo 1 (unu karaktero)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -65,31 +66,31 @@ msgstr "En voko al '%s':" #: core/ustring.cpp msgid "B" -msgstr "" +msgstr "B" #: core/ustring.cpp msgid "KiB" -msgstr "" +msgstr "Kib" #: core/ustring.cpp msgid "MiB" -msgstr "" +msgstr "MiB" #: core/ustring.cpp msgid "GiB" -msgstr "" +msgstr "Gib" #: core/ustring.cpp msgid "TiB" -msgstr "" +msgstr "TiB" #: core/ustring.cpp msgid "PiB" -msgstr "" +msgstr "PiB" #: core/ustring.cpp msgid "EiB" -msgstr "" +msgstr "EiB" #: editor/animation_bezier_editor.cpp msgid "Free" @@ -422,7 +423,7 @@ msgstr "Äœi ne estas ebla adici novan vojeton sen radiko" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "" +msgstr "Nevalida trako por Bezier (neniu taÅga subproprietaĵoj)" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" @@ -12285,7 +12286,7 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "Konstantoj ne povas esti modifitaj." #, fuzzy #~ msgid "Help improve the Godot documentation by giving feedback." diff --git a/editor/translations/es.po b/editor/translations/es.po index 933cff80a4..8446ed2415 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -45,11 +45,12 @@ # Julián Luini <jluini@gmail.com>, 2020. # Victor S. <victorstancioiu@gmail.com>, 2020. # henry rujano herrera <rujhen@gmail.com>, 2020. +# Megamega53 <Christopher.Morales21@myhunter.cuny.edu>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-23 20:21+0000\n" +"PO-Revision-Date: 2020-05-04 15:11+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -58,7 +59,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -617,11 +618,11 @@ msgstr "Eliminar Selección" #: editor/animation_track_editor.cpp msgid "Go to Next Step" -msgstr "Ir al Paso Siguiente" +msgstr "Ir al Siguiente Paso" #: editor/animation_track_editor.cpp msgid "Go to Previous Step" -msgstr "Ir al Paso Anterior" +msgstr "Ir al Anterior Paso" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -2043,7 +2044,7 @@ msgstr "" #: editor/editor_help.cpp msgid "Method Descriptions" -msgstr "Descripción de Métodos" +msgstr "Descripciones de Métodos" #: editor/editor_help.cpp msgid "" @@ -2691,7 +2692,7 @@ msgstr "Posición del Dock" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "Modo sin distracciones" +msgstr "Modo Sin Distracciones" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." @@ -2715,11 +2716,11 @@ msgstr "Copiar Texto" #: editor/editor_node.cpp msgid "Next tab" -msgstr "Pestaña siguiente" +msgstr "Siguiente pestaña" #: editor/editor_node.cpp msgid "Previous tab" -msgstr "Pestaña anterior" +msgstr "Anterior pestaña" #: editor/editor_node.cpp msgid "Filter Files..." @@ -5428,7 +5429,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom Reset" -msgstr "Resetear el Zoom" +msgstr "Resetear Zoom" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5456,17 +5457,17 @@ msgstr "Alt + Clic Derecho: Selección en listado de solapamientos" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode" -msgstr "Modo Movimiento" +msgstr "Modo de Movimiento" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Mode" -msgstr "Modo Rotación" +msgstr "Modo de Rotación" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode" -msgstr "Modo Escalado" +msgstr "Modo de Escalado" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5488,7 +5489,7 @@ msgstr "Modo desplazamiento lateral" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Ruler Mode" -msgstr "Modo Regla" +msgstr "Modo de Regla" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle smart snapping." @@ -5679,7 +5680,7 @@ msgstr "Clave de animación y Opciones de Pose" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" -msgstr "Insertar clave (pistas existentes)" +msgstr "Insertar Clave (Pistas Existentes)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" @@ -6035,7 +6036,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Single Convex Collision Sibling" -msgstr "Crear Colisión Convexa Única Hermana" +msgstr "Crear Collider Convexo Único Hermano" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6047,7 +6048,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Multiple Convex Collision Siblings" -msgstr "Crear Múltiples Colisiones Convexas Hermanas" +msgstr "Crear Múltiples Collider Convexos Hermanos" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6855,7 +6856,7 @@ msgstr "Guardar Todo" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "Recargar parcialmente el script" +msgstr "Recargar Parcialmente el Script" #: editor/plugins/script_editor_plugin.cpp msgid "Copy Script Path" @@ -6863,7 +6864,7 @@ msgstr "Copiar Ruta del Script" #: editor/plugins/script_editor_plugin.cpp msgid "History Previous" -msgstr "Previo en Historial" +msgstr "Previo en el Historial" #: editor/plugins/script_editor_plugin.cpp msgid "History Next" @@ -6900,11 +6901,11 @@ msgstr "Ejecutar" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "Step Into" +msgstr "Entrar En" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" -msgstr "Step Over" +msgstr "Salir de AquÃ" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" @@ -7112,15 +7113,15 @@ msgstr "Eliminar Espacios Sobrantes al Final" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent to Spaces" -msgstr "Convertir Indentación en Espacios" +msgstr "Convertir SangrÃa en Espacios" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent to Tabs" -msgstr "Convertir Indentación en Tabulaciones" +msgstr "Convertir SangrÃa en Tabulaciones" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "Autoindentar" +msgstr "Auto SangrÃa" #: editor/plugins/script_text_editor.cpp msgid "Find in Files..." @@ -7140,7 +7141,7 @@ msgstr "Ir al Siguiente Marcador" #: editor/plugins/script_text_editor.cpp msgid "Go to Previous Bookmark" -msgstr "Ir al Marcador Anterior" +msgstr "Ir al Anterior Marcador" #: editor/plugins/script_text_editor.cpp msgid "Remove All Bookmarks" @@ -7157,19 +7158,19 @@ msgstr "Ir a LÃnea..." #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Toggle Breakpoint" -msgstr "Act./Desact. Breakpoint" +msgstr "Cambiar Punto de Ruptura" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "Eliminar Todos los Breakpoints" +msgstr "Eliminar Todos los Puntos de Ruptura" #: editor/plugins/script_text_editor.cpp msgid "Go to Next Breakpoint" -msgstr "Ir al Siguiente Breakpoint" +msgstr "Ir al Siguiente Punto de Ruptura" #: editor/plugins/script_text_editor.cpp msgid "Go to Previous Breakpoint" -msgstr "Ir al Breakpoint Anterior" +msgstr "Ir al Anterior Punto de Ruptura" #: editor/plugins/shader_editor_plugin.cpp msgid "" @@ -7349,11 +7350,11 @@ msgstr "Detrás" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Transform with View" -msgstr "Alinear Transform con Vista" +msgstr "Alinear la Transformación con la Vista" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Rotation with View" -msgstr "Alinear Rotación con Vista" +msgstr "Alinear la Rotación con la Vista" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." @@ -7437,7 +7438,7 @@ msgstr "Vista Libre Frontal" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Backwards" -msgstr "Vista Libre Posterior" +msgstr "Vista Libre Trasera" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" @@ -7507,7 +7508,7 @@ msgstr "Vista Superior" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "Vista Posterior" +msgstr "Vista Trasera" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" @@ -8125,7 +8126,7 @@ msgstr "Asignar un recurso TileSet a este TileMap para usas sus tiles." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" -msgstr "Dibujar tile" +msgstr "Dibujar Tile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" @@ -8233,35 +8234,35 @@ msgstr "Ãndice Z" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Region Mode" -msgstr "Modo Región" +msgstr "Modo de Región" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Collision Mode" -msgstr "Modo Colisión" +msgstr "Modo de Colisión" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Occlusion Mode" -msgstr "Modo Oclusión" +msgstr "Modo de Oclusión" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Navigation Mode" -msgstr "Modo Navegación" +msgstr "Modo de Navegación" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Bitmask Mode" -msgstr "Modo Bitmask" +msgstr "Modo de Bitmask" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Priority Mode" -msgstr "Modo Prioridad" +msgstr "Modo de Prioridad" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Icon Mode" -msgstr "Modo Icono" +msgstr "Modo de Icono" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Z Index Mode" -msgstr "Modo Ãndice Z" +msgstr "Modo de Ãndice Z" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." @@ -9997,6 +9998,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"La casilla de búsqueda filtra los proyectos por nombre y el último " +"componente de la ruta.\n" +"Para filtrar los proyectos por nombre y ruta completa, la consulta debe " +"contener al menos un carácter `/`." #: editor/project_settings_editor.cpp msgid "Key " @@ -11115,9 +11120,8 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Exportar Perfil" +msgstr "Exportar lista a un archivo CSV" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -11890,7 +11894,7 @@ msgstr "Crear Función" #: modules/visual_script/visual_script_editor.cpp msgid "Refresh Graph" -msgstr "Actualizar Gráfico" +msgstr "Refrescar Gráfico" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index bd6d934a59..9136ac11c3 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -18,8 +18,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-23 20:21+0000\n" -"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" +"PO-Revision-Date: 2020-05-02 01:48+0000\n" +"Last-Translator: Anonymous <noreply@weblate.org>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" "Language: es_AR\n" @@ -27,7 +27,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2954,13 +2954,12 @@ msgid "Q&A" msgstr "Q&A" #: editor/editor_node.cpp -#, fuzzy msgid "Report a Bug" -msgstr "Reimportar" +msgstr "Reportar un Bug" #: editor/editor_node.cpp msgid "Send Docs Feedback" -msgstr "" +msgstr "Enviar comentarios sobre la documentación" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4020,9 +4019,8 @@ msgid "Reimport" msgstr "Reimportar" #: editor/import_dock.cpp -#, fuzzy msgid "Save Scenes, Re-Import, and Restart" -msgstr "Guardar escenas, reimportar y reiniciar" +msgstr "Guardar Escenas, Reimportar y Reiniciar" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -7323,9 +7321,8 @@ msgid "This operation requires a single selected node." msgstr "Esta operación requiere un solo nodo seleccionado." #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Auto Orthogonal Enabled" -msgstr "Ortogonal" +msgstr "Auto Ortogonal Activado" #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" @@ -9956,6 +9953,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"La casilla de búsqueda filtra los proyectos por nombre y el último " +"componente de la ruta.\n" +"Para filtrar los proyectos por nombre y ruta completa, la consulta debe " +"contener al menos un carácter `/`." #: editor/project_settings_editor.cpp msgid "Key " @@ -10951,6 +10952,8 @@ msgid "" "Note: Built-in scripts have some limitations and can't be edited using an " "external editor." msgstr "" +"Nota: Los scripts integrados tienen algunas limitaciones y no pueden ser " +"editados con un editor externo." #: editor/script_create_dialog.cpp msgid "Class Name:" @@ -11073,9 +11076,8 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Exportar Perfil" +msgstr "Exportar lista a un archivo CSV" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -12759,7 +12761,7 @@ msgstr "" #: scene/main/viewport.cpp msgid "Viewport size must be greater than 0 to render anything." -msgstr "" +msgstr "El tamaño del viewport debe ser mayor a 0 para poder renderizar." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." diff --git a/editor/translations/fi.po b/editor/translations/fi.po index af9486a2ad..6695783866 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -10,11 +10,12 @@ # Sami Lehtilä <sami.lehtila@gmail.com>, 2018. # Tapani Niemi <tapani.niemi@kapsi.fi>, 2018, 2019, 2020. # Tuomas Lähteenmäki <lahtis@gmail.com>, 2019. +# Matti Niskanen <matti.t.niskanen@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-20 05:51+0000\n" +"PO-Revision-Date: 2020-05-01 11:42+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -23,7 +24,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2757,7 +2758,7 @@ msgstr "Irrallisten resurssien hallinta..." #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "Lopeta ja palaa projektiluetteloon" +msgstr "Poistu projektiluetteloon" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp @@ -5353,7 +5354,7 @@ msgstr "Palauta oletuslähennystaso" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Select Mode" -msgstr "Valitse tila" +msgstr "Valintatila" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" @@ -5381,7 +5382,7 @@ msgstr "Siirtotila" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Mode" -msgstr "Kääntötila" +msgstr "Kiertotila" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9898,6 +9899,9 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"Hakulaatikko suodattaa projektit nimen ja polun loppuosan mukaan.\n" +"Suodattaaksesi projektit nimen ja koko polun mukaan, haussa tulee olla " +"mukana vähintään yksi `/` merkki." #: editor/project_settings_editor.cpp msgid "Key " @@ -11017,9 +11021,8 @@ msgid "Total:" msgstr "Yhteensä:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Vie profiili" +msgstr "Vie lista CSV tiedostoon" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -11790,7 +11793,7 @@ msgstr "Tee funktio" #: modules/visual_script/visual_script_editor.cpp msgid "Refresh Graph" -msgstr "Päivitä graafi" +msgstr "Päivitä kaaviokuva" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 552da2cedf..bb371b7674 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -76,8 +76,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-23 20:21+0000\n" -"Last-Translator: LaurentOngaro <laurent@gameamea.com>\n" +"PO-Revision-Date: 2020-05-05 14:01+0000\n" +"Last-Translator: Anonymous <noreply@weblate.org>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -85,7 +85,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -5467,12 +5467,12 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom Reset" -msgstr "Réinitialiser le facteur d'agrandissement" +msgstr "Réinitialiser le zoom" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Select Mode" -msgstr "Sélectionner le mode" +msgstr "Mode sélection" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" @@ -5505,7 +5505,7 @@ msgstr "Mode rotation" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode" -msgstr "Mode de mise à l'échelle" +msgstr "Mode mise à l'échelle" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5542,7 +5542,7 @@ msgstr "Activer/Désactiver l'aimantation à la grille." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Grid Snap" -msgstr "Aimanter à la grille" +msgstr "Utiliser l'aimantation à la grille" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" @@ -5672,7 +5672,7 @@ msgstr "Centrer sur la sélection" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "Cadrer la sélection" +msgstr "Encadrer la sélection" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -7394,7 +7394,7 @@ msgstr "Arrière" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Transform with View" -msgstr "Aligner le Transform avec la vue" +msgstr "Aligner Transform avec la vue" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Rotation with View" @@ -7480,19 +7480,19 @@ msgstr "Vue libre droite" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Forward" -msgstr "Vue libre de devant" +msgstr "Vue libre avant" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Backwards" -msgstr "Vue libre de derrière" +msgstr "Vue libre arrière" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "Vue libre de dessus" +msgstr "Vue libre haut" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Down" -msgstr "Vue libre de dessous" +msgstr "Vue libre bas" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" @@ -7500,20 +7500,20 @@ msgstr "Modificateur de vitesse de la vue libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" -msgstr "Modificateur de vitesse de la vue libre" +msgstr "Ralentissement de la vue libre" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" -msgstr "Verrouiller la rotation de la vue" +msgstr "Rotation de la vue verrouillée" #: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" -"Note : La valeur FPS affichée est la fréquence d'images de l'éditeur.\n" -"Il ne doit pas être utilisé comme un indicateur fiable de la performance en " -"jeu." +"Note : Les FPS (images par secondes) affichées sont celles de éditeur.\n" +"Elles ne doivent pas être utilisées comme un indicateur fiable de la " +"performance en jeu." #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" @@ -7521,11 +7521,11 @@ msgstr "Dialogue XForm" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes To Floor" -msgstr "Aligner les nÅ“uds au sol" +msgstr "Aligner les nÅ“uds avec le sol" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." -msgstr "N'a pas pu trouvé de sol solide pour y attacher la sélection." +msgstr "Pas de sol solide trouvé pour y attacher la sélection." #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7539,11 +7539,11 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Local Space" -msgstr "Utiliser l'espace local" +msgstr "Utiliser les coordonées locales" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" -msgstr "Aligner sur la grille" +msgstr "Aligner avec la grille" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" @@ -7555,11 +7555,11 @@ msgstr "Vue de dessus" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "Vue arrière" +msgstr "Vue de derrière" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" -msgstr "Vue avant" +msgstr "Vue de devant" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View" @@ -7579,7 +7579,7 @@ msgstr "Insérer une clef d'animation" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" -msgstr "Focaliser l'origine" +msgstr "Focaliser sur l'origine" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" @@ -8174,7 +8174,7 @@ msgstr "Donnez une ressource TileSet à cette TileMap pour utiliser ses tuiles." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" -msgstr "Peindre la case" +msgstr "Peindre la tuile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" @@ -8186,7 +8186,7 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "Sélectionner une case" +msgstr "Sélectionner une tuile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate Left" diff --git a/editor/translations/he.po b/editor/translations/he.po index 35421252b2..69d8bcc3b5 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -5,18 +5,19 @@ # Daniel <lorddaniel09@gmail.com>, 2018. # Ben Golan <golanben4@gmail.com>, 2017. # Luc Stepniewski <lior@gradstein.info>, 2017. -# Yaron Shahrabani <sh.yaron@gmail.com>, 2018, 2019. +# Yaron Shahrabani <sh.yaron@gmail.com>, 2018, 2019, 2020. # RaikaRakka <shaiyatta@gmail.com>, 2018. # Ido Dana <idodana01@gmail.com>, 2019. # Daniel Dovgun <daniel.dovgun@gmail.com>, 2019. # MordechaiHadad <Mordechai.hadad01@gmail.com>, 2019. # Daniel <danielharush5252@gmail.com>, 2020. +# test test <ugbdvwpeikvyzwaadt@awdrt.org>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-02-25 09:41+0000\n" -"Last-Translator: Daniel <danielharush5252@gmail.com>\n" +"PO-Revision-Date: 2020-05-05 14:01+0000\n" +"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" "godot/he/>\n" "Language: he\n" @@ -25,7 +26,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.0-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -34,7 +35,7 @@ msgstr "×ž×©×ª× ×” סוג ×œ× ×—×•×§×™ ×œ×¤×•× ×§×¦×™×™×ª convert()‎, יש ל #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "צופה מחרוזת ב×ורך 1 (תו)" +msgstr "צפויה מחרוזת ב×ורך 1 (תו)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -722,13 +723,12 @@ msgid "Line Number:" msgstr "מספר השורה:" #: editor/code_editor.cpp -#, fuzzy msgid "%d replaced." -msgstr "החלפה…" +msgstr "%d הוחלף." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." -msgstr "" +msgstr "d% הת×מות." #: editor/code_editor.cpp editor/editor_help.cpp #, fuzzy @@ -4044,9 +4044,8 @@ msgid "Saving..." msgstr "שמירה…" #: editor/import_dock.cpp -#, fuzzy msgid "%d Files" -msgstr " קבצי×" +msgstr "%d קבצי×" #: editor/import_dock.cpp msgid "Set as Default for '%s'" @@ -6788,66 +6787,58 @@ msgid "Error writing TextFile:" msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª ×”× ×•×©×" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Could not load file at:" -msgstr "×œ× × ×™×ª×Ÿ ליצור תיקייה." +msgstr "×œ× × ×™×ª×Ÿ לטעון קובץ מהמיקו×:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error saving file!" -msgstr "שגי××” בשמירה" +msgstr "שגי××” בשמירת קובץ!" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error while saving theme." -msgstr "שגי××” בשמירת ערכת העיצוב" +msgstr "שגי××” בשמירת ערכת העיצוב." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Saving" msgstr "שגי××” בשמירה" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." -msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª ×”× ×•×©×" +msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª העיצוב." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" msgstr "שגי××” בייבו×" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New Text File..." -msgstr "תיקייה חדשה…" +msgstr "קובץ טקסט חדש…" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open File" msgstr "פתיחת קובץ" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Save File As..." -msgstr "שמירה בש×…" +msgstr "שמירת קובץ בש×…" #: editor/plugins/script_editor_plugin.cpp msgid "Can't obtain the script for running." -msgstr "" +msgstr "×œ× × ×™×ª×Ÿ לקבל ×ת הסקריפט להרצה." #: editor/plugins/script_editor_plugin.cpp msgid "Script failed reloading, check console for errors." -msgstr "" +msgstr "×¨×¢× ×•×Ÿ הסקריפט × ×›×©×œ, × × ×œ×—×¤×© ×ת השגי×ות במסוף." #: editor/plugins/script_editor_plugin.cpp msgid "Script is not in tool mode, will not be able to run." -msgstr "" +msgstr "הסקריפט ××™× ×• במצב כלי×, ×œ× ×ª×”×™×” לו ×פשרות לרוץ." #: editor/plugins/script_editor_plugin.cpp msgid "" "To run this script, it must inherit EditorScript and be set to tool mode." msgstr "" +"כדי להריץ ×ת הסקריפט ×”×–×”, עליו לרשת EditorScript ולהגדיר ×ותו למצב כלי×." #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme" @@ -6880,9 +6871,8 @@ msgid "Find Previous" msgstr "×יתור הקוד×" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "מ××¤×™×™× ×™ פריט." +msgstr "×¡×™× ×•×Ÿ סקריפטי×" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." diff --git a/editor/translations/hu.po b/editor/translations/hu.po index d066d5e317..620a2d4d5b 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -10,7 +10,6 @@ # Tusa Gamer <tusagamer@mailinator.com>, 2018. # Máté Lugosi <mate.lugosi@gmail.com>, 2019. # sztrovacsek <magadeve@gmail.com>, 2019. -# Deleted User <noreply+18797@weblate.org>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" diff --git a/editor/translations/it.po b/editor/translations/it.po index 1c7c72ce12..8e9432baac 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -46,12 +46,14 @@ # Douglas Fiedler <dognew@gmail.com>, 2020. # E440QF <ettore.beltra@gmail.com>, 2020. # Giuseppe Lucido <giuseppe.lucido@gmail.com>, 2020. +# Mirko Proto <mirko7@protonmail.com>, 2020. +# J. Lavoie <j.lavoie@net-c.ca>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-27 08:25+0000\n" -"Last-Translator: Micila Micillotto <micillotto@gmail.com>\n" +"PO-Revision-Date: 2020-05-04 15:12+0000\n" +"Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -59,7 +61,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -3026,7 +3028,7 @@ msgstr "Esegui la scena in modifica." #: editor/editor_node.cpp msgid "Play Scene" -msgstr "Esegui scena" +msgstr "Avvia Scena" #: editor/editor_node.cpp msgid "Play custom scene" @@ -3034,7 +3036,7 @@ msgstr "Esegui scena personalizzata" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "Esegui scena personalizzata" +msgstr "Avvia Scena Personalizzata" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." @@ -3071,7 +3073,7 @@ msgstr "Ispettore" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "Espandi pannello inferiore" +msgstr "Espandi Pannello Inferiore" #: editor/editor_node.cpp msgid "Output" @@ -11111,9 +11113,8 @@ msgid "Total:" msgstr "Totale:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Esporta profilo" +msgstr "Esporta l'elenco in un file CSV" #: editor/script_editor_debugger.cpp msgid "Resource Path" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index aac20e9666..8aef04db94 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -35,8 +35,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-27 08:25+0000\n" -"Last-Translator: Anonymous <noreply@weblate.org>\n" +"PO-Revision-Date: 2020-05-04 15:12+0000\n" +"Last-Translator: Wataru Onuki <bettawat@yahoo.co.jp>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" @@ -44,7 +44,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -592,7 +592,7 @@ msgstr "é¸æŠžç¯„囲を複製" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" -msgstr "複製を転置" +msgstr "転置ã—ã¦è¤‡è£½" #: editor/animation_track_editor.cpp msgid "Delete Selection" @@ -1862,7 +1862,7 @@ msgstr "éš ã—ファイルをオン / オフ" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" -msgstr "ãŠæ°—ã«å…¥ã‚Šã®ã‚ªãƒ³ / オフ" +msgstr "ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹ / ã—ãªã„" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" @@ -1870,7 +1870,7 @@ msgstr "モード切替ãˆ" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "フォーカスパス" +msgstr "パスã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" @@ -1898,7 +1898,7 @@ msgstr "ファイル更新。" #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." -msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹/ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰å¤–ã™ã€‚" +msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹ / ã—ãªã„。" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Toggle the visibility of hidden files." @@ -1989,7 +1989,7 @@ msgstr "メソッド" #: editor/editor_help.cpp msgid "Theme Properties" -msgstr "テーマプãƒãƒ‘ティ" +msgstr "テーマ プãƒãƒ‘ティ" #: editor/editor_help.cpp msgid "Enumerations" @@ -4051,6 +4051,7 @@ msgid "Copy Resource" msgstr "リソースをコピー" #: editor/inspector_dock.cpp +#, fuzzy msgid "Make Built-In" msgstr "ビルトインを作æˆ" @@ -5316,22 +5317,22 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock Selected" -msgstr "é¸æŠžã‚’ãƒãƒƒã‚¯" +msgstr "é¸æŠžå¯¾è±¡ã‚’ãƒãƒƒã‚¯" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock Selected" -msgstr "é¸æŠžã‚’解除" +msgstr "é¸æŠžå¯¾è±¡ã‚’ãƒãƒƒã‚¯è§£é™¤" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Group Selected" -msgstr "é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—" +msgstr "é¸æŠžå¯¾è±¡ã‚’グループ化" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Ungroup Selected" -msgstr "グループ解除" +msgstr "é¸æŠžå¯¾è±¡ã‚’グループ解除" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" @@ -5390,7 +5391,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+RMB: Depth list selection" -msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ã(被写界深度)リストã®é¸æŠž" +msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ãé¸æŠžãƒªã‚¹ãƒˆ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5500,12 +5501,12 @@ msgstr "ガイドã«ã‚¹ãƒŠãƒƒãƒ—" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock the selected object in place (can't be moved)." -msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをãã®å ´ã§ãƒãƒƒã‚¯ (移動ä¸å¯èƒ½ã«ã™ã‚‹)。" +msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをç¾åœ¨ä½ç½®ã§ãƒãƒƒã‚¯ (移動ä¸å¯èƒ½ã«ã™ã‚‹)。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock the selected object (can be moved)." -msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをアンãƒãƒƒã‚¯ (移動å¯èƒ½ã«ã™ã‚‹)。" +msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをãƒãƒƒã‚¯è§£é™¤ (移動å¯èƒ½ã«ã™ã‚‹)。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5568,11 +5569,11 @@ msgstr "グループアイコンã¨ãƒãƒƒã‚¯ã‚¢ã‚¤ã‚³ãƒ³ã‚’表示" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" -msgstr "センターé¸æŠž" +msgstr "é¸æŠžå¯¾è±¡ã‚’ä¸å¤®ã«" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "フレームé¸æŠž" +msgstr "é¸æŠžå¯¾è±¡ã‚’å…¨é¢ã«" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -6842,7 +6843,7 @@ msgstr "ブレーク" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp msgid "Continue" -msgstr "実行を継続" +msgstr "続行" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" @@ -7034,7 +7035,7 @@ msgstr "シンボルを補完" #: editor/plugins/script_text_editor.cpp msgid "Evaluate Selection" -msgstr "é¸æŠžã—ãŸã‚‚ã®ã‚’評価ã™ã‚‹" +msgstr "é¸æŠžç¯„囲を評価ã™ã‚‹" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" @@ -7058,7 +7059,7 @@ msgstr "複数ファイル内を検索..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" -msgstr "コンテã‚ストヘルプ" +msgstr "コンテã‚スト ヘルプ" #: editor/plugins/script_text_editor.cpp msgid "Toggle Bookmark" @@ -7363,11 +7364,11 @@ msgstr "フリールックå³" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Forward" -msgstr "å‰æ–¹ã‚’フリールックã§è¦‹ã‚‹" +msgstr "フリールックå‰é€²" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Backwards" -msgstr "フリールック後方" +msgstr "フリールック後進" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" @@ -7379,11 +7380,11 @@ msgstr "フリールック下" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "フリールックã®é€Ÿåº¦ã‚’調整" +msgstr "フリールックã®é€Ÿåº¦èª¿æ•´" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" -msgstr "フリールックã®æ¸›é€Ÿã‚’調整" +msgstr "フリールックã®æ¸›é€Ÿèª¿æ•´" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" @@ -7399,7 +7400,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" -msgstr "Xformダイアãƒã‚°" +msgstr "XFormダイアãƒã‚°" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes To Floor" @@ -7407,7 +7408,7 @@ msgstr "ノードをフãƒã‚¢ã«ã‚¹ãƒŠãƒƒãƒ—" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." -msgstr "é¸æŠžã‚’スナップã™ã‚‹å‰›ä½“ã®åºŠã‚’見ã¤ã‘ã‚Œã¾ã›ã‚“。" +msgstr "é¸æŠžå¯¾è±¡ã‚’スナップã•ã›ã‚‹å‰›ä½“ã®åºŠã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7415,9 +7416,9 @@ msgid "" "Alt+Drag: Move\n" "Alt+RMB: Depth list selection" msgstr "" -"ドラッグ:回転\n" -"Alt+ドラッグ:移動\n" -"Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ãリストã®é¸æŠž" +"ドラッグ: 回転\n" +"Alt+ドラッグ: 移動\n" +"Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ãé¸æŠžãƒªã‚¹ãƒˆ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Local Space" @@ -7453,7 +7454,7 @@ msgstr "å³å´é¢å›³" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" -msgstr "é€è¦–図/æ£æŠ•å½±å›³ã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "é€è¦–投影 / 平行投影ã®åˆ‡ã‚Šæ›¿ãˆ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" @@ -7465,7 +7466,7 @@ msgstr "原点ã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" -msgstr "é¸æŠžã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹" +msgstr "é¸æŠžå¯¾è±¡ã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Freelook" @@ -7494,7 +7495,7 @@ msgstr "2 ビューãƒãƒ¼ãƒˆ" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "2 ビューãƒãƒ¼ãƒˆ(Alt)" +msgstr "2 ビューãƒãƒ¼ãƒˆ (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" @@ -7502,7 +7503,7 @@ msgstr "3 ビューãƒãƒ¼ãƒˆ" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "3 ビューãƒãƒ¼ãƒˆ(Alt)" +msgstr "3 ビューãƒãƒ¼ãƒˆ (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" @@ -7799,7 +7800,7 @@ msgstr "スプライトフレーム" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Region Rect" -msgstr "矩形ã®é ˜åŸŸã‚’è¨å®š" +msgstr "é ˜åŸŸ Rect ã‚’è¨å®š" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Margin" @@ -7989,7 +7990,7 @@ msgstr "フォント" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" -msgstr "\\ Color" +msgstr "Color" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme File" @@ -7997,7 +7998,7 @@ msgstr "テーマ ファイル" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" -msgstr "é¸æŠžå¯¾è±¡ã‚’消去" +msgstr "é¸æŠžç¯„囲を消去" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Fix Invalid Tiles" @@ -8006,7 +8007,7 @@ msgstr "無効ãªã‚¿ã‚¤ãƒ«ã‚’ä¿®æ£" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Cut Selection" -msgstr "é¸æŠžå¯¾è±¡ã‚’切りå–ã‚Š" +msgstr "é¸æŠžç¯„囲を切りå–ã‚Š" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" @@ -8018,7 +8019,7 @@ msgstr "ç›´ç·šã‚’æç”»" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" -msgstr "矩形ペイント" +msgstr "長方形ペイント" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket Fill" @@ -8030,7 +8031,7 @@ msgstr "タイルマップを消去" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Find Tile" -msgstr "タイルを検索ã™ã‚‹" +msgstr "タイルを検索" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" @@ -8056,19 +8057,19 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" -msgstr "タイルを塗る" +msgstr "タイルをペイント" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" "Shift+LMB: Line Draw\n" "Shift+Ctrl+LMB: Rectangle Paint" msgstr "" -"Shift+左マウスボタン:ç·šã®æç”»\n" -"Shift+Ctrl+左マウスボタン:矩形ペイント" +"Shift+左マウスボタン: ç›´ç·šã«æã\n" +"Shift+Ctrl+左マウスボタン: 長方形ペイント" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "タイルをé¸æŠž" +msgstr "タイルをピック" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate Left" @@ -8208,7 +8209,7 @@ msgstr "ビットマスクを消去。" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new rectangle." -msgstr "æ–°è¦çŸ©å½¢ã‚’作æˆã€‚" +msgstr "æ–°ã—ã長方形を作æˆã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new polygon." @@ -8265,12 +8266,12 @@ msgid "" "Drag handles to edit Rect.\n" "Click on another Tile to edit it." msgstr "" -"ãƒãƒ³ãƒ‰ãƒ«ã‚’ドラッグã—ã¦çŸ©å½¢ã‚’編集ã—ã¾ã™ã€‚\n" -"別ã®ã‚¿ã‚¤ãƒ«ã‚’クリックã—ã¦ãれを編集ã—ã¾ã™ã€‚" +"ãƒãƒ³ãƒ‰ãƒ«ã‚’ドラッグã—ã¦é•·æ–¹å½¢ã‚’編集ã—ã¾ã™ã€‚\n" +"別ã®ã‚¿ã‚¤ãƒ«ã‚’クリックã™ã‚‹ã¨ãれを編集ã—ã¾ã™ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Delete selected Rect." -msgstr "é¸æŠžã—ãŸçŸ©å½¢ã‚’削除ã™ã‚‹ã€‚" +msgstr "é¸æŠžã—ãŸé•·æ–¹å½¢ã‚’削除ã™ã‚‹ã€‚" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8476,7 +8477,7 @@ msgstr "タイプã®å¤‰æ›´" #: editor/plugins/version_control_editor_plugin.cpp msgid "Stage Selected" -msgstr "é¸æŠžç‰©ã‚’ステージã™ã‚‹" +msgstr "é¸æŠžå¯¾è±¡ã‚’ステージã™ã‚‹" #: editor/plugins/version_control_editor_plugin.cpp msgid "Stage All" @@ -9285,6 +9286,7 @@ msgstr "" "ãŸã‚ã«ãれを使用ã—ãªã„ã§ãã ã•ã„。" #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "" "Returns falloff based on the dot product of surface normal and view " "direction of camera (pass associated inputs to it)." @@ -9911,6 +9913,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"検索ボックスã§ã¯ã€ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã¯åå‰ãŠã‚ˆã³ãƒ‘スã®æœ€å¾Œã®éƒ¨åˆ†ã§ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã•ã‚Œã¾" +"ã™ã€‚\n" +"プãƒã‚¸ã‚§ã‚¯ãƒˆåãŠã‚ˆã³å®Œå…¨ãƒ‘スã§ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã™ã‚‹ã«ã¯ã€ã‚¯ã‚¨ãƒªã«ã¯ `/` æ–‡å—ãŒå°‘ãªã" +"ã¨ã‚‚1ã¤å¿…è¦ã§ã™ã€‚" #: editor/project_settings_editor.cpp msgid "Key " @@ -11026,9 +11032,8 @@ msgid "Total:" msgstr "åˆè¨ˆ:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "プãƒãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" +msgstr "CSVファイルã«ãƒªã‚¹ãƒˆã‚’エクスãƒãƒ¼ãƒˆ" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -11779,7 +11784,7 @@ msgstr "グラフを編集ã™ã‚‹é–¢æ•°ã‚’é¸æŠžã¾ãŸã¯ä½œæˆã—ã¾ã™ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Delete Selected" -msgstr "é¸æŠžæ¸ˆã¿ã‚’削除" +msgstr "é¸æŠžå¯¾è±¡ã‚’削除" #: modules/visual_script/visual_script_editor.cpp msgid "Find Node Type" @@ -11795,11 +11800,11 @@ msgstr "ノードを切りå–ã‚‹" #: modules/visual_script/visual_script_editor.cpp msgid "Make Function" -msgstr "関数ã®ä½œæˆ" +msgstr "関数を作æˆ" #: modules/visual_script/visual_script_editor.cpp msgid "Refresh Graph" -msgstr "グラフã®æ›´æ–°" +msgstr "グラフを更新" #: modules/visual_script/visual_script_editor.cpp msgid "Edit Member" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index b2dbd4e353..f25550709a 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -21,8 +21,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-20 05:51+0000\n" -"Last-Translator: Myeongjin Lee <aranet100@gmail.com>\n" +"PO-Revision-Date: 2020-05-01 11:42+0000\n" +"Last-Translator: Ch. <ccwpc@hanmail.net>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -30,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -5929,7 +5929,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Single Convex Collision Sibling" -msgstr "개별 Convex ì¶©ëŒ í˜•ì œ 만들기" +msgstr "ë‹¨ì¼ Convex ì¶©ëŒ í˜•ì œ 만들기" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -9838,6 +9838,9 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"ì´ ê²€ìƒ‰ì°½ì€ í”„ë¡œì 트를 ì´ë¦„ê³¼ ê²½ë¡œì˜ ë§ˆì§€ë§‰ 부분으로 거릅니다.\n" +"프로ì 트를 ì „ì²´ 경로를 기준으로 ê±¸ëŸ¬ë‚´ë ¤ë©´ ê²€ìƒ‰ì–´ì— `/` ê°€ í•œ ê¸€ìž ì´ìƒ í¬í•¨" +"시키세요." #: editor/project_settings_editor.cpp msgid "Key " @@ -10949,9 +10952,8 @@ msgid "Total:" msgstr "ì „ì²´:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "프로필 내보내기" +msgstr "목ë¡ì„ CSV 파ì¼ë¡œ 내보내기" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -12584,7 +12586,7 @@ msgstr "" #: scene/main/viewport.cpp msgid "Viewport size must be greater than 0 to render anything." -msgstr "ë·°í¬íŠ¸ í¬ê¸°ëŠ” 무엇ì´ë“ ë Œë”ë§í•˜ê¸° 위해 0보다 커야 합니다." +msgstr "무엇ì´ë“ ë Œë”ë§í•˜ë ¤ë©´ ë·°í¬íŠ¸ í¬ê¸°ê°€ 0보다 커야 합니다." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 5b2a55ffbe..902c243d16 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -3,41 +3,42 @@ # Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. # Prachi Joshi <josprachi@yahoo.com>, 2019, 2020. +# Shirious <sad3119823@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2020-01-30 03:56+0000\n" -"Last-Translator: Prachi Joshi <josprachi@yahoo.com>\n" +"PO-Revision-Date: 2020-05-05 14:01+0000\n" +"Last-Translator: Shirious <sad3119823@gmail.com>\n" "Language-Team: Marathi <https://hosted.weblate.org/projects/godot-engine/" "godot/mr/>\n" "Language: mr\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.11-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "" +msgstr "convert() साठी अवैध आरगà¥à¤¯à¥à¤®à¥‡à¤¨à¥à¤Ÿ, TYPE_* कोनà¥à¤¸à¤Ÿà¤¨à¥à¤Ÿ वापरा." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "" +msgstr "1 लांबीची सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग अपेकà¥à¤·à¤¿à¤¤ (à¤à¤• कैरेकà¥à¤Ÿà¤°)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "" +msgstr "डिकोड करणà¥à¤¯à¤¾à¤¸à¤¾à¤ ी पà¥à¤°à¤¸à¥‡ बाईटसॠनाहित, किंवा अवैध फ़ोरमैट." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "" +msgstr "à¤à¤•à¥à¤¸à¤ªà¥à¤°à¥‡à¤¶à¤¨ मधे अवैध इनपà¥à¤Ÿ %i (पास नाही à¤à¤¾à¤²à¥‡)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "" +msgstr "self वापरले जाऊ शकत नाही कारण इनà¥à¤¸à¤Ÿà¤¨à¥à¤¸ null आहे (पास नाही à¤à¤¾à¤²à¥‡)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -1928,9 +1929,8 @@ msgid "Property Descriptions" msgstr "" #: editor/editor_help.cpp -#, fuzzy msgid "(value)" -msgstr "मूलà¥à¤¯:" +msgstr "(किंमत)" #: editor/editor_help.cpp msgid "" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index ba11dc0dad..93219f8bfc 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -44,7 +44,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-23 20:21+0000\n" +"PO-Revision-Date: 2020-05-04 15:12+0000\n" "Last-Translator: Stijn Hinlopen <f.a.hinlopen@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" @@ -53,7 +53,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -2023,8 +2023,8 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Er is momenteel geen beschrijving voor deze eigenschap. Help ons alsjeblieft " -"door [color=$color][url=$url]een toe te voegen[/url][/color]!" +"Er is momenteel geen beschrijving voor deze eigenschap. Help ons alstublieft " +"door [color=$color][url=$url]een bijdrage te leveren[/url][/color]!" #: editor/editor_help.cpp msgid "Method Descriptions" @@ -2035,8 +2035,8 @@ msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Er is momenteel geen beschrijving voor deze methode. Help ons alsjeblieft " -"door [color=$color][url=$url]een toe te voegen[/url][/color]!" +"Er is momenteel geen beschrijving voor deze methode. Help ons alstublieft " +"door [color=$color][url=$url]een bijdrage te leveren[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2500,8 +2500,8 @@ msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" -"Deze optie is verouderd. Situaties waar een hernieuwing geforceerd moet " -"worden zijn softwarefouten. Rapporteer dit alsjeblieft." +"Deze optie is verouderd. Situaties waarbij gedwongen herladen moet worden, " +"worden gezien als softwarefouten. Rapporteer dit alstublieft." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -2730,7 +2730,7 @@ msgstr "Alle scènes opslaan" #: editor/editor_node.cpp msgid "Convert To..." -msgstr "Converteer Naar..." +msgstr "Omzetten naar..." #: editor/editor_node.cpp msgid "MeshLibrary..." @@ -5898,7 +5898,7 @@ msgstr "Creëer een statisch tri-mesh lichaam" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" -msgstr "Dit werkt niet op scènewortel!" +msgstr "Dit werkt niet op de scènewortel!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Shape" @@ -6986,7 +6986,7 @@ msgstr "Kies Kleur" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Convert Case" -msgstr "Converteer Hoofdlettergebruik" +msgstr "Letters omzetten" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Uppercase" @@ -6998,7 +6998,7 @@ msgstr "Kleine letters" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Capitalize" -msgstr "Maak Hoofdletters" +msgstr "Elk Woord Met Hoofdletter" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Syntax Highlighter" @@ -7074,15 +7074,15 @@ msgstr "Trim Navolgende Spaties" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent to Spaces" -msgstr "Converteer Indentatie Naar Spaties" +msgstr "Insprong in spaties omzetten" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent to Tabs" -msgstr "Converteer Indentatie Naar Tabs" +msgstr "Insprong in Tabs omzetten" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "Auto Indentatie" +msgstr "Automatisch inspringen" #: editor/plugins/script_text_editor.cpp msgid "Find in Files..." @@ -7678,7 +7678,7 @@ msgstr "Ongeldige geometrie, kan geen polygon creëren." #: editor/plugins/sprite_editor_plugin.cpp msgid "Convert to Polygon2D" -msgstr "Converteer naar Polygon2D" +msgstr "Naar Polygon2D omzetten" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." @@ -9816,8 +9816,8 @@ msgstr "" "\n" "%s\n" "\n" -"Als je doorgaat met het openen van dit bestand, zal het worden geconverteerd " -"naar Godot's huidige format voor project-configuratiebestanden.\n" +"Als je doorgaat met het openen van dit bestand, zal het worden omgezet naar " +"Godot's huidige formaat voor project-configuratiebestanden.\n" "Waarschuwing: Hierna kan het project niet meer worden geopend door oudere " "versies van Godot Engine." @@ -9966,6 +9966,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"De zoekbalk filtert projecten op naam en naam van de map waarin het project " +"staat.\n" +"Om ook op het volledige pad te filteren, moet de zoekopdracht tenminste één " +"`/` karakter bevatten." #: editor/project_settings_editor.cpp msgid "Key " @@ -10706,7 +10710,7 @@ msgstr "Knoop hieronder toevoegen" #: editor/scene_tree_dock.cpp msgid "Expand/Collapse All" -msgstr "Alles uit-/inklappen" +msgstr "Alles in-/uitklappen" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -10718,7 +10722,7 @@ msgstr "Onder nieuwe knoop hangen" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" -msgstr "Scènewortel instellen" +msgstr "Als scènewortel instellen" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -11085,9 +11089,8 @@ msgid "Total:" msgstr "Totaal:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Profiel exporteren" +msgstr "Exporteer lijst naar een csv-bestand" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -12208,9 +12211,7 @@ msgstr "" msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" -msgstr "" -"Een vorm moet voorzien worden om CollisionShape2D te laten functioneren. " -"Creëer hiervoor alsjeblieft een vorm resource!" +msgstr "Een CollisionShape2D heeft een vorm nodig in de Shape-eigenschap!" #: scene/2d/cpu_particles_2d.cpp msgid "" @@ -12238,7 +12239,7 @@ msgstr "" #: scene/2d/light_occluder_2d.cpp msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" -"De occluder polygoon van deze occluder is leeg. Teken alsjeblieft een " +"De occluder-polygoon van deze occluder is leeg. Teken alstublieft een " "polygoon." #: scene/2d/navigation_polygon.cpp @@ -12703,7 +12704,7 @@ msgstr "Alarm!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." -msgstr "Bevestig alsjeblieft..." +msgstr "Bevestig alstublieft..." #: scene/gui/popup.cpp msgid "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index eb84ea26ca..a7b57f31ba 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -42,7 +42,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-27 08:25+0000\n" +"PO-Revision-Date: 2020-05-01 11:42+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -52,7 +52,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -9933,6 +9933,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"Pasek wyszukiwania filtruje projekty po nazwie i ostatnim komponencie " +"Å›cieżki.\n" +"By filtrować po nazwie i peÅ‚nej Å›cieżce, zapytanie musi zawierać " +"przynajmniej jeden znak \"/\"." #: editor/project_settings_editor.cpp msgid "Key " @@ -11049,9 +11053,8 @@ msgid "Total:" msgstr "CaÅ‚kowity:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Eksportuj profil" +msgstr "Eksportuj listÄ™ do pliku CSV" #: editor/script_editor_debugger.cpp msgid "Resource Path" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index b7102a7cdf..d38c4186c7 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -86,12 +86,14 @@ # Richard Urban <redasuio1@gmail.com>, 2020. # Wellyngton R Weller <well.weller@hotmail.com>, 2020. # Lucas Araujo <lucassants2808@gmail.com>, 2020. +# Sr Half <flavio05@outlook.com>, 2020. +# Matheus Pesegoginski <pese.ek.tk@outlook.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2020-04-27 08:25+0000\n" -"Last-Translator: johnnybigoode <jamarson@gmail.com>\n" +"PO-Revision-Date: 2020-05-04 15:12+0000\n" +"Last-Translator: Anonymous <noreply@weblate.org>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -99,7 +101,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -736,7 +738,7 @@ msgstr "Selecionar Todos/Nenhum" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" -msgstr "Adicionar Trilha de Clipes de Ãudio" +msgstr "Adicionar Clipe de Trilha de Ãudio" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -3128,7 +3130,7 @@ msgstr "" "Você pode então aplicar modificações e construir seu próprio APK na guia " "Exportação (Adicionando módulos, trocando o AndroidManifest.xml, etc.).\n" "Note que para fazer uma construção customizada, em vez de usar APKs pre-" -"construÃdos, a opção \"Usar construção customizada\" deve estar ativa nas " +"construÃdos, a opção \"Usar Construção Customizada\" deve estar ativa nas " "predefinições de exportação Android." #: editor/editor_node.cpp @@ -5655,7 +5657,7 @@ msgstr "Visualizar Canvas Scale" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." -msgstr "Mascara de tradução para inserção de chaves" +msgstr "Máscara de tradução para inserção de chaves" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation mask for inserting keys." @@ -6044,7 +6046,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Single Convex Collision Sibling" -msgstr "Criar Simples Colisão Convexa Irmã(s)" +msgstr "Criar um irmão de Colisão Convexa" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -7369,7 +7371,7 @@ msgstr "Essa operação requer um único nó selecionado." #: editor/plugins/spatial_editor_plugin.cpp msgid "Auto Orthogonal Enabled" -msgstr "Ortogonal automático habilitado" +msgstr "Auto-Ortogonal Habilitado" #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" @@ -7689,7 +7691,7 @@ msgstr "Visualizar PolÃgono De Colisão 2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create LightOccluder2D" -msgstr "Criar LightOccluder2D" +msgstr "Criar PolÃgono de Oclusão (LightOccluder2D)" #: editor/plugins/sprite_editor_plugin.cpp msgid "LightOccluder2D Preview" @@ -7730,7 +7732,7 @@ msgstr "Criar PolÃgonoDeColisão2D Irmão" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create light occluder." -msgstr "Geometria inválida, não é possÃvel criar oclusor de luz." +msgstr "Geometria inválida, não é possÃvel criar o oclusor de luz." #: editor/plugins/sprite_editor_plugin.cpp msgid "Create LightOccluder2D Sibling" @@ -8145,11 +8147,11 @@ msgstr "Pegar Tile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate Left" -msgstr "Girar à esquerda" +msgstr "Girar à Esquerda" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate Right" -msgstr "Girar à direita" +msgstr "Girar à Direita" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Horizontally" @@ -9991,6 +9993,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"A caixa de busca filtra projetos por nome e pelo último componente do " +"caminho.\n" +"Para filtrar projetos por nome e pelo caminho completo, a consulta deve " +"conter pelo menos um caractere `/`." #: editor/project_settings_editor.cpp msgid "Key " @@ -11107,9 +11113,8 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Exportar Perfil" +msgstr "Exportar lista para arquivo CSV" #: editor/script_editor_debugger.cpp msgid "Resource Path" diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index f7c6f042d2..6314d31908 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-20 05:51+0000\n" +"PO-Revision-Date: 2020-05-01 11:42+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" @@ -29,7 +29,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1473,7 +1473,7 @@ msgstr "O Ficheiro não existe." #: editor/editor_autoload_settings.cpp msgid "Not in resource path." -msgstr "Não está no Caminho do recurso." +msgstr "Não está no caminho do recurso." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -2498,27 +2498,27 @@ msgstr "Incapaz de localizar campo Script para plugin em: 'res://addons/%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "Incapaz de carregar Script addon do Caminho: '%s'." +msgstr "Incapaz de carregar script addon do caminho: '%s'." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." msgstr "" -"Incapaz de carregar Script addon do caminho: '%s' Parece haver um erro no " +"Incapaz de carregar script addon do caminho: '%s' Parece haver um erro no " "código, reveja a sintaxe." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" -"Incapaz de carregar Script addon do Caminho: '%s' Tipo base não é " +"Incapaz de carregar script addon do Caminho: '%s' Tipo base não é " "EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" -"Incapaz de carregar Script addon do Caminho: '%s' Script não está no modo " +"Incapaz de carregar script addon do Caminho: '%s' Script não está no modo " "ferramenta." #: editor/editor_node.cpp @@ -3443,7 +3443,7 @@ msgstr "Não foi encontrado version.txt dentro dos Modelos." #: editor/export_template_manager.cpp msgid "Error creating path for templates:" -msgstr "Erro ao criar o Caminho para os Modelos:" +msgstr "Erro ao criar o caminho para os modelos:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -6069,7 +6069,7 @@ msgstr "Fonte da Malha não especificada (e MultiMesh não contêm Malha)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." -msgstr "A fonte da Malha é inválida (Caminho inválido)." +msgstr "A fonte da malha é inválida (caminho inválido)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (not a MeshInstance)." @@ -6085,7 +6085,7 @@ msgstr "Fonte de superfÃcie não especificada." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (invalid path)." -msgstr "A fonte de superfÃcie é inválida (Caminho inválido)." +msgstr "A fonte de superfÃcie é inválida (caminho inválido)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no geometry)." @@ -9615,7 +9615,7 @@ msgstr "Seria uma boa ideia dar um nome ao Projeto." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "Caminho de Projeto inválido (alguma alteração?)." +msgstr "Caminho de projeto inválido (alguma alteração?)." #: editor/project_manager.cpp msgid "" @@ -9902,6 +9902,10 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"A caixa de pesquisa filtra projetos por nome e último componente do " +"caminho.\n" +"Para filtrar projetos por nome e caminho completo, a pesquisa tem de conter " +"pelo menos um caráter `/`." #: editor/project_settings_editor.cpp msgid "Key " @@ -10101,7 +10105,7 @@ msgstr "Remover tradução" #: editor/project_settings_editor.cpp msgid "Add Remapped Path" -msgstr "Adicionar correção remapeada" +msgstr "Adicionar Caminho Remapeado" #: editor/project_settings_editor.cpp msgid "Resource Remap Add Remap" @@ -10862,11 +10866,11 @@ msgstr "Nome de classe inválido." #: editor/script_create_dialog.cpp msgid "Invalid inherited parent name or path." -msgstr "Nome ou Caminho de parente herdado inválido." +msgstr "Nome ou caminho de parente herdado inválido." #: editor/script_create_dialog.cpp msgid "Script path/name is valid." -msgstr "Caminho/nome de Script é válido." +msgstr "Caminho/nome de script é válido." #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9, _ and ." @@ -11017,13 +11021,12 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "Exportar Perfil" +msgstr "Exportar lista para ficheiro CSV" #: editor/script_editor_debugger.cpp msgid "Resource Path" -msgstr "Caminho do recurso" +msgstr "Caminho do Recurso" #: editor/script_editor_debugger.cpp msgid "Type" @@ -11241,7 +11244,7 @@ msgstr "" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary format (invalid script at @path)" -msgstr "Formato de dicionário de instância inválido (Script inválido em @path)" +msgstr "Formato de dicionário de instância inválido (script inválido em @path)" #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary (invalid subclasses)" @@ -12240,7 +12243,7 @@ msgstr "" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." msgstr "" -"Para funcionar, a Propriedade Caminho tem de apontar para um nó Node2D " +"Para funcionar, a propriedade caminho tem de apontar para um nó Node2D " "válido." #: scene/2d/skeleton_2d.cpp diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 2344b31e59..d8c55d825e 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -70,12 +70,13 @@ # Ivan Kuzmenko <kuzmenko.ivan2002@yandex.com>, 2020. # Super Pracion <superpracion2@gmail.com>, 2020. # PizzArt <7o7goo7o7@gmail.com>, 2020. +# TheGracekale <mrsmailbot.lg@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-23 20:21+0000\n" -"Last-Translator: PizzArt <7o7goo7o7@gmail.com>\n" +"PO-Revision-Date: 2020-05-05 14:01+0000\n" +"Last-Translator: Super Pracion <superpracion2@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -84,7 +85,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: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -9966,6 +9967,9 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"Поле поиÑка фильтрует проекты по имени и поÑледнему компоненту пути\n" +"Чтобы отфильтровать проекты по имени и полному пути, Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ñодержать " +"Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один Ñимвол `/`." #: editor/project_settings_editor.cpp msgid "Key " @@ -10935,9 +10939,8 @@ msgid "Invalid inherited parent name or path." msgstr "Ðеверное Ð¸Ð¼Ñ Ð¸Ð»Ð¸ путь наÑледуемого предка." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script path/name is valid." -msgstr "Путь/Ð¸Ð¼Ñ Ñкрипта дейÑтвителен." +msgstr "Путь/Ð¸Ð¼Ñ Ñкрипта допуÑтимы." #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9, _ and ." @@ -11089,9 +11092,8 @@ msgid "Total:" msgstr "Ð’Ñего:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "ÐкÑпортировать профиль" +msgstr "ÐкÑпортировать профиль в CSV файл" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -12524,7 +12526,6 @@ msgid "PathFollow only works when set as a child of a Path node." msgstr "PathFollow работает только при еÑли она дочь узла Path." #: scene/3d/path.cpp -#, fuzzy msgid "" "PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " "parent Path's Curve resource." diff --git a/editor/translations/sk.po b/editor/translations/sk.po index d5730a7db9..295b7ac429 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-23 20:21+0000\n" +"PO-Revision-Date: 2020-05-01 11:42+0000\n" "Last-Translator: Richard Urban <redasuio1@gmail.com>\n" "Language-Team: Slovak <https://hosted.weblate.org/projects/godot-engine/" "godot/sk/>\n" @@ -22,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -3034,6 +3034,13 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" +"Toto pripravà vás projekt pre vlastný Android builds keÄ inÅ¡talujete source " +"template do \"res://android/build\".\n" +"Teraz môžete pridaÅ¥ modifikácie a tak vytvoriÅ¥ vlastné APK na export " +"(pridávanie modulov, zmeniÅ¥ AndroidManifest.xml, atÄ.).\n" +"Poznámka že v záujme vytvorenia vlastných zostavenà namiesto použitia vopred " +"vytvorených súborov APK by mala byÅ¥ v predvoľbe exportu systému Android " +"povolená možnosÅ¥ \"Use Costom Build\"." #: editor/editor_node.cpp msgid "" @@ -3042,27 +3049,30 @@ msgid "" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" +"V tomto projekte už je nainÅ¡talovaný Android build template a nemôže byÅ¥ " +"prepÃsaný.\n" +"Manuálne odstránte \"res://android/build\" predtým ako sa znova pokúsite o " +"túto operáciu." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "" +msgstr "ImportovaÅ¥ Å ablóny Zo ZIP File-u" #: editor/editor_node.cpp -#, fuzzy msgid "Template Package" -msgstr "VÅ¡etky vybrané" +msgstr "BalÃÄek Å ablón" #: editor/editor_node.cpp msgid "Export Library" -msgstr "" +msgstr "ExportovaÅ¥ Library" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "" +msgstr "SpojiÅ¥ Z Existujúcim" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "" +msgstr "OtvoriÅ¥ & SpustiÅ¥ Script" #: editor/editor_node.cpp #, fuzzy diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 46e671a8a8..e713e79a4c 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-04-20 05:51+0000\n" +"PO-Revision-Date: 2020-05-01 11:43+0000\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -27,7 +27,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: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -9937,6 +9937,9 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"Поле пошуку фільтрує проєкти за назвою Ñ– оÑтаннім компонентом шлÑху.\n" +"Щоб виконати Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² за назвою Ñ– повним шлÑхом, у запиті має " +"бути принаймні один Ñимвол `/`." #: editor/project_settings_editor.cpp msgid "Key " @@ -11055,9 +11058,8 @@ msgid "Total:" msgstr "Загалом:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "ЕкÑпорт профілю" +msgstr "ЕкÑпортувати ÑпиÑок до файла CSV" #: editor/script_editor_debugger.cpp msgid "Resource Path" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 953ec63714..538e017a5d 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -64,8 +64,8 @@ msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2020-04-24 15:30+0000\n" -"Last-Translator: Revan Ji <jiruifancr@gmail.com>\n" +"PO-Revision-Date: 2020-05-01 11:42+0000\n" +"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -73,7 +73,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.0.2-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -5901,7 +5901,6 @@ msgstr "" "这是最准确(但是最慢)的碰撞检测手段。" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" msgstr "创建å•ä¸€å‡¸ç¢°æ’žåŒçº§" @@ -7211,9 +7210,8 @@ msgid "This operation requires a single selected node." msgstr "æ¤æ“作åªèƒ½åº”用于å•ä¸ªé€‰ä¸èŠ‚点。" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Auto Orthogonal Enabled" -msgstr "æ£äº¤" +msgstr "å¯ç”¨è‡ªåŠ¨æ£äº¤" #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" @@ -9774,6 +9772,8 @@ msgid "" "To filter projects by name and full path, the query must contain at least " "one `/` character." msgstr "" +"æœç´¢æ¡†æ ¹æ®å称和路径的末尾部分æ¥è¿‡æ»¤é¡¹ç›®ã€‚\n" +"如果è¦æ ¹æ®å称和完整路径过滤,æœç´¢å†…容应至少包å«ä¸€ä¸ªâ€œ/â€å—符。" #: editor/project_settings_editor.cpp msgid "Key " @@ -10874,9 +10874,8 @@ msgid "Total:" msgstr "åˆè®¡:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Export list to a CSV file" -msgstr "导出é…置文件" +msgstr "将列表导出为CSV文件" #: editor/script_editor_debugger.cpp msgid "Resource Path" @@ -12171,7 +12170,7 @@ msgstr "å¹³é¢å½¢çŠ¶æ— 法æ£å¸¸å·¥ä½œï¼Œæœªæ¥ç‰ˆæœ¬å°†è¢«åˆ 除。请勿使用 #: scene/3d/collision_shape.cpp msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." -msgstr "" +msgstr "ConcavePolygonShape仅支æŒé™æ€RigidBody。" #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index e3d9a84cfb..770b4d38f2 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -2,27 +2,28 @@ # Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. # Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. -# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017. +# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017, 2020. # cnieFIT <dtotncq@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-04-10 00:46+0000\n" -"Last-Translator: cnieFIT <dtotncq@gmail.com>\n" -"Language-Team: Chinese (Hong Kong) <https://hosted.weblate.org/projects/" -"godot-engine/godot/zh_Hant_HK/>\n" +"PO-Revision-Date: 2020-05-01 11:43+0000\n" +"Last-Translator: zx-wt <ZX_WT@ymail.com>\n" +"Language-Team: Chinese (Traditional, Hong Kong) <https://hosted.weblate.org/" +"projects/godot-engine/godot/zh_Hant_HK/>\n" "Language: zh_HK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.6-dev\n" +"X-Generator: Weblate 4.0.2\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp +#, fuzzy msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "" +msgstr "convert()çš„é¡žåž‹åƒæ•¸ç„¡æ•ˆ, 請使用 TYPE_* 常數。" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -68,19 +69,19 @@ msgstr "" #: core/ustring.cpp msgid "KiB" -msgstr "" +msgstr "KiB" #: core/ustring.cpp msgid "MiB" -msgstr "" +msgstr "MiB" #: core/ustring.cpp msgid "GiB" -msgstr "" +msgstr "GiB" #: core/ustring.cpp msgid "TiB" -msgstr "" +msgstr "TiB" #: core/ustring.cpp msgid "PiB" @@ -88,20 +89,19 @@ msgstr "" #: core/ustring.cpp msgid "EiB" -msgstr "" +msgstr "PiB" #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "" +msgstr "自由" #: editor/animation_bezier_editor.cpp msgid "Balanced" -msgstr "" +msgstr "å¹³å‡" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Mirror" -msgstr "錯誤!" +msgstr "å°ç¨±" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" @@ -112,9 +112,8 @@ msgid "Value:" msgstr "" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "å‹•æ™æ’入關éµå¹€ï¼Ÿ" +msgstr "在這æ’入關éµå¹€" #: editor/animation_bezier_editor.cpp #, fuzzy @@ -127,14 +126,12 @@ msgid "Delete Selected Key(s)" msgstr "刪除é¸ä¸æª”案" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Add Bezier Point" -msgstr "新增訊號" +msgstr "新增Bezier節點" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Move Bezier Points" -msgstr "下移" +msgstr "Bezier節點下移" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -158,9 +155,8 @@ msgid "Anim Change Transform" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Change Keyframe Value" -msgstr "動畫變化數值" +msgstr "動畫變化關éµå¹€æ•¸å€¼" #: editor/animation_track_editor.cpp msgid "Anim Change Call" @@ -199,7 +195,7 @@ msgstr "更改動畫å稱:" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "變更動畫循環" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -241,23 +237,21 @@ msgid "Add Track" msgstr "新增動畫軌跡" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Looping" -msgstr "動畫縮放。" +msgstr "動畫循環" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Functions:" -msgstr "行為" +msgstr "" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "" +msgstr "è²éŸ³ç‰‡æ®µï¼š" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "" +msgstr "動畫片段:" #: editor/animation_track_editor.cpp msgid "Change Track Path" @@ -272,9 +266,8 @@ msgid "Update Mode (How this property is set)" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Interpolation Mode" -msgstr "無干擾模å¼" +msgstr "模å¼" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" @@ -311,11 +304,11 @@ msgstr "發動" #: editor/animation_track_editor.cpp msgid "Capture" -msgstr "" +msgstr "æ•æ‰" #: editor/animation_track_editor.cpp msgid "Nearest" -msgstr "" +msgstr "最近" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -337,7 +330,7 @@ msgstr "" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "" +msgstr "æ’入動畫幀" #: editor/animation_track_editor.cpp #, fuzzy @@ -447,16 +440,15 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "沒有ROOT以新增新動畫軌跡" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Bezier Track" -msgstr "新增動畫軌跡" +msgstr "新增Bezier軌跡" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." @@ -571,14 +563,12 @@ msgid "Edit" msgstr "編輯" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation properties." -msgstr "新增動畫" +msgstr "動畫內容。" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Copy Tracks" -msgstr "複製åƒæ•¸" +msgstr "複製" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -701,9 +691,8 @@ msgid "Select All/None" msgstr "ä¸é¸" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "新增動畫軌跡" +msgstr "新增è²éŸ³è»Œè·¡ç‰‡æ®µ" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -734,18 +723,16 @@ msgid "Line Number:" msgstr "行數:" #: editor/code_editor.cpp -#, fuzzy msgid "%d replaced." -msgstr "å–代" +msgstr "å·²å–代 %d。" #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." msgstr "" #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." -msgstr "沒有相åŒ" +msgstr "%d 相åŒã€‚" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -795,7 +782,7 @@ msgstr "é‡è¨ç¸®æ”¾æ¯”例" #: editor/code_editor.cpp msgid "Warnings" -msgstr "" +msgstr "è¦å‘Š" #: editor/code_editor.cpp msgid "Line and column numbers." @@ -817,18 +804,16 @@ msgid "Connect to Node:" msgstr "連到:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "ä¸èƒ½é€£åˆ°ä¸»æ©Ÿï¼š" +msgstr "連到腳本:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "訊號:" +msgstr "來自訊號:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "" +msgstr "å ´æ™¯æ²’æœ‰å«æœ‰ä»»ä½•è…³æœ¬ã€‚" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -856,17 +841,16 @@ msgid "Extra Call Arguments:" msgstr "" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "é¸æ“‡æ¨¡å¼" +msgstr "接收模å¼ï¼š" #: editor/connections_dialog.cpp msgid "Advanced" -msgstr "" +msgstr "進階" #: editor/connections_dialog.cpp msgid "Deferred" -msgstr "" +msgstr "延é²" #: editor/connections_dialog.cpp msgid "" @@ -875,16 +859,15 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Oneshot" -msgstr "" +msgstr "åªé™ä¸€æ¬¡" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." msgstr "" #: editor/connections_dialog.cpp -#, fuzzy msgid "Cannot connect signal" -msgstr "連接訊號:" +msgstr "無法連接訊號" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -956,9 +939,8 @@ msgid "Are you sure you want to remove all connections from this signal?" msgstr "" #: editor/connections_dialog.cpp -#, fuzzy msgid "Disconnect All" -msgstr "ä¸æ–·" +msgstr "ä¸æ–·å…¨éƒ¨" #: editor/connections_dialog.cpp #, fuzzy @@ -1142,7 +1124,7 @@ msgstr "刪除" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "æ“有" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" @@ -1166,19 +1148,16 @@ msgid "Godot Engine contributors" msgstr "Godot Engine è²¢ç»è€…" #: editor/editor_about.cpp -#, fuzzy msgid "Project Founders" -msgstr "專案è¨å®š" +msgstr "專案開è’人" #: editor/editor_about.cpp -#, fuzzy msgid "Lead Developer" -msgstr "開發者" +msgstr "主è¦é–‹ç™¼è€…" #: editor/editor_about.cpp -#, fuzzy msgid "Project Manager " -msgstr "é–‹å•Ÿ Project Manager?" +msgstr "é–‹å•Ÿ Project Manager " #: editor/editor_about.cpp msgid "Developers" @@ -1210,7 +1189,7 @@ msgstr "白銀級æ款人" #: editor/editor_about.cpp msgid "Bronze Donors" -msgstr "é’銅æ款人" +msgstr "é’銅級æ款人" #: editor/editor_about.cpp msgid "Donors" @@ -1304,14 +1283,12 @@ msgid "Add Effect" msgstr "新增效果" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "é‡æ–°å‘½åAutoload" +msgstr "é‡æ–°å‘½åAudio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Change Audio Bus Volume" -msgstr "動畫變化數值" +msgstr "變更Audio Busè²é‡" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" @@ -1338,9 +1315,8 @@ msgid "Move Bus Effect" msgstr "" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Delete Bus Effect" -msgstr "刪除é¸ä¸æª”案" +msgstr "刪除Bus Effect" #: editor/editor_audio_buses.cpp msgid "Drag & drop to rearrange." @@ -1348,7 +1324,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "" +msgstr "Solo" #: editor/editor_audio_buses.cpp msgid "Mute" @@ -1367,7 +1343,7 @@ msgstr "é¸é …" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "複製" +msgstr "å†è£½" #: editor/editor_audio_buses.cpp #, fuzzy @@ -1397,9 +1373,8 @@ msgid "Delete Audio Bus" msgstr "刪除佈局" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Duplicate Audio Bus" -msgstr "複製" +msgstr "å†è£½ Audio Bus" #: editor/editor_audio_buses.cpp #, fuzzy @@ -1407,9 +1382,8 @@ msgid "Reset Bus Volume" msgstr "é‡è¨ç¸®æ”¾æ¯”例" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Move Audio Bus" -msgstr "移動" +msgstr "移動 Audio Bus" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As..." @@ -1428,9 +1402,8 @@ msgid "There is no '%s' file." msgstr "" #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" -msgstr "儲å˜ä½ˆå±€" +msgstr "佈局" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -1483,7 +1456,7 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Invalid name." -msgstr "無效å稱" +msgstr "無效å稱。" #: editor/editor_autoload_settings.cpp #, fuzzy @@ -1491,19 +1464,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." @@ -1571,7 +1541,7 @@ msgstr "路徑:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "Nodeå稱" #: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp #: editor/editor_profiler.cpp editor/project_manager.cpp @@ -1602,16 +1572,15 @@ msgstr "æ£åœ¨æ›´æ–°å ´æ™¯..." #: editor/editor_data.cpp editor/editor_properties.cpp msgid "[empty]" -msgstr "" +msgstr "[空]" #: editor/editor_data.cpp msgid "[unsaved]" -msgstr "" +msgstr "[未儲å˜ï¼½" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "請先儲å˜å ´æ™¯" +msgstr "è«‹å…ˆé¸æ“‡ä¸»è¦è³‡æ–™å¤¾ã€‚" #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1674,9 +1643,8 @@ msgstr "" #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom debug template not found." -msgstr "未找到佈局å稱ï¼" +msgstr "" #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1685,23 +1653,20 @@ msgid "Custom release template not found." msgstr "" #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found:" -msgstr "未找到佈局å稱ï¼" +msgstr "" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "編輯器" +msgstr "3D編輯器" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "開啟資料夾" +msgstr "" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1747,9 +1712,8 @@ msgid "(Editor Disabled, Properties Disabled)" msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Properties Disabled)" -msgstr "é¸æ“‡æ¨¡å¼" +msgstr "" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1799,9 +1763,8 @@ msgid "Unset" msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "新增資料夾" +msgstr "" #: editor/editor_feature_profile.cpp msgid "Make Current" @@ -1881,15 +1844,13 @@ msgid "Copy Path" msgstr "複製路徑" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "Open in File Manager" -msgstr "é–‹å•Ÿ Project Manager?" +msgstr "在Project Manageré–‹å•Ÿ" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp -#, fuzzy msgid "Show in File Manager" -msgstr "é–‹å•Ÿ Project Manager?" +msgstr "在Project Manager顯示" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp #, fuzzy @@ -1903,7 +1864,7 @@ msgstr "é‡æ–°æ•´ç†" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" -msgstr "所有類型" +msgstr "所有已知類型" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" @@ -1915,7 +1876,7 @@ msgstr "開啟檔案" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open File(s)" -msgstr "開啟檔案" +msgstr "é–‹å•Ÿ(多個)檔案" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a Directory" @@ -1937,16 +1898,18 @@ msgid "Save a File" msgstr "儲å˜æª”案" #: editor/editor_file_dialog.cpp +#, fuzzy msgid "Go Back" -msgstr "" +msgstr "å‘後" #: editor/editor_file_dialog.cpp +#, fuzzy msgid "Go Forward" -msgstr "" +msgstr "å‘å‰" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "å‘上" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" @@ -1975,14 +1938,12 @@ msgid "Move Favorite Down" msgstr "下移最愛" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to previous folder." -msgstr "無法新增資料夾" +msgstr "回到上一個資料夾。" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "無法新增資料夾" +msgstr "下一個資料夾" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy @@ -2028,7 +1989,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" @@ -2069,13 +2030,12 @@ msgid "Description" msgstr "æ述:" #: editor/editor_help.cpp -#, fuzzy msgid "Online Tutorials" -msgstr "é—œé–‰å ´æ™¯" +msgstr "Onlineæ•™å¸" #: editor/editor_help.cpp msgid "Properties" -msgstr "" +msgstr "內客" #: editor/editor_help.cpp msgid "override:" @@ -2158,29 +2118,24 @@ msgid "Classes Only" msgstr "" #: editor/editor_help_search.cpp -#, fuzzy msgid "Methods Only" -msgstr "é¸æ“‡æ¨¡å¼" +msgstr "" #: editor/editor_help_search.cpp -#, fuzzy msgid "Signals Only" -msgstr "訊號" +msgstr "åªé™è¨Šè™Ÿ" #: editor/editor_help_search.cpp -#, fuzzy msgid "Constants Only" -msgstr "常數" +msgstr "åªé™å¸¸æ•¸" #: editor/editor_help_search.cpp -#, fuzzy msgid "Properties Only" -msgstr "é¸æ“‡æ¨¡å¼" +msgstr "åªé™å…§å®¹" #: editor/editor_help_search.cpp -#, fuzzy msgid "Theme Properties Only" -msgstr "é¸æ“‡æ¨¡å¼" +msgstr "" #: editor/editor_help_search.cpp msgid "Member Type" @@ -2191,9 +2146,8 @@ msgid "Class" msgstr "" #: editor/editor_help_search.cpp -#, fuzzy msgid "Method" -msgstr "é¸æ“‡æ¨¡å¼" +msgstr "" #: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp #, fuzzy @@ -2205,14 +2159,12 @@ msgid "Constant" msgstr "常數" #: editor/editor_help_search.cpp -#, fuzzy msgid "Property" -msgstr "é¸æ“‡æ¨¡å¼" +msgstr "內容" #: editor/editor_help_search.cpp -#, fuzzy msgid "Theme Property" -msgstr "篩é¸:" +msgstr "" #: editor/editor_inspector.cpp editor/project_settings_editor.cpp msgid "Property:" @@ -2231,9 +2183,8 @@ msgid "Output:" msgstr "" #: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Copy Selection" -msgstr "移除é¸é …" +msgstr "複製é¸é …" #: editor/editor_log.cpp editor/editor_network_profiler.cpp #: editor/editor_profiler.cpp editor/editor_properties.cpp @@ -2265,9 +2216,8 @@ msgid "%s/s" msgstr "" #: editor/editor_network_profiler.cpp -#, fuzzy msgid "Down" -msgstr "下載" +msgstr "" #: editor/editor_network_profiler.cpp msgid "Up" @@ -2322,14 +2272,12 @@ msgid "Save Resource As..." msgstr "把資æºå¦å˜ç‚º..." #: editor/editor_node.cpp -#, fuzzy msgid "Can't open file for writing:" -msgstr "ä¸èƒ½å¯«å…¥ï¼Œä¸èƒ½é–‹å•Ÿæª”案:" +msgstr "ä¸èƒ½é–‹å•Ÿæª”案以供寫入:" #: editor/editor_node.cpp -#, fuzzy msgid "Requested file format unknown:" -msgstr "è¦æ±‚çš„æª”æ¡ˆæ ¼å¼æœªçŸ¥ï¼š" +msgstr "è¦æ±‚çš„æª”æ¡ˆæ ¼å¼ä¸æ˜Žï¼š" #: editor/editor_node.cpp msgid "Error while saving." @@ -3501,15 +3449,16 @@ msgstr "ä½ æ˜¯å¦å¿˜äº†é—œéµè©ž 'tool' ?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "ä¸èƒ½åŸ·è¡Œè…³æœ¬ï¼š" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" msgstr "" #: editor/editor_sub_scene.cpp +#, fuzzy msgid "Select Node(s) to Import" -msgstr "" +msgstr "é¸æ“‡è¦å°Žå…¥çš„Node(s)" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" @@ -3521,7 +3470,7 @@ msgstr "å ´æ™¯è·¯å¾‘:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "從Node導入:" #: editor/export_template_manager.cpp #, fuzzy @@ -3542,59 +3491,66 @@ msgid "Download" msgstr "下載" #: editor/export_template_manager.cpp +#, fuzzy msgid "Official export templates aren't available for development builds." -msgstr "" +msgstr "Development builds未能æ供官方export templates。" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "ï¼ˆæ¬ ç¼ºï¼‰" #: editor/export_template_manager.cpp +#, fuzzy msgid "(Current)" -msgstr "" +msgstr "(Current)" #: editor/export_template_manager.cpp +#, fuzzy msgid "Retrieving mirrors, please wait..." -msgstr "" +msgstr "接收 mirrorsä¸, è«‹ç¨ä¾¯..." #: editor/export_template_manager.cpp +#, fuzzy msgid "Remove template version '%s'?" -msgstr "" +msgstr "移除版本 '%s' 的範本?" #: editor/export_template_manager.cpp +#, fuzzy msgid "Can't open export templates zip." -msgstr "" +msgstr "ä¸èƒ½é–‹å•Ÿexport templatesçš„zip壓縮檔。" #: editor/export_template_manager.cpp #, fuzzy msgid "Invalid version.txt format inside templates: %s." -msgstr "無效的 version.txt æ ¼å¼ inside templates." +msgstr "範本文件: %s ä¸çš„ version.txt æ ¼å¼ç„¡æ•ˆã€‚" #: editor/export_template_manager.cpp #, fuzzy msgid "No version.txt found inside templates." -msgstr "找ä¸åˆ°version.txt inside templates." +msgstr "範本ä¸æ‰¾ä¸åˆ°version.txt。" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:" -msgstr "載入å—形出ç¾éŒ¯èª¤" +msgstr "ç¯„æœ¬å‰µé€ è·¯å¾‘æ™‚å‡ºç¾éŒ¯èª¤ï¼š" #: editor/export_template_manager.cpp +#, fuzzy msgid "Extracting Export Templates" -msgstr "" +msgstr "æ£åœ¨è§£å£“Export Templates" #: editor/export_template_manager.cpp msgid "Importing:" -msgstr "å°Žå…¥ä¸:" +msgstr "å°Žå…¥ä¸ï¼š" #: editor/export_template_manager.cpp +#, fuzzy msgid "Error getting the list of mirrors." -msgstr "" +msgstr "å–å¾—mirrors列表時出錯。" #: editor/export_template_manager.cpp +#, fuzzy msgid "Error parsing JSON of mirror list. Please report this issue!" -msgstr "" +msgstr "parsing mirror列表的JSONå‡ºéŒ¯ã€‚ã€€è«‹å›žå ±æ¤å•é¡Œï¼" #: editor/export_template_manager.cpp #, fuzzy @@ -3605,8 +3561,9 @@ msgstr "找ä¸åˆ°é€™å€‹ç‰ˆæœ¬çš„下載連çµã€‚直接下載åªé©ç”¨æ–¼official #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Can't resolve." -msgstr "" +msgstr "無法解決。" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3624,8 +3581,9 @@ msgid "Request Failed." msgstr "請求失敗。" #: editor/export_template_manager.cpp +#, fuzzy msgid "Redirect Loop." -msgstr "" +msgstr "é‡æ–°å®šå‘循環。" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3633,49 +3591,49 @@ msgid "Failed:" msgstr "失敗:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Complete." -msgstr "下載出ç¾éŒ¯èª¤" +msgstr "下載完æˆã€‚" #: editor/export_template_manager.cpp -#, fuzzy msgid "Cannot remove temporary file:" -msgstr "無法移除:\n" +msgstr "無法移除暫å˜æª”:" #: editor/export_template_manager.cpp +#, fuzzy msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." msgstr "" +"Templates安è£å¤±æ•—。\n" +"出ç¾å•é¡Œçš„templates å˜æª”å¯ä»¥åœ¨ \"%s\" ä¸æ‰¾åˆ°ã€‚" #: editor/export_template_manager.cpp #, fuzzy msgid "Error requesting URL:" -msgstr "請求時出ç¾éŒ¯èª¤" +msgstr "請求URL時出ç¾éŒ¯èª¤ï¼š" #: editor/export_template_manager.cpp #, fuzzy msgid "Connecting to Mirror..." -msgstr "連到..." +msgstr "æ£åœ¨é€£åˆ°Mirror..." #: editor/export_template_manager.cpp #, fuzzy msgid "Disconnected" -msgstr "ä¸æ–·" +msgstr "æ–·ç·š" #: editor/export_template_manager.cpp msgid "Resolving" -msgstr "" +msgstr "解決ä¸" #: editor/export_template_manager.cpp msgid "Can't Resolve" -msgstr "" +msgstr "ä¸èƒ½è§£æ±º" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Connecting..." -msgstr "連到..." +msgstr "連接ä¸..." #: editor/export_template_manager.cpp #, fuzzy @@ -3685,7 +3643,7 @@ msgstr "ä¸èƒ½é€£æŽ¥ã€‚" #: editor/export_template_manager.cpp #, fuzzy msgid "Connected" -msgstr "連到" +msgstr "已連線" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3695,63 +3653,61 @@ msgstr "請求ä¸..." #: editor/export_template_manager.cpp #, fuzzy msgid "Downloading" -msgstr "下載出ç¾éŒ¯èª¤" +msgstr "下載ä¸" #: editor/export_template_manager.cpp -#, fuzzy msgid "Connection Error" -msgstr "連到..." +msgstr "連接出錯" #: editor/export_template_manager.cpp +#, fuzzy msgid "SSL Handshake Error" -msgstr "" +msgstr "SSL Handshake出錯" #: editor/export_template_manager.cpp #, fuzzy msgid "Uncompressing Android Build Sources" -msgstr "å°Žå…¥ä¸:" +msgstr "æ£åœ¨è§£å£“Android Build Sources" #: editor/export_template_manager.cpp +#, fuzzy msgid "Current Version:" -msgstr "" +msgstr "當å‰ç‰ˆæœ¬ï¼š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "無效副檔å" +msgstr "已安è£çš„版本:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "從檔案下載" +msgstr "從檔案安è£" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "移除é¸é …" +msgstr "移除Template" #: editor/export_template_manager.cpp #, fuzzy msgid "Select Template File" -msgstr "è¦åˆªé™¤é¸ä¸æª”案?" +msgstr "é¸å–Template檔案" #: editor/export_template_manager.cpp #, fuzzy msgid "Godot Export Templates" -msgstr "管ç†è¼¸å‡ºç¯„本" +msgstr "Godot輸出範本" #: editor/export_template_manager.cpp +#, fuzzy msgid "Export Template Manager" -msgstr "" +msgstr "Export Template管ç†å™¨" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download Templates" -msgstr "移除é¸é …" +msgstr "下載Templates" #: editor/export_template_manager.cpp msgid "Select mirror from list: (Shift+Click: Open in Browser)" -msgstr "" +msgstr "從清單ä¸é¸æ“‡é¡åƒ: (Shift + 單擊: 在ç€è¦½å™¨ä¸æ‰“é–‹)" #: editor/filesystem_dock.cpp #, fuzzy @@ -3759,77 +3715,73 @@ msgid "Favorites" msgstr "最愛:" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Status: Import of file failed. Please fix file and reimport manually." -msgstr "" +msgstr "狀態:導入檔案失敗。請修æ£æª”案並å†æ‰‹å‹•å°Žå…¥ã€‚" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Cannot move/rename resources root." -msgstr "" +msgstr "ä¸èƒ½ç§»å‹•ï¼é‡æ–°å‘½å resources root." #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself." -msgstr "" +msgstr "ä¸èƒ½ç§»å‹•è³‡æ–™å¤¾åˆ°è³‡æ–™å¤¾è‡ªèº«ã€‚" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:" -msgstr "載入錯誤:" +msgstr "移動錯誤:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error duplicating:" -msgstr "載入錯誤:" +msgstr "å†è£½æ™‚出錯:" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Unable to update dependencies:" -msgstr "" +msgstr "未能更新dependencies:" #: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp msgid "No name provided." -msgstr "" +msgstr "沒有æä¾›åå—。" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Provided name contains invalid characters." -msgstr "有效å—符:" +msgstr "æ供的åå—å«æœ‰ç„¡æ•ˆå—符。" #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." -msgstr "" +msgstr "具有æ¤å稱的檔或資料夾已å˜åœ¨ã€‚" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Name contains invalid characters." -msgstr "有效å—符:" +msgstr "åå—å«æœ‰ç„¡æ•ˆå—符。" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Renaming file:" -msgstr "儲å˜TileSet時出ç¾éŒ¯èª¤ï¼" +msgstr "é‡æ–°å‘½å檔案:" #: editor/filesystem_dock.cpp msgid "Renaming folder:" -msgstr "" +msgstr "é‡æ–°å‘½å資料夾:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Duplicating file:" -msgstr "複製" +msgstr "å†è£½æª”案:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Duplicating folder:" -msgstr "複製" +msgstr "å†è£½è³‡æ–™å¤¾ï¼š" #: editor/filesystem_dock.cpp #, fuzzy msgid "New Inherited Scene" -msgstr "下一個腳本" +msgstr "新增 Inherited Scene" #: editor/filesystem_dock.cpp #, fuzzy msgid "Set As Main Scene" -msgstr "é¸æ“‡ä¸»å ´æ™¯" +msgstr "è¨å®¶æˆä¸»å ´æ™¯" #: editor/filesystem_dock.cpp #, fuzzy @@ -3837,22 +3789,22 @@ msgid "Open Scenes" msgstr "é–‹å•“å ´æ™¯" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Instance" -msgstr "" +msgstr "Instance" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Add to Favorites" -msgstr "最愛:" +msgstr "åŠ åˆ°æœ€æ„›" #: editor/filesystem_dock.cpp #, fuzzy msgid "Remove from Favorites" -msgstr "åªé™é¸ä¸" +msgstr "從最愛ä¸ç§»é™¤" #: editor/filesystem_dock.cpp msgid "Edit Dependencies..." -msgstr "" +msgstr "編輯Dependencies..." #: editor/filesystem_dock.cpp msgid "View Owners..." @@ -3864,9 +3816,8 @@ msgid "Rename..." msgstr "é‡æ–°å‘½å..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Duplicate..." -msgstr "複製" +msgstr "å†è£½..." #: editor/filesystem_dock.cpp #, fuzzy @@ -3874,37 +3825,33 @@ msgid "Move To..." msgstr "æ¬åˆ°..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Scene..." -msgstr "æ–°å¢žå ´æ™¯" +msgstr "æ–°å¢žå ´æ™¯..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New Script..." -msgstr "下一個腳本" +msgstr "新增腳本..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Resource..." -msgstr "把資æºå¦å˜ç‚º..." +msgstr "新增資æº..." #: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp #: editor/script_editor_debugger.cpp msgid "Expand All" -msgstr "" +msgstr "全部展開" #: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Collapse All" -msgstr "關閉" +msgstr "全部折疊" #: editor/filesystem_dock.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/project_manager.cpp editor/rename_dialog.cpp #: editor/scene_tree_dock.cpp msgid "Rename" -msgstr "é‡æ–°å‘½å..." +msgstr "é‡æ–°å‘½å" #: editor/filesystem_dock.cpp #, fuzzy @@ -3912,18 +3859,18 @@ msgid "Previous Folder/File" msgstr "上一個tab" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Next Folder/File" -msgstr "新增資料夾" +msgstr "下一個資料夾ï¼æª”案" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Re-Scan Filesystem" -msgstr "" +msgstr "é‡æ–°æŽƒæ檔案系統" #: editor/filesystem_dock.cpp #, fuzzy msgid "Toggle Split Mode" -msgstr "(ä¸ï¼‰é¡¯ç¤ºéš±è—的文件" +msgstr "切æ›Split 模å¼" #: editor/filesystem_dock.cpp #, fuzzy @@ -3931,10 +3878,11 @@ msgid "Search files" msgstr "在幫助檔æœå°‹" #: editor/filesystem_dock.cpp +#, fuzzy msgid "" "Scanning Files,\n" "Please Wait..." -msgstr "" +msgstr "æ£åœ¨æŽƒæ檔案, è«‹ç¨å€™..." #: editor/filesystem_dock.cpp msgid "Move" @@ -3942,35 +3890,35 @@ msgstr "移動" #: editor/filesystem_dock.cpp msgid "There is already file or folder with the same name in this location." -msgstr "" +msgstr "æ¤ä½ç½®å·²å˜åœ¨åŒå的檔案或資料夾。" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Overwrite" -msgstr "" +msgstr "覆蓋" #: editor/filesystem_dock.cpp #, fuzzy msgid "Create Scene" -msgstr "儲å˜å ´æ™¯" +msgstr "æ–°å¢žå ´æ™¯" #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Create Script" -msgstr "" +msgstr "新增腳本" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "Find in Files" -msgstr "多 %d 檔案" +msgstr "在檔案ä¸æœ¬å°‹æ‰¾" #: editor/find_in_files.cpp -#, fuzzy msgid "Find:" -msgstr "尋找" +msgstr "尋找:" #: editor/find_in_files.cpp -#, fuzzy msgid "Folder:" -msgstr "新增資料夾" +msgstr "資料夾:" #: editor/find_in_files.cpp #, fuzzy @@ -3978,169 +3926,166 @@ msgid "Filters:" msgstr "篩é¸:" #: editor/find_in_files.cpp +#, fuzzy msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." -msgstr "" +msgstr "包å«ä¸‹åˆ—副檔å的文件。在ProjectSettingså¢žåŠ æˆ–ç§»é™¤ã€‚" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find..." -msgstr "" +msgstr "尋找..." #: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp +#, fuzzy msgid "Replace..." -msgstr "" +msgstr "替æ›â€¦" #: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp msgid "Cancel" msgstr "å–消" #: editor/find_in_files.cpp -#, fuzzy msgid "Find: " -msgstr "尋找" +msgstr "尋找: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace: " -msgstr "å–代" +msgstr "å–代: " #: editor/find_in_files.cpp -#, fuzzy msgid "Replace all (no undo)" -msgstr "全部å–代" +msgstr "全部å–代(ä¸å¯é‚„原)" #: editor/find_in_files.cpp -#, fuzzy msgid "Searching..." -msgstr "儲å˜ä¸..." +msgstr "æœå°‹ä¸..." #: editor/find_in_files.cpp -#, fuzzy msgid "Search complete" -msgstr "在幫助檔æœå°‹" +msgstr "æœå°‹å®Œæˆ" #: editor/groups_editor.cpp +#, fuzzy msgid "Add to Group" -msgstr "" +msgstr "åŠ åˆ°Group" #: editor/groups_editor.cpp msgid "Remove from Group" -msgstr "" +msgstr "從Groupä¸ç§»é™¤" #: editor/groups_editor.cpp -#, fuzzy msgid "Group name already exists." -msgstr "錯誤:動畫å稱已å˜åœ¨ï¼" +msgstr "錯誤:groupå稱已å˜åœ¨ã€‚" #: editor/groups_editor.cpp -#, fuzzy msgid "Invalid group name." -msgstr "無效å稱" +msgstr "無效groupå稱。" #: editor/groups_editor.cpp -#, fuzzy msgid "Rename Group" -msgstr "專案" +msgstr "é‡æ–°å‘½åGroup" #: editor/groups_editor.cpp #, fuzzy msgid "Delete Group" -msgstr "刪除佈局" +msgstr "刪除Group" #: editor/groups_editor.cpp editor/node_dock.cpp +#, fuzzy msgid "Groups" -msgstr "" +msgstr "Groups" #: editor/groups_editor.cpp msgid "Nodes Not in Group" -msgstr "" +msgstr "ä¸åœ¨Group內的Nodes" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp #: editor/scene_tree_editor.cpp #, fuzzy msgid "Filter nodes" -msgstr "篩é¸:" +msgstr "篩é¸nodes:" #: editor/groups_editor.cpp msgid "Nodes in Group" -msgstr "" +msgstr "Groupä¸çš„Nodes" #: editor/groups_editor.cpp msgid "Empty groups will be automatically removed." -msgstr "" +msgstr "空groups會被移除。" #: editor/groups_editor.cpp -#, fuzzy msgid "Group Editor" -msgstr "開啟資料夾" +msgstr "Group編輯器" #: editor/groups_editor.cpp msgid "Manage Groups" -msgstr "" +msgstr "管ç†groups" #: editor/import/resource_importer_scene.cpp #, fuzzy msgid "Import as Single Scene" -msgstr "æ›´æ–°å ´æ™¯" +msgstr "å°Žå…¥ç‚ºå–®ä¸€å ´æ™¯" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Animations" -msgstr "" +msgstr "以分開的動畫導入" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials" -msgstr "" +msgstr "以分開的Materialså°Žå…¥" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects" -msgstr "" +msgstr "以分開的物件導入" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials" -msgstr "" +msgstr "以分開的物件+Materialså°Žå…¥" #: editor/import/resource_importer_scene.cpp +#, fuzzy msgid "Import with Separate Objects+Animations" -msgstr "" +msgstr "以分開的物件+動畫導入" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Materials+Animations" -msgstr "" +msgstr "以分開的Materials+動畫導入" #: editor/import/resource_importer_scene.cpp msgid "Import with Separate Objects+Materials+Animations" -msgstr "" +msgstr "以分開的物件+Materials+動畫導入" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes" -msgstr "" +msgstr "å°Žå…¥ç‚ºå¤šå€‹å ´æ™¯" #: editor/import/resource_importer_scene.cpp msgid "Import as Multiple Scenes+Materials" -msgstr "" +msgstr "å°Žå…¥ç‚ºå¤šå€‹å ´æ™¯ï¼‹Materials" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Import Scene" -msgstr "" +msgstr "å°Žå…¥å ´æ™¯" #: editor/import/resource_importer_scene.cpp msgid "Importing Scene..." -msgstr "" +msgstr "å°Žå…¥å ´æ™¯ä¸..." #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" -msgstr "" +msgstr "光照圖生æˆä¸" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh: " -msgstr "" +msgstr "為Mesh生æˆä¸ï¼š " #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." -msgstr "" +msgstr "æ£åœ¨é‹è¡Œè‡ªå®šç¾©è…³æœ¬..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" @@ -9101,15 +9046,15 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "ç‰æ–¼ (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "大於(>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "大於或ç‰æ–¼(>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9131,15 +9076,15 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "å°æ–¼ (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "å°æ–¼æˆ–ç‰æ–¼ (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "ä¸ç‰æ–¼ (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -10833,23 +10778,24 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Move Nodes In Parent" -msgstr "" +msgstr "在Parent內移動Nodes" #: editor/scene_tree_dock.cpp msgid "Duplicate Node(s)" -msgstr "" +msgstr "å†è£½Node" #: editor/scene_tree_dock.cpp msgid "Can't reparent nodes in inherited scenes, order of nodes can't change." -msgstr "" +msgstr "ä¸èƒ½åœ¨inherited sceneså…§reparent nodes,nodesé †åºä¸èƒ½æ”¹è®Šã€‚" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Node must belong to the edited scene to become root." -msgstr "" +msgstr "Nodeå¿…é ˆå±¬æ–¼å·²ç·¨è¼¯çš„å ´æ™¯ä»¥æˆç‚ºroot." #: editor/scene_tree_dock.cpp msgid "Instantiated scenes can't become root" -msgstr "" +msgstr "Instantiated scenesä¸èƒ½æˆç‚ºroot" #: editor/scene_tree_dock.cpp #, fuzzy @@ -10862,12 +10808,14 @@ msgid "Delete %d nodes?" msgstr "ä¸é¸" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Delete the root node \"%s\"?" -msgstr "" +msgstr "åˆ é™¤root node \"%s\"?" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Delete node \"%s\" and its children?" -msgstr "" +msgstr "åˆ é™¤root node \"%s\"?" #: editor/scene_tree_dock.cpp #, fuzzy @@ -12938,7 +12886,7 @@ msgstr "" #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." -msgstr "" +msgstr "當\"Exp Edit\" 啟用時,\"Min Value\" å¿…é ˆå¤§æ–¼0。" #: scene/gui/scroll_container.cpp msgid "" @@ -12949,7 +12897,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(其他)" #: scene/main/scene_tree.cpp msgid "" @@ -12966,23 +12914,22 @@ msgid "" msgstr "" #: scene/main/viewport.cpp +#, fuzzy msgid "Viewport size must be greater than 0 to render anything." -msgstr "" +msgstr "viewport大å°å¿…é ˆå¤§æ–¼ï¼ä»¥æ¸²æŸ“任何æ±è¥¿ã€‚" #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." -msgstr "無效å—åž‹" +msgstr "é 覽來自無效來æºã€‚" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid source for shader." -msgstr "無效å—åž‹" +msgstr "無效的SHADER來æºã€‚" #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Invalid comparison function for that type." -msgstr "無效å—åž‹" +msgstr "無效的函å¼é¡žåž‹å°æ¯”。" #: servers/visual/shader_language.cpp msgid "Assignment to function." diff --git a/main/main.cpp b/main/main.cpp index dff7907e72..95449dd5cc 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -139,6 +139,7 @@ static DisplayServer::ScreenOrientation window_orientation = DisplayServer::SCRE static uint32_t window_flags = 0; static Size2i window_size = Size2i(1024, 600); static bool window_vsync_via_compositor = false; +static bool disable_wintab = false; static int init_screen = -1; static bool init_fullscreen = false; @@ -314,6 +315,7 @@ void Main::print_help(const char *p_binary) { OS::get_singleton()->print(" --enable-vsync-via-compositor When vsync is enabled, vsync via the OS' window compositor (Windows only).\n"); OS::get_singleton()->print(" --disable-vsync-via-compositor Disable vsync via the OS' window compositor (Windows only).\n"); OS::get_singleton()->print(" --single-window Use a single window (no separate subwindows).\n"); + OS::get_singleton()->print(" --disable-wintab Disable WinTab API and always use Windows Ink API for the pen input (Windows only).\n"); OS::get_singleton()->print("\n"); #endif @@ -595,6 +597,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph } else if (I->get() == "--gpu-abort") { // force windowed window Engine::singleton->abort_on_gpu_errors = true; + } else if (I->get() == "--disable-wintab") { + + disable_wintab = true; } else if (I->get() == "--single-window") { // force single window single_window = true; @@ -1079,6 +1084,13 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->_vsync_via_compositor = window_vsync_via_compositor; + if (!disable_wintab) { + // No "--disable_wintab" option + disable_wintab = GLOBAL_DEF("display/window/disable_wintab_api", false); + } + + OS::get_singleton()->_disable_wintab = disable_wintab; + /* todo restore OS::get_singleton()->_allow_layered = GLOBAL_DEF("display/window/per_pixel_transparency/allowed", false); video_mode.layered = GLOBAL_DEF("display/window/per_pixel_transparency/enabled", false); diff --git a/misc/dist/linux/org.godotengine.Godot.desktop b/misc/dist/linux/org.godotengine.Godot.desktop index c8b99207f8..8b74234174 100644 --- a/misc/dist/linux/org.godotengine.Godot.desktop +++ b/misc/dist/linux/org.godotengine.Godot.desktop @@ -5,6 +5,7 @@ Comment=Multi-platform 2D and 3D game engine with a feature-rich editor Exec=godot %f Icon=godot Terminal=false +PrefersNonDefaultGPU=true Type=Application MimeType=application/x-godot-project; Categories=Development;IDE; diff --git a/modules/csg/csg.cpp b/modules/csg/csg.cpp index 3f61e2852f..6714db76bb 100644 --- a/modules/csg/csg.cpp +++ b/modules/csg/csg.cpp @@ -50,7 +50,7 @@ inline static Vector2 interpolate_segment_uv(const Vector2 p_segement_points[2], float distance = (p_interpolation_point - p_segement_points[0]).length(); float fraction = distance / segment_length; - return p_uvs[0].linear_interpolate(p_uvs[1], fraction); + return p_uvs[0].lerp(p_uvs[1], fraction); } inline static Vector2 interpolate_triangle_uv(const Vector2 p_vertices[3], const Vector2 p_uvs[3], const Vector2 &p_interpolation_point) { diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index d38ddf3f90..550a919d0d 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -46,7 +46,7 @@ void CSGShape3D::set_use_collision(bool p_enable) { root_collision_instance = PhysicsServer3D::get_singleton()->body_create(PhysicsServer3D::BODY_MODE_STATIC); PhysicsServer3D::get_singleton()->body_set_state(root_collision_instance, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform()); PhysicsServer3D::get_singleton()->body_add_shape(root_collision_instance, root_collision_shape->get_rid()); - PhysicsServer3D::get_singleton()->body_set_space(root_collision_instance, get_world()->get_space()); + PhysicsServer3D::get_singleton()->body_set_space(root_collision_instance, get_world_3d()->get_space()); PhysicsServer3D::get_singleton()->body_attach_object_instance_id(root_collision_instance, get_instance_id()); set_collision_layer(collision_layer); set_collision_mask(collision_mask); @@ -507,7 +507,7 @@ void CSGShape3D::_notification(int p_what) { root_collision_instance = PhysicsServer3D::get_singleton()->body_create(PhysicsServer3D::BODY_MODE_STATIC); PhysicsServer3D::get_singleton()->body_set_state(root_collision_instance, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform()); PhysicsServer3D::get_singleton()->body_add_shape(root_collision_instance, root_collision_shape->get_rid()); - PhysicsServer3D::get_singleton()->body_set_space(root_collision_instance, get_world()->get_space()); + PhysicsServer3D::get_singleton()->body_set_space(root_collision_instance, get_world_3d()->get_space()); PhysicsServer3D::get_singleton()->body_attach_object_instance_id(root_collision_instance, get_instance_id()); set_collision_layer(collision_layer); set_collision_mask(collision_mask); diff --git a/modules/gdnative/gdnative/color.cpp b/modules/gdnative/gdnative/color.cpp index 914d5b03f4..68c83e05a6 100644 --- a/modules/gdnative/gdnative/color.cpp +++ b/modules/gdnative/gdnative/color.cpp @@ -155,11 +155,11 @@ godot_color GDAPI godot_color_contrasted(const godot_color *p_self) { return dest; } -godot_color GDAPI godot_color_linear_interpolate(const godot_color *p_self, const godot_color *p_b, const godot_real p_t) { +godot_color GDAPI godot_color_lerp(const godot_color *p_self, const godot_color *p_b, const godot_real p_t) { godot_color dest; const Color *self = (const Color *)p_self; const Color *b = (const Color *)p_b; - *((Color *)&dest) = self->linear_interpolate(*b, p_t); + *((Color *)&dest) = self->lerp(*b, p_t); return dest; } diff --git a/modules/gdnative/gdnative/vector2.cpp b/modules/gdnative/gdnative/vector2.cpp index e9e2a8edf8..dc273e7951 100644 --- a/modules/gdnative/gdnative/vector2.cpp +++ b/modules/gdnative/gdnative/vector2.cpp @@ -109,11 +109,11 @@ godot_real GDAPI godot_vector2_angle_to_point(const godot_vector2 *p_self, const return self->angle_to_point(*to); } -godot_vector2 GDAPI godot_vector2_linear_interpolate(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_real p_t) { +godot_vector2 GDAPI godot_vector2_lerp(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_real p_t) { godot_vector2 dest; const Vector2 *self = (const Vector2 *)p_self; const Vector2 *b = (const Vector2 *)p_b; - *((Vector2 *)&dest) = self->linear_interpolate(*b, p_t); + *((Vector2 *)&dest) = self->lerp(*b, p_t); return dest; } diff --git a/modules/gdnative/gdnative/vector3.cpp b/modules/gdnative/gdnative/vector3.cpp index e34a9370a5..bb27ad5a00 100644 --- a/modules/gdnative/gdnative/vector3.cpp +++ b/modules/gdnative/gdnative/vector3.cpp @@ -106,11 +106,11 @@ godot_vector3 GDAPI godot_vector3_rotated(const godot_vector3 *p_self, const god return dest; } -godot_vector3 GDAPI godot_vector3_linear_interpolate(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_real p_t) { +godot_vector3 GDAPI godot_vector3_lerp(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_real p_t) { godot_vector3 dest; const Vector3 *self = (const Vector3 *)p_self; const Vector3 *b = (const Vector3 *)p_b; - *((Vector3 *)&dest) = self->linear_interpolate(*b, p_t); + *((Vector3 *)&dest) = self->lerp(*b, p_t); return dest; } diff --git a/modules/gdnative/gdnative_api.json b/modules/gdnative/gdnative_api.json index 9473a3d419..d5ab62dc61 100644 --- a/modules/gdnative/gdnative_api.json +++ b/modules/gdnative/gdnative_api.json @@ -586,7 +586,7 @@ ] }, { - "name": "godot_color_linear_interpolate", + "name": "godot_color_lerp", "return_type": "godot_color", "arguments": [ ["const godot_color *", "p_self"], @@ -710,7 +710,7 @@ ] }, { - "name": "godot_vector2_linear_interpolate", + "name": "godot_vector2_lerp", "return_type": "godot_vector2", "arguments": [ ["const godot_vector2 *", "p_self"], @@ -1449,7 +1449,7 @@ ] }, { - "name": "godot_vector3_linear_interpolate", + "name": "godot_vector3_lerp", "return_type": "godot_vector3", "arguments": [ ["const godot_vector3 *", "p_self"], diff --git a/modules/gdnative/include/gdnative/color.h b/modules/gdnative/include/gdnative/color.h index 47c01dbb20..e7737bf8e1 100644 --- a/modules/gdnative/include/gdnative/color.h +++ b/modules/gdnative/include/gdnative/color.h @@ -95,7 +95,7 @@ godot_color GDAPI godot_color_inverted(const godot_color *p_self); godot_color GDAPI godot_color_contrasted(const godot_color *p_self); -godot_color GDAPI godot_color_linear_interpolate(const godot_color *p_self, const godot_color *p_b, const godot_real p_t); +godot_color GDAPI godot_color_lerp(const godot_color *p_self, const godot_color *p_b, const godot_real p_t); godot_color GDAPI godot_color_blend(const godot_color *p_self, const godot_color *p_over); diff --git a/modules/gdnative/include/gdnative/vector2.h b/modules/gdnative/include/gdnative/vector2.h index 15a1a6063b..c11e23a586 100644 --- a/modules/gdnative/include/gdnative/vector2.h +++ b/modules/gdnative/include/gdnative/vector2.h @@ -81,7 +81,7 @@ godot_real GDAPI godot_vector2_angle_to(const godot_vector2 *p_self, const godot godot_real GDAPI godot_vector2_angle_to_point(const godot_vector2 *p_self, const godot_vector2 *p_to); -godot_vector2 GDAPI godot_vector2_linear_interpolate(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_real p_t); +godot_vector2 GDAPI godot_vector2_lerp(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_real p_t); godot_vector2 GDAPI godot_vector2_cubic_interpolate(const godot_vector2 *p_self, const godot_vector2 *p_b, const godot_vector2 *p_pre_a, const godot_vector2 *p_post_b, const godot_real p_t); diff --git a/modules/gdnative/include/gdnative/vector3.h b/modules/gdnative/include/gdnative/vector3.h index 1b344590ea..8ebf15b724 100644 --- a/modules/gdnative/include/gdnative/vector3.h +++ b/modules/gdnative/include/gdnative/vector3.h @@ -86,7 +86,7 @@ godot_vector3 GDAPI godot_vector3_snapped(const godot_vector3 *p_self, const god godot_vector3 GDAPI godot_vector3_rotated(const godot_vector3 *p_self, const godot_vector3 *p_axis, const godot_real p_phi); -godot_vector3 GDAPI godot_vector3_linear_interpolate(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_real p_t); +godot_vector3 GDAPI godot_vector3_lerp(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_real p_t); godot_vector3 GDAPI godot_vector3_cubic_interpolate(const godot_vector3 *p_self, const godot_vector3 *p_b, const godot_vector3 *p_pre_a, const godot_vector3 *p_post_b, const godot_real p_t); diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 9324691df5..be159b6407 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -568,7 +568,7 @@ <description> Linearly interpolates between two values by a normalized value. This is the opposite of [method inverse_lerp]. If the [code]from[/code] and [code]to[/code] arguments are of type [int] or [float], the return value is a [float]. - If both are of the same vector type ([Vector2], [Vector3] or [Color]), the return value will be of the same type ([code]lerp[/code] then calls the vector type's [code]linear_interpolate[/code] method). + If both are of the same vector type ([Vector2], [Vector3] or [Color]), the return value will be of the same type ([code]lerp[/code] then calls the vector type's [code]lerp[/code] method). [codeblock] lerp(0, 4, 0.75) # Returns 3.0 lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Returns Vector2(2, 3.5) diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 98366f7957..06ab9e226d 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -103,15 +103,14 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco instance->owner->set_script_instance(instance); /* STEP 2, INITIALIZE AND CONSTRUCT */ - { MutexLock lock(GDScriptLanguage::singleton->lock); - instances.insert(instance->owner); } - + if (p_argcount < 0) { + return instance; + } initializer->call(instance, p_args, p_argcount, r_error); - if (r_error.error != Callable::CallError::CALL_OK) { instance->script = Ref<GDScript>(); instance->owner->set_script_instance(nullptr); @@ -119,10 +118,8 @@ GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argco MutexLock lock(GDScriptLanguage::singleton->lock); instances.erase(p_owner); } - - ERR_FAIL_COND_V(r_error.error != Callable::CallError::CALL_OK, nullptr); //error constructing + ERR_FAIL_V_MSG(nullptr, "Error constructing a GDScriptInstance."); } - //@TODO make thread safe return instance; } @@ -638,12 +635,12 @@ uint16_t GDScript::get_rpc_method_id(const StringName &p_method) const { } StringName GDScript::get_rpc_method(const uint16_t p_rpc_method_id) const { - ERR_FAIL_COND_V(p_rpc_method_id >= rpc_functions.size(), StringName()); + if (p_rpc_method_id >= rpc_functions.size()) return StringName(); return rpc_functions[p_rpc_method_id].name; } MultiplayerAPI::RPCMode GDScript::get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const { - ERR_FAIL_COND_V(p_rpc_method_id >= rpc_functions.size(), MultiplayerAPI::RPC_MODE_DISABLED); + if (p_rpc_method_id >= rpc_functions.size()) return MultiplayerAPI::RPC_MODE_DISABLED; return rpc_functions[p_rpc_method_id].mode; } @@ -665,12 +662,12 @@ uint16_t GDScript::get_rset_property_id(const StringName &p_variable) const { } StringName GDScript::get_rset_property(const uint16_t p_rset_member_id) const { - ERR_FAIL_COND_V(p_rset_member_id >= rpc_variables.size(), StringName()); + if (p_rset_member_id >= rpc_variables.size()) return StringName(); return rpc_variables[p_rset_member_id].name; } MultiplayerAPI::RPCMode GDScript::get_rset_mode_by_id(const uint16_t p_rset_member_id) const { - ERR_FAIL_COND_V(p_rset_member_id >= rpc_variables.size(), MultiplayerAPI::RPC_MODE_DISABLED); + if (p_rset_member_id >= rpc_variables.size()) return MultiplayerAPI::RPC_MODE_DISABLED; return rpc_variables[p_rset_member_id].mode; } diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 7ad0682637..ab3228d076 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -1427,6 +1427,7 @@ static bool _guess_identifier_type_from_base(GDScriptCompletionContext &p_contex // Variable used in the same expression return false; } + if (_guess_expression_type(p_context, m.expression, r_type)) { return true; } @@ -3490,6 +3491,17 @@ Error GDScriptLanguage::lookup_code(const String &p_code, const String &p_symbol return OK; } } break; + case GDScriptParser::COMPLETION_TYPE_HINT: { + + GDScriptParser::DataType base_type = context._class->base_type; + base_type.has_type = true; + base_type.kind = GDScriptParser::DataType::CLASS; + base_type.class_type = const_cast<GDScriptParser::ClassNode *>(context._class); + + if (_lookup_symbol_from_base(base_type, p_symbol, false, r_result) == OK) { + return OK; + } + } break; default: { } } diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp index 4e0891921e..44640411bb 100644 --- a/modules/gdscript/gdscript_function.cpp +++ b/modules/gdscript/gdscript_function.cpp @@ -294,11 +294,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a line = p_state->line; ip = p_state->ip; alloca_size = p_state->stack.size(); - script = p_state->script.ptr(); - p_instance = p_state->instance; + script = static_cast<GDScript *>(ObjectDB::get_instance(p_state->script_id)); + p_instance = p_state->instance_id.is_valid() ? static_cast<GDScriptInstance *>(ObjectDB::get_instance(p_state->instance_id)->get_script_instance()) : nullptr; defarg = p_state->defarg; self = p_state->self; - //stack[p_state->result_pos]=p_state->result; //assign stack with result } else { @@ -1280,13 +1279,14 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a gdfs->state.stack_size = _stack_size; gdfs->state.self = self; gdfs->state.alloca_size = alloca_size; - gdfs->state.script = Ref<GDScript>(_script); gdfs->state.ip = ip + ipofs; gdfs->state.line = line; + gdfs->state.script_id = script->get_instance_id(); +#ifdef DEBUG_ENABLED + gdfs->state.script_path = _script->get_path(); +#endif gdfs->state.instance_id = (p_instance && p_instance->get_owner()) ? p_instance->get_owner()->get_instance_id() : ObjectID(); - //gdfs->state.result_pos=ip+ipofs-1; gdfs->state.defarg = defarg; - gdfs->state.instance = p_instance; gdfs->function = this; retvalue = gdfs; @@ -1833,9 +1833,14 @@ bool GDScriptFunctionState::is_valid(bool p_extended_check) const { return false; if (p_extended_check) { - //class instance gone? - if (state.instance_id.is_valid() && !ObjectDB::get_instance(state.instance_id)) + // Class instance gone? (Otherwise script is valid for sure, because the instance has a ref to the script) + if (state.instance_id.is_valid() && !ObjectDB::get_instance(state.instance_id)) { return false; + } + // Script gone? (Static method, so there's no instance whose ref to the script can ensure it's valid) + if (!ObjectDB::get_instance(state.script_id)) { + return false; + } } return true; @@ -1846,7 +1851,14 @@ Variant GDScriptFunctionState::resume(const Variant &p_arg) { ERR_FAIL_COND_V(!function, Variant()); if (state.instance_id.is_valid() && !ObjectDB::get_instance(state.instance_id)) { #ifdef DEBUG_ENABLED - ERR_FAIL_V_MSG(Variant(), "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_MSG(Variant(), "Resumed function '" + String(function->get_name()) + "()' after yield, but class instance is gone. At script: " + state.script_path + ":" + itos(state.line)); +#else + return Variant(); +#endif + } + if (!ObjectDB::get_instance(state.script_id)) { +#ifdef DEBUG_ENABLED + ERR_FAIL_V_MSG(Variant(), "Resumed function '" + String(function->get_name()) + "()' after yield, but script is gone. At script: " + state.script_path + ":" + itos(state.line)); #else return Variant(); #endif diff --git a/modules/gdscript/gdscript_function.h b/modules/gdscript/gdscript_function.h index acfc0a95b4..9d8e23d994 100644 --- a/modules/gdscript/gdscript_function.h +++ b/modules/gdscript/gdscript_function.h @@ -293,13 +293,15 @@ private: public: struct CallState { + ObjectID script_id; +#ifdef DEBUG_ENABLED + String script_path; +#endif ObjectID instance_id; - GDScriptInstance *instance; Vector<uint8_t> stack; int stack_size; Variant self; uint32_t alloca_size; - Ref<GDScript> script; int ip; int line; int defarg; diff --git a/modules/gdscript/gdscript_functions.cpp b/modules/gdscript/gdscript_functions.cpp index 9154d6eb89..0199af642f 100644 --- a/modules/gdscript/gdscript_functions.cpp +++ b/modules/gdscript/gdscript_functions.cpp @@ -362,13 +362,13 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_ const double t = (double)*p_args[2]; switch (p_args[0]->get_type() == p_args[1]->get_type() ? p_args[0]->get_type() : Variant::FLOAT) { case Variant::VECTOR2: { - r_ret = ((Vector2)*p_args[0]).linear_interpolate((Vector2)*p_args[1], t); + r_ret = ((Vector2)*p_args[0]).lerp((Vector2)*p_args[1], t); } break; case Variant::VECTOR3: { - r_ret = (p_args[0]->operator Vector3()).linear_interpolate(p_args[1]->operator Vector3(), t); + r_ret = (p_args[0]->operator Vector3()).lerp(p_args[1]->operator Vector3(), t); } break; case Variant::COLOR: { - r_ret = ((Color)*p_args[0]).linear_interpolate((Color)*p_args[1], t); + r_ret = ((Color)*p_args[0]).lerp((Color)*p_args[1], t); } break; default: { VALIDATE_ARG_NUM(0); @@ -1197,8 +1197,7 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_ return; } } - - r_ret = gdscr->_new(nullptr, 0, r_error); + r_ret = gdscr->_new(nullptr, -1 /*skip initializer*/, r_error); GDScriptInstance *ins = static_cast<GDScriptInstance *>(static_cast<Object *>(r_ret)->get_script_instance()); Ref<GDScript> gd_ref = ins->get_script(); diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index 411512d631..17077567c7 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -3358,15 +3358,10 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) { } if (args.empty() || args.size() > 2) { - _set_error("Wrong number of arguments, expected 1 or 2"); + _set_error("Wrong number of arguments, expected 1 or 2", assert_line); return; } -#ifdef DEBUG_ENABLED - // Mark as safe, let type check mark as unsafe if needed - _mark_line_as_safe(assert_line); - _reduce_node_type(args[0]); -#endif AssertNode *an = alloc_node<AssertNode>(); an->condition = _reduce_expression(args[0], p_static); an->line = assert_line; @@ -3383,7 +3378,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) { p_block->statements.push_back(an); if (!_end_statement()) { - _set_error("Expected end of statement after \"assert\"."); + _set_error("Expected end of statement after \"assert\".", assert_line); return; } } break; @@ -4038,7 +4033,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) { if (!_enter_indent_block(block)) { - _set_error("Indented block expected."); + _set_error(vformat("Indented block expected after declaration of \"%s\" function.", function->name)); return; } @@ -8133,10 +8128,15 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) { Node *statement = E->get(); switch (statement->type) { case Node::TYPE_NEWLINE: - case Node::TYPE_BREAKPOINT: - case Node::TYPE_ASSERT: { + case Node::TYPE_BREAKPOINT: { // Nothing to do } break; + case Node::TYPE_ASSERT: { + AssertNode *an = static_cast<AssertNode *>(statement); + _mark_line_as_safe(an->line); + _reduce_node_type(an->condition); + _reduce_node_type(an->message); + } break; case Node::TYPE_LOCAL_VAR: { LocalVarNode *lv = static_cast<LocalVarNode *>(statement); lv->datatype = _resolve_type(lv->datatype, lv->line); @@ -8571,7 +8571,13 @@ Error GDScriptParser::_parse(const String &p_base_path) { _set_error("Parse error: " + tokenizer->get_token_error()); } - if (error_set && !for_completion) { + bool for_completion_error_set = false; + if (error_set && for_completion) { + for_completion_error_set = true; + error_set = false; + } + + if (error_set) { return ERR_PARSE_ERROR; } @@ -8601,6 +8607,10 @@ Error GDScriptParser::_parse(const String &p_base_path) { // Resolve the function blocks _check_class_blocks_types(main_class); + if (for_completion_error_set) { + error_set = true; + } + if (error_set) { return ERR_PARSE_ERROR; } diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index df7c2f397f..0dbefbb39f 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -80,7 +80,7 @@ bool GridMap::_set(const StringName &p_name, const Variant &p_value) { RS::get_singleton()->get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid()); RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id()); if (is_inside_tree()) { - RS::get_singleton()->instance_set_scenario(bm.instance, get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(bm.instance, get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_transform(bm.instance, get_global_transform()); } baked_meshes.push_back(bm); @@ -536,7 +536,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) { RS::get_singleton()->instance_set_base(instance, mm); if (is_inside_tree()) { - RS::get_singleton()->instance_set_scenario(instance, get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(instance, get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_transform(instance, get_global_transform()); } @@ -577,15 +577,15 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) { ERR_FAIL_COND(!octant_map.has(p_key)); Octant &g = *octant_map[p_key]; PhysicsServer3D::get_singleton()->body_set_state(g.static_body, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform()); - PhysicsServer3D::get_singleton()->body_set_space(g.static_body, get_world()->get_space()); + PhysicsServer3D::get_singleton()->body_set_space(g.static_body, get_world_3d()->get_space()); if (g.collision_debug_instance.is_valid()) { - RS::get_singleton()->instance_set_scenario(g.collision_debug_instance, get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(g.collision_debug_instance, get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_transform(g.collision_debug_instance, get_global_transform()); } for (int i = 0; i < g.multimesh_instances.size(); i++) { - RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_transform(g.multimesh_instances[i].instance, get_global_transform()); } @@ -684,7 +684,7 @@ void GridMap::_notification(int p_what) { } for (int i = 0; i < baked_meshes.size(); i++) { - RS::get_singleton()->instance_set_scenario(baked_meshes[i].instance, get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(baked_meshes[i].instance, get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_transform(baked_meshes[i].instance, get_global_transform()); } @@ -1054,7 +1054,7 @@ void GridMap::make_baked_meshes(bool p_gen_lightmap_uv, float p_lightmap_uv_texe RS::get_singleton()->get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid()); RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id()); if (is_inside_tree()) { - RS::get_singleton()->instance_set_scenario(bm.instance, get_world()->get_scenario()); + RS::get_singleton()->instance_set_scenario(bm.instance, get_world_3d()->get_scenario()); RS::get_singleton()->instance_set_transform(bm.instance, get_global_transform()); } diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp index 9c3101945a..9abbac6a0b 100644 --- a/modules/gridmap/grid_map_editor_plugin.cpp +++ b/modules/gridmap/grid_map_editor_plugin.cpp @@ -556,7 +556,7 @@ void GridMapEditor::_set_clipboard_data() { item.cell_item = itm; item.grid_offset = Vector3(i, j, k) - selection.begin; item.orientation = node->get_cell_item_orientation(i, j, k); - item.instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world()->get_scenario()); + item.instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world_3d()->get_scenario()); clipboard_items.push_back(item); } @@ -1083,12 +1083,12 @@ void GridMapEditor::_notification(int p_what) { for (int i = 0; i < 3; i++) { grid[i] = RS::get_singleton()->mesh_create(); - grid_instance[i] = RS::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world()->get_scenario()); - selection_level_instance[i] = RenderingServer::get_singleton()->instance_create2(selection_level_mesh[i], get_tree()->get_root()->get_world()->get_scenario()); + grid_instance[i] = RS::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world_3d()->get_scenario()); + selection_level_instance[i] = RenderingServer::get_singleton()->instance_create2(selection_level_mesh[i], get_tree()->get_root()->get_world_3d()->get_scenario()); } - selection_instance = RenderingServer::get_singleton()->instance_create2(selection_mesh, get_tree()->get_root()->get_world()->get_scenario()); - paste_instance = RenderingServer::get_singleton()->instance_create2(paste_mesh, get_tree()->get_root()->get_world()->get_scenario()); + selection_instance = RenderingServer::get_singleton()->instance_create2(selection_mesh, get_tree()->get_root()->get_world_3d()->get_scenario()); + paste_instance = RenderingServer::get_singleton()->instance_create2(paste_mesh, get_tree()->get_root()->get_world_3d()->get_scenario()); _update_selection_transform(); _update_paste_indicator(); @@ -1168,7 +1168,7 @@ void GridMapEditor::_update_cursor_instance() { Ref<Mesh> mesh = node->get_mesh_library()->get_item_mesh(selected_palette); if (!mesh.is_null() && mesh->get_rid().is_valid()) { - cursor_instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world()->get_scenario()); + cursor_instance = RenderingServer::get_singleton()->instance_create2(mesh->get_rid(), get_tree()->get_root()->get_world_3d()->get_scenario()); RenderingServer::get_singleton()->instance_set_transform(cursor_instance, cursor_transform); } } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs index 1d1a49945f..6030b72a44 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs @@ -306,16 +306,26 @@ namespace Godot return res; } - public Color LinearInterpolate(Color c, float t) - { - var res = this; - - res.r += t * (c.r - r); - res.g += t * (c.g - g); - res.b += t * (c.b - b); - res.a += t * (c.a - a); + public Color Lerp(Color to, float weight) + { + return new Color + ( + Mathf.Lerp(r, to.r, weight), + Mathf.Lerp(g, to.g, weight), + Mathf.Lerp(b, to.b, weight), + Mathf.Lerp(a, to.a, weight) + ); + } - return res; + public Color Lerp(Color to, Color weight) + { + return new Color + ( + Mathf.Lerp(r, to.r, weight.r), + Mathf.Lerp(g, to.g, weight.g), + Mathf.Lerp(b, to.b, weight.b), + Mathf.Lerp(a, to.a, weight.a) + ); } public uint ToAbgr32() @@ -410,7 +420,7 @@ namespace Godot return txt; } - // Constructors + // Constructors public Color(float r, float g, float b, float a = 1.0f) { this.r = r; @@ -419,6 +429,14 @@ namespace Godot this.a = a; } + public Color(Color c, float a = 1.0f) + { + r = c.r; + g = c.g; + b = c.b; + this.a = a; + } + public Color(uint rgba) { a = (rgba & 0xFF) / 255.0f; diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs index 91e614dc7b..1098ffe4e5 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2.cs @@ -127,7 +127,7 @@ namespace Godot { var g = this; - g.GrowIndividual(Margin.Left == margin ? by : 0, + g = g.GrowIndividual(Margin.Left == margin ? by : 0, Margin.Top == margin ? by : 0, Margin.Right == margin ? by : 0, Margin.Bottom == margin ? by : 0); diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs index bc2cad8713..c0b236c524 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Rect2i.cs @@ -122,7 +122,7 @@ namespace Godot { var g = this; - g.GrowIndividual(Margin.Left == margin ? by : 0, + g = g.GrowIndividual(Margin.Left == margin ? by : 0, Margin.Top == margin ? by : 0, Margin.Right == margin ? by : 0, Margin.Bottom == margin ? by : 0); diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs index aa8815d1aa..6a58b90561 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform.cs @@ -104,8 +104,8 @@ namespace Godot Vector3 destinationLocation = transform.origin; var interpolated = new Transform(); - interpolated.basis.SetQuatScale(sourceRotation.Slerp(destinationRotation, c).Normalized(), sourceScale.LinearInterpolate(destinationScale, c)); - interpolated.origin = sourceLocation.LinearInterpolate(destinationLocation, c); + interpolated.basis.SetQuatScale(sourceRotation.Slerp(destinationRotation, c).Normalized(), sourceScale.Lerp(destinationScale, c)); + interpolated.origin = sourceLocation.Lerp(destinationLocation, c); return interpolated; } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs index e72a44809a..3ae96d4922 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform2D.cs @@ -172,7 +172,7 @@ namespace Godot if (dot > 0.9995f) { // Linearly interpolate to avoid numerical precision issues - v = v1.LinearInterpolate(v2, c).Normalized(); + v = v1.Lerp(v2, c).Normalized(); } else { @@ -186,8 +186,8 @@ namespace Godot Vector2 p2 = m.origin; // Construct matrix - var res = new Transform2D(Mathf.Atan2(v.y, v.x), p1.LinearInterpolate(p2, c)); - Vector2 scale = s1.LinearInterpolate(s2, c); + var res = new Transform2D(Mathf.Atan2(v.y, v.x), p1.Lerp(p2, c)); + Vector2 scale = s1.Lerp(s2, c); res.x *= scale; res.y *= scale; diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs index f7b13198f8..7e4804f9fd 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs @@ -186,14 +186,22 @@ namespace Godot return x * x + y * y; } - public Vector2 LinearInterpolate(Vector2 b, real_t t) + public Vector2 Lerp(Vector2 to, real_t weight) { - var res = this; - - res.x += t * (b.x - x); - res.y += t * (b.y - y); + return new Vector2 + ( + Mathf.Lerp(x, to.x, weight), + Mathf.Lerp(y, to.y, weight) + ); + } - return res; + public Vector2 Lerp(Vector2 to, Vector2 weight) + { + return new Vector2 + ( + Mathf.Lerp(x, to.x, weight.x), + Mathf.Lerp(y, to.y, weight.y) + ); } public Vector2 MoveToward(Vector2 to, real_t delta) diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs index a43836e985..b26e17ecba 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs @@ -184,13 +184,23 @@ namespace Godot return x2 + y2 + z2; } - public Vector3 LinearInterpolate(Vector3 b, real_t t) + public Vector3 Lerp(Vector3 to, real_t weight) { return new Vector3 ( - x + t * (b.x - x), - y + t * (b.y - y), - z + t * (b.z - z) + Mathf.Lerp(x, to.x, weight), + Mathf.Lerp(y, to.y, weight), + Mathf.Lerp(z, to.z, weight) + ); + } + + public Vector3 Lerp(Vector3 to, Vector3 weight) + { + return new Vector3 + ( + Mathf.Lerp(x, to.x, weight.x), + Mathf.Lerp(y, to.y, weight.y), + Mathf.Lerp(z, to.z, weight.z) ); } diff --git a/modules/mono/utils/string_utils.cpp b/modules/mono/utils/string_utils.cpp index 907811355f..67b264d803 100644 --- a/modules/mono/utils/string_utils.cpp +++ b/modules/mono/utils/string_utils.cpp @@ -196,16 +196,6 @@ String str_format(const char *p_format, ...) { return res; } -// va_copy was defined in the C99, but not in C++ standards before C++11. -// When you compile C++ without --std=c++<XX> option, compilers still define -// va_copy, otherwise you have to use the internal version (__va_copy). -#if !defined(va_copy) -#if defined(__GNUC__) -#define va_copy(d, s) __va_copy((d), (s)) -#else -#define va_copy(d, s) ((d) = (s)) -#endif -#endif #if defined(MINGW_ENABLED) || defined(_MSC_VER) && _MSC_VER < 1900 #define gd_vsnprintf(m_buffer, m_count, m_format, m_args_copy) vsnprintf_s(m_buffer, m_count, _TRUNCATE, m_format, m_args_copy) diff --git a/modules/tinyexr/SCsub b/modules/tinyexr/SCsub index e7fd44fabd..84b3b4015b 100644 --- a/modules/tinyexr/SCsub +++ b/modules/tinyexr/SCsub @@ -15,6 +15,9 @@ thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] env_tinyexr.Prepend(CPPPATH=[thirdparty_dir]) +# Enable threaded loading with C++11. +env_tinyexr.Append(CPPDEFINES=["TINYEXR_USE_THREAD"]) + env_thirdparty = env_tinyexr.Clone() env_thirdparty.disable_warnings() env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.java b/platform/android/java/lib/src/org/godotengine/godot/Godot.java index bf0d1c6273..957f6223a9 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java @@ -30,6 +30,13 @@ package org.godotengine.godot; +import org.godotengine.godot.input.GodotEditText; +import org.godotengine.godot.plugin.GodotPlugin; +import org.godotengine.godot.plugin.GodotPluginRegistry; +import org.godotengine.godot.utils.GodotNetUtils; +import org.godotengine.godot.utils.PermissionsUtil; +import org.godotengine.godot.xr.XRMode; + import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityManager; @@ -77,6 +84,7 @@ import android.widget.Button; import android.widget.FrameLayout; import android.widget.ProgressBar; import android.widget.TextView; + import com.google.android.vending.expansion.downloader.DownloadProgressInfo; import com.google.android.vending.expansion.downloader.DownloaderClientMarshaller; import com.google.android.vending.expansion.downloader.DownloaderServiceMarshaller; @@ -84,6 +92,7 @@ import com.google.android.vending.expansion.downloader.Helpers; import com.google.android.vending.expansion.downloader.IDownloaderClient; import com.google.android.vending.expansion.downloader.IDownloaderService; import com.google.android.vending.expansion.downloader.IStub; + import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -91,12 +100,6 @@ import java.security.MessageDigest; import java.util.LinkedList; import java.util.List; import java.util.Locale; -import org.godotengine.godot.input.GodotEditText; -import org.godotengine.godot.plugin.GodotPlugin; -import org.godotengine.godot.plugin.GodotPluginRegistry; -import org.godotengine.godot.utils.GodotNetUtils; -import org.godotengine.godot.utils.PermissionsUtil; -import org.godotengine.godot.xr.XRMode; public abstract class Godot extends FragmentActivity implements SensorEventListener, IDownloaderClient { diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java index 1fb242d0bc..fa95e82e7a 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java @@ -35,6 +35,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; import android.util.Log; + import com.google.android.vending.expansion.downloader.DownloaderClientMarshaller; /** diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java index 7e74e8a80d..434da95bc0 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java @@ -33,6 +33,7 @@ package org.godotengine.godot; import android.content.Context; import android.content.SharedPreferences; import android.util.Log; + import com.google.android.vending.expansion.downloader.impl.DownloaderService; /** diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java index 9be93243b8..5d8ac09643 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java @@ -29,13 +29,7 @@ /*************************************************************************/ package org.godotengine.godot; -import android.annotation.SuppressLint; -import android.graphics.PixelFormat; -import android.opengl.GLSurfaceView; -import android.view.GestureDetector; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.SurfaceView; + import org.godotengine.godot.input.GodotGestureHandler; import org.godotengine.godot.input.GodotInputHandler; import org.godotengine.godot.utils.GLUtils; @@ -47,6 +41,14 @@ import org.godotengine.godot.xr.regular.RegularConfigChooser; import org.godotengine.godot.xr.regular.RegularContextFactory; import org.godotengine.godot.xr.regular.RegularFallbackConfigChooser; +import android.annotation.SuppressLint; +import android.graphics.PixelFormat; +import android.opengl.GLSurfaceView; +import android.view.GestureDetector; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.SurfaceView; + /** * A simple GLSurfaceView sub-class that demonstrate how to perform * OpenGL ES 2.0 rendering into a GL Surface. Note the following important diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java index 016a3a8d18..2eb6f4e313 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java @@ -29,6 +29,9 @@ /*************************************************************************/ package org.godotengine.godot; + +import org.godotengine.godot.input.*; + import android.content.*; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -39,11 +42,10 @@ import android.os.*; import android.util.DisplayMetrics; import android.util.Log; import android.util.SparseArray; + import java.io.IOException; import java.io.InputStream; import java.util.Locale; -import org.godotengine.godot.input.*; -//android.os.Build // Wrapper for native library diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java index 71fe822233..9383781150 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java @@ -33,6 +33,7 @@ package org.godotengine.godot; import android.app.Activity; import android.hardware.SensorEvent; import android.view.Surface; + import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java index 3e5bb4a4c9..39858e5fee 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java @@ -30,13 +30,15 @@ package org.godotengine.godot; +import org.godotengine.godot.plugin.GodotPlugin; +import org.godotengine.godot.plugin.GodotPluginRegistry; +import org.godotengine.godot.utils.GLUtils; + import android.content.Context; import android.opengl.GLSurfaceView; + import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; -import org.godotengine.godot.plugin.GodotPlugin; -import org.godotengine.godot.plugin.GodotPluginRegistry; -import org.godotengine.godot.utils.GLUtils; /** * Godot's renderer implementation. diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java index 30197d5729..3a36c512a2 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java @@ -30,15 +30,16 @@ package org.godotengine.godot; +import org.godotengine.godot.input.GodotGestureHandler; +import org.godotengine.godot.input.GodotInputHandler; +import org.godotengine.godot.vulkan.VkRenderer; +import org.godotengine.godot.vulkan.VkSurfaceView; + import android.annotation.SuppressLint; import android.view.GestureDetector; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceView; -import org.godotengine.godot.input.GodotGestureHandler; -import org.godotengine.godot.input.GodotInputHandler; -import org.godotengine.godot.vulkan.VkRenderer; -import org.godotengine.godot.vulkan.VkSurfaceView; public class GodotVulkanRenderView extends VkSurfaceView implements GodotRenderView { diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java index 92bb118e44..547c093419 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java @@ -29,6 +29,9 @@ /*************************************************************************/ package org.godotengine.godot.input; + +import org.godotengine.godot.*; + import android.content.Context; import android.os.Handler; import android.os.Message; @@ -38,8 +41,8 @@ import android.view.KeyEvent; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; + import java.lang.ref.WeakReference; -import org.godotengine.godot.*; public class GodotEditText extends EditText { // =========================================================== diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java index b1e0f66373..0ac82dbfe4 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.java @@ -30,11 +30,12 @@ package org.godotengine.godot.input; +import org.godotengine.godot.GodotLib; +import org.godotengine.godot.GodotRenderView; + import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; -import org.godotengine.godot.GodotLib; -import org.godotengine.godot.GodotRenderView; /** * Handles gesture input related events for the {@link GodotRenderView} view. diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java index 0e4fc65119..cea58f27e6 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java @@ -32,18 +32,20 @@ package org.godotengine.godot.input; import static org.godotengine.godot.utils.GLUtils.DEBUG; +import org.godotengine.godot.GodotLib; +import org.godotengine.godot.GodotRenderView; +import org.godotengine.godot.input.InputManagerCompat.InputDeviceListener; + import android.util.Log; import android.view.InputDevice; import android.view.InputDevice.MotionRange; import android.view.KeyEvent; import android.view.MotionEvent; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import org.godotengine.godot.GodotLib; -import org.godotengine.godot.GodotRenderView; -import org.godotengine.godot.input.InputManagerCompat.InputDeviceListener; /** * Handles input related events for the {@link GodotRenderView} view. diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java index e12ff266bf..9cd08de529 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java @@ -29,6 +29,9 @@ /*************************************************************************/ package org.godotengine.godot.input; + +import org.godotengine.godot.*; + import android.content.Context; import android.text.Editable; import android.text.TextWatcher; @@ -37,7 +40,6 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; -import org.godotengine.godot.*; public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListener { // =========================================================== diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java b/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java index e4bafa7ff9..3b88609cc9 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java @@ -23,6 +23,7 @@ import android.os.Build; import android.os.Handler; import android.view.InputDevice; import android.view.MotionEvent; + import java.util.HashMap; import java.util.Map; diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java b/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java index 0c1bdb32aa..1f3fe1e527 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java @@ -31,6 +31,7 @@ package org.godotengine.godot.input; import android.view.InputDevice.MotionRange; + import java.util.ArrayList; /** diff --git a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java index a051164d15..a42bcb28ce 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java +++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java @@ -30,6 +30,9 @@ package org.godotengine.godot.plugin; +import org.godotengine.godot.BuildConfig; +import org.godotengine.godot.Godot; + import android.app.Activity; import android.content.Intent; import android.support.annotation.NonNull; @@ -38,16 +41,16 @@ import android.text.TextUtils; import android.util.Log; import android.view.Surface; import android.view.View; + import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; + import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; -import org.godotengine.godot.BuildConfig; -import org.godotengine.godot.Godot; /** * Base class for the Godot Android plugins. diff --git a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java index e13a9c15d8..7bc8f2c03f 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java +++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginRegistry.java @@ -30,12 +30,15 @@ package org.godotengine.godot.plugin; +import org.godotengine.godot.Godot; + import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; + import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; @@ -43,7 +46,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import org.godotengine.godot.Godot; /** * Registry used to load and access the registered Godot Android plugins. diff --git a/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java b/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java index f907706889..b940d679f0 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java +++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java @@ -32,6 +32,7 @@ package org.godotengine.godot.plugin; import android.support.annotation.NonNull; import android.text.TextUtils; + import java.util.Arrays; /** diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java b/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java index 9d29551f89..291847723c 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java +++ b/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java @@ -31,6 +31,7 @@ package org.godotengine.godot.utils; import android.util.Log; + import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLDisplay; diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java b/platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java index 011d426c7e..bb1667afda 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java +++ b/platform/android/java/lib/src/org/godotengine/godot/utils/GodotNetUtils.java @@ -30,10 +30,11 @@ package org.godotengine.godot.utils; +import org.godotengine.godot.Godot; + import android.content.Context; import android.net.wifi.WifiManager; import android.util.Log; -import org.godotengine.godot.Godot; /** * This class handles Android-specific networking functions. diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java index 7cf32b00fe..4000e63fbe 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java +++ b/platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java @@ -30,15 +30,18 @@ package org.godotengine.godot.utils; +import org.godotengine.godot.Godot; + import android.Manifest; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; import android.os.Build; import android.support.v4.content.ContextCompat; +import android.util.Log; + import java.util.ArrayList; import java.util.List; -import org.godotengine.godot.Godot; /** * This class includes utility functions for Android permissions related operations. @@ -46,6 +49,8 @@ import org.godotengine.godot.Godot; */ public final class PermissionsUtil { + private static final String TAG = PermissionsUtil.class.getSimpleName(); + static final int REQUEST_RECORD_AUDIO_PERMISSION = 1; static final int REQUEST_CAMERA_PERMISSION = 2; static final int REQUEST_VIBRATE_PERMISSION = 3; @@ -113,8 +118,8 @@ public final class PermissionsUtil { dangerousPermissions.add(manifestPermission); } } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - return false; + // Skip this permission and continue. + Log.w(TAG, "Unable to identify permission " + manifestPermission, e); } } @@ -153,8 +158,8 @@ public final class PermissionsUtil { dangerousPermissions.add(manifestPermission); } } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - return new String[0]; + // Skip this permission and continue. + Log.w(TAG, "Unable to identify permission " + manifestPermission, e); } } diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java index 9209d6ccf2..c66d75bb2d 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java +++ b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java @@ -32,6 +32,7 @@ package org.godotengine.godot.xr.ovr; import android.opengl.EGLExt; import android.opengl.GLSurfaceView; + import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLDisplay; diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java index 36f4416df2..16d4a998f2 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java +++ b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java @@ -32,6 +32,7 @@ package org.godotengine.godot.xr.ovr; import android.opengl.EGL14; import android.opengl.GLSurfaceView; + import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java index b2aa130f37..7ca0777f11 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java +++ b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java @@ -31,6 +31,7 @@ package org.godotengine.godot.xr.ovr; import android.opengl.GLSurfaceView; + import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLDisplay; diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java index 8409e37f8f..924d12f0bc 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java +++ b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java @@ -30,11 +30,13 @@ package org.godotengine.godot.xr.regular; +import org.godotengine.godot.utils.GLUtils; + import android.opengl.GLSurfaceView; + import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLDisplay; -import org.godotengine.godot.utils.GLUtils; /** * Used to select the egl config for pancake games. diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java index 31cf696195..126f3ad5f5 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java +++ b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java @@ -30,14 +30,16 @@ package org.godotengine.godot.xr.regular; +import org.godotengine.godot.GodotLib; +import org.godotengine.godot.utils.GLUtils; + import android.opengl.GLSurfaceView; import android.util.Log; + import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; import javax.microedition.khronos.egl.EGLDisplay; -import org.godotengine.godot.GodotLib; -import org.godotengine.godot.utils.GLUtils; /** * Factory used to setup the opengl context for pancake games. diff --git a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java index 71fcf06020..64bc4ac1da 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java +++ b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java @@ -30,11 +30,13 @@ package org.godotengine.godot.xr.regular; +import org.godotengine.godot.utils.GLUtils; + import android.util.Log; + import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLDisplay; -import org.godotengine.godot.utils.GLUtils; /* Fallback if 32bit View is not supported*/ public class RegularFallbackConfigChooser extends RegularConfigChooser { diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java index c15bc232ce..31c72fe7f8 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ConsumeTask.java @@ -33,7 +33,9 @@ package org.godotengine.godot.plugin.payment; import android.content.Context; import android.os.AsyncTask; import android.os.RemoteException; + import com.android.vending.billing.IInAppBillingService; + import java.lang.ref.WeakReference; abstract public class ConsumeTask { diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java index c7d0a5de65..08ade2a18d 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java @@ -30,16 +30,19 @@ package org.godotengine.godot.plugin.payment; +import org.godotengine.godot.Dictionary; +import org.godotengine.godot.Godot; +import org.godotengine.godot.GodotLib; +import org.godotengine.godot.plugin.GodotPlugin; + import android.content.Intent; import android.support.annotation.NonNull; import android.util.Log; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.godotengine.godot.Dictionary; -import org.godotengine.godot.Godot; -import org.godotengine.godot.GodotLib; -import org.godotengine.godot.plugin.GodotPlugin; + import org.json.JSONException; import org.json.JSONObject; diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java index fe5685288b..70a51fcb97 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/HandlePurchaseTask.java @@ -32,6 +32,7 @@ package org.godotengine.godot.plugin.payment; import android.app.Activity; import android.content.Intent; + import org.json.JSONException; import org.json.JSONObject; diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java index bded1f452f..0393c0b06e 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PaymentsManager.java @@ -40,9 +40,12 @@ import android.os.IBinder; import android.os.RemoteException; import android.text.TextUtils; import android.util.Log; + import com.android.vending.billing.IInAppBillingService; + import java.util.ArrayList; import java.util.Arrays; + import org.json.JSONException; import org.json.JSONObject; diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java index eecd1d2151..4894e4020f 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/PurchaseTask.java @@ -37,6 +37,7 @@ import android.content.IntentSender.SendIntentException; import android.os.Bundle; import android.os.RemoteException; import android.util.Log; + import com.android.vending.billing.IInAppBillingService; abstract public class PurchaseTask { diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java index b7bd638feb..006688a450 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ReleaseAllConsumablesTask.java @@ -34,9 +34,12 @@ import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; + import com.android.vending.billing.IInAppBillingService; + import java.lang.ref.WeakReference; import java.util.ArrayList; + import org.json.JSONException; import org.json.JSONObject; diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java index d42ded0c9b..4ee7b5a0f8 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/ValidateTask.java @@ -30,12 +30,15 @@ package org.godotengine.godot.plugin.payment; +import org.godotengine.godot.plugin.payment.utils.HttpRequester; +import org.godotengine.godot.plugin.payment.utils.RequestParams; + import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; + import java.lang.ref.WeakReference; -import org.godotengine.godot.plugin.payment.utils.HttpRequester; -import org.godotengine.godot.plugin.payment.utils.RequestParams; + import org.json.JSONException; import org.json.JSONObject; diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java index 9571769cd3..55b87b49e5 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java @@ -38,8 +38,10 @@ import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; + import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; + import org.apache.http.conn.ssl.SSLSocketFactory; /** diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java index dcb983201e..acd17f10f2 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java @@ -30,9 +30,12 @@ package org.godotengine.godot.plugin.payment.utils; +import org.godotengine.godot.utils.Crypt; + import android.content.Context; import android.content.SharedPreferences; import android.util.Log; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -40,6 +43,7 @@ import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.security.KeyStore; import java.util.Date; + import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.client.ClientProtocolException; @@ -61,7 +65,6 @@ import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; -import org.godotengine.godot.utils.Crypt; /** * diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java index 4be8b37473..023fd87f68 100644 --- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java @@ -33,6 +33,7 @@ package org.godotengine.godot.plugin.payment.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; + import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp index ad06aef86e..c0230b94fa 100644 --- a/platform/javascript/os_javascript.cpp +++ b/platform/javascript/os_javascript.cpp @@ -981,7 +981,7 @@ Error OS_JavaScript::initialize(const VideoMode &p_desired, int p_video_driver, SET_EM_CALLBACK(EMSCRIPTEN_EVENT_TARGET_WINDOW, mousemove, mousemove_callback) SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, mousedown, mouse_button_callback) SET_EM_CALLBACK(EMSCRIPTEN_EVENT_TARGET_WINDOW, mouseup, mouse_button_callback) - SET_EM_CALLBACK(EMSCRIPTEN_EVENT_TARGET_WINDOW, wheel, wheel_callback) + SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, wheel, wheel_callback) SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, touchstart, touch_press_callback) SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, touchmove, touchmove_callback) SET_EM_CALLBACK(GODOT_CANVAS_SELECTOR, touchend, touch_press_callback) diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index e38b0c13d0..dd9298d667 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -254,13 +254,16 @@ bool DisplayServerX11::_refresh_device_info() { bool absolute_mode = false; int resolution_x = 0; int resolution_y = 0; - double range_min_x = 0; - double range_min_y = 0; - double range_max_x = 0; - double range_max_y = 0; - int pressure_resolution = 0; - int tilt_resolution_x = 0; - int tilt_resolution_y = 0; + double abs_x_min = 0; + double abs_x_max = 0; + double abs_y_min = 0; + double abs_y_max = 0; + double pressure_min = 0; + double pressure_max = 0; + double tilt_x_min = 0; + double tilt_x_max = 0; + double tilt_y_min = 0; + double tilt_y_max = 0; for (int j = 0; j < dev->num_classes; j++) { #ifdef TOUCH_ENABLED if (dev->classes[j]->type == XITouchClass && ((XITouchClassInfo *)dev->classes[j])->mode == XIDirectTouch) { @@ -272,23 +275,23 @@ bool DisplayServerX11::_refresh_device_info() { if (class_info->number == VALUATOR_ABSX && class_info->mode == XIModeAbsolute) { resolution_x = class_info->resolution; - range_min_x = class_info->min; - range_max_x = class_info->max; + abs_x_min = class_info->min; + abs_y_max = class_info->max; absolute_mode = true; } else if (class_info->number == VALUATOR_ABSY && class_info->mode == XIModeAbsolute) { resolution_y = class_info->resolution; - range_min_y = class_info->min; - range_max_y = class_info->max; + abs_y_min = class_info->min; + abs_y_max = class_info->max; absolute_mode = true; } else if (class_info->number == VALUATOR_PRESSURE && class_info->mode == XIModeAbsolute) { - pressure_resolution = (class_info->max - class_info->min); - if (pressure_resolution == 0) pressure_resolution = 1; + pressure_min = class_info->min; + pressure_max = class_info->max; } else if (class_info->number == VALUATOR_TILTX && class_info->mode == XIModeAbsolute) { - tilt_resolution_x = (class_info->max - class_info->min); - if (tilt_resolution_x == 0) tilt_resolution_x = 1; + tilt_x_min = class_info->min; + tilt_x_max = class_info->max; } else if (class_info->number == VALUATOR_TILTY && class_info->mode == XIModeAbsolute) { - tilt_resolution_y = (class_info->max - class_info->min); - if (tilt_resolution_y == 0) tilt_resolution_y = 1; + tilt_x_min = class_info->min; + tilt_x_max = class_info->max; } } } @@ -299,18 +302,19 @@ bool DisplayServerX11::_refresh_device_info() { if (absolute_mode) { // If no resolution was reported, use the min/max ranges. if (resolution_x <= 0) { - resolution_x = (range_max_x - range_min_x) * abs_resolution_range_mult; + resolution_x = (abs_x_max - abs_x_min) * abs_resolution_range_mult; } if (resolution_y <= 0) { - resolution_y = (range_max_y - range_min_y) * abs_resolution_range_mult; + resolution_y = (abs_y_max - abs_y_min) * abs_resolution_range_mult; } - xi.absolute_devices[dev->deviceid] = Vector2(abs_resolution_mult / resolution_x, abs_resolution_mult / resolution_y); print_verbose("XInput: Absolute pointing device: " + String(dev->name)); } xi.pressure = 0; - xi.pen_devices[dev->deviceid] = Vector3(pressure_resolution, tilt_resolution_x, tilt_resolution_y); + xi.pen_pressure_range[dev->deviceid] = Vector2(pressure_min, pressure_max); + xi.pen_tilt_x_range[dev->deviceid] = Vector2(tilt_x_min, tilt_x_max); + xi.pen_tilt_y_range[dev->deviceid] = Vector2(tilt_y_min, tilt_y_max); } XIFreeDeviceInfo(info); @@ -2353,6 +2357,10 @@ void DisplayServerX11::process_events() { // Is the current mouse mode one where it needs to be grabbed. bool mouse_mode_grab = mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED; + xi.pressure = 0; + xi.tilt = Vector2(); + xi.pressure_supported = false; + while (XPending(x11_display) > 0) { XEvent event; XNextEvent(x11_display, &event); @@ -2399,9 +2407,6 @@ void DisplayServerX11::process_events() { double rel_x = 0.0; double rel_y = 0.0; - double pressure = 0.0; - double tilt_x = 0.0; - double tilt_y = 0.0; if (XIMaskIsSet(raw_event->valuators.mask, VALUATOR_ABSX)) { rel_x = *values; @@ -2414,24 +2419,41 @@ void DisplayServerX11::process_events() { } if (XIMaskIsSet(raw_event->valuators.mask, VALUATOR_PRESSURE)) { - pressure = *values; + Map<int, Vector2>::Element *pen_pressure = xi.pen_pressure_range.find(device_id); + if (pen_pressure) { + Vector2 pen_pressure_range = pen_pressure->value(); + if (pen_pressure_range != Vector2()) { + xi.pressure_supported = true; + xi.pressure = (*values - pen_pressure_range[0]) / + (pen_pressure_range[1] - pen_pressure_range[0]); + } + } + values++; } if (XIMaskIsSet(raw_event->valuators.mask, VALUATOR_TILTX)) { - tilt_x = *values; + Map<int, Vector2>::Element *pen_tilt_x = xi.pen_tilt_x_range.find(device_id); + if (pen_tilt_x) { + Vector2 pen_tilt_x_range = pen_tilt_x->value(); + if (pen_tilt_x_range != Vector2()) { + xi.tilt.x = ((*values - pen_tilt_x_range[0]) / (pen_tilt_x_range[1] - pen_tilt_x_range[0])) * 2 - 1; + } + } + values++; } if (XIMaskIsSet(raw_event->valuators.mask, VALUATOR_TILTY)) { - tilt_y = *values; - } + Map<int, Vector2>::Element *pen_tilt_y = xi.pen_tilt_y_range.find(device_id); + if (pen_tilt_y) { + Vector2 pen_tilt_y_range = pen_tilt_y->value(); + if (pen_tilt_y_range != Vector2()) { + xi.tilt.y = ((*values - pen_tilt_y_range[0]) / (pen_tilt_y_range[1] - pen_tilt_y_range[0])) * 2 - 1; + } + } - Map<int, Vector3>::Element *pen_info = xi.pen_devices.find(device_id); - if (pen_info) { - Vector3 mult = pen_info->value(); - if (mult.x != 0.0) xi.pressure = pressure / mult.x; - if ((mult.y != 0.0) && (mult.z != 0.0)) xi.tilt = Vector2(tilt_x / mult.y, tilt_y / mult.z); + values++; } // https://bugs.freedesktop.org/show_bug.cgi?id=71609 @@ -2763,7 +2785,11 @@ void DisplayServerX11::process_events() { mm.instance(); mm->set_window_id(window_id); - mm->set_pressure(xi.pressure); + if (xi.pressure_supported) { + mm->set_pressure(xi.pressure); + } else { + mm->set_pressure((mouse_get_button_state() & (1 << (BUTTON_LEFT - 1))) ? 1.0f : 0.0f); + } mm->set_tilt(xi.tilt); // Make the absolute position integral so it doesn't look _too_ weird :) diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h index 8f090d3fad..b5ea71f72a 100644 --- a/platform/linuxbsd/display_server_x11.h +++ b/platform/linuxbsd/display_server_x11.h @@ -170,10 +170,13 @@ class DisplayServerX11 : public DisplayServer { int opcode; Vector<int> touch_devices; Map<int, Vector2> absolute_devices; - Map<int, Vector3> pen_devices; + Map<int, Vector2> pen_pressure_range; + Map<int, Vector2> pen_tilt_x_range; + Map<int, Vector2> pen_tilt_y_range; XIEventMask all_event_mask; Map<int, Vector2> state; double pressure; + bool pressure_supported; Vector2 tilt; Vector2 mouse_pos_to_filter; Vector2 relative_motion; diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index e4fe7f04d0..3afe6c20ec 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -36,10 +36,6 @@ #include <avrt.h> -#ifndef WM_POINTERUPDATE -#define WM_POINTERUPDATE 0x0245 -#endif - #ifdef DEBUG_ENABLED static String format_error_message(DWORD id) { @@ -545,6 +541,10 @@ void DisplayServerWindows::delete_sub_window(WindowID p_window) { } #endif + if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[p_window].wtctx) { + wintab_WTClose(windows[p_window].wtctx); + windows[p_window].wtctx = 0; + } DestroyWindow(windows[p_window].hWnd); windows.erase(p_window); } @@ -1849,7 +1849,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA alt_mem = false; }; - return 0; // Return To The Message Loop + if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[window_id].wtctx) { + wintab_WTEnable(windows[window_id].wtctx, GET_WM_ACTIVATE_STATE(wParam, lParam)); + } + + return 0; // Return To The Message Loop } case WM_GETMINMAXINFO: { if (windows[window_id].resizable && !windows[window_id].fullscreen) { @@ -1929,6 +1933,8 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mm->set_shift(shift_mem); mm->set_alt(alt_mem); + mm->set_pressure((raw->data.mouse.ulButtons & RI_MOUSE_LEFT_BUTTON_DOWN) ? 1.0f : 0.0f); + mm->set_button_mask(last_button_state); Point2i c(windows[window_id].width / 2, windows[window_id].height / 2); @@ -1977,6 +1983,42 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } delete[] lpb; } break; + case WT_CSRCHANGE: + case WT_PROXIMITY: { + if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[window_id].wtctx) { + AXIS pressure; + if (wintab_WTInfo(WTI_DEVICES + windows[window_id].wtlc.lcDevice, DVC_NPRESSURE, &pressure)) { + windows[window_id].min_pressure = int(pressure.axMin); + windows[window_id].max_pressure = int(pressure.axMax); + } + AXIS orientation[3]; + if (wintab_WTInfo(WTI_DEVICES + windows[window_id].wtlc.lcDevice, DVC_ORIENTATION, &orientation)) { + windows[window_id].tilt_supported = orientation[0].axResolution && orientation[1].axResolution; + } + return 0; + } + } break; + case WT_PACKET: { + if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[window_id].wtctx) { + PACKET packet; + if (wintab_WTPacket(windows[window_id].wtctx, wParam, &packet)) { + + float pressure = float(packet.pkNormalPressure - windows[window_id].min_pressure) / float(windows[window_id].max_pressure - windows[window_id].min_pressure); + windows[window_id].last_pressure = pressure; + windows[window_id].last_pressure_update = 0; + + double azim = (packet.pkOrientation.orAzimuth / 10.0f) * (Math_PI / 180); + double alt = Math::tan((Math::abs(packet.pkOrientation.orAltitude / 10.0f)) * (Math_PI / 180)); + + if (windows[window_id].tilt_supported) { + windows[window_id].last_tilt = Vector2(Math::atan(Math::sin(azim) / alt), Math::atan(Math::cos(azim) / alt)); + } else { + windows[window_id].last_tilt = Vector2(); + } + } + return 0; + } + } break; case WM_POINTERUPDATE: { if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) { break; @@ -2038,8 +2080,14 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mm.instance(); mm->set_window_id(window_id); - mm->set_pressure(pen_info.pressure ? (float)pen_info.pressure / 1024 : 0); - mm->set_tilt(Vector2(pen_info.tiltX ? (float)pen_info.tiltX / 90 : 0, pen_info.tiltY ? (float)pen_info.tiltY / 90 : 0)); + if (pen_info.penMask & PEN_MASK_PRESSURE) { + mm->set_pressure((float)pen_info.pressure / 1024); + } else { + mm->set_pressure((HIWORD(wParam) & POINTER_MESSAGE_FLAG_FIRSTBUTTON) ? 1.0f : 0.0f); + } + if ((pen_info.penMask & PEN_MASK_TILT_X) && (pen_info.penMask & PEN_MASK_TILT_Y)) { + mm->set_tilt(Vector2((float)pen_info.tiltX / 90, (float)pen_info.tiltY / 90)); + } mm->set_control((wParam & MK_CONTROL) != 0); mm->set_shift((wParam & MK_SHIFT) != 0); @@ -2138,6 +2186,22 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mm->set_shift((wParam & MK_SHIFT) != 0); mm->set_alt(alt_mem); + if (!OS::get_singleton()->is_wintab_disabled() && wintab_available && windows[window_id].wtctx) { + // Note: WinTab sends both WT_PACKET and WM_xBUTTONDOWN/UP/MOUSEMOVE events, use mouse 1/0 pressure only when last_pressure was not update recently. + if (windows[window_id].last_pressure_update < 10) { + windows[window_id].last_pressure_update++; + } else { + windows[window_id].last_tilt = Vector2(); + windows[window_id].last_pressure = (wParam & MK_LBUTTON) ? 1.0f : 0.0f; + } + } else { + windows[window_id].last_tilt = Vector2(); + windows[window_id].last_pressure = (wParam & MK_LBUTTON) ? 1.0f : 0.0f; + } + + mm->set_pressure(windows[window_id].last_pressure); + mm->set_tilt(windows[window_id].last_tilt); + mm->set_button_mask(last_button_state); mm->set_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); @@ -2759,6 +2823,39 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, DragAcceptFiles(wd.hWnd, true); + if (!OS::get_singleton()->is_wintab_disabled() && wintab_available) { + wintab_WTInfo(WTI_DEFSYSCTX, 0, &wd.wtlc); + wd.wtlc.lcOptions |= CXO_MESSAGES; + wd.wtlc.lcPktData = PK_NORMAL_PRESSURE | PK_TANGENT_PRESSURE | PK_ORIENTATION; + wd.wtlc.lcMoveMask = PK_NORMAL_PRESSURE | PK_TANGENT_PRESSURE; + wd.wtlc.lcPktMode = 0; + wd.wtlc.lcOutOrgX = 0; + wd.wtlc.lcOutExtX = wd.wtlc.lcInExtX; + wd.wtlc.lcOutOrgY = 0; + wd.wtlc.lcOutExtY = -wd.wtlc.lcInExtY; + wd.wtctx = wintab_WTOpen(wd.hWnd, &wd.wtlc, false); + if (wd.wtctx) { + wintab_WTEnable(wd.wtctx, true); + AXIS pressure; + if (wintab_WTInfo(WTI_DEVICES + wd.wtlc.lcDevice, DVC_NPRESSURE, &pressure)) { + wd.min_pressure = int(pressure.axMin); + wd.max_pressure = int(pressure.axMax); + } + AXIS orientation[3]; + if (wintab_WTInfo(WTI_DEVICES + wd.wtlc.lcDevice, DVC_ORIENTATION, &orientation)) { + wd.tilt_supported = orientation[0].axResolution && orientation[1].axResolution; + } + } else { + print_verbose("WinTab context creation failed."); + } + } else { + wd.wtctx = 0; + } + + wd.last_pressure = 0; + wd.last_pressure_update = 0; + wd.last_tilt = Vector2(); + // IME wd.im_himc = ImmGetContext(wd.hWnd); ImmReleaseContext(wd.hWnd, wd.im_himc); @@ -2776,6 +2873,15 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, return id; } +// WinTab API +bool DisplayServerWindows::wintab_available = false; +WTOpenPtr DisplayServerWindows::wintab_WTOpen = nullptr; +WTClosePtr DisplayServerWindows::wintab_WTClose = nullptr; +WTInfoPtr DisplayServerWindows::wintab_WTInfo = nullptr; +WTPacketPtr DisplayServerWindows::wintab_WTPacket = nullptr; +WTEnablePtr DisplayServerWindows::wintab_WTEnable = nullptr; + +// Windows Ink API GetPointerTypePtr DisplayServerWindows::win8p_GetPointerType = nullptr; GetPointerPenInfoPtr DisplayServerWindows::win8p_GetPointerPenInfo = nullptr; @@ -2787,7 +2893,19 @@ typedef enum _SHC_PROCESS_DPI_AWARENESS { DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { - //Note: Functions for pen input, available on Windows 8+ + //Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink. + HMODULE wintab_lib = LoadLibraryW(L"wintab32.dll"); + if (wintab_lib) { + wintab_WTOpen = (WTOpenPtr)GetProcAddress(wintab_lib, "WTOpenW"); + wintab_WTClose = (WTClosePtr)GetProcAddress(wintab_lib, "WTClose"); + wintab_WTInfo = (WTInfoPtr)GetProcAddress(wintab_lib, "WTInfoW"); + wintab_WTPacket = (WTPacketPtr)GetProcAddress(wintab_lib, "WTPacket"); + wintab_WTEnable = (WTEnablePtr)GetProcAddress(wintab_lib, "WTEnable"); + + wintab_available = wintab_WTOpen && wintab_WTClose && wintab_WTInfo && wintab_WTPacket && wintab_WTEnable; + } + + //Note: Windows Ink API for pen input, available on Windows 8+ only. HMODULE user32_lib = LoadLibraryW(L"user32.dll"); if (user32_lib) { win8p_GetPointerType = (GetPointerTypePtr)GetProcAddress(user32_lib, "GetPointerType"); @@ -3004,7 +3122,10 @@ DisplayServerWindows::~DisplayServerWindows() { context_vulkan->window_destroy(MAIN_WINDOW_ID); } #endif - + if (wintab_available && windows[MAIN_WINDOW_ID].wtctx) { + wintab_WTClose(windows[MAIN_WINDOW_ID].wtctx); + windows[MAIN_WINDOW_ID].wtctx = 0; + } DestroyWindow(windows[MAIN_WINDOW_ID].hWnd); } } diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index 6243f54cfa..4f5bdbac5b 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -66,6 +66,87 @@ #include <windows.h> #include <windowsx.h> +// WinTab API +#define WT_PACKET 0x7FF0 +#define WT_PROXIMITY 0x7FF5 +#define WT_INFOCHANGE 0x7FF6 +#define WT_CSRCHANGE 0x7FF7 + +#define WTI_DEFSYSCTX 4 +#define WTI_DEVICES 100 +#define DVC_NPRESSURE 15 +#define DVC_TPRESSURE 16 +#define DVC_ORIENTATION 17 +#define DVC_ROTATION 18 + +#define CXO_MESSAGES 0x0004 +#define PK_NORMAL_PRESSURE 0x0400 +#define PK_TANGENT_PRESSURE 0x0800 +#define PK_ORIENTATION 0x1000 + +typedef struct tagLOGCONTEXTW { + WCHAR lcName[40]; + UINT lcOptions; + UINT lcStatus; + UINT lcLocks; + UINT lcMsgBase; + UINT lcDevice; + UINT lcPktRate; + DWORD lcPktData; + DWORD lcPktMode; + DWORD lcMoveMask; + DWORD lcBtnDnMask; + DWORD lcBtnUpMask; + LONG lcInOrgX; + LONG lcInOrgY; + LONG lcInOrgZ; + LONG lcInExtX; + LONG lcInExtY; + LONG lcInExtZ; + LONG lcOutOrgX; + LONG lcOutOrgY; + LONG lcOutOrgZ; + LONG lcOutExtX; + LONG lcOutExtY; + LONG lcOutExtZ; + DWORD lcSensX; + DWORD lcSensY; + DWORD lcSensZ; + BOOL lcSysMode; + int lcSysOrgX; + int lcSysOrgY; + int lcSysExtX; + int lcSysExtY; + DWORD lcSysSensX; + DWORD lcSysSensY; +} LOGCONTEXTW; + +typedef struct tagAXIS { + LONG axMin; + LONG axMax; + UINT axUnits; + DWORD axResolution; +} AXIS; + +typedef struct tagORIENTATION { + int orAzimuth; + int orAltitude; + int orTwist; +} ORIENTATION; + +typedef struct tagPACKET { + int pkNormalPressure; + int pkTangentPressure; + ORIENTATION pkOrientation; +} PACKET; + +typedef HANDLE(WINAPI *WTOpenPtr)(HWND p_window, LOGCONTEXTW *p_ctx, BOOL p_enable); +typedef BOOL(WINAPI *WTClosePtr)(HANDLE p_ctx); +typedef UINT(WINAPI *WTInfoPtr)(UINT p_category, UINT p_index, LPVOID p_output); +typedef BOOL(WINAPI *WTPacketPtr)(HANDLE p_ctx, UINT p_param, LPVOID p_packets); +typedef BOOL(WINAPI *WTEnablePtr)(HANDLE p_ctx, BOOL p_enable); + +// Windows Ink API #ifndef POINTER_STRUCTURES #define POINTER_STRUCTURES @@ -75,6 +156,22 @@ typedef UINT32 POINTER_FLAGS; typedef UINT32 PEN_FLAGS; typedef UINT32 PEN_MASK; +#ifndef PEN_MASK_PRESSURE +#define PEN_MASK_PRESSURE 0x00000001 +#endif + +#ifndef PEN_MASK_TILT_X +#define PEN_MASK_TILT_X 0x00000004 +#endif + +#ifndef PEN_MASK_TILT_Y +#define PEN_MASK_TILT_Y 0x00000008 +#endif + +#ifndef POINTER_MESSAGE_FLAG_FIRSTBUTTON +#define POINTER_MESSAGE_FLAG_FIRSTBUTTON 0x00000010 +#endif + enum tagPOINTER_INPUT_TYPE { PT_POINTER = 0x00000001, PT_TOUCH = 0x00000002, @@ -128,6 +225,10 @@ typedef struct tagPOINTER_PEN_INFO { #endif //POINTER_STRUCTURES +#ifndef WM_POINTERUPDATE +#define WM_POINTERUPDATE 0x0245 +#endif + typedef BOOL(WINAPI *GetPointerTypePtr)(uint32_t p_id, POINTER_INPUT_TYPE *p_type); typedef BOOL(WINAPI *GetPointerPenInfoPtr)(uint32_t p_id, POINTER_PEN_INFO *p_pen_info); @@ -155,6 +256,15 @@ class DisplayServerWindows : public DisplayServer { _THREAD_SAFE_CLASS_ + // WinTab API + static bool wintab_available; + static WTOpenPtr wintab_WTOpen; + static WTClosePtr wintab_WTClose; + static WTInfoPtr wintab_WTInfo; + static WTPacketPtr wintab_WTPacket; + static WTEnablePtr wintab_WTEnable; + + // Windows Ink API static GetPointerTypePtr win8p_GetPointerType; static GetPointerPenInfoPtr win8p_GetPointerPenInfo; @@ -214,6 +324,16 @@ class DisplayServerWindows : public DisplayServer { bool no_focus = false; bool window_has_focus = false; + HANDLE wtctx; + LOGCONTEXTW wtlc; + int min_pressure; + int max_pressure; + bool tilt_supported; + + int last_pressure_update; + float last_pressure; + Vector2 last_tilt; + HBITMAP hBitmap; //DIB section for layered window uint8_t *dib_data = nullptr; Size2 dib_size; diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index 19484442b1..abbfbf83b7 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -118,7 +118,7 @@ Array NavigationPolygon::_get_polygons() const { return ret; } -void NavigationPolygon::_set_outlines(const TypedArray<Vector<int32_t>> &p_array) { +void NavigationPolygon::_set_outlines(const TypedArray<Vector<Vector2>> &p_array) { outlines.resize(p_array.size()); for (int i = 0; i < p_array.size(); i++) { diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h index cbfe4299fb..e730df6373 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -58,7 +58,7 @@ protected: void _set_polygons(const TypedArray<Vector<int32_t>> &p_array); Array _get_polygons() const; - void _set_outlines(const TypedArray<Vector<int32_t>> &p_array); + void _set_outlines(const TypedArray<Vector<Vector2>> &p_array); Array _get_outlines() const; public: diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp index ac8a77b6cb..1ea51be148 100644 --- a/scene/2d/node_2d.cpp +++ b/scene/2d/node_2d.cpp @@ -42,6 +42,7 @@ Dictionary Node2D::_edit_get_state() const { state["position"] = get_position(); state["rotation"] = get_rotation(); state["scale"] = get_scale(); + state["skew"] = get_skew(); return state; } @@ -51,11 +52,14 @@ void Node2D::_edit_set_state(const Dictionary &p_state) { pos = p_state["position"]; angle = p_state["rotation"]; _scale = p_state["scale"]; + skew = p_state["skew"]; _update_transform(); _change_notify("rotation"); _change_notify("rotation_degrees"); _change_notify("scale"); + _change_notify("skew"); + _change_notify("skew_degrees"); _change_notify("position"); } @@ -111,7 +115,7 @@ void Node2D::_edit_set_rect(const Rect2 &p_edit_rect) { Point2 new_pos = p_edit_rect.position + p_edit_rect.size * zero_offset; Transform2D postxf; - postxf.set_rotation_and_scale(angle, _scale); + postxf.set_rotation_scale_and_skew(angle, _scale, skew); new_pos = postxf.xform(new_pos); pos += new_pos; @@ -128,12 +132,13 @@ void Node2D::_update_xform_values() { pos = _mat.elements[2]; angle = _mat.get_rotation(); _scale = _mat.get_scale(); + skew = _mat.get_skew(); _xform_dirty = false; } void Node2D::_update_transform() { - _mat.set_rotation_and_scale(angle, _scale); + _mat.set_rotation_scale_and_skew(angle, _scale, skew); _mat.elements[2] = pos; RenderingServer::get_singleton()->canvas_item_set_transform(get_canvas_item(), _mat); @@ -163,11 +168,26 @@ void Node2D::set_rotation(float p_radians) { _change_notify("rotation_degrees"); } +void Node2D::set_skew(float p_radians) { + + if (_xform_dirty) + ((Node2D *)this)->_update_xform_values(); + skew = p_radians; + _update_transform(); + _change_notify("skew"); + _change_notify("skew_degrees"); +} + void Node2D::set_rotation_degrees(float p_degrees) { set_rotation(Math::deg2rad(p_degrees)); } +void Node2D::set_skew_degrees(float p_degrees) { + + set_skew(Math::deg2rad(p_degrees)); +} + void Node2D::set_scale(const Size2 &p_scale) { if (_xform_dirty) @@ -196,11 +216,22 @@ float Node2D::get_rotation() const { return angle; } +float Node2D::get_skew() const { + if (_xform_dirty) + ((Node2D *)this)->_update_xform_values(); + + return skew; +} + float Node2D::get_rotation_degrees() const { return Math::rad2deg(get_rotation()); } +float Node2D::get_skew_degrees() const { + + return Math::rad2deg(get_skew()); +} Size2 Node2D::get_scale() const { if (_xform_dirty) ((Node2D *)this)->_update_xform_values(); @@ -398,11 +429,15 @@ void Node2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_position", "position"), &Node2D::set_position); ClassDB::bind_method(D_METHOD("set_rotation", "radians"), &Node2D::set_rotation); ClassDB::bind_method(D_METHOD("set_rotation_degrees", "degrees"), &Node2D::set_rotation_degrees); + ClassDB::bind_method(D_METHOD("set_skew", "radians"), &Node2D::set_skew); + ClassDB::bind_method(D_METHOD("set_skew_degrees", "degrees"), &Node2D::set_skew_degrees); ClassDB::bind_method(D_METHOD("set_scale", "scale"), &Node2D::set_scale); ClassDB::bind_method(D_METHOD("get_position"), &Node2D::get_position); ClassDB::bind_method(D_METHOD("get_rotation"), &Node2D::get_rotation); ClassDB::bind_method(D_METHOD("get_rotation_degrees"), &Node2D::get_rotation_degrees); + ClassDB::bind_method(D_METHOD("get_skew"), &Node2D::get_skew); + ClassDB::bind_method(D_METHOD("get_skew_degrees"), &Node2D::get_skew_degrees); ClassDB::bind_method(D_METHOD("get_scale"), &Node2D::get_scale); ClassDB::bind_method(D_METHOD("rotate", "radians"), &Node2D::rotate); @@ -443,6 +478,8 @@ void Node2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_rotation", "get_rotation"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation_degrees", PROPERTY_HINT_RANGE, "-360,360,0.1,or_lesser,or_greater", PROPERTY_USAGE_EDITOR), "set_rotation_degrees", "get_rotation_degrees"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scale"), "set_scale", "get_scale"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "skew", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_skew", "get_skew"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "skew_degrees", PROPERTY_HINT_RANGE, "-89.9,89.9,0.1", PROPERTY_USAGE_EDITOR), "set_skew_degrees", "get_skew_degrees"); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "transform", PROPERTY_HINT_NONE, "", 0), "set_transform", "get_transform"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_position", PROPERTY_HINT_NONE, "", 0), "set_global_position", "get_global_position"); @@ -460,6 +497,7 @@ Node2D::Node2D() { angle = 0; _scale = Vector2(1, 1); + skew = 0; _xform_dirty = false; z_index = 0; z_relative = true; diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h index abed05ed0c..0afec36254 100644 --- a/scene/2d/node_2d.h +++ b/scene/2d/node_2d.h @@ -40,6 +40,7 @@ class Node2D : public CanvasItem { Point2 pos; float angle; Size2 _scale; + float skew; int z_index; bool z_relative; @@ -75,6 +76,8 @@ public: void set_position(const Point2 &p_pos); void set_rotation(float p_radians); void set_rotation_degrees(float p_degrees); + void set_skew(float p_radians); + void set_skew_degrees(float p_radians); void set_scale(const Size2 &p_scale); void rotate(float p_radians); @@ -86,7 +89,9 @@ public: Point2 get_position() const; float get_rotation() const; + float get_skew() const; float get_rotation_degrees() const; + float get_skew_degrees() const; Size2 get_scale() const; Point2 get_global_position() const; diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 9628c01718..86e61fe878 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -940,13 +940,10 @@ void TileMap::update_bitmask_area(const Vector2 &p_pos) { void TileMap::update_bitmask_region(const Vector2 &p_start, const Vector2 &p_end) { if ((p_end.x < p_start.x || p_end.y < p_start.y) || (p_end.x == p_start.x && p_end.y == p_start.y)) { - int i; Array a = get_used_cells(); - for (i = 0; i < a.size(); i++) { - // update_bitmask_area() in order to update cells adjacent to the - // current cell, since ordering in array may not be reliable + for (int i = 0; i < a.size(); i++) { Vector2 vector = (Vector2)a[i]; - update_bitmask_area(Vector2(vector.x, vector.y)); + update_cell_bitmask(vector.x, vector.y); } return; } diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp index 097368853e..5701d3cea2 100644 --- a/scene/3d/audio_stream_player_3d.cpp +++ b/scene/3d/audio_stream_player_3d.cpp @@ -385,8 +385,8 @@ void AudioStreamPlayer3D::_notification(int p_what) { linear_velocity = velocity_tracker->get_tracked_linear_velocity(); } - Ref<World3D> world = get_world(); - ERR_FAIL_COND(world.is_null()); + Ref<World3D> world_3d = get_world_3d(); + ERR_FAIL_COND(world_3d.is_null()); int new_output_count = 0; @@ -396,7 +396,7 @@ void AudioStreamPlayer3D::_notification(int p_what) { //check if any area is diverting sound into a bus - PhysicsDirectSpaceState3D *space_state = PhysicsServer3D::get_singleton()->space_get_direct_state(world->get_space()); + PhysicsDirectSpaceState3D *space_state = PhysicsServer3D::get_singleton()->space_get_direct_state(world_3d->get_space()); PhysicsDirectSpaceState3D::ShapeResult sr[MAX_INTERSECT_AREAS]; @@ -419,7 +419,7 @@ void AudioStreamPlayer3D::_notification(int p_what) { } List<Camera3D *> cameras; - world->get_camera_list(&cameras); + world_3d->get_camera_list(&cameras); for (List<Camera3D *>::Element *E = cameras.front(); E; E = E->next()) { @@ -556,7 +556,7 @@ void AudioStreamPlayer3D::_notification(int p_what) { for (int i = 0; i < vol_index_max; i++) { - output.reverb_vol[i] = output.reverb_vol[i].linear_interpolate(center_frame, attenuation); + output.reverb_vol[i] = output.reverb_vol[i].lerp(center_frame, attenuation); } } else { for (int i = 0; i < vol_index_max; i++) { @@ -567,7 +567,7 @@ void AudioStreamPlayer3D::_notification(int p_what) { for (int i = 0; i < vol_index_max; i++) { - output.reverb_vol[i] = output.vol[i].linear_interpolate(output.reverb_vol[i] * attenuation, uniformity); + output.reverb_vol[i] = output.vol[i].lerp(output.reverb_vol[i] * attenuation, uniformity); output.reverb_vol[i] *= area_send; } @@ -710,6 +710,11 @@ float AudioStreamPlayer3D::get_pitch_scale() const { void AudioStreamPlayer3D::play(float p_from_pos) { + if (!is_playing()) { + // Reset the prev_output_count if the stream is stopped + prev_output_count = 0; + } + if (stream_playback.is_valid()) { active = true; setplay = p_from_pos; diff --git a/scene/3d/camera_3d.cpp b/scene/3d/camera_3d.cpp index 706c49b43b..871f3119bc 100644 --- a/scene/3d/camera_3d.cpp +++ b/scene/3d/camera_3d.cpp @@ -95,8 +95,8 @@ void Camera3D::_update_camera() { get_viewport()->_camera_transform_changed_notify(); - if (get_world().is_valid()) { - get_world()->_update_camera(this); + if (get_world_3d().is_valid()) { + get_world_3d()->_update_camera(this); } } @@ -144,12 +144,12 @@ void Camera3D::_notification(int p_what) { } break; case NOTIFICATION_BECAME_CURRENT: { if (viewport) { - viewport->find_world()->_register_camera(this); + viewport->find_world_3d()->_register_camera(this); } } break; case NOTIFICATION_LOST_CURRENT: { if (viewport) { - viewport->find_world()->_remove_camera(this); + viewport->find_world_3d()->_remove_camera(this); } } break; } @@ -689,7 +689,7 @@ Camera3D::Camera3D() { viewport = nullptr; force_change = false; mode = PROJECTION_PERSPECTIVE; - set_perspective(70.0, 0.05, 100.0); + set_perspective(75.0, 0.05, 100.0); keep_aspect = KEEP_HEIGHT; layers = 0xfffff; v_offset = 0; @@ -743,7 +743,7 @@ void ClippedCamera3D::_notification(int p_what) { return; } - PhysicsDirectSpaceState3D *dspace = get_world()->get_direct_space_state(); + PhysicsDirectSpaceState3D *dspace = get_world_3d()->get_direct_space_state(); ERR_FAIL_COND(!dspace); // most likely physics set to threads Vector3 cam_fw = -get_global_transform().basis.get_axis(Vector3::AXIS_Z).normalized(); diff --git a/scene/3d/collision_object_3d.cpp b/scene/3d/collision_object_3d.cpp index e6cd7bfe7e..5d050e32b0 100644 --- a/scene/3d/collision_object_3d.cpp +++ b/scene/3d/collision_object_3d.cpp @@ -44,7 +44,7 @@ void CollisionObject3D::_notification(int p_what) { else PhysicsServer3D::get_singleton()->body_set_state(rid, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform()); - RID space = get_world()->get_space(); + RID space = get_world_3d()->get_space(); if (area) { PhysicsServer3D::get_singleton()->area_set_space(rid, space); } else diff --git a/scene/3d/cpu_particles_3d.cpp b/scene/3d/cpu_particles_3d.cpp index 12c105b0f4..4c25f55f0b 100644 --- a/scene/3d/cpu_particles_3d.cpp +++ b/scene/3d/cpu_particles_3d.cpp @@ -69,6 +69,7 @@ void CPUParticles3D::set_amount(int p_amount) { for (int i = 0; i < p_amount; i++) { w[i].active = false; + w[i].custom[3] = 0.0; // Make sure w component isn't garbage data } } diff --git a/scene/3d/node_3d.cpp b/scene/3d/node_3d.cpp index 0b7407e049..913a3ea49f 100644 --- a/scene/3d/node_3d.cpp +++ b/scene/3d/node_3d.cpp @@ -507,12 +507,12 @@ bool Node3D::is_set_as_toplevel() const { return data.toplevel; } -Ref<World3D> Node3D::get_world() const { +Ref<World3D> Node3D::get_world_3d() const { ERR_FAIL_COND_V(!is_inside_world(), Ref<World3D>()); ERR_FAIL_COND_V(!data.viewport, Ref<World3D>()); - return data.viewport->find_world(); + return data.viewport->find_world_3d(); } void Node3D::_propagate_visibility_changed() { @@ -756,7 +756,7 @@ void Node3D::_bind_methods() { ClassDB::bind_method(D_METHOD("is_set_as_toplevel"), &Node3D::is_set_as_toplevel); ClassDB::bind_method(D_METHOD("set_disable_scale", "disable"), &Node3D::set_disable_scale); ClassDB::bind_method(D_METHOD("is_scale_disabled"), &Node3D::is_scale_disabled); - ClassDB::bind_method(D_METHOD("get_world"), &Node3D::get_world); + ClassDB::bind_method(D_METHOD("get_world_3d"), &Node3D::get_world_3d); ClassDB::bind_method(D_METHOD("force_update_transform"), &Node3D::force_update_transform); diff --git a/scene/3d/node_3d.h b/scene/3d/node_3d.h index f97a8a97dc..a4191eb2b3 100644 --- a/scene/3d/node_3d.h +++ b/scene/3d/node_3d.h @@ -124,7 +124,7 @@ public: Node3D *get_parent_spatial() const; - Ref<World3D> get_world() const; + Ref<World3D> get_world_3d() const; void set_translation(const Vector3 &p_translation); void set_rotation(const Vector3 &p_euler_rad); diff --git a/scene/3d/physics_joint_3d.cpp b/scene/3d/physics_joint_3d.cpp index 591c17a91e..140d887d9a 100644 --- a/scene/3d/physics_joint_3d.cpp +++ b/scene/3d/physics_joint_3d.cpp @@ -807,6 +807,9 @@ void Generic6DOFJoint3D::_bind_methods() { BIND_ENUM_CONSTANT(PARAM_LINEAR_DAMPING); BIND_ENUM_CONSTANT(PARAM_LINEAR_MOTOR_TARGET_VELOCITY); BIND_ENUM_CONSTANT(PARAM_LINEAR_MOTOR_FORCE_LIMIT); + BIND_ENUM_CONSTANT(PARAM_LINEAR_SPRING_STIFFNESS); + BIND_ENUM_CONSTANT(PARAM_LINEAR_SPRING_DAMPING); + BIND_ENUM_CONSTANT(PARAM_LINEAR_SPRING_EQUILIBRIUM_POINT); BIND_ENUM_CONSTANT(PARAM_ANGULAR_LOWER_LIMIT); BIND_ENUM_CONSTANT(PARAM_ANGULAR_UPPER_LIMIT); BIND_ENUM_CONSTANT(PARAM_ANGULAR_LIMIT_SOFTNESS); @@ -816,6 +819,9 @@ void Generic6DOFJoint3D::_bind_methods() { BIND_ENUM_CONSTANT(PARAM_ANGULAR_ERP); BIND_ENUM_CONSTANT(PARAM_ANGULAR_MOTOR_TARGET_VELOCITY); BIND_ENUM_CONSTANT(PARAM_ANGULAR_MOTOR_FORCE_LIMIT); + BIND_ENUM_CONSTANT(PARAM_ANGULAR_SPRING_STIFFNESS); + BIND_ENUM_CONSTANT(PARAM_ANGULAR_SPRING_DAMPING); + BIND_ENUM_CONSTANT(PARAM_ANGULAR_SPRING_EQUILIBRIUM_POINT); BIND_ENUM_CONSTANT(PARAM_MAX); BIND_ENUM_CONSTANT(FLAG_ENABLE_LINEAR_LIMIT); diff --git a/scene/3d/ray_cast_3d.cpp b/scene/3d/ray_cast_3d.cpp index a18da61656..304a5e1254 100644 --- a/scene/3d/ray_cast_3d.cpp +++ b/scene/3d/ray_cast_3d.cpp @@ -196,7 +196,7 @@ void RayCast3D::_notification(int p_what) { } void RayCast3D::_update_raycast_state() { - Ref<World3D> w3d = get_world(); + Ref<World3D> w3d = get_world_3d(); ERR_FAIL_COND(w3d.is_null()); PhysicsDirectSpaceState3D *dss = PhysicsServer3D::get_singleton()->space_get_direct_state(w3d->get_space()); diff --git a/scene/3d/skeleton_ik_3d.cpp b/scene/3d/skeleton_ik_3d.cpp index 7366290ed3..10bdd71d73 100644 --- a/scene/3d/skeleton_ik_3d.cpp +++ b/scene/3d/skeleton_ik_3d.cpp @@ -287,14 +287,22 @@ void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool ove return; // Skip solving } - p_task->skeleton->clear_bones_global_pose_override(); + p_task->skeleton->set_bone_global_pose_override(p_task->chain.chain_root.bone, Transform(), 0.0, true); + + if (p_task->chain.middle_chain_item) { + p_task->skeleton->set_bone_global_pose_override(p_task->chain.middle_chain_item->bone, Transform(), 0.0, true); + } + + for (int i = 0; i < p_task->chain.tips.size(); i += 1) { + p_task->skeleton->set_bone_global_pose_override(p_task->chain.tips[i].chain_item->bone, Transform(), 0.0, true); + } make_goal(p_task, p_task->skeleton->get_global_transform().affine_inverse().scaled(p_task->skeleton->get_global_transform().get_basis().get_scale()), blending_delta); update_chain(p_task->skeleton, &p_task->chain.chain_root); if (p_use_magnet && p_task->chain.middle_chain_item) { - p_task->chain.magnet_position = p_task->chain.middle_chain_item->initial_transform.origin.linear_interpolate(p_magnet_position, blending_delta); + p_task->chain.magnet_position = p_task->chain.middle_chain_item->initial_transform.origin.lerp(p_magnet_position, blending_delta); solve_simple(p_task, true); } solve_simple(p_task, false); diff --git a/scene/3d/soft_body_3d.cpp b/scene/3d/soft_body_3d.cpp index 6092818252..850ffab292 100644 --- a/scene/3d/soft_body_3d.cpp +++ b/scene/3d/soft_body_3d.cpp @@ -270,7 +270,7 @@ void SoftBody3D::_notification(int p_what) { add_change_receptor(this); } - RID space = get_world()->get_space(); + RID space = get_world_3d()->get_space(); PhysicsServer3D::get_singleton()->soft_body_set_space(physics_rid, space); prepare_physics_server(); } break; diff --git a/scene/3d/spring_arm_3d.cpp b/scene/3d/spring_arm_3d.cpp index 0ffde7aa8f..1410b730fd 100644 --- a/scene/3d/spring_arm_3d.cpp +++ b/scene/3d/spring_arm_3d.cpp @@ -147,7 +147,7 @@ void SpringArm3D::process_spring() { if (shape.is_null()) { motion = Vector3(cast_direction * (spring_length)); PhysicsDirectSpaceState3D::RayResult r; - bool intersected = get_world()->get_direct_space_state()->intersect_ray(get_global_transform().origin, get_global_transform().origin + motion, r, excluded_objects, mask); + bool intersected = get_world_3d()->get_direct_space_state()->intersect_ray(get_global_transform().origin, get_global_transform().origin + motion, r, excluded_objects, mask); if (intersected) { float dist = get_global_transform().origin.distance_to(r.position); dist -= margin; @@ -155,7 +155,7 @@ void SpringArm3D::process_spring() { } } else { motion = Vector3(cast_direction * spring_length); - get_world()->get_direct_space_state()->cast_motion(shape->get_rid(), get_global_transform(), motion, 0, motion_delta, motion_delta_unsafe, excluded_objects, mask); + get_world_3d()->get_direct_space_state()->cast_motion(shape->get_rid(), get_global_transform(), motion, 0, motion_delta, motion_delta_unsafe, excluded_objects, mask); } current_spring_length = spring_length * motion_delta; diff --git a/scene/3d/visibility_notifier_3d.cpp b/scene/3d/visibility_notifier_3d.cpp index 2f657fe7b1..2707a0a514 100644 --- a/scene/3d/visibility_notifier_3d.cpp +++ b/scene/3d/visibility_notifier_3d.cpp @@ -68,7 +68,7 @@ void VisibilityNotifier3D::set_aabb(const AABB &p_aabb) { aabb = p_aabb; if (is_inside_world()) { - get_world()->_update_notifier(this, get_global_transform().xform(aabb)); + get_world_3d()->_update_notifier(this, get_global_transform().xform(aabb)); } _change_notify("aabb"); @@ -85,15 +85,15 @@ void VisibilityNotifier3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_WORLD: { - get_world()->_register_notifier(this, get_global_transform().xform(aabb)); + get_world_3d()->_register_notifier(this, get_global_transform().xform(aabb)); } break; case NOTIFICATION_TRANSFORM_CHANGED: { - get_world()->_update_notifier(this, get_global_transform().xform(aabb)); + get_world_3d()->_update_notifier(this, get_global_transform().xform(aabb)); } break; case NOTIFICATION_EXIT_WORLD: { - get_world()->_remove_notifier(this); + get_world_3d()->_remove_notifier(this); } break; } } diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index 604bc53422..ce8672c1dd 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -60,8 +60,8 @@ void VisualInstance3D::_notification(int p_what) { if (skeleton) RenderingServer::get_singleton()->instance_attach_skeleton( instance, skeleton->get_skeleton() ); */ - ERR_FAIL_COND(get_world().is_null()); - RenderingServer::get_singleton()->instance_set_scenario(instance, get_world()->get_scenario()); + ERR_FAIL_COND(get_world_3d().is_null()); + RenderingServer::get_singleton()->instance_set_scenario(instance, get_world_3d()->get_scenario()); _update_visibility(); } break; diff --git a/scene/3d/world_environment.cpp b/scene/3d/world_environment.cpp index 8cf4554653..8dbb709ae4 100644 --- a/scene/3d/world_environment.cpp +++ b/scene/3d/world_environment.cpp @@ -36,50 +36,50 @@ void WorldEnvironment::_notification(int p_what) { if (p_what == Node3D::NOTIFICATION_ENTER_WORLD || p_what == Node3D::NOTIFICATION_ENTER_TREE) { if (environment.is_valid()) { - if (get_viewport()->find_world()->get_environment().is_valid()) { + if (get_viewport()->find_world_3d()->get_environment().is_valid()) { WARN_PRINT("World already has an environment (Another WorldEnvironment?), overriding."); } - get_viewport()->find_world()->set_environment(environment); - add_to_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id())); + get_viewport()->find_world_3d()->set_environment(environment); + add_to_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); } if (camera_effects.is_valid()) { - if (get_viewport()->find_world()->get_camera_effects().is_valid()) { + if (get_viewport()->find_world_3d()->get_camera_effects().is_valid()) { WARN_PRINT("World already has a camera effects (Another WorldEnvironment?), overriding."); } - get_viewport()->find_world()->set_camera_effects(camera_effects); - add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world()->get_scenario().get_id())); + get_viewport()->find_world_3d()->set_camera_effects(camera_effects); + add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); } } else if (p_what == Node3D::NOTIFICATION_EXIT_WORLD || p_what == Node3D::NOTIFICATION_EXIT_TREE) { - if (environment.is_valid() && get_viewport()->find_world()->get_environment() == environment) { - get_viewport()->find_world()->set_environment(Ref<Environment>()); - remove_from_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id())); + if (environment.is_valid() && get_viewport()->find_world_3d()->get_environment() == environment) { + get_viewport()->find_world_3d()->set_environment(Ref<Environment>()); + remove_from_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); } - if (camera_effects.is_valid() && get_viewport()->find_world()->get_camera_effects() == camera_effects) { - get_viewport()->find_world()->set_camera_effects(Ref<CameraEffects>()); - remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world()->get_scenario().get_id())); + if (camera_effects.is_valid() && get_viewport()->find_world_3d()->get_camera_effects() == camera_effects) { + get_viewport()->find_world_3d()->set_camera_effects(Ref<CameraEffects>()); + remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); } } } void WorldEnvironment::set_environment(const Ref<Environment> &p_environment) { - if (is_inside_tree() && environment.is_valid() && get_viewport()->find_world()->get_environment() == environment) { - get_viewport()->find_world()->set_environment(Ref<Environment>()); - remove_from_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id())); + if (is_inside_tree() && environment.is_valid() && get_viewport()->find_world_3d()->get_environment() == environment) { + get_viewport()->find_world_3d()->set_environment(Ref<Environment>()); + remove_from_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); //clean up } environment = p_environment; if (is_inside_tree() && environment.is_valid()) { - if (get_viewport()->find_world()->get_environment().is_valid()) { + if (get_viewport()->find_world_3d()->get_environment().is_valid()) { WARN_PRINT("World already has an environment (Another WorldEnvironment?), overriding."); } - get_viewport()->find_world()->set_environment(environment); - add_to_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id())); + get_viewport()->find_world_3d()->set_environment(environment); + add_to_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); } update_configuration_warning(); @@ -92,19 +92,19 @@ Ref<Environment> WorldEnvironment::get_environment() const { void WorldEnvironment::set_camera_effects(const Ref<CameraEffects> &p_camera_effects) { - if (is_inside_tree() && camera_effects.is_valid() && get_viewport()->find_world()->get_camera_effects() == camera_effects) { - get_viewport()->find_world()->set_camera_effects(Ref<CameraEffects>()); - remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world()->get_scenario().get_id())); + if (is_inside_tree() && camera_effects.is_valid() && get_viewport()->find_world_3d()->get_camera_effects() == camera_effects) { + get_viewport()->find_world_3d()->set_camera_effects(Ref<CameraEffects>()); + remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); //clean up } camera_effects = p_camera_effects; if (is_inside_tree() && camera_effects.is_valid()) { - if (get_viewport()->find_world()->get_camera_effects().is_valid()) { + if (get_viewport()->find_world_3d()->get_camera_effects().is_valid()) { WARN_PRINT("World already has an camera_effects (Another WorldEnvironment?), overriding."); } - get_viewport()->find_world()->set_camera_effects(camera_effects); - add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world()->get_scenario().get_id())); + get_viewport()->find_world_3d()->set_camera_effects(camera_effects); + add_to_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); } update_configuration_warning(); @@ -125,7 +125,7 @@ String WorldEnvironment::get_configuration_warning() const { return String(); List<Node *> nodes; - get_tree()->get_nodes_in_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id()), &nodes); + get_tree()->get_nodes_in_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()), &nodes); if (nodes.size() > 1) { return TTR("Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."); diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 946f759610..8228cf67bd 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -395,9 +395,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float } else { - nc->loc_accum = nc->loc_accum.linear_interpolate(loc, p_interp); + nc->loc_accum = nc->loc_accum.lerp(loc, p_interp); nc->rot_accum = nc->rot_accum.slerp(rot, p_interp); - nc->scale_accum = nc->scale_accum.linear_interpolate(scale, p_interp); + nc->scale_accum = nc->scale_accum.lerp(scale, p_interp); } } break; @@ -950,13 +950,13 @@ void AnimationPlayer::_animation_process(float p_delta) { play(queued.front()->get()); String new_name = playback.assigned; queued.pop_front(); - if (end_notify || playback.seeked) + if (end_notify) emit_signal(SceneStringNames::get_singleton()->animation_changed, old, new_name); } else { //stop(); playing = false; _set_process(false); - if (end_notify || playback.seeked) + if (end_notify) emit_signal(SceneStringNames::get_singleton()->animation_finished, playback.assigned); } end_reached = false; diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index f8b3ca291b..56e224819f 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -958,7 +958,7 @@ void AnimationTree::_process_graph(float p_delta) { if (err != OK) continue; - t->loc = t->loc.linear_interpolate(loc, blend); + t->loc = t->loc.lerp(loc, blend); if (t->rot_blend_accum == 0) { t->rot = rot; t->rot_blend_accum = blend; @@ -967,7 +967,7 @@ void AnimationTree::_process_graph(float p_delta) { t->rot = rot.slerp(t->rot, t->rot_blend_accum / rot_total).normalized(); t->rot_blend_accum = rot_total; } - t->scale = t->scale.linear_interpolate(scale, blend); + t->scale = t->scale.lerp(scale, blend); } } break; diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index bc28c38e2c..d0c6cac8cf 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -126,14 +126,17 @@ bool Tween::_set(const StringName &p_name, const Variant &p_value) { String name = p_name; if (name == "playback/speed" || name == "speed") { // Backwards compatibility set_speed_scale(p_value); + return true; } else if (name == "playback/active") { set_active(p_value); + return true; } else if (name == "playback/repeat") { set_repeat(p_value); + return true; } - return true; + return false; } bool Tween::_get(const StringName &p_name, Variant &r_ret) const { @@ -142,14 +145,17 @@ bool Tween::_get(const StringName &p_name, Variant &r_ret) const { String name = p_name; if (name == "playback/speed") { // Backwards compatibility r_ret = speed_scale; + return true; } else if (name == "playback/active") { r_ret = is_active(); + return true; } else if (name == "playback/repeat") { r_ret = is_repeat(); + return true; } - return true; + return false; } void Tween::_get_property_list(List<PropertyInfo> *p_list) const { diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index b4dc37c74f..b710ba4803 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -2896,7 +2896,7 @@ void Control::_bind_methods() { ADD_GROUP("Size Flags", "size_flags_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "size_flags_horizontal", PROPERTY_HINT_FLAGS, "Fill,Expand,Shrink Center,Shrink End"), "set_h_size_flags", "get_h_size_flags"); ADD_PROPERTY(PropertyInfo(Variant::INT, "size_flags_vertical", PROPERTY_HINT_FLAGS, "Fill,Expand,Shrink Center,Shrink End"), "set_v_size_flags", "get_v_size_flags"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size_flags_stretch_ratio", PROPERTY_HINT_RANGE, "0,128,0.01"), "set_stretch_ratio", "get_stretch_ratio"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size_flags_stretch_ratio", PROPERTY_HINT_RANGE, "0,20,0.01,or_greater"), "set_stretch_ratio", "get_stretch_ratio"); ADD_GROUP("Theme", ""); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), "set_theme", "get_theme"); ADD_GROUP("", ""); diff --git a/scene/gui/gradient_edit.cpp b/scene/gui/gradient_edit.cpp index 88107f754c..a6ed3d8de9 100644 --- a/scene/gui/gradient_edit.cpp +++ b/scene/gui/gradient_edit.cpp @@ -207,7 +207,7 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { prev = points[pos]; } - newPoint.color = prev.color.linear_interpolate(next.color, (newPoint.offset - prev.offset) / (next.offset - prev.offset)); + newPoint.color = prev.color.lerp(next.color, (newPoint.offset - prev.offset) / (next.offset - prev.offset)); points.push_back(newPoint); points.sort(); diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 3af730de23..0bf67df9b4 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -653,7 +653,7 @@ void GraphEdit::_bake_segment2d(Vector<Vector2> &points, Vector<Color> &colors, if (p_depth >= p_min_depth && (dp < p_tol || p_depth >= p_max_depth)) { points.push_back((beg + end) * 0.5); - colors.push_back(p_color.linear_interpolate(p_to_color, mp)); + colors.push_back(p_color.lerp(p_to_color, mp)); lines++; } else { _bake_segment2d(points, colors, p_begin, mp, p_a, p_out, p_b, p_in, p_depth + 1, p_min_depth, p_max_depth, p_tol, p_color, p_to_color, lines); @@ -737,8 +737,8 @@ void GraphEdit::_connections_layer_draw() { Color tocolor = gto->get_connection_input_color(E->get().to_port); if (E->get().activity > 0) { - color = color.linear_interpolate(activity_color, E->get().activity); - tocolor = tocolor.linear_interpolate(activity_color, E->get().activity); + color = color.lerp(activity_color, E->get().activity); + tocolor = tocolor.lerp(activity_color, E->get().activity); } _draw_cos_line(connections_layer, frompos, topos, color, tocolor); } diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index a247863298..9c48801ec1 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -1079,6 +1079,11 @@ bool PopupMenu::is_item_shortcut_disabled(int p_idx) const { return items[p_idx].shortcut_is_disabled; } +int PopupMenu::get_current_index() const { + + return mouse_over; +} + int PopupMenu::get_item_count() const { return items.size(); @@ -1457,6 +1462,7 @@ void PopupMenu::_bind_methods() { ClassDB::bind_method(D_METHOD("get_item_tooltip", "idx"), &PopupMenu::get_item_tooltip); ClassDB::bind_method(D_METHOD("get_item_shortcut", "idx"), &PopupMenu::get_item_shortcut); + ClassDB::bind_method(D_METHOD("get_current_index"), &PopupMenu::get_current_index); ClassDB::bind_method(D_METHOD("get_item_count"), &PopupMenu::get_item_count); ClassDB::bind_method(D_METHOD("remove_item", "idx"), &PopupMenu::remove_item); diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h index 2eef1f009d..d5c1015863 100644 --- a/scene/gui/popup_menu.h +++ b/scene/gui/popup_menu.h @@ -178,6 +178,7 @@ public: Ref<ShortCut> get_item_shortcut(int p_idx) const; int get_item_state(int p_idx) const; + int get_current_index() const; int get_item_count() const; bool activate_item_by_event(const Ref<InputEvent> &p_event, bool p_for_global_only = false); diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 4ae9d9b2f5..84097eb6a1 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -2093,6 +2093,8 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { } String tag = p_bbcode.substr(brk_pos + 1, brk_end - brk_pos - 1); + Vector<String> split_tag_block = tag.split(" ", false); + String bbcode = !split_tag_block.empty() ? split_tag_block[0] : ""; if (tag.begins_with("/") && tag_stack.size()) { bool tag_ok = tag_stack.size() && tag_stack.front()->get() == tag.substr(1, tag.length()); @@ -2325,15 +2327,14 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { pos = brk_end + 1; tag_stack.push_front("font"); - } else if (tag.begins_with("fade")) { - Vector<String> tags = tag.split(" ", false); + } else if (bbcode == "fade") { int startIndex = 0; int length = 10; - if (tags.size() > 1) { - tags.remove(0); - for (int i = 0; i < tags.size(); i++) { - String expr = tags[i]; + if (split_tag_block.size() > 1) { + split_tag_block.remove(0); + for (int i = 0; i < split_tag_block.size(); i++) { + String expr = split_tag_block[i]; if (expr.begins_with("start=")) { String start_str = expr.substr(6, expr.length()); startIndex = start_str.to_int(); @@ -2347,15 +2348,14 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { push_fade(startIndex, length); pos = brk_end + 1; tag_stack.push_front("fade"); - } else if (tag.begins_with("shake")) { - Vector<String> tags = tag.split(" ", false); + } else if (bbcode == "shake") { int strength = 5; float rate = 20.0f; - if (tags.size() > 1) { - tags.remove(0); - for (int i = 0; i < tags.size(); i++) { - String expr = tags[i]; + if (split_tag_block.size() > 1) { + split_tag_block.remove(0); + for (int i = 0; i < split_tag_block.size(); i++) { + String expr = split_tag_block[i]; if (expr.begins_with("level=")) { String str_str = expr.substr(6, expr.length()); strength = str_str.to_int(); @@ -2370,15 +2370,14 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { pos = brk_end + 1; tag_stack.push_front("shake"); set_process_internal(true); - } else if (tag.begins_with("wave")) { - Vector<String> tags = tag.split(" ", false); + } else if (bbcode == "wave") { float amplitude = 20.0f; float period = 5.0f; - if (tags.size() > 1) { - tags.remove(0); - for (int i = 0; i < tags.size(); i++) { - String expr = tags[i]; + if (split_tag_block.size() > 1) { + split_tag_block.remove(0); + for (int i = 0; i < split_tag_block.size(); i++) { + String expr = split_tag_block[i]; if (expr.begins_with("amp=")) { String amp_str = expr.substr(4, expr.length()); amplitude = amp_str.to_float(); @@ -2393,15 +2392,14 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { pos = brk_end + 1; tag_stack.push_front("wave"); set_process_internal(true); - } else if (tag.begins_with("tornado")) { - Vector<String> tags = tag.split(" ", false); + } else if (bbcode == "tornado") { float radius = 10.0f; float frequency = 1.0f; - if (tags.size() > 1) { - tags.remove(0); - for (int i = 0; i < tags.size(); i++) { - String expr = tags[i]; + if (split_tag_block.size() > 1) { + split_tag_block.remove(0); + for (int i = 0; i < split_tag_block.size(); i++) { + String expr = split_tag_block[i]; if (expr.begins_with("radius=")) { String amp_str = expr.substr(7, expr.length()); radius = amp_str.to_float(); @@ -2416,16 +2414,15 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { pos = brk_end + 1; tag_stack.push_front("tornado"); set_process_internal(true); - } else if (tag.begins_with("rainbow")) { - Vector<String> tags = tag.split(" ", false); + } else if (bbcode == "rainbow") { float saturation = 0.8f; float value = 0.8f; float frequency = 1.0f; - if (tags.size() > 1) { - tags.remove(0); - for (int i = 0; i < tags.size(); i++) { - String expr = tags[i]; + if (split_tag_block.size() > 1) { + split_tag_block.remove(0); + for (int i = 0; i < split_tag_block.size(); i++) { + String expr = split_tag_block[i]; if (expr.begins_with("sat=")) { String sat_str = expr.substr(4, expr.length()); saturation = sat_str.to_float(); @@ -2444,7 +2441,7 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { tag_stack.push_front("rainbow"); set_process_internal(true); } else { - Vector<String> expr = tag.split(" ", false); + Vector<String> &expr = split_tag_block; if (expr.size() < 1) { add_text("["); pos = brk_pos + 1; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 5643bb6709..aa518fbb7d 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1153,7 +1153,7 @@ void TextEdit::_notification(int p_what) { highlighted_text_col = _get_column_pos_of_word(highlighted_text, str, SEARCH_MATCH_CASE | SEARCH_WHOLE_WORDS, 0); if (select_identifiers_enabled && highlighted_word.length() != 0) { - if (_is_char(highlighted_word[0])) { + if (_is_char(highlighted_word[0]) || highlighted_word[0] == '.') { highlighted_word_col = _get_column_pos_of_word(highlighted_word, fullstr, SEARCH_MATCH_CASE | SEARCH_WHOLE_WORDS, 0); } } @@ -6215,6 +6215,10 @@ void TextEdit::_push_current_op() { current_op.type = TextOperation::TYPE_NONE; current_op.text = ""; current_op.chain_forward = false; + + if (undo_stack.size() > undo_stack_max_size) { + undo_stack.pop_front(); + } } void TextEdit::set_indent_using_spaces(const bool p_use_spaces) { @@ -7079,6 +7083,7 @@ void TextEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("get_line_count"), &TextEdit::get_line_count); ClassDB::bind_method(D_METHOD("get_text"), &TextEdit::get_text); ClassDB::bind_method(D_METHOD("get_line", "line"), &TextEdit::get_line); + ClassDB::bind_method(D_METHOD("set_line", "line", "new_text"), &TextEdit::set_line); ClassDB::bind_method(D_METHOD("center_viewport_to_cursor"), &TextEdit::center_viewport_to_cursor); ClassDB::bind_method(D_METHOD("cursor_set_column", "column", "adjust_viewport"), &TextEdit::cursor_set_column, DEFVAL(true)); @@ -7239,6 +7244,8 @@ void TextEdit::_bind_methods() { GLOBAL_DEF("gui/timers/text_edit_idle_detect_sec", 3); ProjectSettings::get_singleton()->set_custom_property_info("gui/timers/text_edit_idle_detect_sec", PropertyInfo(Variant::FLOAT, "gui/timers/text_edit_idle_detect_sec", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater")); // No negative numbers. + GLOBAL_DEF("gui/common/text_edit_undo_stack_max_size", 1024); + ProjectSettings::get_singleton()->set_custom_property_info("gui/common/text_edit_undo_stack_max_size", PropertyInfo(Variant::INT, "gui/common/text_edit_undo_stack_max_size", PROPERTY_HINT_RANGE, "0,10000,1,or_greater")); // No negative numbers. } TextEdit::TextEdit() { @@ -7318,6 +7325,7 @@ TextEdit::TextEdit() { current_op.type = TextOperation::TYPE_NONE; undo_enabled = true; + undo_stack_max_size = GLOBAL_GET("gui/common/text_edit_undo_stack_max_size"); undo_stack_pos = nullptr; setting_text = false; last_dblclk = 0; diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index ef8c39d32f..ac8eb5da1d 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -306,6 +306,7 @@ private: List<TextOperation> undo_stack; List<TextOperation>::Element *undo_stack_pos; + int undo_stack_max_size; void _clear_redo(); void _do_text_op(const TextOperation &p_op, bool p_reverse); diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index aad36ebf02..329c1085df 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -779,6 +779,9 @@ void TreeItem::_bind_methods() { ClassDB::bind_method(D_METHOD("set_text", "column", "text"), &TreeItem::set_text); ClassDB::bind_method(D_METHOD("get_text", "column"), &TreeItem::get_text); + ClassDB::bind_method(D_METHOD("set_suffix", "column", "text"), &TreeItem::set_suffix); + ClassDB::bind_method(D_METHOD("get_suffix", "column"), &TreeItem::get_suffix); + ClassDB::bind_method(D_METHOD("set_icon", "column", "texture"), &TreeItem::set_icon); ClassDB::bind_method(D_METHOD("get_icon", "column"), &TreeItem::get_icon); diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 22cd1c98ab..07cb8e3cd2 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -504,7 +504,7 @@ bool SceneTree::idle(float p_time) { String env_path = ProjectSettings::get_singleton()->get("rendering/environment/default_environment"); env_path = env_path.strip_edges(); //user may have added a space or two String cpath; - Ref<Environment> fallback = get_root()->get_world()->get_fallback_environment(); + Ref<Environment> fallback = get_root()->get_world_3d()->get_fallback_environment(); if (fallback.is_valid()) { cpath = fallback->get_path(); } @@ -519,7 +519,7 @@ bool SceneTree::idle(float p_time) { } else { fallback.unref(); } - get_root()->get_world()->set_fallback_environment(fallback); + get_root()->get_world_3d()->set_fallback_environment(fallback); } } @@ -1409,8 +1409,8 @@ SceneTree::SceneTree() { root = memnew(Window); root->set_name("root"); - if (!root->get_world().is_valid()) - root->set_world(Ref<World3D>(memnew(World3D))); + if (!root->get_world_3d().is_valid()) + root->set_world_3d(Ref<World3D>(memnew(World3D))); // Initialize network state multiplayer_poll = true; @@ -1447,7 +1447,7 @@ SceneTree::SceneTree() { if (env_path != String()) { Ref<Environment> env = ResourceLoader::load(env_path); if (env.is_valid()) { - root->get_world()->set_fallback_environment(env); + root->get_world_3d()->set_fallback_environment(env); } else { if (Engine::get_singleton()->is_editor_hint()) { //file was erased, clear the field. diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index b0718eed79..e9827d521b 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -215,7 +215,7 @@ void Viewport::update_worlds() { find_world_2d()->_update_viewport(this, xformed_rect); find_world_2d()->_update(); - find_world()->_update(get_tree()->get_frame()); + find_world_3d()->_update(get_tree()->get_frame()); } void Viewport::_collision_object_input_event(CollisionObject3D *p_object, Camera3D *p_camera, const Ref<InputEvent> &p_input_event, const Vector3 &p_pos, const Vector3 &p_normal, int p_shape) { @@ -422,22 +422,22 @@ void Viewport::_sub_window_remove(Window *p_window) { RenderingServer::get_singleton()->viewport_set_parent_viewport(p_window->viewport, p_window->parent ? p_window->parent->viewport : RID()); } -void Viewport::_own_world_changed() { - ERR_FAIL_COND(world.is_null()); - ERR_FAIL_COND(own_world.is_null()); +void Viewport::_own_world_3d_changed() { + ERR_FAIL_COND(world_3d.is_null()); + ERR_FAIL_COND(own_world_3d.is_null()); if (is_inside_tree()) { _propagate_exit_world(this); } - own_world = world->duplicate(); + own_world_3d = world_3d->duplicate(); if (is_inside_tree()) { _propagate_enter_world(this); } if (is_inside_tree()) { - RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world()->get_scenario()); + RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario()); } _update_listener(); @@ -459,7 +459,7 @@ void Viewport::_notification(int p_what) { } current_canvas = find_world_2d()->get_canvas(); - RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world()->get_scenario()); + RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario()); RenderingServer::get_singleton()->viewport_attach_canvas(viewport, current_canvas); _update_listener(); @@ -474,14 +474,14 @@ void Viewport::_notification(int p_what) { contact_2d_debug = RenderingServer::get_singleton()->canvas_item_create(); RenderingServer::get_singleton()->canvas_item_set_parent(contact_2d_debug, find_world_2d()->get_canvas()); //3D - PhysicsServer3D::get_singleton()->space_set_debug_contacts(find_world()->get_space(), get_tree()->get_collision_debug_contact_count()); + PhysicsServer3D::get_singleton()->space_set_debug_contacts(find_world_3d()->get_space(), get_tree()->get_collision_debug_contact_count()); contact_3d_debug_multimesh = RenderingServer::get_singleton()->multimesh_create(); RenderingServer::get_singleton()->multimesh_allocate(contact_3d_debug_multimesh, get_tree()->get_collision_debug_contact_count(), RS::MULTIMESH_TRANSFORM_3D, true); RenderingServer::get_singleton()->multimesh_set_visible_instances(contact_3d_debug_multimesh, 0); RenderingServer::get_singleton()->multimesh_set_mesh(contact_3d_debug_multimesh, get_tree()->get_debug_contact_mesh()->get_rid()); contact_3d_debug_instance = RenderingServer::get_singleton()->instance_create(); RenderingServer::get_singleton()->instance_set_base(contact_3d_debug_instance, contact_3d_debug_multimesh); - RenderingServer::get_singleton()->instance_set_scenario(contact_3d_debug_instance, find_world()->get_scenario()); + RenderingServer::get_singleton()->instance_set_scenario(contact_3d_debug_instance, find_world_3d()->get_scenario()); //RenderingServer::get_singleton()->instance_geometry_set_flag(contact_3d_debug_instance, RS::INSTANCE_FLAG_VISIBLE_IN_ALL_ROOMS, true); } @@ -576,8 +576,8 @@ void Viewport::_notification(int p_what) { if (get_tree()->is_debugging_collisions_hint() && contact_3d_debug_multimesh.is_valid()) { - Vector<Vector3> points = PhysicsServer3D::get_singleton()->space_get_contacts(find_world()->get_space()); - int point_count = PhysicsServer3D::get_singleton()->space_get_contact_count(find_world()->get_space()); + Vector<Vector3> points = PhysicsServer3D::get_singleton()->space_get_contacts(find_world_3d()->get_space()); + int point_count = PhysicsServer3D::get_singleton()->space_get_contact_count(find_world_3d()->get_space()); RS::get_singleton()->multimesh_set_visible_instances(contact_3d_debug_multimesh, point_count); } @@ -805,7 +805,7 @@ void Viewport::_notification(int p_what) { Vector3 from = camera->project_ray_origin(pos); Vector3 dir = camera->project_ray_normal(pos); - PhysicsDirectSpaceState3D *space = PhysicsServer3D::get_singleton()->space_get_direct_state(find_world()->get_space()); + PhysicsDirectSpaceState3D *space = PhysicsServer3D::get_singleton()->space_get_direct_state(find_world_3d()->get_space()); if (space) { bool col = space->intersect_ray(from, from + dir * 10000, result, Set<RID>(), 0xFFFFFFFF, true, true, true); @@ -1185,7 +1185,7 @@ void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) { return; if (parent && parent->find_world_2d() == p_world_2d) { - WARN_PRINT("Unable to use parent world as world_2d"); + WARN_PRINT("Unable to use parent world_3d as world_2d"); return; } @@ -1197,7 +1197,7 @@ void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) { if (p_world_2d.is_valid()) world_2d = p_world_2d; else { - WARN_PRINT("Invalid world"); + WARN_PRINT("Invalid world_3d"); world_2d = Ref<World2D>(memnew(World2D)); } @@ -1235,7 +1235,7 @@ void Viewport::_propagate_enter_world(Node *p_node) { Viewport *v = Object::cast_to<Viewport>(p_node); if (v) { - if (v->world.is_valid() || v->own_world.is_valid()) + if (v->world_3d.is_valid() || v->own_world_3d.is_valid()) return; } #ifndef _3D_DISABLED @@ -1275,7 +1275,7 @@ void Viewport::_propagate_exit_world(Node *p_node) { Viewport *v = Object::cast_to<Viewport>(p_node); if (v) { - if (v->world.is_valid() || v->own_world.is_valid()) + if (v->world_3d.is_valid() || v->own_world_3d.is_valid()) return; } #ifndef _3D_DISABLED @@ -1289,26 +1289,26 @@ void Viewport::_propagate_exit_world(Node *p_node) { } } -void Viewport::set_world(const Ref<World3D> &p_world) { +void Viewport::set_world_3d(const Ref<World3D> &p_world_3d) { - if (world == p_world) + if (world_3d == p_world_3d) return; if (is_inside_tree()) _propagate_exit_world(this); - if (own_world.is_valid() && world.is_valid()) { - world->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_changed)); + if (own_world_3d.is_valid() && world_3d.is_valid()) { + world_3d->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed)); } - world = p_world; + world_3d = p_world_3d; - if (own_world.is_valid()) { - if (world.is_valid()) { - own_world = world->duplicate(); - world->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_changed)); + if (own_world_3d.is_valid()) { + if (world_3d.is_valid()) { + own_world_3d = world_3d->duplicate(); + world_3d->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed)); } else { - own_world = Ref<World3D>(memnew(World3D)); + own_world_3d = Ref<World3D>(memnew(World3D)); } } @@ -1316,15 +1316,15 @@ void Viewport::set_world(const Ref<World3D> &p_world) { _propagate_enter_world(this); if (is_inside_tree()) { - RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world()->get_scenario()); + RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario()); } _update_listener(); } -Ref<World3D> Viewport::get_world() const { +Ref<World3D> Viewport::get_world_3d() const { - return world; + return world_3d; } Ref<World2D> Viewport::get_world_2d() const { @@ -1332,14 +1332,14 @@ Ref<World2D> Viewport::get_world_2d() const { return world_2d; } -Ref<World3D> Viewport::find_world() const { +Ref<World3D> Viewport::find_world_3d() const { - if (own_world.is_valid()) - return own_world; - else if (world.is_valid()) - return world; + if (own_world_3d.is_valid()) + return own_world_3d; + else if (world_3d.is_valid()) + return world_3d; else if (parent) - return parent->find_world(); + return parent->find_world_3d(); else return Ref<World3D>(); } @@ -3077,25 +3077,25 @@ void Viewport::unhandled_input(const Ref<InputEvent> &p_event, bool p_local_coor } } -void Viewport::set_use_own_world(bool p_world) { +void Viewport::set_use_own_world_3d(bool p_world_3d) { - if (p_world == own_world.is_valid()) + if (p_world_3d == own_world_3d.is_valid()) return; if (is_inside_tree()) _propagate_exit_world(this); - if (!p_world) { - own_world = Ref<World3D>(); - if (world.is_valid()) { - world->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_changed)); + if (!p_world_3d) { + own_world_3d = Ref<World3D>(); + if (world_3d.is_valid()) { + world_3d->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed)); } } else { - if (world.is_valid()) { - own_world = world->duplicate(); - world->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_changed)); + if (world_3d.is_valid()) { + own_world_3d = world_3d->duplicate(); + world_3d->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed)); } else { - own_world = Ref<World3D>(memnew(World3D)); + own_world_3d = Ref<World3D>(memnew(World3D)); } } @@ -3103,15 +3103,15 @@ void Viewport::set_use_own_world(bool p_world) { _propagate_enter_world(this); if (is_inside_tree()) { - RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world()->get_scenario()); + RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario()); } _update_listener(); } -bool Viewport::is_using_own_world() const { +bool Viewport::is_using_own_world_3d() const { - return own_world.is_valid(); + return own_world_3d.is_valid(); } void Viewport::set_physics_object_picking(bool p_enable) { @@ -3366,9 +3366,9 @@ void Viewport::_bind_methods() { ClassDB::bind_method(D_METHOD("set_world_2d", "world_2d"), &Viewport::set_world_2d); ClassDB::bind_method(D_METHOD("get_world_2d"), &Viewport::get_world_2d); ClassDB::bind_method(D_METHOD("find_world_2d"), &Viewport::find_world_2d); - ClassDB::bind_method(D_METHOD("set_world", "world"), &Viewport::set_world); - ClassDB::bind_method(D_METHOD("get_world"), &Viewport::get_world); - ClassDB::bind_method(D_METHOD("find_world"), &Viewport::find_world); + ClassDB::bind_method(D_METHOD("set_world_3d", "world_3d"), &Viewport::set_world_3d); + ClassDB::bind_method(D_METHOD("get_world_3d"), &Viewport::get_world_3d); + ClassDB::bind_method(D_METHOD("find_world_3d"), &Viewport::find_world_3d); ClassDB::bind_method(D_METHOD("set_canvas_transform", "xform"), &Viewport::set_canvas_transform); ClassDB::bind_method(D_METHOD("get_canvas_transform"), &Viewport::get_canvas_transform); @@ -3404,8 +3404,8 @@ void Viewport::_bind_methods() { ClassDB::bind_method(D_METHOD("update_worlds"), &Viewport::update_worlds); - ClassDB::bind_method(D_METHOD("set_use_own_world", "enable"), &Viewport::set_use_own_world); - ClassDB::bind_method(D_METHOD("is_using_own_world"), &Viewport::is_using_own_world); + ClassDB::bind_method(D_METHOD("set_use_own_world_3d", "enable"), &Viewport::set_use_own_world_3d); + ClassDB::bind_method(D_METHOD("is_using_own_world_3d"), &Viewport::is_using_own_world_3d); ClassDB::bind_method(D_METHOD("get_camera"), &Viewport::get_camera); @@ -3453,8 +3453,8 @@ void Viewport::_bind_methods() { ClassDB::bind_method(D_METHOD("set_default_canvas_item_texture_repeat", "mode"), &Viewport::set_default_canvas_item_texture_repeat); ClassDB::bind_method(D_METHOD("get_default_canvas_item_texture_repeat"), &Viewport::get_default_canvas_item_texture_repeat); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "own_world"), "set_use_own_world", "is_using_own_world"); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "world", PROPERTY_HINT_RESOURCE_TYPE, "World"), "set_world", "get_world"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "own_world_3d"), "set_use_own_world_3d", "is_using_own_world_3d"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "world_3d", PROPERTY_HINT_RESOURCE_TYPE, "World3D"), "set_world_3d", "get_world_3d"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "world_2d", PROPERTY_HINT_RESOURCE_TYPE, "World2D", 0), "set_world_2d", "get_world_2d"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "transparent_bg"), "set_transparent_background", "has_transparent_background"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "handle_input_locally"), "set_handle_input_locally", "is_handling_input_locally"); diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 7e2df9fe42..7da57347fd 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -253,8 +253,8 @@ private: Map<ObjectID, uint64_t> physics_2d_mouseover; Ref<World2D> world_2d; - Ref<World3D> world; - Ref<World3D> own_world; + Ref<World3D> world_3d; + Ref<World3D> own_world_3d; Rect2i to_screen_rect; StringName input_group; @@ -430,7 +430,7 @@ private: void _gui_set_root_order_dirty(); - void _own_world_changed(); + void _own_world_3d_changed(); friend class Window; @@ -477,10 +477,10 @@ public: Rect2 get_visible_rect() const; RID get_viewport_rid() const; - void set_world(const Ref<World3D> &p_world); + void set_world_3d(const Ref<World3D> &p_world_3d); void set_world_2d(const Ref<World2D> &p_world_2d); - Ref<World3D> get_world() const; - Ref<World3D> find_world() const; + Ref<World3D> get_world_3d() const; + Ref<World3D> find_world_3d() const; Ref<World2D> get_world_2d() const; Ref<World2D> find_world_2d() const; @@ -519,8 +519,8 @@ public: Vector2 get_camera_coords(const Vector2 &p_viewport_coords) const; Vector2 get_camera_rect_size() const; - void set_use_own_world(bool p_world); - bool is_using_own_world() const; + void set_use_own_world_3d(bool p_world_3d); + bool is_using_own_world_3d() const; void input_text(const String &p_text); void input(const Ref<InputEvent> &p_event, bool p_local_coords = false); diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp index aa4c9bf225..ea4338519e 100644 --- a/scene/resources/animation.cpp +++ b/scene/resources/animation.cpp @@ -1570,7 +1570,7 @@ Animation::TransformKey Animation::_interpolate(const Animation::TransformKey &p Vector3 Animation::_interpolate(const Vector3 &p_a, const Vector3 &p_b, float p_c) const { - return p_a.linear_interpolate(p_b, p_c); + return p_a.lerp(p_b, p_c); } Quat Animation::_interpolate(const Quat &p_a, const Quat &p_b, float p_c) const { @@ -2432,7 +2432,7 @@ float Animation::bezier_track_interpolate(int p_track, float p_time) const { Vector2 high_pos = _bezier_interp(high, start, start_out, end_in, end); float c = (t - low_pos.x) / (high_pos.x - low_pos.x); - return low_pos.linear_interpolate(high_pos, c).y; + return low_pos.lerp(high_pos, c).y; } int Animation::audio_track_insert_key(int p_track, float p_time, const RES &p_stream, float p_start_offset, float p_end_offset) { diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp index d19eae0d4f..ae705a47e8 100644 --- a/scene/resources/curve.cpp +++ b/scene/resources/curve.cpp @@ -796,7 +796,7 @@ Vector2 Curve2D::interpolate_baked(float p_offset, bool p_cubic) const { Vector2 post = (idx < (bpc - 2)) ? r[idx + 2] : r[idx + 1]; return r[idx].cubic_interpolate(r[idx + 1], pre, post, frac); } else { - return r[idx].linear_interpolate(r[idx + 1], frac); + return r[idx].lerp(r[idx + 1], frac); } } @@ -1354,7 +1354,7 @@ Vector3 Curve3D::interpolate_baked(float p_offset, bool p_cubic) const { Vector3 post = (idx < (bpc - 2)) ? r[idx + 2] : r[idx + 1]; return r[idx].cubic_interpolate(r[idx + 1], pre, post, frac); } else { - return r[idx].linear_interpolate(r[idx + 1], frac); + return r[idx].lerp(r[idx + 1], frac); } } diff --git a/scene/resources/gradient.h b/scene/resources/gradient.h index 2d98f799e2..573749ea7e 100644 --- a/scene/resources/gradient.h +++ b/scene/resources/gradient.h @@ -120,7 +120,7 @@ public: return points[0].color; const Point &pointFirst = points[first]; const Point &pointSecond = points[second]; - return pointFirst.color.linear_interpolate(pointSecond.color, (p_offset - pointFirst.offset) / (pointSecond.offset - pointFirst.offset)); + return pointFirst.color.lerp(pointSecond.color, (p_offset - pointFirst.offset) / (pointSecond.offset - pointFirst.offset)); } int get_points_count() const; diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp index 310a7ef4e4..3b245f908a 100644 --- a/scene/resources/visual_shader.cpp +++ b/scene/resources/visual_shader.cpp @@ -1630,9 +1630,11 @@ const VisualShaderNodeInput::Port VisualShaderNodeInput::ports[] = { { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_vec", "vec3(LIGHT_VEC, 0.0)" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_height", "LIGHT_HEIGHT" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_color", "LIGHT_COLOR.rgb" }, - { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_alpha", "LIGHT_COLOR.a" }, + { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "light_alpha", "LIGHT_COLOR.a" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "light_uv", "vec3(LIGHT_UV, 0.0)" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "shadow_color", "SHADOW_COLOR.rgb" }, + { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_SCALAR, "shadow_alpha", "SHADOW_COLOR.a" }, + { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "shadow_vec", "vec3(SHADOW_VEC, 0.0)" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "screen_uv", "vec3(SCREEN_UV, 0.0)" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "texture_pixel_size", "vec3(TEXTURE_PIXEL_SIZE, 1.0)" }, { Shader::MODE_CANVAS_ITEM, VisualShader::TYPE_LIGHT, VisualShaderNode::PORT_TYPE_VECTOR, "point_coord", "vec3(POINT_COORD, 0.0)" }, @@ -2156,12 +2158,43 @@ String VisualShaderNodeUniform::get_uniform_name() const { return uniform_name; } +void VisualShaderNodeUniform::set_qualifier(VisualShaderNodeUniform::Qualifier p_qual) { + qualifier = p_qual; + emit_changed(); +} + +VisualShaderNodeUniform::Qualifier VisualShaderNodeUniform::get_qualifier() const { + return qualifier; +} + void VisualShaderNodeUniform::_bind_methods() { ClassDB::bind_method(D_METHOD("set_uniform_name", "name"), &VisualShaderNodeUniform::set_uniform_name); ClassDB::bind_method(D_METHOD("get_uniform_name"), &VisualShaderNodeUniform::get_uniform_name); + ClassDB::bind_method(D_METHOD("set_qualifier", "qualifier"), &VisualShaderNodeUniform::set_qualifier); + ClassDB::bind_method(D_METHOD("get_qualifier"), &VisualShaderNodeUniform::get_qualifier); + ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "uniform_name"), "set_uniform_name", "get_uniform_name"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "qualifier", PROPERTY_HINT_ENUM, "None,Global,Instance"), "set_qualifier", "get_qualifier"); + + BIND_ENUM_CONSTANT(QUAL_NONE); + BIND_ENUM_CONSTANT(QUAL_GLOBAL); + BIND_ENUM_CONSTANT(QUAL_INSTANCE); +} + +String VisualShaderNodeUniform::_get_qual_str() const { + if (is_qualifier_supported(qualifier)) { + switch (qualifier) { + case QUAL_NONE: + break; + case QUAL_GLOBAL: + return "global "; + case QUAL_INSTANCE: + return "instance "; + } + } + return String(); } String VisualShaderNodeUniform::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const { @@ -2171,11 +2204,21 @@ String VisualShaderNodeUniform::get_warning(Shader::Mode p_mode, VisualShader::T if (keyword_list.find(uniform_name)) { return TTR("Uniform name cannot be equal to a shader keyword. Choose another name."); } + if (!is_qualifier_supported(qualifier)) { + return "This uniform type does not support that qualifier."; + } return String(); } +Vector<StringName> VisualShaderNodeUniform::get_editable_properties() const { + Vector<StringName> props; + props.push_back("qualifier"); + return props; +} + VisualShaderNodeUniform::VisualShaderNodeUniform() { + qualifier = QUAL_NONE; } ////////////// GroupBase diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h index ecf3f93fbb..56f8e74d2b 100644 --- a/scene/resources/visual_shader.h +++ b/scene/resources/visual_shader.h @@ -369,21 +369,38 @@ public: class VisualShaderNodeUniform : public VisualShaderNode { GDCLASS(VisualShaderNodeUniform, VisualShaderNode); +public: + enum Qualifier { + QUAL_NONE, + QUAL_GLOBAL, + QUAL_INSTANCE, + }; + private: String uniform_name; + Qualifier qualifier; protected: static void _bind_methods(); + String _get_qual_str() const; public: void set_uniform_name(const String &p_name); String get_uniform_name() const; + void set_qualifier(Qualifier p_qual); + Qualifier get_qualifier() const; + + virtual bool is_qualifier_supported(Qualifier p_qual) const = 0; + + virtual Vector<StringName> get_editable_properties() const; virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const; VisualShaderNodeUniform(); }; +VARIANT_ENUM_CAST(VisualShaderNodeUniform::Qualifier) + class VisualShaderNodeGroupBase : public VisualShaderNode { GDCLASS(VisualShaderNodeGroupBase, VisualShaderNode); diff --git a/scene/resources/visual_shader_nodes.cpp b/scene/resources/visual_shader_nodes.cpp index 2064ca10f3..7b9953a90f 100644 --- a/scene/resources/visual_shader_nodes.cpp +++ b/scene/resources/visual_shader_nodes.cpp @@ -3283,11 +3283,11 @@ String VisualShaderNodeFloatUniform::get_output_port_name(int p_port) const { String VisualShaderNodeFloatUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { if (hint == HINT_RANGE) { - return "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ");\n"; + return _get_qual_str() + "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ");\n"; } else if (hint == HINT_RANGE_STEP) { - return "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ");\n"; + return _get_qual_str() + "uniform float " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ");\n"; } - return "uniform float " + get_uniform_name() + ";\n"; + return _get_qual_str() + "uniform float " + get_uniform_name() + ";\n"; } String VisualShaderNodeFloatUniform::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 { @@ -3353,8 +3353,12 @@ void VisualShaderNodeFloatUniform::_bind_methods() { BIND_ENUM_CONSTANT(HINT_RANGE_STEP); } +bool VisualShaderNodeFloatUniform::is_qualifier_supported(Qualifier p_qual) const { + return true; // all qualifiers are supported +} + Vector<StringName> VisualShaderNodeFloatUniform::get_editable_properties() const { - Vector<StringName> props; + Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties(); props.push_back("hint"); if (hint == HINT_RANGE || hint == HINT_RANGE_STEP) { props.push_back("min"); @@ -3405,11 +3409,11 @@ String VisualShaderNodeIntUniform::get_output_port_name(int p_port) const { String VisualShaderNodeIntUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { if (hint == HINT_RANGE) { - return "uniform int " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ");\n"; + return _get_qual_str() + "uniform int " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ");\n"; } else if (hint == HINT_RANGE_STEP) { - return "uniform int " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ");\n"; + return _get_qual_str() + "uniform int " + get_uniform_name() + " : hint_range(" + rtos(hint_range_min) + ", " + rtos(hint_range_max) + ", " + rtos(hint_range_step) + ");\n"; } - return "uniform int " + get_uniform_name() + ";\n"; + return _get_qual_str() + "uniform int " + get_uniform_name() + ";\n"; } String VisualShaderNodeIntUniform::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 { @@ -3475,8 +3479,12 @@ void VisualShaderNodeIntUniform::_bind_methods() { BIND_ENUM_CONSTANT(HINT_RANGE_STEP); } +bool VisualShaderNodeIntUniform::is_qualifier_supported(Qualifier p_qual) const { + return true; // all qualifiers are supported +} + Vector<StringName> VisualShaderNodeIntUniform::get_editable_properties() const { - Vector<StringName> props; + Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties(); props.push_back("hint"); if (hint == HINT_RANGE || hint == HINT_RANGE_STEP) { props.push_back("min"); @@ -3526,13 +3534,17 @@ String VisualShaderNodeBooleanUniform::get_output_port_name(int p_port) const { } String VisualShaderNodeBooleanUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - return "uniform bool " + get_uniform_name() + ";\n"; + return _get_qual_str() + "uniform bool " + get_uniform_name() + ";\n"; } String VisualShaderNodeBooleanUniform::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] + " = " + get_uniform_name() + ";\n"; } +bool VisualShaderNodeBooleanUniform::is_qualifier_supported(Qualifier p_qual) const { + return true; // all qualifiers are supported +} + VisualShaderNodeBooleanUniform::VisualShaderNodeBooleanUniform() { } @@ -3568,7 +3580,7 @@ String VisualShaderNodeColorUniform::get_output_port_name(int p_port) const { String VisualShaderNodeColorUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - return "uniform vec4 " + get_uniform_name() + " : hint_color;\n"; + return _get_qual_str() + "uniform vec4 " + get_uniform_name() + " : hint_color;\n"; } String VisualShaderNodeColorUniform::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 { @@ -3577,6 +3589,10 @@ String VisualShaderNodeColorUniform::generate_code(Shader::Mode p_mode, VisualSh return code; } +bool VisualShaderNodeColorUniform::is_qualifier_supported(Qualifier p_qual) const { + return true; // all qualifiers are supported +} + VisualShaderNodeColorUniform::VisualShaderNodeColorUniform() { } @@ -3611,13 +3627,17 @@ String VisualShaderNodeVec3Uniform::get_output_port_name(int p_port) const { } String VisualShaderNodeVec3Uniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - return "uniform vec3 " + get_uniform_name() + ";\n"; + return _get_qual_str() + "uniform vec3 " + get_uniform_name() + ";\n"; } String VisualShaderNodeVec3Uniform::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] + " = " + get_uniform_name() + ";\n"; } +bool VisualShaderNodeVec3Uniform::is_qualifier_supported(Qualifier p_qual) const { + return true; // all qualifiers are supported +} + VisualShaderNodeVec3Uniform::VisualShaderNodeVec3Uniform() { } @@ -3652,13 +3672,17 @@ String VisualShaderNodeTransformUniform::get_output_port_name(int p_port) const } String VisualShaderNodeTransformUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - return "uniform mat4 " + get_uniform_name() + ";\n"; + return _get_qual_str() + "uniform mat4 " + get_uniform_name() + ";\n"; } String VisualShaderNodeTransformUniform::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] + " = " + get_uniform_name() + ";\n"; } +bool VisualShaderNodeTransformUniform::is_qualifier_supported(Qualifier p_qual) const { + return true; // all qualifiers are supported +} + VisualShaderNodeTransformUniform::VisualShaderNodeTransformUniform() { } @@ -3713,7 +3737,7 @@ String VisualShaderNodeTextureUniform::get_output_port_name(int p_port) const { } String VisualShaderNodeTextureUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - String code = "uniform sampler2D " + get_uniform_name(); + String code = _get_qual_str() + "uniform sampler2D " + get_uniform_name(); switch (texture_type) { case TYPE_DATA: @@ -3778,7 +3802,7 @@ VisualShaderNodeTextureUniform::ColorDefault VisualShaderNodeTextureUniform::get } Vector<StringName> VisualShaderNodeTextureUniform::get_editable_properties() const { - Vector<StringName> props; + Vector<StringName> props = VisualShaderNodeUniform::get_editable_properties(); props.push_back("texture_type"); props.push_back("color_default"); return props; @@ -3810,6 +3834,18 @@ String VisualShaderNodeTextureUniform::get_input_port_default_hint(int p_port) c return ""; } +bool VisualShaderNodeTextureUniform::is_qualifier_supported(Qualifier p_qual) const { + switch (p_qual) { + case Qualifier::QUAL_NONE: + return true; + case Qualifier::QUAL_GLOBAL: + return true; + case Qualifier::QUAL_INSTANCE: + return false; + } + return false; +} + VisualShaderNodeTextureUniform::VisualShaderNodeTextureUniform() { texture_type = TYPE_DATA; color_default = COLOR_DEFAULT_WHITE; @@ -3952,7 +3988,7 @@ String VisualShaderNodeCubemapUniform::get_input_port_default_hint(int p_port) c } String VisualShaderNodeCubemapUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - String code = "uniform samplerCube " + get_uniform_name(); + String code = _get_qual_str() + "uniform samplerCube " + get_uniform_name(); switch (texture_type) { case TYPE_DATA: diff --git a/scene/resources/visual_shader_nodes.h b/scene/resources/visual_shader_nodes.h index 035e39230c..69f42f621a 100644 --- a/scene/resources/visual_shader_nodes.h +++ b/scene/resources/visual_shader_nodes.h @@ -1457,6 +1457,8 @@ public: void set_step(float p_value); float get_step() const; + bool is_qualifier_supported(Qualifier p_qual) const; + virtual Vector<StringName> get_editable_properties() const; VisualShaderNodeFloatUniform(); @@ -1509,6 +1511,8 @@ public: void set_step(int p_value); int get_step() const; + bool is_qualifier_supported(Qualifier p_qual) const; + virtual Vector<StringName> get_editable_properties() const; VisualShaderNodeIntUniform(); @@ -1535,6 +1539,8 @@ public: virtual String generate_global(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 + bool is_qualifier_supported(Qualifier p_qual) const; + VisualShaderNodeBooleanUniform(); }; @@ -1557,6 +1563,8 @@ public: virtual String generate_global(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 + bool is_qualifier_supported(Qualifier p_qual) const; + VisualShaderNodeColorUniform(); }; @@ -1579,6 +1587,8 @@ public: virtual String generate_global(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 + bool is_qualifier_supported(Qualifier p_qual) const; + VisualShaderNodeVec3Uniform(); }; @@ -1601,6 +1611,8 @@ public: virtual String generate_global(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 + bool is_qualifier_supported(Qualifier p_qual) const; + VisualShaderNodeTransformUniform(); }; @@ -1652,6 +1664,8 @@ public: void set_color_default(ColorDefault p_default); ColorDefault get_color_default() const; + bool is_qualifier_supported(Qualifier p_qual) const; + VisualShaderNodeTextureUniform(); }; diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp index 60217002fb..eb92cf55e3 100644 --- a/servers/register_server_types.cpp +++ b/servers/register_server_types.cpp @@ -218,6 +218,7 @@ void register_server_singletons() { Engine::get_singleton()->add_singleton(Engine::Singleton("DisplayServer", DisplayServer::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("RenderingServer", RenderingServer::get_singleton())); + Engine::get_singleton()->add_singleton(Engine::Singleton("RenderingDevice", RenderingDevice::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("AudioServer", AudioServer::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("PhysicsServer2D", PhysicsServer2D::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("PhysicsServer3D", PhysicsServer3D::get_singleton())); diff --git a/servers/rendering/rasterizer_rd/rasterizer_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_rd.cpp index 9c54f0caae..4c92912e9c 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_rd.cpp @@ -30,6 +30,8 @@ #include "rasterizer_rd.h" +#include "core/project_settings.h" + void RasterizerRD::prepare_for_blitting_render_targets() { RD::get_singleton()->prepare_screen_for_drawing(); } @@ -78,6 +80,10 @@ void RasterizerRD::blit_render_targets_to_screen(DisplayServer::WindowID p_scree void RasterizerRD::begin_frame(double frame_step) { frame++; time += frame_step; + + double time_roll_over = GLOBAL_GET("rendering/limits/time/time_rollover_secs"); + time = Math::fmod(time, time_roll_over); + canvas->set_time(time); scene->set_time(time, frame_step); } diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp index b3cf40f166..6986f82065 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp @@ -1720,6 +1720,16 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig light_data.shadow_enabled = p_using_shadows && storage->light_has_shadow(base); + float angular_diameter = storage->light_get_param(base, RS::LIGHT_PARAM_SIZE); + if (angular_diameter > 0.0) { + // I know tan(0) is 0, but let's not risk it with numerical precision. + // technically this will keep expanding until reaching the sun, but all we care + // is expand until we reach the radius of the near plane (there can't be more occluders than that) + angular_diameter = Math::tan(Math::deg2rad(angular_diameter)); + } else { + angular_diameter = 0.0; + } + if (light_data.shadow_enabled) { RS::LightDirectionalShadowMode smode = storage->light_directional_get_shadow_mode(base); @@ -1775,15 +1785,9 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig light_data.fade_to = -light_data.shadow_split_offsets[3]; light_data.soft_shadow_scale = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BLUR); + light_data.softshadow_angle = angular_diameter; - float softshadow_angle = storage->light_get_param(base, RS::LIGHT_PARAM_SIZE); - if (softshadow_angle > 0.0) { - // I know tan(0) is 0, but let's not risk it with numerical precision. - // technically this will keep expanding until reaching the sun, but all we care - // is expand until we reach the radius of the near plane (there can't be more occluders than that) - light_data.softshadow_angle = Math::tan(Math::deg2rad(softshadow_angle)); - } else { - light_data.softshadow_angle = 0; + if (angular_diameter <= 0.0) { light_data.soft_shadow_scale *= directional_shadow_quality_radius_get(); // Only use quality radius for PCF } } @@ -1806,7 +1810,7 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig sky_light_data.color[2] = light_data.color[2]; sky_light_data.enabled = true; - sky_light_data.size = light_data.softshadow_angle; + sky_light_data.size = angular_diameter; sky_scene_state.directional_light_count++; } diff --git a/servers/rendering/rendering_server_scene.cpp b/servers/rendering/rendering_server_scene.cpp index 9d141ea570..2c3c2730d5 100644 --- a/servers/rendering/rendering_server_scene.cpp +++ b/servers/rendering/rendering_server_scene.cpp @@ -1348,15 +1348,15 @@ _FORCE_INLINE_ static void _light_capture_sample_octree(const RasterizerStorage: for (int i = 0; i < 2; i++) { - Vector3 color_x00 = color[i][0].linear_interpolate(color[i][1], pos_fract[i].x); - Vector3 color_xy0 = color[i][2].linear_interpolate(color[i][3], pos_fract[i].x); - Vector3 blend_z0 = color_x00.linear_interpolate(color_xy0, pos_fract[i].y); + Vector3 color_x00 = color[i][0].lerp(color[i][1], pos_fract[i].x); + Vector3 color_xy0 = color[i][2].lerp(color[i][3], pos_fract[i].x); + Vector3 blend_z0 = color_x00.lerp(color_xy0, pos_fract[i].y); - Vector3 color_x0z = color[i][4].linear_interpolate(color[i][5], pos_fract[i].x); - Vector3 color_xyz = color[i][6].linear_interpolate(color[i][7], pos_fract[i].x); - Vector3 blend_z1 = color_x0z.linear_interpolate(color_xyz, pos_fract[i].y); + Vector3 color_x0z = color[i][4].lerp(color[i][5], pos_fract[i].x); + Vector3 color_xyz = color[i][6].lerp(color[i][7], pos_fract[i].x); + Vector3 blend_z1 = color_x0z.lerp(color_xyz, pos_fract[i].y); - color_interp[i] = blend_z0.linear_interpolate(blend_z1, pos_fract[i].z); + color_interp[i] = blend_z0.lerp(blend_z1, pos_fract[i].z); float alpha_x00 = Math::lerp(alpha[i][0], alpha[i][1], pos_fract[i].x); float alpha_xy0 = Math::lerp(alpha[i][2], alpha[i][3], pos_fract[i].x); @@ -1369,7 +1369,7 @@ _FORCE_INLINE_ static void _light_capture_sample_octree(const RasterizerStorage: alpha_interp[i] = Math::lerp(alpha_z0, alpha_z1, pos_fract[i].z); } - r_color = color_interp[0].linear_interpolate(color_interp[1], level_filter); + r_color = color_interp[0].lerp(color_interp[1], level_filter); r_alpha = Math::lerp(alpha_interp[0], alpha_interp[1], level_filter); //print_line("pos: " + p_posf + " level " + rtos(p_level) + " down to " + itos(target_level) + "." + rtos(level_filter) + " color " + r_color + " alpha " + rtos(r_alpha)); @@ -1850,12 +1850,13 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c real_t z = i == 0 ? -1 : 1; Vector<Plane> planes; - planes.resize(5); + planes.resize(6); planes.write[0] = light_transform.xform(Plane(Vector3(0, 0, z), radius)); planes.write[1] = light_transform.xform(Plane(Vector3(1, 0, z).normalized(), radius)); planes.write[2] = light_transform.xform(Plane(Vector3(-1, 0, z).normalized(), radius)); planes.write[3] = light_transform.xform(Plane(Vector3(0, 1, z).normalized(), radius)); planes.write[4] = light_transform.xform(Plane(Vector3(0, -1, z).normalized(), radius)); + planes.write[5] = light_transform.xform(Plane(Vector3(0, 0, -z), 0)); int cull_count = p_scenario->octree.cull_convex(planes, instance_shadow_cull_result, MAX_INSTANCE_CULL, RS::INSTANCE_GEOMETRY_MASK); Plane near_plane(light_transform.origin, light_transform.basis.get_axis(2) * z); diff --git a/servers/rendering/rendering_server_scene.h b/servers/rendering/rendering_server_scene.h index db2fbd6707..eb66cea3aa 100644 --- a/servers/rendering/rendering_server_scene.h +++ b/servers/rendering/rendering_server_scene.h @@ -82,7 +82,7 @@ public: Camera() { visible_layers = 0xFFFFFFFF; - fov = 70; + fov = 75; type = PERSPECTIVE; znear = 0.05; zfar = 100; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 57a34f24cf..908f05702c 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -2400,6 +2400,9 @@ RenderingServer::RenderingServer() { GLOBAL_DEF_RST("rendering/vram_compression/import_etc2", true); GLOBAL_DEF_RST("rendering/vram_compression/import_pvrtc", false); + GLOBAL_DEF("rendering/limits/time/time_rollover_secs", 3600); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/time/time_rollover_secs", PropertyInfo(Variant::FLOAT, "rendering/limits/time/time_rollover_secs", PROPERTY_HINT_RANGE, "0,10000,1,or_greater")); + GLOBAL_DEF("rendering/quality/directional_shadow/size", 4096); GLOBAL_DEF("rendering/quality/directional_shadow/size.mobile", 2048); ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/directional_shadow/size", PropertyInfo(Variant::INT, "rendering/quality/directional_shadow/size", PROPERTY_HINT_RANGE, "256,16384")); diff --git a/thirdparty/README.md b/thirdparty/README.md index 7518f5d0f7..1a3588e0e0 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -27,7 +27,7 @@ Files extracted from upstream source: ## basis_universal - Upstream: https://github.com/BinomialLLC/basis_universal -- Version: git (895ee8e, 2020) +- Version: git (895ee8ee7e04f22267f8d16d46de04d5a01d63ac, 2020) - License: Apache 2.0 Files extracted from upstream source: @@ -40,11 +40,10 @@ Files extracted from upstream source: ## bullet - Upstream: https://github.com/bulletphysics/bullet3 -- Version: 2.90 (master cd8cf7521cbb8b7808126a6adebd47bb83ea166a) +- Version: git pre-2.90 (cd8cf7521cbb8b7808126a6adebd47bb83ea166a, 2020) - License: zlib Important: Synced with a pre-release version of bullet 2.90 from the master branch. -Commit hash: cd8cf7521cbb8b7808126a6adebd47bb83ea166a Files extracted from upstream source: @@ -55,7 +54,7 @@ Files extracted from upstream source: ## certs - Upstream: Mozilla, via https://apps.fedoraproject.org/packages/ca-certificates -- Version: 2018.2.26 +- Version: 2018.2.26 (2018) - License: MPL 2.0 File extracted from a recent Fedora install: @@ -67,7 +66,7 @@ as it's generated on the user's system.) ## cvtt - Upstream: https://github.com/elasota/cvtt -- Version: 1.0.0-beta4 +- Version: 1.0.0-beta4 (2018) - License: MIT Files extracted from upstream source: @@ -78,7 +77,7 @@ Files extracted from upstream source: ## enet - Upstream: http://enet.bespin.org -- Version: 1.3.14 (0eaf48e, 2019) +- Version: 1.3.15 (224f31101fc60939c02f6bbe8e8fc810a7db306b, 2020) - License: MIT Files extracted from upstream source: @@ -88,21 +87,21 @@ Files extracted from upstream source: - LICENSE file Important: enet.h, host.c, protocol.c have been slightly modified -to be usable by godot socket implementation and allow IPv6. -Apply the patch in the `patches/` folder when syncing on newer upstream +to be usable by godot socket implementation and allow IPv6 and DTLS. +Apply the patches in the `patches/` folder when syncing on newer upstream commits. Two files (godot.cpp and enet/godot.h) have been added to provide enet socket implementation using Godot classes. It is still possible to build against a system wide ENet but doing so -will limit it's functionality to IPv4 only. +will limit its functionality to IPv4 only. ## etc2comp - Upstream: https://github.com/google/etc2comp -- Version: git (9cd0f9c, 2017) +- Version: git (9cd0f9cae0f32338943699bb418107db61bb66f2, 2017) - License: Apache 2.0 Files extracted from upstream source: @@ -120,7 +119,7 @@ comments. ### Noto Sans - Upstream: https://github.com/googlei18n/noto-fonts -- Version: 1.06 +- Version: 1.06 (2017) - License: OFL-1.1 Use UI font variant if available, because it has tight vertical metrics and good for UI. @@ -128,7 +127,7 @@ Use UI font variant if available, because it has tight vertical metrics and good ### Hack Regular - Upstream: https://github.com/source-foundry/Hack -- Version: 3.003 +- Version: 3.003 (2018) - License: MIT + Bitstream Vera License ### DroidSans*.ttf @@ -141,7 +140,7 @@ Use UI font variant if available, because it has tight vertical metrics and good ## freetype - Upstream: https://www.freetype.org -- Version: 2.10.1 +- Version: 2.10.1 (2019) - License: FreeType License (BSD-like) Files extracted from upstream source: @@ -154,7 +153,7 @@ Files extracted from upstream source: ## glad - Upstream: https://github.com/Dav1dde/glad -- Version: 0.1.33 +- Version: 0.1.33 (2019) - License: MIT The files we package are automatically generated. @@ -198,7 +197,7 @@ Patches in the `patches` directory should be re-applied after updates. ## libogg - Upstream: https://www.xiph.org/ogg -- Version: git (c8fca6b, 2019) +- Version: git (c8fca6b4a02d695b1ceea39b330d4406001c03ed, 2019) - License: BSD-3-Clause Files extracted from upstream source: @@ -211,7 +210,7 @@ Files extracted from upstream source: ## libpng - Upstream: http://libpng.org/pub/png/libpng.html -- Version: 1.6.37 +- Version: 1.6.37 (2019) - License: libpng/zlib Files extracted from upstream source: @@ -226,7 +225,7 @@ Files extracted from upstream source: ## libsimplewebm - Upstream: https://github.com/zaps166/libsimplewebm -- Version: git (fe57fd3, 2019) +- Version: git (fe57fd3cfe6c0af4c6af110b1f84a90cf191d943, 2019) - License: MIT (main), BSD-3-Clause (libwebm) This contains libwebm, but the version in use is updated from the one used by libsimplewebm, @@ -245,7 +244,7 @@ comments. ## libtheora - Upstream: https://www.theora.org -- Version: 1.1.1 +- Version: 1.1.1 (2010) - License: BSD-3-Clause Files extracted from upstream source: @@ -261,7 +260,7 @@ on top of the 1.1.1 source (not included in any stable release yet). ## libvorbis - Upstream: https://www.xiph.org/vorbis -- Version: 1.3.6 +- Version: 1.3.6 (2018) - License: BSD-3-Clause Files extracted from upstream source: @@ -274,7 +273,7 @@ Files extracted from upstream source: ## libvpx - Upstream: https://chromium.googlesource.com/webm/libvpx/ -- Version: 1.6.0 +- Version: 1.6.0 (2016) - License: BSD-3-Clause Files extracted from upstream source: @@ -291,7 +290,7 @@ from the Android NDK r18. ## libwebp - Upstream: https://chromium.googlesource.com/webm/libwebp/ -- Version: 1.1.0 +- Version: 1.1.0 (2020) - License: BSD-3-Clause Files extracted from upstream source: @@ -307,7 +306,7 @@ changes are marked with `// -- GODOT --` comments. ## mbedtls - Upstream: https://tls.mbed.org/ -- Version: 2.16.6 +- Version: 2.16.6 (2020) - License: Apache 2.0 File extracted from upstream release tarball (`-apache.tgz` variant): @@ -327,7 +326,7 @@ File extracted from upstream release tarball (`-apache.tgz` variant): ## miniupnpc - Upstream: https://github.com/miniupnp/miniupnp/tree/master/miniupnpc -- Version: git (4436632, 2020) +- Version: git (44366328661826603982d1e0d7ebb4062c5f2bfc, 2020) - License: BSD-3-Clause Files extracted from upstream source: @@ -343,7 +342,7 @@ The only modified file is miniupnpcstrings.h, which was created for Godot ## minizip - Upstream: http://www.zlib.net -- Version: 1.2.11 (zlib contrib) +- Version: 1.2.11 (zlib contrib, 2017) - License: zlib Files extracted from the upstream source: @@ -363,15 +362,15 @@ Collection of single-file libraries used in Godot components. - `clipper.{cpp,hpp}` * Upstream: https://sourceforge.net/projects/polyclipping - * Version: 6.4.2 + Godot changes (added optional exceptions handling) + * Version: 6.4.2 (2017) + Godot changes (added optional exceptions handling) * License: BSL-1.0 - `cubemap_coeffs.h` * Upstream: https://research.activision.com/publications/archives/fast-filtering-of-reflection-probes - File coeffs_const_8.txt + File coeffs_const_8.txt (retrieved April 2020) * License: MIT - `fastlz.{c,h}` * Upstream: https://github.com/ariya/FastLZ - * Version: git (f121734, 2007) + * Version: 0.5.0 (4f20f54d46f5a6dd4fae4def134933369b7602d2, 2020) * License: MIT - `hq2x.{cpp,h}` * Upstream: https://github.com/brunexgeek/hqx @@ -379,7 +378,7 @@ Collection of single-file libraries used in Godot components. * License: Apache 2.0 - `open-simplex-noise.{c,h}` * Upstream: https://github.com/smcameron/open-simplex-noise-in-c - * Version: git (0d555e7, 2015) + * Version: git (0d555e7f40527d0870906fe9469a3b1bb4020b7f, 2015) + custom changes * License: Unlicense - `pcg.{cpp,h}` * Upstream: http://www.pcg-random.org @@ -387,7 +386,7 @@ Collection of single-file libraries used in Godot components. * License: Apache 2.0 - `smaz.{c,h}` * Upstream: https://github.com/antirez/smaz - * Version: git (150e125, 2009) + * Version: git (150e125cbae2e8fd20dd332432776ce13395d4d4, 2009) * License: BSD-3-Clause * Modifications: use `const char*` instead of `char*` for input string - `triangulator.{cpp,h}` @@ -397,10 +396,6 @@ Collection of single-file libraries used in Godot components. ### modules -- `curl_hostcheck.{c,h}` - * Upstream: https://curl.haxx.se/ - * Version: ? (2013) - * License: MIT - `yuv2rgb.h` * Upstream: http://wss.co.uk/pinknoise/yuv2rgb/ (to check) * Version: ? @@ -410,29 +405,30 @@ Collection of single-file libraries used in Godot components. - `ifaddrs-android.{cc,h}` * Upstream: https://chromium.googlesource.com/external/webrtc/stable/talk/+/master/base/ifaddrs-android.h - * Version: git (5976650, 2013) + * Version: git (5976650443d68ccfadf1dea24999ee459dd2819d, 2013) * License: BSD-3-Clause ### scene - `easing_equations.cpp` * Upstream: http://robertpenner.com/easing/ via https://github.com/jesusgollonet/ofpennereasing (modified to fit Godot types) - * Version: git (af72c14, 2008) + Godot types and style changes + * Version: git (af72c147c3a74e7e872aa28c7e2abfcced04fdce, 2008) + Godot types and style changes * License: BSD-3-Clause - `mikktspace.{c,h}` - * Upstream: https://wiki.blender.org/index.php/Dev:Shading/Tangent_Space_Normal_Maps - * Version: 1.0 + * Upstream: https://archive.blender.org/wiki/index.php/Dev:Shading/Tangent_Space_Normal_Maps/ + * Version: 1.0 (2011) * License: zlib - `stb_vorbis.c` * Upstream: https://github.com/nothings/stb - * Version: 1.17 + * Version: 1.19 * License: Public Domain (Unlicense) or MIT + * Modifications: `f->temp_offset += (sz+3)&~3;` changed to `f->temp_offset += (sz+7)&~7;` (needed until fixed upstream) ## nanosvg - Upstream: https://github.com/memononen/nanosvg -- Version: git (25241c5, 2019) +- Version: git (25241c5a8f8451d41ab1b02ab2d865b01600d949, 2019) - License: zlib Files extracted from the upstream source: @@ -444,7 +440,7 @@ Files extracted from the upstream source: ## opus - Upstream: https://opus-codec.org -- Version: 1.1.5 (opus) and 0.8 (opusfile) +- Version: 1.1.5 (opus) and 0.8 (opusfile) (2017) - License: BSD-3-Clause Files extracted from upstream source: @@ -461,14 +457,13 @@ Files extracted from upstream source: ## pcre2 - Upstream: http://www.pcre.org -- Version: 10.33 +- Version: 10.34 (2019) - License: BSD-3-Clause Files extracted from upstream source: - Files listed in the file NON-AUTOTOOLS-BUILD steps 1-4 - All .h files in src/ apart from pcre2posix.h -- src/pcre2_jit_compile.c - src/pcre2_jit_match.c - src/pcre2_jit_misc.c - src/sljit/* @@ -478,7 +473,7 @@ Files extracted from upstream source: ## pvrtccompressor - Upstream: https://bitbucket.org/jthlim/pvrtccompressor -- Version: hg (cf71777, 2015) +- Version: hg (cf7177748ee0dcdccfe89716dc11a47d2dc81af5, 2015) - License: BSD-3-Clause Files extracted from upstream source: @@ -490,19 +485,19 @@ Files extracted from upstream source: ## recastnavigation - Upstream: https://github.com/recastnavigation/recastnavigation -- Version: git (ef3ea40f, 2017) +- Version: git (57610fa6ef31b39020231906f8c5d40eaa8294ae, 2019) - License: zlib Files extracted from upstream source: -- `Recast/` folder +- `Recast/` folder without `CMakeLists.txt` - License.txt -## Rvo2 +## rvo2 - Upstream: http://gamma.cs.unc.edu/RVO2/ -- Version: 3D - 1.0.1 +- Version: 3D - 1.0.1 (2016) - License: Apache 2.0 Files extracted from upstream source: @@ -518,7 +513,7 @@ Godot. Please check the file to know what's new. ## squish - Upstream: https://sourceforge.net/projects/libsquish -- Version: 1.15 +- Version: 1.15 (2017) - License: MIT Files extracted from upstream source: @@ -533,7 +528,7 @@ comments and a patch is provided in the squish/ folder. ## tinyexr - Upstream: https://github.com/syoyo/tinyexr -- Version: git (656bb61, 2019) +- Version: git (4dbd05a22f51a2d7462311569b8b0cba0bbe2ac5, 2020) - License: BSD-3-Clause Files extracted from upstream source: @@ -544,7 +539,7 @@ Files extracted from upstream source: ## vhacd - Upstream: https://github.com/kmammou/v-hacd -- Version: git (b07958e, 2019) +- Version: git (b07958e18e01d504e3af80eeaeb9f033226533d7, 2019) - License: BSD-3-Clause Files extracted from upstream source: @@ -561,7 +556,7 @@ folder. ## vulkan - Upstream: https://github.com/KhronosGroup/Vulkan-Loader -- Version: sdk-1.2.131.2 +- Version: sdk-1.2.131.2 (2020) - License: Apache 2.0 Unless there is a specific reason to package a more recent version, please stick @@ -583,7 +578,7 @@ Includes custom change to disable MSVC pragma, might be upstreamed via: https://github.com/KhronosGroup/Vulkan-ValidationLayers/pull/1666 `vk_mem_alloc.h` is taken from https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator -Version: 2.3.0 +Version: 2.3.0 (2019) Patches in the `patches` directory should be re-applied after updates. @@ -591,7 +586,7 @@ Patches in the `patches` directory should be re-applied after updates. ## wslay - Upstream: https://github.com/tatsuhiro-t/wslay -- Version: 1.1.0 +- Version: 1.1.0 (2018) - License: MIT File extracted from upstream release tarball: @@ -616,7 +611,7 @@ Files extracted from upstream source: ## zlib - Upstream: http://www.zlib.net -- Version: 1.2.11 +- Version: 1.2.11 (2017) - License: zlib Files extracted from upstream source: @@ -627,7 +622,7 @@ Files extracted from upstream source: ## zstd - Upstream: https://github.com/facebook/zstd -- Version: 1.4.4 +- Version: 1.4.4 (2019) - License: BSD-3-Clause Files extracted from upstream source: diff --git a/thirdparty/enet/LICENSE b/thirdparty/enet/LICENSE index 78d9dcf613..6906f8eb0b 100644 --- a/thirdparty/enet/LICENSE +++ b/thirdparty/enet/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2002-2019 Lee Salzman +Copyright (c) 2002-2020 Lee Salzman 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: diff --git a/thirdparty/enet/enet/enet.h b/thirdparty/enet/enet/enet.h index ac7552adb2..3900353c34 100644 --- a/thirdparty/enet/enet/enet.h +++ b/thirdparty/enet/enet/enet.h @@ -22,7 +22,7 @@ extern "C" #define ENET_VERSION_MAJOR 1 #define ENET_VERSION_MINOR 3 -#define ENET_VERSION_PATCH 14 +#define ENET_VERSION_PATCH 15 #define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch)) #define ENET_VERSION_GET_MAJOR(version) (((version)>>16)&0xFF) #define ENET_VERSION_GET_MINOR(version) (((version)>>8)&0xFF) @@ -248,6 +248,11 @@ typedef struct _ENetChannel ENetList incomingUnreliableCommands; } ENetChannel; +typedef enum _ENetPeerFlag +{ + ENET_PEER_FLAG_NEEDS_DISPATCH = (1 << 0) +} ENetPeerFlag; + /** * An ENet peer which data packets may be sent or received from. * @@ -309,7 +314,9 @@ typedef struct _ENetPeer ENetList outgoingReliableCommands; ENetList outgoingUnreliableCommands; ENetList dispatchedCommands; - int needsDispatch; + enet_uint16 flags; + enet_uint8 roundTripTimeRemainder; + enet_uint8 roundTripTimeVarianceRemainder; enet_uint16 incomingUnsequencedGroup; enet_uint16 outgoingUnsequencedGroup; enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32]; diff --git a/thirdparty/enet/enet/utility.h b/thirdparty/enet/enet/utility.h index e48a476be3..b04bb7a5b3 100644 --- a/thirdparty/enet/enet/utility.h +++ b/thirdparty/enet/enet/utility.h @@ -7,6 +7,7 @@ #define ENET_MAX(x, y) ((x) > (y) ? (x) : (y)) #define ENET_MIN(x, y) ((x) < (y) ? (x) : (y)) +#define ENET_DIFFERENCE(x, y) ((x) < (y) ? (y) - (x) : (x) - (y)) #endif /* __ENET_UTILITY_H__ */ diff --git a/thirdparty/enet/patches/dtls_support.patch b/thirdparty/enet/patches/dtls_support.patch new file mode 100644 index 0000000000..ce3480a858 --- /dev/null +++ b/thirdparty/enet/patches/dtls_support.patch @@ -0,0 +1,13 @@ +diff --git a/thirdparty/enet/enet/enet.h b/thirdparty/enet/enet/enet.h +index 966e3a465d..ac7552adb2 100644 +--- a/thirdparty/enet/enet/enet.h ++++ b/thirdparty/enet/enet/enet.h +@@ -578,6 +578,8 @@ ENET_API void enet_host_channel_limit (ENetHost *, size_t); + ENET_API void enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32); + extern void enet_host_bandwidth_throttle (ENetHost *); + extern enet_uint32 enet_host_random_seed (void); ++ENET_API void enet_host_dtls_server_setup (ENetHost *, void *, void *); ++ENET_API void enet_host_dtls_client_setup (ENetHost *, void *, uint8_t, const char *); + + ENET_API int enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *); + ENET_API ENetPacket * enet_peer_receive (ENetPeer *, enet_uint8 * channelID); diff --git a/thirdparty/enet/peer.c b/thirdparty/enet/peer.c index e2d0872bd3..1278b85a80 100644 --- a/thirdparty/enet/peer.c +++ b/thirdparty/enet/peer.c @@ -66,7 +66,7 @@ enet_peer_throttle (ENetPeer * peer, enet_uint32 rtt) peer -> packetThrottle = peer -> packetThrottleLimit; } else - if (rtt < peer -> lastRoundTripTime) + if (rtt <= peer -> lastRoundTripTime) { peer -> packetThrottle += peer -> packetThrottleAcceleration; @@ -76,7 +76,7 @@ enet_peer_throttle (ENetPeer * peer, enet_uint32 rtt) return 1; } else - if (rtt > peer -> lastRoundTripTime + 2 * peer -> lastRoundTripTimeVariance) + if (rtt >= peer -> lastRoundTripTime + 2 * peer -> lastRoundTripTimeVariance) { if (peer -> packetThrottle > peer -> packetThrottleDeceleration) peer -> packetThrottle -= peer -> packetThrottleDeceleration; @@ -306,11 +306,11 @@ enet_peer_reset_queues (ENetPeer * peer) { ENetChannel * channel; - if (peer -> needsDispatch) + if (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH) { enet_list_remove (& peer -> dispatchList); - peer -> needsDispatch = 0; + peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH; } while (! enet_list_empty (& peer -> acknowledgements)) @@ -418,6 +418,9 @@ enet_peer_reset (ENetPeer * peer) peer -> outgoingUnsequencedGroup = 0; peer -> eventData = 0; peer -> totalWaitingData = 0; + peer -> flags = 0; + peer -> roundTripTimeRemainder = 0; + peer -> roundTripTimeVarianceRemainder = 0; memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow)); @@ -724,11 +727,11 @@ enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * { enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); - if (! peer -> needsDispatch) + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) { enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); - peer -> needsDispatch = 1; + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; } droppedCommand = currentCommand; @@ -752,11 +755,11 @@ enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * { enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); - if (! peer -> needsDispatch) + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) { enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); - peer -> needsDispatch = 1; + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; } } } @@ -768,11 +771,11 @@ enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * { enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); - if (! peer -> needsDispatch) + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) { enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); - peer -> needsDispatch = 1; + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; } droppedCommand = currentCommand; @@ -809,11 +812,11 @@ enet_peer_dispatch_incoming_reliable_commands (ENetPeer * peer, ENetChannel * ch enet_list_move (enet_list_end (& peer -> dispatchedCommands), enet_list_begin (& channel -> incomingReliableCommands), enet_list_previous (currentCommand)); - if (! peer -> needsDispatch) + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) { enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); - peer -> needsDispatch = 1; + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; } if (! enet_list_empty (& channel -> incomingUnreliableCommands)) diff --git a/thirdparty/enet/protocol.c b/thirdparty/enet/protocol.c index 28ad5fc41c..fefc0e6f0a 100644 --- a/thirdparty/enet/protocol.c +++ b/thirdparty/enet/protocol.c @@ -48,11 +48,11 @@ enet_protocol_dispatch_state (ENetHost * host, ENetPeer * peer, ENetPeerState st { enet_protocol_change_state (host, peer, state); - if (! peer -> needsDispatch) + if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH)) { enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList); - peer -> needsDispatch = 1; + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; } } @@ -63,7 +63,7 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) { ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatchQueue)); - peer -> needsDispatch = 0; + peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH; switch (peer -> state) { @@ -101,7 +101,7 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) if (! enet_list_empty (& peer -> dispatchedCommands)) { - peer -> needsDispatch = 1; + peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH; enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList); } @@ -851,24 +851,29 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * if (ENET_TIME_LESS (host -> serviceTime, receivedSentTime)) return 0; - peer -> lastReceiveTime = host -> serviceTime; - peer -> earliestTimeout = 0; - roundTripTime = ENET_TIME_DIFFERENCE (host -> serviceTime, receivedSentTime); + roundTripTime = ENET_MAX (roundTripTime, 1); - enet_peer_throttle (peer, roundTripTime); + if (peer -> lastReceiveTime > 0) + { + enet_uint32 accumRoundTripTime = (peer -> roundTripTime << 8) + peer -> roundTripTimeRemainder; + enet_uint32 accumRoundTripTimeVariance = (peer -> roundTripTimeVariance << 8) + peer -> roundTripTimeVarianceRemainder; - peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4; + enet_peer_throttle (peer, roundTripTime); - if (roundTripTime >= peer -> roundTripTime) - { - peer -> roundTripTime += (roundTripTime - peer -> roundTripTime) / 8; - peer -> roundTripTimeVariance += (roundTripTime - peer -> roundTripTime) / 4; + roundTripTime <<= 8; + accumRoundTripTimeVariance = (accumRoundTripTimeVariance * 3 + ENET_DIFFERENCE (roundTripTime, accumRoundTripTime)) / 4; + accumRoundTripTime = (accumRoundTripTime * 7 + roundTripTime) / 8; + + peer -> roundTripTime = accumRoundTripTime >> 8; + peer -> roundTripTimeRemainder = accumRoundTripTime & 0xFF; + peer -> roundTripTimeVariance = accumRoundTripTimeVariance >> 8; + peer -> roundTripTimeVarianceRemainder = accumRoundTripTimeVariance & 0xFF; } else { - peer -> roundTripTime -= (peer -> roundTripTime - roundTripTime) / 8; - peer -> roundTripTimeVariance += (peer -> roundTripTime - roundTripTime) / 4; + peer -> roundTripTime = roundTripTime; + peer -> roundTripTimeVariance = (roundTripTime + 1) / 2; } if (peer -> roundTripTime < peer -> lowestRoundTripTime) @@ -881,12 +886,15 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> packetThrottleEpoch) >= peer -> packetThrottleInterval) { peer -> lastRoundTripTime = peer -> lowestRoundTripTime; - peer -> lastRoundTripTimeVariance = peer -> highestRoundTripTimeVariance; + peer -> lastRoundTripTimeVariance = ENET_MAX (peer -> highestRoundTripTimeVariance, 2); peer -> lowestRoundTripTime = peer -> roundTripTime; peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance; peer -> packetThrottleEpoch = host -> serviceTime; } + peer -> lastReceiveTime = ENET_MAX (host -> serviceTime, 1); + peer -> earliestTimeout = 0; + receivedReliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedReliableSequenceNumber); commandNumber = enet_protocol_remove_sent_reliable_command (peer, receivedReliableSequenceNumber, command -> header.channelID); @@ -1261,7 +1269,7 @@ enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) } } - return -1; + return 0; } static void @@ -1663,19 +1671,9 @@ enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int ch #ifdef ENET_DEBUG printf ("peer %u: %f%%+-%f%% packet loss, %u+-%u ms round trip time, %f%% throttle, %u/%u outgoing, %u/%u incoming\n", currentPeer -> incomingPeerID, currentPeer -> packetLoss / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> packetLossVariance / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> roundTripTime, currentPeer -> roundTripTimeVariance, currentPeer -> packetThrottle / (float) ENET_PEER_PACKET_THROTTLE_SCALE, enet_list_size (& currentPeer -> outgoingReliableCommands), enet_list_size (& currentPeer -> outgoingUnreliableCommands), currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingReliableCommands) : 0, currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingUnreliableCommands) : 0); #endif - - currentPeer -> packetLossVariance -= currentPeer -> packetLossVariance / 4; - if (packetLoss >= currentPeer -> packetLoss) - { - currentPeer -> packetLoss += (packetLoss - currentPeer -> packetLoss) / 8; - currentPeer -> packetLossVariance += (packetLoss - currentPeer -> packetLoss) / 4; - } - else - { - currentPeer -> packetLoss -= (currentPeer -> packetLoss - packetLoss) / 8; - currentPeer -> packetLossVariance += (currentPeer -> packetLoss - packetLoss) / 4; - } + currentPeer -> packetLossVariance = (currentPeer -> packetLossVariance * 3 + ENET_DIFFERENCE (packetLoss, currentPeer -> packetLoss)) / 4; + currentPeer -> packetLoss = (currentPeer -> packetLoss * 7 + packetLoss) / 8; currentPeer -> packetLossEpoch = host -> serviceTime; currentPeer -> packetsSent = 0; diff --git a/thirdparty/jpeg-compressor/jpgd.cpp b/thirdparty/jpeg-compressor/jpgd.cpp index 257d0b7574..baf6ea0484 100644 --- a/thirdparty/jpeg-compressor/jpgd.cpp +++ b/thirdparty/jpeg-compressor/jpgd.cpp @@ -37,16 +37,14 @@ #ifndef JPGD_USE_SSE2 - #if defined(__GNUC__) - - #if (defined(__x86_64__) || defined(_M_X64)) - #if defined(__SSE2__) - #define JPGD_USE_SSE2 (1) - #endif + #if defined(__GNUC__) + #if defined(__SSE2__) + #define JPGD_USE_SSE2 (1) + #endif + #elif defined(_MSC_VER) + #if defined(_M_X64) + #define JPGD_USE_SSE2 (1) #endif - - #else - #define JPGD_USE_SSE2 (1) #endif #endif diff --git a/thirdparty/jpeg-compressor/patches/fix-msvc-sse2-detection.patch b/thirdparty/jpeg-compressor/patches/fix-msvc-sse2-detection.patch new file mode 100644 index 0000000000..830b03b0c0 --- /dev/null +++ b/thirdparty/jpeg-compressor/patches/fix-msvc-sse2-detection.patch @@ -0,0 +1,44 @@ +From ae74fa2fcdef8ec44b925a649f66e8cbefce8315 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= <rverschelde@gmail.com> +Date: Thu, 7 May 2020 12:14:09 +0200 +Subject: [PATCH] Fix detection of SSE2 with Visual Studio + +The previous code assumed that SSE2 is available when building with +Visual Studio, but that's not accurate on ARM with UWP. + +SSE2 could also be enabled on x86 if `_M_IX86_FP == 2`, but it requires +checking first that it's not actually set to 2 for AVX, AVX2 or AVX512 +(see https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2019), +so I left it out for this quick fix. +--- + jpgd.cpp | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +diff --git a/jpgd.cpp b/jpgd.cpp +index 91e66ad..db1f3b4 100644 +--- a/jpgd.cpp ++++ b/jpgd.cpp +@@ -37,16 +37,14 @@ + + #ifndef JPGD_USE_SSE2 + +- #if defined(__GNUC__) +- +- #if (defined(__x86_64__) || defined(_M_X64)) +- #if defined(__SSE2__) +- #define JPGD_USE_SSE2 (1) +- #endif ++ #if defined(__GNUC__) ++ #if defined(__SSE2__) ++ #define JPGD_USE_SSE2 (1) ++ #endif ++ #elif defined(_MSC_VER) ++ #if defined(_M_X64) ++ #define JPGD_USE_SSE2 (1) + #endif +- +- #else +- #define JPGD_USE_SSE2 (1) + #endif + + #endif diff --git a/thirdparty/misc/curl_hostcheck.c b/thirdparty/misc/curl_hostcheck.c deleted file mode 100644 index feef232619..0000000000 --- a/thirdparty/misc/curl_hostcheck.c +++ /dev/null @@ -1,217 +0,0 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -/* This file is an amalgamation of hostcheck.c and most of rawstr.c - from cURL. The contents of the COPYING file mentioned above are: - -COPYRIGHT AND PERMISSION NOTICE - -Copyright (c) 1996 - 2013, Daniel Stenberg, <daniel@haxx.se>. - -All rights reserved. - -Permission to use, copy, modify, and distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright -notice and this permission notice appear in all copies. - -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 OF THIRD PARTY RIGHTS. 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. - -Except as contained in this notice, the name of a copyright holder shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization of the copyright holder. -*/ - -#include "curl_hostcheck.h" -#include <string.h> - -/* Portable, consistent toupper (remember EBCDIC). Do not use toupper() because - its behavior is altered by the current locale. */ -static char Curl_raw_toupper(char in) -{ - switch (in) { - case 'a': - return 'A'; - case 'b': - return 'B'; - case 'c': - return 'C'; - case 'd': - return 'D'; - case 'e': - return 'E'; - case 'f': - return 'F'; - case 'g': - return 'G'; - case 'h': - return 'H'; - case 'i': - return 'I'; - case 'j': - return 'J'; - case 'k': - return 'K'; - case 'l': - return 'L'; - case 'm': - return 'M'; - case 'n': - return 'N'; - case 'o': - return 'O'; - case 'p': - return 'P'; - case 'q': - return 'Q'; - case 'r': - return 'R'; - case 's': - return 'S'; - case 't': - return 'T'; - case 'u': - return 'U'; - case 'v': - return 'V'; - case 'w': - return 'W'; - case 'x': - return 'X'; - case 'y': - return 'Y'; - case 'z': - return 'Z'; - } - return in; -} - -/* - * Curl_raw_equal() is for doing "raw" case insensitive strings. This is meant - * to be locale independent and only compare strings we know are safe for - * this. See http://daniel.haxx.se/blog/2008/10/15/strcasecmp-in-turkish/ for - * some further explanation to why this function is necessary. - * - * The function is capable of comparing a-z case insensitively even for - * non-ascii. - */ - -static int Curl_raw_equal(const char *first, const char *second) -{ - while(*first && *second) { - if(Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) - /* get out of the loop as soon as they don't match */ - break; - first++; - second++; - } - /* we do the comparison here (possibly again), just to make sure that if the - loop above is skipped because one of the strings reached zero, we must not - return this as a successful match */ - return (Curl_raw_toupper(*first) == Curl_raw_toupper(*second)); -} - -static int Curl_raw_nequal(const char *first, const char *second, size_t max) -{ - while(*first && *second && max) { - if(Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) { - break; - } - max--; - first++; - second++; - } - if(0 == max) - return 1; /* they are equal this far */ - - return Curl_raw_toupper(*first) == Curl_raw_toupper(*second); -} - -/* - * Match a hostname against a wildcard pattern. - * E.g. - * "foo.host.com" matches "*.host.com". - * - * We use the matching rule described in RFC6125, section 6.4.3. - * http://tools.ietf.org/html/rfc6125#section-6.4.3 - */ - -static int hostmatch(const char *hostname, const char *pattern) -{ - const char *pattern_label_end, *pattern_wildcard, *hostname_label_end; - int wildcard_enabled; - size_t prefixlen, suffixlen; - pattern_wildcard = strchr(pattern, '*'); - if(pattern_wildcard == NULL) - return Curl_raw_equal(pattern, hostname) ? - CURL_HOST_MATCH : CURL_HOST_NOMATCH; - - /* We require at least 2 dots in pattern to avoid too wide wildcard - match. */ - wildcard_enabled = 1; - pattern_label_end = strchr(pattern, '.'); - if(pattern_label_end == NULL || strchr(pattern_label_end+1, '.') == NULL || - pattern_wildcard > pattern_label_end || - Curl_raw_nequal(pattern, "xn--", 4)) { - wildcard_enabled = 0; - } - if(!wildcard_enabled) - return Curl_raw_equal(pattern, hostname) ? - CURL_HOST_MATCH : CURL_HOST_NOMATCH; - - hostname_label_end = strchr(hostname, '.'); - if(hostname_label_end == NULL || - !Curl_raw_equal(pattern_label_end, hostname_label_end)) - return CURL_HOST_NOMATCH; - - /* The wildcard must match at least one character, so the left-most - label of the hostname is at least as large as the left-most label - of the pattern. */ - if(hostname_label_end - hostname < pattern_label_end - pattern) - return CURL_HOST_NOMATCH; - - prefixlen = pattern_wildcard - pattern; - suffixlen = pattern_label_end - (pattern_wildcard+1); - return Curl_raw_nequal(pattern, hostname, prefixlen) && - Curl_raw_nequal(pattern_wildcard+1, hostname_label_end - suffixlen, - suffixlen) ? - CURL_HOST_MATCH : CURL_HOST_NOMATCH; -} - -int Tool_Curl_cert_hostcheck(const char *match_pattern, const char *hostname) -{ - if(!match_pattern || !*match_pattern || - !hostname || !*hostname) /* sanity check */ - return 0; - - if(Curl_raw_equal(hostname, match_pattern)) /* trivial case */ - return 1; - - if(hostmatch(hostname,match_pattern) == CURL_HOST_MATCH) - return 1; - return 0; -} diff --git a/thirdparty/misc/curl_hostcheck.h b/thirdparty/misc/curl_hostcheck.h deleted file mode 100644 index 1b7fbe81e3..0000000000 --- a/thirdparty/misc/curl_hostcheck.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef HEADER_TOOL_CURL_HOSTCHECK_H -#define HEADER_TOOL_CURL_HOSTCHECK_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -#define CURL_HOST_NOMATCH 0 -#define CURL_HOST_MATCH 1 -int Tool_Curl_cert_hostcheck(const char *match_pattern, const char *hostname); - -#ifdef __cplusplus -} -#endif - -#endif /* HEADER_CURL_HOSTCHECK_H */ - diff --git a/thirdparty/misc/fastlz.c b/thirdparty/misc/fastlz.c index 508f6ea2ae..b4d2dd3c29 100644 --- a/thirdparty/misc/fastlz.c +++ b/thirdparty/misc/fastlz.c @@ -1,9 +1,6 @@ - /* - FastLZ - lightning-fast lossless compression library - - Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) - Copyright (C) 2006 Ariya Hidayat (ariya@kde.org) - Copyright (C) 2005 Ariya Hidayat (ariya@kde.org) +/* + FastLZ - Byte-aligned LZ77 compression library + Copyright (C) 2005-2020 Ariya Hidayat <ariya.hidayat@gmail.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24,239 +21,375 @@ THE SOFTWARE. */ -#if !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) +#include "fastlz.h" + +#include <stdint.h> /* * Always check for bound when decompressing. * Generally it is best to leave it defined. */ #define FASTLZ_SAFE +#if defined(FASTLZ_USE_SAFE_DECOMPRESSOR) && (FASTLZ_USE_SAFE_DECOMPRESSOR == 0) +#undef FASTLZ_SAFE +#endif /* * Give hints to the compiler for branch prediction optimization. */ -#if defined(__GNUC__) && (__GNUC__ > 2) -#define FASTLZ_EXPECT_CONDITIONAL(c) (__builtin_expect((c), 1)) -#define FASTLZ_UNEXPECT_CONDITIONAL(c) (__builtin_expect((c), 0)) +#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 2)) +#define FASTLZ_LIKELY(c) (__builtin_expect(!!(c), 1)) +#define FASTLZ_UNLIKELY(c) (__builtin_expect(!!(c), 0)) #else -#define FASTLZ_EXPECT_CONDITIONAL(c) (c) -#define FASTLZ_UNEXPECT_CONDITIONAL(c) (c) +#define FASTLZ_LIKELY(c) (c) +#define FASTLZ_UNLIKELY(c) (c) #endif -/* - * Use inlined functions for supported systems. - */ -#if defined(__GNUC__) || defined(__DMC__) || defined(__POCC__) || defined(__WATCOMC__) || defined(__SUNPRO_C) -#define FASTLZ_INLINE inline -#elif defined(__BORLANDC__) || defined(_MSC_VER) || defined(__LCC__) -#define FASTLZ_INLINE __inline -#else -#define FASTLZ_INLINE +#if defined(FASTLZ_SAFE) +#define FASTLZ_BOUND_CHECK(cond) \ + if (FASTLZ_UNLIKELY(!(cond))) return 0; +#else +#define FASTLZ_BOUND_CHECK(cond) \ + do { \ + } while (0) #endif -/* - * Prevent accessing more than 8-bit at once, except on x86 architectures. - */ -#if !defined(FASTLZ_STRICT_ALIGN) -#define FASTLZ_STRICT_ALIGN -#if defined(__i386__) || defined(__386) /* GNU C, Sun Studio */ -#undef FASTLZ_STRICT_ALIGN -#elif defined(__i486__) || defined(__i586__) || defined(__i686__) /* GNU C */ -#undef FASTLZ_STRICT_ALIGN -#elif defined(_M_IX86) /* Intel, MSVC */ -#undef FASTLZ_STRICT_ALIGN -#elif defined(__386) -#undef FASTLZ_STRICT_ALIGN -#elif defined(_X86_) /* MinGW */ -#undef FASTLZ_STRICT_ALIGN -#elif defined(__I86__) /* Digital Mars */ -#undef FASTLZ_STRICT_ALIGN -#endif -#endif +#define MAX_COPY 32 +#define MAX_LEN 264 /* 256 + 8 */ +#define MAX_L1_DISTANCE 8192 +#define MAX_L2_DISTANCE 8191 +#define MAX_FARDISTANCE (65535 + MAX_L2_DISTANCE - 1) + +#define FASTLZ_READU16(p) ((p)[0] | (p)[1] << 8) + +#define HASH_LOG 13 +#define HASH_SIZE (1 << HASH_LOG) +#define HASH_MASK (HASH_SIZE - 1) +#define HASH_FUNCTION(v, p) \ + { \ + v = FASTLZ_READU16(p); \ + v ^= FASTLZ_READU16(p + 1) ^ (v >> (16 - HASH_LOG)); \ + v &= HASH_MASK; \ + } -/* - * FIXME: use preprocessor magic to set this on different platforms! - */ -typedef unsigned char flzuint8; -typedef unsigned short flzuint16; -typedef unsigned int flzuint32; +int fastlz1_compress(const void* input, int length, void* output) { + const uint8_t* ip = (const uint8_t*)input; + const uint8_t* ip_bound = ip + length - 2; + const uint8_t* ip_limit = ip + length - 12 - 1; + uint8_t* op = (uint8_t*)output; -/* prototypes */ -int fastlz_compress(const void* input, int length, void* output); -int fastlz_compress_level(int level, const void* input, int length, void* output); -int fastlz_decompress(const void* input, int length, void* output, int maxout); + const uint8_t* htab[HASH_SIZE]; + uint32_t hval; -#define MAX_COPY 32 -#define MAX_LEN 264 /* 256 + 8 */ -#define MAX_DISTANCE 8192 + uint32_t copy; -#if !defined(FASTLZ_STRICT_ALIGN) -#define FASTLZ_READU16(p) *((const flzuint16*)(p)) -#else -#define FASTLZ_READU16(p) ((p)[0] | (p)[1]<<8) -#endif + /* sanity check */ + if (FASTLZ_UNLIKELY(length < 4)) { + if (length) { + /* create literal copy only */ + *op++ = length - 1; + ip_bound++; + while (ip <= ip_bound) *op++ = *ip++; + return length + 1; + } else + return 0; + } -#define HASH_LOG 13 -#define HASH_SIZE (1<< HASH_LOG) -#define HASH_MASK (HASH_SIZE-1) -#define HASH_FUNCTION(v,p) { v = FASTLZ_READU16(p); v ^= FASTLZ_READU16(p+1)^(v>>(16-HASH_LOG));v &= HASH_MASK; } - -#undef FASTLZ_LEVEL -#define FASTLZ_LEVEL 1 - -#undef FASTLZ_COMPRESSOR -#undef FASTLZ_DECOMPRESSOR -#define FASTLZ_COMPRESSOR fastlz1_compress -#define FASTLZ_DECOMPRESSOR fastlz1_decompress -static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output); -static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout); -#include "fastlz.c" - -#undef FASTLZ_LEVEL -#define FASTLZ_LEVEL 2 - -#undef MAX_DISTANCE -#define MAX_DISTANCE 8191 -#define MAX_FARDISTANCE (65535+MAX_DISTANCE-1) - -#undef FASTLZ_COMPRESSOR -#undef FASTLZ_DECOMPRESSOR -#define FASTLZ_COMPRESSOR fastlz2_compress -#define FASTLZ_DECOMPRESSOR fastlz2_decompress -static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output); -static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout); -#include "fastlz.c" - -int fastlz_compress(const void* input, int length, void* output) -{ - /* for short block, choose fastlz1 */ - if(length < 65536) - return fastlz1_compress(input, length, output); + /* initializes hash table */ + for (hval = 0; hval < HASH_SIZE; ++hval) htab[hval] = ip; - /* else... */ - return fastlz2_compress(input, length, output); + /* we start with literal copy */ + copy = 2; + *op++ = MAX_COPY - 1; + *op++ = *ip++; + *op++ = *ip++; + + /* main loop */ + while (FASTLZ_LIKELY(ip < ip_limit)) { + const uint8_t* ref; + uint32_t distance; + + /* minimum match length */ + uint32_t len = 3; + + /* comparison starting-point */ + const uint8_t* anchor = ip; + + /* find potential match */ + HASH_FUNCTION(hval, ip); + ref = htab[hval]; + + /* update hash table */ + htab[hval] = anchor; + + /* calculate distance to the match */ + distance = anchor - ref; + + /* is this a match? check the first 3 bytes */ + if (distance == 0 || (distance >= MAX_L1_DISTANCE) || *ref++ != *ip++ || + *ref++ != *ip++ || *ref++ != *ip++) + goto literal; + + /* last matched byte */ + ip = anchor + len; + + /* distance is biased */ + distance--; + + if (!distance) { + /* zero distance means a run */ + uint8_t x = ip[-1]; + while (ip < ip_bound) + if (*ref++ != x) + break; + else + ip++; + } else + for (;;) { + /* safe because the outer check against ip limit */ + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + while (ip < ip_bound) + if (*ref++ != *ip++) break; + break; + } + + /* if we have copied something, adjust the copy count */ + if (copy) /* copy is biased, '0' means 1 byte copy */ + *(op - copy - 1) = copy - 1; + else + /* back, to overwrite the copy count */ + op--; + + /* reset literal counter */ + copy = 0; + + /* length is biased, '1' means a match of 3 bytes */ + ip -= 3; + len = ip - anchor; + + /* encode the match */ + if (FASTLZ_UNLIKELY(len > MAX_LEN - 2)) + while (len > MAX_LEN - 2) { + *op++ = (7 << 5) + (distance >> 8); + *op++ = MAX_LEN - 2 - 7 - 2; + *op++ = (distance & 255); + len -= MAX_LEN - 2; + } + + if (len < 7) { + *op++ = (len << 5) + (distance >> 8); + *op++ = (distance & 255); + } else { + *op++ = (7 << 5) + (distance >> 8); + *op++ = len - 7; + *op++ = (distance & 255); + } + + /* update the hash at match boundary */ + HASH_FUNCTION(hval, ip); + htab[hval] = ip++; + HASH_FUNCTION(hval, ip); + htab[hval] = ip++; + + /* assuming literal copy */ + *op++ = MAX_COPY - 1; + + continue; + + literal: + *op++ = *anchor++; + ip = anchor; + copy++; + if (FASTLZ_UNLIKELY(copy == MAX_COPY)) { + copy = 0; + *op++ = MAX_COPY - 1; + } + } + + /* left-over as literal copy */ + ip_bound++; + while (ip <= ip_bound) { + *op++ = *ip++; + copy++; + if (copy == MAX_COPY) { + copy = 0; + *op++ = MAX_COPY - 1; + } + } + + /* if we have copied something, adjust the copy length */ + if (copy) + *(op - copy - 1) = copy - 1; + else + op--; + + return op - (uint8_t*)output; } -int fastlz_decompress(const void* input, int length, void* output, int maxout) -{ - /* magic identifier for compression level */ - int level = ((*(const flzuint8*)input) >> 5) + 1; +#if defined(FASTLZ_USE_MEMMOVE) && (FASTLZ_USE_MEMMOVE == 0) - if(level == 1) - return fastlz1_decompress(input, length, output, maxout); - if(level == 2) - return fastlz2_decompress(input, length, output, maxout); +static void fastlz_memmove(uint8_t* dest, const uint8_t* src, uint32_t count) { + do { + *dest++ = *src++; + } while (--count); +} - /* unknown level, trigger error */ - return 0; +static void fastlz_memcpy(uint8_t* dest, const uint8_t* src, uint32_t count) { + return fastlz_memmove(dest, src, count); } -int fastlz_compress_level(int level, const void* input, int length, void* output) -{ - if(level == 1) - return fastlz1_compress(input, length, output); - if(level == 2) - return fastlz2_compress(input, length, output); +#else - return 0; +#include <string.h> + +static void fastlz_memmove(uint8_t* dest, const uint8_t* src, uint32_t count) { + if ((count > 4) && (dest >= src + count)) { + memmove(dest, src, count); + } else { + switch (count) { + default: + do { + *dest++ = *src++; + } while (--count); + break; + case 3: + *dest++ = *src++; + case 2: + *dest++ = *src++; + case 1: + *dest++ = *src++; + case 0: + break; + } + } +} + +static void fastlz_memcpy(uint8_t* dest, const uint8_t* src, uint32_t count) { + memcpy(dest, src, count); } -#else /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */ +#endif -static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output) -{ - const flzuint8* ip = (const flzuint8*) input; - const flzuint8* ip_bound = ip + length - 2; - const flzuint8* ip_limit = ip + length - 12; - flzuint8* op = (flzuint8*) output; +int fastlz1_decompress(const void* input, int length, void* output, + int maxout) { + const uint8_t* ip = (const uint8_t*)input; + const uint8_t* ip_limit = ip + length; + const uint8_t* ip_bound = ip_limit - 2; + uint8_t* op = (uint8_t*)output; + uint8_t* op_limit = op + maxout; + uint32_t ctrl = (*ip++) & 31; + + while (1) { + if (ctrl >= 32) { + uint32_t len = (ctrl >> 5) - 1; + uint32_t ofs = (ctrl & 31) << 8; + const uint8_t* ref = op - ofs - 1; + if (len == 7 - 1) { + FASTLZ_BOUND_CHECK(ip <= ip_bound); + len += *ip++; + } + ref -= *ip++; + len += 3; + FASTLZ_BOUND_CHECK(op + len <= op_limit); + FASTLZ_BOUND_CHECK(ref >= (uint8_t*)output); + fastlz_memmove(op, ref, len); + op += len; + } else { + ctrl++; + FASTLZ_BOUND_CHECK(op + ctrl <= op_limit); + FASTLZ_BOUND_CHECK(ip + ctrl <= ip_limit); + fastlz_memcpy(op, ip, ctrl); + ip += ctrl; + op += ctrl; + } - const flzuint8* htab[HASH_SIZE]; - const flzuint8** hslot; - flzuint32 hval; + if (FASTLZ_UNLIKELY(ip > ip_bound)) break; + ctrl = *ip++; + } + + return op - (uint8_t*)output; +} - flzuint32 copy; +int fastlz2_compress(const void* input, int length, void* output) { + const uint8_t* ip = (const uint8_t*)input; + const uint8_t* ip_bound = ip + length - 2; + const uint8_t* ip_limit = ip + length - 12 - 1; + uint8_t* op = (uint8_t*)output; + + const uint8_t* htab[HASH_SIZE]; + uint32_t hval; + + uint32_t copy; /* sanity check */ - if(FASTLZ_UNEXPECT_CONDITIONAL(length < 4)) - { - if(length) - { + if (FASTLZ_UNLIKELY(length < 4)) { + if (length) { /* create literal copy only */ - *op++ = length-1; + *op++ = length - 1; ip_bound++; - while(ip <= ip_bound) - *op++ = *ip++; - return length+1; - } - else + while (ip <= ip_bound) *op++ = *ip++; + return length + 1; + } else return 0; } /* initializes hash table */ - for (hslot = htab; hslot < htab + HASH_SIZE; hslot++) - *hslot = ip; + for (hval = 0; hval < HASH_SIZE; ++hval) htab[hval] = ip; /* we start with literal copy */ copy = 2; - *op++ = MAX_COPY-1; + *op++ = MAX_COPY - 1; *op++ = *ip++; *op++ = *ip++; /* main loop */ - while(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit)) - { - const flzuint8* ref; - flzuint32 distance; + while (FASTLZ_LIKELY(ip < ip_limit)) { + const uint8_t* ref; + uint32_t distance; /* minimum match length */ - flzuint32 len = 3; + uint32_t len = 3; /* comparison starting-point */ - const flzuint8* anchor = ip; + const uint8_t* anchor = ip; /* check for a run */ -#if FASTLZ_LEVEL==2 - if(ip[0] == ip[-1] && FASTLZ_READU16(ip-1)==FASTLZ_READU16(ip+1)) - { + if (ip[0] == ip[-1] && ip[0] == ip[1] && ip[1] == ip[2]) { distance = 1; ip += 3; ref = anchor - 1 + 3; goto match; } -#endif /* find potential match */ - HASH_FUNCTION(hval,ip); - hslot = htab + hval; + HASH_FUNCTION(hval, ip); ref = htab[hval]; + /* update hash table */ + htab[hval] = anchor; + /* calculate distance to the match */ distance = anchor - ref; - /* update hash table */ - *hslot = anchor; - /* is this a match? check the first 3 bytes */ - if(distance==0 || -#if FASTLZ_LEVEL==1 - (distance >= MAX_DISTANCE) || -#else - (distance >= MAX_FARDISTANCE) || -#endif - *ref++ != *ip++ || *ref++!=*ip++ || *ref++!=*ip++) + if (distance == 0 || (distance >= MAX_FARDISTANCE) || *ref++ != *ip++ || + *ref++ != *ip++ || *ref++ != *ip++) goto literal; -#if FASTLZ_LEVEL==2 /* far, needs at least 5-byte match */ - if(distance >= MAX_DISTANCE) - { - if(*ip++ != *ref++ || *ip++!= *ref++) - goto literal; + if (distance >= MAX_L2_DISTANCE) { + if (*ip++ != *ref++ || *ip++ != *ref++) goto literal; len += 2; } - - match: -#endif + + match: /* last matched byte */ ip = anchor + len; @@ -264,34 +397,33 @@ static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* /* distance is biased */ distance--; - if(!distance) - { + if (!distance) { /* zero distance means a run */ - flzuint8 x = ip[-1]; - while(ip < ip_bound) - if(*ref++ != x) break; else ip++; - } - else - for(;;) - { - /* safe because the outer check against ip limit */ - if(*ref++ != *ip++) break; - if(*ref++ != *ip++) break; - if(*ref++ != *ip++) break; - if(*ref++ != *ip++) break; - if(*ref++ != *ip++) break; - if(*ref++ != *ip++) break; - if(*ref++ != *ip++) break; - if(*ref++ != *ip++) break; - while(ip < ip_bound) - if(*ref++ != *ip++) break; - break; - } + uint8_t x = ip[-1]; + while (ip < ip_bound) + if (*ref++ != x) + break; + else + ip++; + } else + for (;;) { + /* safe because the outer check against ip limit */ + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + if (*ref++ != *ip++) break; + while (ip < ip_bound) + if (*ref++ != *ip++) break; + break; + } /* if we have copied something, adjust the copy count */ - if(copy) - /* copy is biased, '0' means 1 byte copy */ - *(op-copy-1) = copy-1; + if (copy) /* copy is biased, '0' means 1 byte copy */ + *(op - copy - 1) = copy - 1; else /* back, to overwrite the copy count */ op--; @@ -304,248 +436,156 @@ static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* len = ip - anchor; /* encode the match */ -#if FASTLZ_LEVEL==2 - if(distance < MAX_DISTANCE) - { - if(len < 7) - { + if (distance < MAX_L2_DISTANCE) { + if (len < 7) { *op++ = (len << 5) + (distance >> 8); *op++ = (distance & 255); - } - else - { + } else { *op++ = (7 << 5) + (distance >> 8); - for(len-=7; len >= 255; len-= 255) - *op++ = 255; + for (len -= 7; len >= 255; len -= 255) *op++ = 255; *op++ = len; *op++ = (distance & 255); } - } - else - { + } else { /* far away, but not yet in the another galaxy... */ - if(len < 7) - { - distance -= MAX_DISTANCE; + if (len < 7) { + distance -= MAX_L2_DISTANCE; *op++ = (len << 5) + 31; *op++ = 255; *op++ = distance >> 8; *op++ = distance & 255; - } - else - { - distance -= MAX_DISTANCE; + } else { + distance -= MAX_L2_DISTANCE; *op++ = (7 << 5) + 31; - for(len-=7; len >= 255; len-= 255) - *op++ = 255; + for (len -= 7; len >= 255; len -= 255) *op++ = 255; *op++ = len; *op++ = 255; *op++ = distance >> 8; *op++ = distance & 255; } } -#else - - if(FASTLZ_UNEXPECT_CONDITIONAL(len > MAX_LEN-2)) - while(len > MAX_LEN-2) - { - *op++ = (7 << 5) + (distance >> 8); - *op++ = MAX_LEN - 2 - 7 -2; - *op++ = (distance & 255); - len -= MAX_LEN-2; - } - - if(len < 7) - { - *op++ = (len << 5) + (distance >> 8); - *op++ = (distance & 255); - } - else - { - *op++ = (7 << 5) + (distance >> 8); - *op++ = len - 7; - *op++ = (distance & 255); - } -#endif /* update the hash at match boundary */ - HASH_FUNCTION(hval,ip); + HASH_FUNCTION(hval, ip); htab[hval] = ip++; - HASH_FUNCTION(hval,ip); + HASH_FUNCTION(hval, ip); htab[hval] = ip++; /* assuming literal copy */ - *op++ = MAX_COPY-1; + *op++ = MAX_COPY - 1; continue; - literal: - *op++ = *anchor++; - ip = anchor; - copy++; - if(FASTLZ_UNEXPECT_CONDITIONAL(copy == MAX_COPY)) - { - copy = 0; - *op++ = MAX_COPY-1; - } + literal: + *op++ = *anchor++; + ip = anchor; + copy++; + if (FASTLZ_UNLIKELY(copy == MAX_COPY)) { + copy = 0; + *op++ = MAX_COPY - 1; + } } /* left-over as literal copy */ ip_bound++; - while(ip <= ip_bound) - { + while (ip <= ip_bound) { *op++ = *ip++; copy++; - if(copy == MAX_COPY) - { + if (copy == MAX_COPY) { copy = 0; - *op++ = MAX_COPY-1; + *op++ = MAX_COPY - 1; } } /* if we have copied something, adjust the copy length */ - if(copy) - *(op-copy-1) = copy-1; + if (copy) + *(op - copy - 1) = copy - 1; else op--; -#if FASTLZ_LEVEL==2 /* marker for fastlz2 */ - *(flzuint8*)output |= (1 << 5); -#endif + *(uint8_t*)output |= (1 << 5); - return op - (flzuint8*)output; + return op - (uint8_t*)output; } -static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout) -{ - const flzuint8* ip = (const flzuint8*) input; - const flzuint8* ip_limit = ip + length; - flzuint8* op = (flzuint8*) output; - flzuint8* op_limit = op + maxout; - flzuint32 ctrl = (*ip++) & 31; - int loop = 1; - - do - { - const flzuint8* ref = op; - flzuint32 len = ctrl >> 5; - flzuint32 ofs = (ctrl & 31) << 8; - - if(ctrl >= 32) - { -#if FASTLZ_LEVEL==2 - flzuint8 code; -#endif - len--; - ref -= ofs; - if (len == 7-1) -#if FASTLZ_LEVEL==1 - len += *ip++; - ref -= *ip++; -#else - do - { +int fastlz2_decompress(const void* input, int length, void* output, + int maxout) { + const uint8_t* ip = (const uint8_t*)input; + const uint8_t* ip_limit = ip + length; + const uint8_t* ip_bound = ip_limit - 2; + uint8_t* op = (uint8_t*)output; + uint8_t* op_limit = op + maxout; + uint32_t ctrl = (*ip++) & 31; + + while (1) { + if (ctrl >= 32) { + uint32_t len = (ctrl >> 5) - 1; + uint32_t ofs = (ctrl & 31) << 8; + const uint8_t* ref = op - ofs - 1; + + uint8_t code; + if (len == 7 - 1) do { + FASTLZ_BOUND_CHECK(ip <= ip_bound); code = *ip++; len += code; - } while (code==255); + } while (code == 255); code = *ip++; ref -= code; + len += 3; /* match from 16-bit distance */ - if(FASTLZ_UNEXPECT_CONDITIONAL(code==255)) - if(FASTLZ_EXPECT_CONDITIONAL(ofs==(31 << 8))) - { - ofs = (*ip++) << 8; - ofs += *ip++; - ref = op - ofs - MAX_DISTANCE; - } -#endif - -#ifdef FASTLZ_SAFE - if (FASTLZ_UNEXPECT_CONDITIONAL(op + len + 3 > op_limit)) - return 0; - - if (FASTLZ_UNEXPECT_CONDITIONAL(ref-1 < (flzuint8 *)output)) - return 0; -#endif - - if(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit)) - ctrl = *ip++; - else - loop = 0; - - if(ref == op) - { - /* optimize copy for a run */ - flzuint8 b = ref[-1]; - *op++ = b; - *op++ = b; - *op++ = b; - for(; len; --len) - *op++ = b; - } - else - { -#if !defined(FASTLZ_STRICT_ALIGN) - const flzuint16* p; - flzuint16* q; -#endif - /* copy from reference */ - ref--; - *op++ = *ref++; - *op++ = *ref++; - *op++ = *ref++; - -#if !defined(FASTLZ_STRICT_ALIGN) - /* copy a byte, so that now it's word aligned */ - if(len & 1) - { - *op++ = *ref++; - len--; + if (FASTLZ_UNLIKELY(code == 255)) + if (FASTLZ_LIKELY(ofs == (31 << 8))) { + FASTLZ_BOUND_CHECK(ip < ip_bound); + ofs = (*ip++) << 8; + ofs += *ip++; + ref = op - ofs - MAX_L2_DISTANCE - 1; } - /* copy 16-bit at once */ - q = (flzuint16*) op; - op += len; - p = (const flzuint16*) ref; - for(len>>=1; len > 4; len-=4) - { - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - } - for(; len; --len) - *q++ = *p++; -#else - for(; len; --len) - *op++ = *ref++; -#endif - } - } - else - { + FASTLZ_BOUND_CHECK(op + len <= op_limit); + FASTLZ_BOUND_CHECK(ref >= (uint8_t*)output); + fastlz_memmove(op, ref, len); + op += len; + } else { ctrl++; -#ifdef FASTLZ_SAFE - if (FASTLZ_UNEXPECT_CONDITIONAL(op + ctrl > op_limit)) - return 0; - if (FASTLZ_UNEXPECT_CONDITIONAL(ip + ctrl > ip_limit)) - return 0; -#endif - - *op++ = *ip++; - for(--ctrl; ctrl; ctrl--) - *op++ = *ip++; - - loop = FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit); - if(loop) - ctrl = *ip++; + FASTLZ_BOUND_CHECK(op + ctrl <= op_limit); + FASTLZ_BOUND_CHECK(ip + ctrl <= ip_limit); + fastlz_memcpy(op, ip, ctrl); + ip += ctrl; + op += ctrl; } + + if (FASTLZ_UNLIKELY(ip >= ip_limit)) break; + ctrl = *ip++; } - while(FASTLZ_EXPECT_CONDITIONAL(loop)); - return op - (flzuint8*)output; + return op - (uint8_t*)output; } -#endif /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */ +int fastlz_compress(const void* input, int length, void* output) { + /* for short block, choose fastlz1 */ + if (length < 65536) return fastlz1_compress(input, length, output); + + /* else... */ + return fastlz2_compress(input, length, output); +} + +int fastlz_decompress(const void* input, int length, void* output, int maxout) { + /* magic identifier for compression level */ + int level = ((*(const uint8_t*)input) >> 5) + 1; + + if (level == 1) return fastlz1_decompress(input, length, output, maxout); + if (level == 2) return fastlz2_decompress(input, length, output, maxout); + + /* unknown level, trigger error */ + return 0; +} + +int fastlz_compress_level(int level, const void* input, int length, + void* output) { + if (level == 1) return fastlz1_compress(input, length, output); + if (level == 2) return fastlz2_compress(input, length, output); + + return 0; +} diff --git a/thirdparty/misc/fastlz.h b/thirdparty/misc/fastlz.h index e5ca8dfc02..e53dbfbb56 100644 --- a/thirdparty/misc/fastlz.h +++ b/thirdparty/misc/fastlz.h @@ -1,9 +1,6 @@ /* - FastLZ - lightning-fast lossless compression library - - Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) - Copyright (C) 2006 Ariya Hidayat (ariya@kde.org) - Copyright (C) 2005 Ariya Hidayat (ariya@kde.org) + FastLZ - Byte-aligned LZ77 compression library + Copyright (C) 2005-2020 Ariya Hidayat <ariya.hidayat@gmail.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -27,15 +24,15 @@ #ifndef FASTLZ_H #define FASTLZ_H -#define FASTLZ_VERSION 0x000100 +#define FASTLZ_VERSION 0x000500 -#define FASTLZ_VERSION_MAJOR 0 -#define FASTLZ_VERSION_MINOR 0 -#define FASTLZ_VERSION_REVISION 0 +#define FASTLZ_VERSION_MAJOR 0 +#define FASTLZ_VERSION_MINOR 5 +#define FASTLZ_VERSION_REVISION 0 -#define FASTLZ_VERSION_STRING "0.1.0" +#define FASTLZ_VERSION_STRING "0.5.0" -#if defined (__cplusplus) +#if defined(__cplusplus) extern "C" { #endif @@ -51,9 +48,18 @@ extern "C" { length (input buffer size). The input buffer and the output buffer can not overlap. + + Compression level can be specified in parameter level. At the moment, + only level 1 and level 2 are supported. + Level 1 is the fastest compression and generally useful for short data. + Level 2 is slightly slower but it gives better compression ratio. + + Note that the compressed data, regardless of the level, can always be + decompressed using the function fastlz_decompress below. */ -int fastlz_compress(const void* input, int length, void* output); +int fastlz_compress_level(int level, const void* input, int length, + void* output); /** Decompress a block of compressed data and returns the size of the @@ -65,35 +71,27 @@ int fastlz_compress(const void* input, int length, void* output); Decompression is memory safe and guaranteed not to write the output buffer more than what is specified in maxout. + + Note that the decompression will always work, regardless of the + compression level specified in fastlz_compress_level above (when + producing the compressed block). */ int fastlz_decompress(const void* input, int length, void* output, int maxout); /** - Compress a block of data in the input buffer and returns the size of - compressed block. The size of input buffer is specified by length. The - minimum input buffer size is 16. + DEPRECATED. - The output buffer must be at least 5% larger than the input buffer - and can not be smaller than 66 bytes. - - If the input is not compressible, the return value might be larger than - length (input buffer size). + This is similar to fastlz_compress_level above, but with the level + automatically chosen. - The input buffer and the output buffer can not overlap. - - Compression level can be specified in parameter level. At the moment, - only level 1 and level 2 are supported. - Level 1 is the fastest compression and generally useful for short data. - Level 2 is slightly slower but it gives better compression ratio. - - Note that the compressed data, regardless of the level, can always be - decompressed using the function fastlz_decompress above. + This function is deprecated and it will be completely removed in some future + version. */ -int fastlz_compress_level(int level, const void* input, int length, void* output); +int fastlz_compress(const void* input, int length, void* output); -#if defined (__cplusplus) +#if defined(__cplusplus) } #endif diff --git a/thirdparty/misc/stb_vorbis.c b/thirdparty/misc/stb_vorbis.c index 4ab8880d5d..b0d79b1724 100644 --- a/thirdparty/misc/stb_vorbis.c +++ b/thirdparty/misc/stb_vorbis.c @@ -1,4 +1,4 @@ -// Ogg Vorbis audio decoder - v1.17 - public domain +// Ogg Vorbis audio decoder - v1.19 - public domain // http://nothings.org/stb_vorbis/ // // Original version written by Sean Barrett in 2007. @@ -26,13 +26,16 @@ // Terje Mathisen Niklas Frykholm Andy Hill // Casey Muratori John Bolton Gargaj // Laurent Gomila Marc LeBlanc Ronny Chevalier -// Bernhard Wodo Evan Balster alxprd@github +// Bernhard Wodo Evan Balster github:alxprd // Tom Beaumont Ingo Leitgeb Nicolas Guillemot // Phillip Bennefall Rohit Thiago Goulart -// manxorist@github saga musix github:infatum -// Timur Gagiev Maxwell Koo +// github:manxorist saga musix github:infatum +// Timur Gagiev Maxwell Koo Peter Waller +// github:audinowho Dougall Johnson // // Partial history: +// 1.19 - 2020-02-05 - warnings +// 1.18 - 2020-02-02 - fix seek bugs; parse header comments; misc warnings etc. // 1.17 - 2019-07-08 - fix CVE-2019-13217..CVE-2019-13223 (by ForAllSecure) // 1.16 - 2019-03-04 - fix warnings // 1.15 - 2019-02-07 - explicit failure if Ogg Skeleton data is found @@ -130,9 +133,20 @@ typedef struct int max_frame_size; } stb_vorbis_info; +typedef struct +{ + char *vendor; + + int comment_list_length; + char **comment_list; +} stb_vorbis_comment; + // get general information about the file extern stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f); +// get ogg comments +extern stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f); + // get the last error detected (clears it, too) extern int stb_vorbis_get_error(stb_vorbis *f); @@ -759,6 +773,10 @@ struct stb_vorbis unsigned int temp_memory_required; unsigned int setup_temp_memory_required; + char *vendor; + int comment_list_length; + char **comment_list; + // input config #ifndef STB_VORBIS_NO_STDIO FILE *f; @@ -774,8 +792,11 @@ struct stb_vorbis uint8 push_mode; + // the page to seek to when seeking to start, may be zero uint32 first_audio_page_offset; + // p_first is the page on which the first audio packet ends + // (but not necessarily the page on which it starts) ProbedPage p_first, p_last; // memory management @@ -888,7 +909,7 @@ static int error(vorb *f, enum STBVorbisError e) #define array_size_required(count,size) (count*(sizeof(void *)+(size))) #define temp_alloc(f,size) (f->alloc.alloc_buffer ? setup_temp_malloc(f,size) : alloca(size)) -#define temp_free(f,p) 0 +#define temp_free(f,p) (void)0 #define temp_alloc_save(f) ((f)->temp_offset) #define temp_alloc_restore(f,p) ((f)->temp_offset = (p)) @@ -909,7 +930,7 @@ static void *make_block_array(void *mem, int count, int size) static void *setup_malloc(vorb *f, int sz) { - sz = (sz+3) & ~3; + sz = (sz+7) & ~7; // round up to nearest 8 for alignment of future allocs. f->setup_memory_required += sz; if (f->alloc.alloc_buffer) { void *p = (char *) f->alloc.alloc_buffer + f->setup_offset; @@ -928,7 +949,7 @@ static void setup_free(vorb *f, void *p) static void *setup_temp_malloc(vorb *f, int sz) { - sz = (sz+3) & ~3; + sz = (sz+7) & ~7; // round up to nearest 8 for alignment of future allocs. if (f->alloc.alloc_buffer) { if (f->temp_offset - sz < f->setup_offset) return NULL; f->temp_offset -= sz; @@ -940,7 +961,7 @@ static void *setup_temp_malloc(vorb *f, int sz) static void setup_temp_free(vorb *f, void *p, int sz) { if (f->alloc.alloc_buffer) { - f->temp_offset += (sz+3)&~3; + f->temp_offset += (sz+7)&~7; return; } free(p); @@ -1404,6 +1425,9 @@ static int capture_pattern(vorb *f) static int start_page_no_capturepattern(vorb *f) { uint32 loc0,loc1,n; + if (f->first_decode && !IS_PUSH_MODE(f)) { + f->p_first.page_start = stb_vorbis_get_file_offset(f) - 4; + } // stream structure version if (0 != get8(f)) return error(f, VORBIS_invalid_stream_structure_version); // header flag @@ -1440,15 +1464,12 @@ static int start_page_no_capturepattern(vorb *f) } if (f->first_decode) { int i,len; - ProbedPage p; len = 0; for (i=0; i < f->segment_count; ++i) len += f->segments[i]; len += 27 + f->segment_count; - p.page_start = f->first_audio_page_offset; - p.page_end = p.page_start + len; - p.last_decoded_sample = loc0; - f->p_first = p; + f->p_first.page_end = f->p_first.page_start + len; + f->p_first.last_decoded_sample = loc0; } f->next_seg = 0; return TRUE; @@ -1539,6 +1560,16 @@ static int get8_packet(vorb *f) return x; } +static int get32_packet(vorb *f) +{ + uint32 x; + x = get8_packet(f); + x += get8_packet(f) << 8; + x += get8_packet(f) << 16; + x += (uint32) get8_packet(f) << 24; + return x; +} + static void flush_packet(vorb *f) { while (get8_packet_raw(f) != EOP); @@ -2130,47 +2161,7 @@ static void decode_residue(vorb *f, float *residue_buffers[], int ch, int n, int ++class_set; #endif } - } else if (ch == 1) { - while (pcount < part_read) { - int z = r->begin + pcount*r->part_size; - int c_inter = 0, p_inter = z; - if (pass == 0) { - Codebook *c = f->codebooks+r->classbook; - int q; - DECODE(q,f,c); - if (q == EOP) goto done; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - part_classdata[0][class_set] = r->classdata[q]; - #else - for (i=classwords-1; i >= 0; --i) { - classifications[0][i+pcount] = q % r->classifications; - q /= r->classifications; - } - #endif - } - for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { - int z = r->begin + pcount*r->part_size; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - int c = part_classdata[0][class_set][i]; - #else - int c = classifications[0][pcount]; - #endif - int b = r->residue_books[c][pass]; - if (b >= 0) { - Codebook *book = f->codebooks + b; - if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) - goto done; - } else { - z += r->part_size; - c_inter = 0; - p_inter = z; - } - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - ++class_set; - #endif - } - } else { + } else if (ch > 2) { while (pcount < part_read) { int z = r->begin + pcount*r->part_size; int c_inter = z % ch, p_inter = z/ch; @@ -3504,7 +3495,7 @@ static int vorbis_pump_first_frame(stb_vorbis *f) } #ifndef STB_VORBIS_NO_PUSHDATA_API -static int is_whole_packet_present(stb_vorbis *f, int end_page) +static int is_whole_packet_present(stb_vorbis *f) { // make sure that we have the packet available before continuing... // this requires a full ogg parse, but we know we can fetch from f->stream @@ -3524,8 +3515,6 @@ static int is_whole_packet_present(stb_vorbis *f, int end_page) break; } // either this continues, or it ends it... - if (end_page) - if (s < f->segment_count-1) return error(f, VORBIS_invalid_stream); if (s == f->segment_count) s = -1; // set 'crosses page' flag if (p > f->stream_end) return error(f, VORBIS_need_more_data); @@ -3558,8 +3547,6 @@ static int is_whole_packet_present(stb_vorbis *f, int end_page) if (q[s] < 255) break; } - if (end_page) - if (s < n-1) return error(f, VORBIS_invalid_stream); if (s == n) s = -1; // set 'crosses page' flag if (p > f->stream_end) return error(f, VORBIS_need_more_data); @@ -3576,6 +3563,7 @@ static int start_decoder(vorb *f) int longest_floorlist=0; // first page, first packet + f->first_decode = TRUE; if (!start_page(f)) return FALSE; // validate page flag @@ -3633,6 +3621,41 @@ static int start_decoder(vorb *f) if (!start_page(f)) return FALSE; if (!start_packet(f)) return FALSE; + + if (!next_segment(f)) return FALSE; + + if (get8_packet(f) != VORBIS_packet_comment) return error(f, VORBIS_invalid_setup); + for (i=0; i < 6; ++i) header[i] = get8_packet(f); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); + //file vendor + len = get32_packet(f); + f->vendor = (char*)setup_malloc(f, sizeof(char) * (len+1)); + for(i=0; i < len; ++i) { + f->vendor[i] = get8_packet(f); + } + f->vendor[len] = (char)'\0'; + //user comments + f->comment_list_length = get32_packet(f); + f->comment_list = (char**)setup_malloc(f, sizeof(char*) * (f->comment_list_length)); + + for(i=0; i < f->comment_list_length; ++i) { + len = get32_packet(f); + f->comment_list[i] = (char*)setup_malloc(f, sizeof(char) * (len+1)); + + for(j=0; j < len; ++j) { + f->comment_list[i][j] = get8_packet(f); + } + f->comment_list[i][len] = (char)'\0'; + } + + // framing_flag + x = get8_packet(f); + if (!(x & 1)) return error(f, VORBIS_invalid_setup); + + + skip(f, f->bytes_in_seg); + f->bytes_in_seg = 0; + do { len = next_segment(f); skip(f, len); @@ -3644,7 +3667,7 @@ static int start_decoder(vorb *f) #ifndef STB_VORBIS_NO_PUSHDATA_API if (IS_PUSH_MODE(f)) { - if (!is_whole_packet_present(f, TRUE)) { + if (!is_whole_packet_present(f)) { // convert error in ogg header to write type if (f->error == VORBIS_invalid_stream) f->error = VORBIS_invalid_setup; @@ -3947,7 +3970,7 @@ static int start_decoder(vorb *f) g->sorted_order[j] = (uint8) p[j].id; // precompute the neighbors for (j=2; j < g->values; ++j) { - int low,hi; + int low = 0,hi = 0; neighbors(g->Xlist, j, &low,&hi); g->neighbors[j][0] = low; g->neighbors[j][1] = hi; @@ -4132,7 +4155,6 @@ static int start_decoder(vorb *f) f->temp_memory_required = imdct_mem; } - f->first_decode = TRUE; if (f->alloc.alloc_buffer) { assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes); @@ -4141,7 +4163,17 @@ static int start_decoder(vorb *f) return error(f, VORBIS_outofmem); } - f->first_audio_page_offset = stb_vorbis_get_file_offset(f); + // @TODO: stb_vorbis_seek_start expects first_audio_page_offset to point to a page + // without PAGEFLAG_continued_packet, so this either points to the first page, or + // the page after the end of the headers. It might be cleaner to point to a page + // in the middle of the headers, when that's the page where the first audio packet + // starts, but we'd have to also correctly skip the end of any continued packet in + // stb_vorbis_seek_start. + if (f->next_seg == -1) { + f->first_audio_page_offset = stb_vorbis_get_file_offset(f); + } else { + f->first_audio_page_offset = 0; + } return TRUE; } @@ -4149,6 +4181,13 @@ static int start_decoder(vorb *f) static void vorbis_deinit(stb_vorbis *p) { int i,j; + + setup_free(p, p->vendor); + for (i=0; i < p->comment_list_length; ++i) { + setup_free(p, p->comment_list[i]); + } + setup_free(p, p->comment_list); + if (p->residue_config) { for (i=0; i < p->residue_count; ++i) { Residue *r = p->residue_config+i; @@ -4248,6 +4287,15 @@ stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f) return d; } +stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f) +{ + stb_vorbis_comment d; + d.vendor = f->vendor; + d.comment_list_length = f->comment_list_length; + d.comment_list = f->comment_list; + return d; +} + int stb_vorbis_get_error(stb_vorbis *f) { int e = f->error; @@ -4389,7 +4437,7 @@ int stb_vorbis_decode_frame_pushdata( f->error = VORBIS__no_error; // check that we have the entire packet in memory - if (!is_whole_packet_present(f, FALSE)) { + if (!is_whole_packet_present(f)) { *samples = 0; return 0; } @@ -4625,8 +4673,8 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) { ProbedPage left, right, mid; int i, start_seg_with_known_loc, end_pos, page_start; - uint32 delta, stream_length, padding; - double offset, bytes_per_sample; + uint32 delta, stream_length, padding, last_sample_limit; + double offset = 0.0, bytes_per_sample = 0.0; int probe = 0; // find the last page and validate the target sample @@ -4639,9 +4687,9 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) // indicates should be the granule position (give or take one)). padding = ((f->blocksize_1 - f->blocksize_0) >> 2); if (sample_number < padding) - sample_number = 0; + last_sample_limit = 0; else - sample_number -= padding; + last_sample_limit = sample_number - padding; left = f->p_first; while (left.last_decoded_sample == ~0U) { @@ -4654,9 +4702,12 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) assert(right.last_decoded_sample != ~0U); // starting from the start is handled differently - if (sample_number <= left.last_decoded_sample) { - if (stb_vorbis_seek_start(f)) + if (last_sample_limit <= left.last_decoded_sample) { + if (stb_vorbis_seek_start(f)) { + if (f->current_loc > sample_number) + return error(f, VORBIS_seek_failed); return 1; + } return 0; } @@ -4673,10 +4724,10 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) // first probe (interpolate) double data_bytes = right.page_end - left.page_start; bytes_per_sample = data_bytes / right.last_decoded_sample; - offset = left.page_start + bytes_per_sample * (sample_number - left.last_decoded_sample); + offset = left.page_start + bytes_per_sample * (last_sample_limit - left.last_decoded_sample); } else { // second probe (try to bound the other side) - double error = ((double) sample_number - mid.last_decoded_sample) * bytes_per_sample; + double error = ((double) last_sample_limit - mid.last_decoded_sample) * bytes_per_sample; if (error >= 0 && error < 8000) error = 8000; if (error < 0 && error > -8000) error = -8000; offset += error * 2; @@ -4707,14 +4758,16 @@ static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) } // if we've just found the last page again then we're in a tricky file, - // and we're close enough. - if (mid.page_start == right.page_start) - break; - - if (sample_number < mid.last_decoded_sample) - right = mid; - else - left = mid; + // and we're close enough (if it wasn't an interpolation probe). + if (mid.page_start == right.page_start) { + if (probe >= 2 || delta <= 65536) + break; + } else { + if (last_sample_limit < mid.last_decoded_sample) + right = mid; + else + left = mid; + } ++probe; } @@ -4830,8 +4883,8 @@ int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number) flush_packet(f); } } - // the next frame will start with the sample - assert(f->current_loc == sample_number); + // the next frame should start with the sample + if (f->current_loc != sample_number) return error(f, VORBIS_seek_failed); return 1; } @@ -5173,7 +5226,7 @@ static void convert_samples_short(int buf_c, short **buffer, int b_offset, int d int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples) { - float **output; + float **output = NULL; int len = stb_vorbis_get_frame_float(f, NULL, &output); if (len > num_samples) len = num_samples; if (len) diff --git a/thirdparty/pcre2/src/config.h b/thirdparty/pcre2/src/config.h index 25d45eeb38..787bb9c999 100644 --- a/thirdparty/pcre2/src/config.h +++ b/thirdparty/pcre2/src/config.h @@ -218,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.33" +#define PACKAGE_STRING "PCRE2 10.34" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre2" @@ -227,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.33" +#define PACKAGE_VERSION "10.34" /* 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 @@ -352,7 +352,7 @@ sure both macros are undefined; an emulation function will then be used. */ #endif /* Version number of package */ -#define VERSION "10.33" +#define VERSION "10.34" /* Define to 1 if on MINIX. */ /* #undef _MINIX */ diff --git a/thirdparty/pcre2/src/pcre2.h b/thirdparty/pcre2/src/pcre2.h index 102b5d91f1..cb9d61a35b 100644 --- a/thirdparty/pcre2/src/pcre2.h +++ b/thirdparty/pcre2/src/pcre2.h @@ -5,7 +5,7 @@ /* This is the public header file for the PCRE library, second API, to be #included by applications that call PCRE2 functions. - Copyright (c) 2016-2018 University of Cambridge + Copyright (c) 2016-2019 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE. /* The current PCRE version information. */ #define PCRE2_MAJOR 10 -#define PCRE2_MINOR 33 +#define PCRE2_MINOR 34 #define PCRE2_PRERELEASE -#define PCRE2_DATE 2019-04-16 +#define PCRE2_DATE 2019-11-21 /* 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 @@ -142,6 +142,7 @@ D is inspected during pcre2_dfa_match() execution #define PCRE2_USE_OFFSET_LIMIT 0x00800000u /* J M D */ #define PCRE2_EXTENDED_MORE 0x01000000u /* C */ #define PCRE2_LITERAL 0x02000000u /* C */ +#define PCRE2_MATCH_INVALID_UTF 0x04000000u /* J M D */ /* An additional compile options word is available in the compile context. */ @@ -305,6 +306,8 @@ pcre2_pattern_convert(). */ #define PCRE2_ERROR_INVALID_HYPHEN_IN_OPTIONS 194 #define PCRE2_ERROR_ALPHA_ASSERTION_UNKNOWN 195 #define PCRE2_ERROR_SCRIPT_RUN_NOT_AVAILABLE 196 +#define PCRE2_ERROR_TOO_MANY_CAPTURES 197 +#define PCRE2_ERROR_CONDITION_ATOMIC_ASSERTION_EXPECTED 198 /* "Expected" matching error codes: no match and partial match. */ @@ -390,6 +393,7 @@ released, the numbers must not be changed. */ #define PCRE2_ERROR_HEAPLIMIT (-63) #define PCRE2_ERROR_CONVERT_SYNTAX (-64) #define PCRE2_ERROR_INTERNAL_DUPMATCH (-65) +#define PCRE2_ERROR_DFA_UINVALID_UTF (-66) /* Request types for pcre2_pattern_info() */ @@ -580,7 +584,7 @@ PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ pcre2_set_bsr(pcre2_compile_context *, uint32_t); \ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ - pcre2_set_character_tables(pcre2_compile_context *, const unsigned char *); \ + pcre2_set_character_tables(pcre2_compile_context *, const uint8_t *); \ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ pcre2_set_compile_extra_options(pcre2_compile_context *, uint32_t); \ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ @@ -675,6 +679,8 @@ PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \ pcre2_match_data_free(pcre2_match_data *); \ PCRE2_EXP_DECL PCRE2_SPTR PCRE2_CALL_CONVENTION \ pcre2_get_mark(pcre2_match_data *); \ +PCRE2_EXP_DECL PCRE2_SIZE PCRE2_CALL_CONVENTION \ + pcre2_get_match_data_size(pcre2_match_data *); \ PCRE2_EXP_DECL uint32_t PCRE2_CALL_CONVENTION \ pcre2_get_ovector_count(pcre2_match_data *); \ PCRE2_EXP_DECL PCRE2_SIZE PCRE2_CALL_CONVENTION \ @@ -773,7 +779,8 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \ pcre2_get_error_message(int, PCRE2_UCHAR *, PCRE2_SIZE); \ PCRE2_EXP_DECL const uint8_t PCRE2_CALL_CONVENTION \ *pcre2_maketables(pcre2_general_context *); \ - +PCRE2_EXP_DECL void PCRE2_CALL_CONVENTION \ + pcre2_maketables_free(pcre2_general_context *, const uint8_t *); /* Define macros that generate width-specific names from generic versions. The three-level macro scheme is necessary to get the macros expanded when we want @@ -838,6 +845,7 @@ pcre2_compile are called by application code. */ #define pcre2_general_context_free PCRE2_SUFFIX(pcre2_general_context_free_) #define pcre2_get_error_message PCRE2_SUFFIX(pcre2_get_error_message_) #define pcre2_get_mark PCRE2_SUFFIX(pcre2_get_mark_) +#define pcre2_get_match_data_size PCRE2_SUFFIX(pcre2_get_match_data_size_) #define pcre2_get_ovector_pointer PCRE2_SUFFIX(pcre2_get_ovector_pointer_) #define pcre2_get_ovector_count PCRE2_SUFFIX(pcre2_get_ovector_count_) #define pcre2_get_startchar PCRE2_SUFFIX(pcre2_get_startchar_) @@ -848,6 +856,7 @@ pcre2_compile are called by application code. */ #define pcre2_jit_stack_create PCRE2_SUFFIX(pcre2_jit_stack_create_) #define pcre2_jit_stack_free PCRE2_SUFFIX(pcre2_jit_stack_free_) #define pcre2_maketables PCRE2_SUFFIX(pcre2_maketables_) +#define pcre2_maketables_free PCRE2_SUFFIX(pcre2_maketables_free_) #define pcre2_match PCRE2_SUFFIX(pcre2_match_) #define pcre2_match_context_copy PCRE2_SUFFIX(pcre2_match_context_copy_) #define pcre2_match_context_create PCRE2_SUFFIX(pcre2_match_context_create_) diff --git a/thirdparty/pcre2/src/pcre2_auto_possess.c b/thirdparty/pcre2/src/pcre2_auto_possess.c index 6d7b7c4a4d..5b95b9b8a8 100644 --- a/thirdparty/pcre2/src/pcre2_auto_possess.c +++ b/thirdparty/pcre2/src/pcre2_auto_possess.c @@ -624,6 +624,13 @@ for(;;) case OP_ASSERTBACK_NOT: case OP_ONCE: return !entered_a_group; + + /* Non-atomic assertions - don't possessify last iterator. This needs + more thought. */ + + case OP_ASSERT_NA: + case OP_ASSERTBACK_NA: + return FALSE; } /* Skip over the bracket and inspect what comes next. */ diff --git a/thirdparty/pcre2/src/pcre2_compile.c b/thirdparty/pcre2/src/pcre2_compile.c index 068735ae8e..f2e6b6b5bd 100644 --- a/thirdparty/pcre2/src/pcre2_compile.c +++ b/thirdparty/pcre2/src/pcre2_compile.c @@ -135,6 +135,9 @@ static BOOL set_lookbehind_lengths(uint32_t **, int *, int *, parsed_recurse_check *, compile_block *); +static int + check_lookbehinds(uint32_t *, uint32_t **, parsed_recurse_check *, + compile_block *); /************************************************* @@ -250,36 +253,41 @@ is present where expected in a conditional group. */ #define META_LOOKBEHIND 0x80250000u /* (?<= */ #define META_LOOKBEHINDNOT 0x80260000u /* (?<! */ +/* These cannot be conditions */ + +#define META_LOOKAHEAD_NA 0x80270000u /* (*napla: */ +#define META_LOOKBEHIND_NA 0x80280000u /* (*naplb: */ + /* 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 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 */ +#define META_MARK 0x80290000u /* (*MARK) */ +#define META_ACCEPT 0x802a0000u /* (*ACCEPT) */ +#define META_FAIL 0x802b0000u /* (*FAIL) */ +#define META_COMMIT 0x802c0000u /* These */ +#define META_COMMIT_ARG 0x802d0000u /* pairs */ +#define META_PRUNE 0x802e0000u /* must */ +#define META_PRUNE_ARG 0x802f0000u /* be */ +#define META_SKIP 0x80300000u /* kept */ +#define META_SKIP_ARG 0x80310000u /* in */ +#define META_THEN 0x80320000u /* this */ +#define META_THEN_ARG 0x80330000u /* order */ /* These must be kept in groups of adjacent 3 values, and all together. */ -#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_ASTERISK 0x80340000u /* * */ +#define META_ASTERISK_PLUS 0x80350000u /* *+ */ +#define META_ASTERISK_QUERY 0x80360000u /* *? */ +#define META_PLUS 0x80370000u /* + */ +#define META_PLUS_PLUS 0x80380000u /* ++ */ +#define META_PLUS_QUERY 0x80390000u /* +? */ +#define META_QUERY 0x803a0000u /* ? */ +#define META_QUERY_PLUS 0x803b0000u /* ?+ */ +#define META_QUERY_QUERY 0x803c0000u /* ?? */ +#define META_MINMAX 0x803d0000u /* {n,m} repeat */ +#define META_MINMAX_PLUS 0x803e0000u /* {n,m}+ repeat */ +#define META_MINMAX_QUERY 0x803f0000u /* {n,m}? repeat */ #define META_FIRST_QUANTIFIER META_ASTERISK #define META_LAST_QUANTIFIER META_MINMAX_QUERY @@ -335,6 +343,8 @@ static unsigned char meta_extra_lengths[] = { 0, /* META_LOOKAHEADNOT */ SIZEOFFSET, /* META_LOOKBEHIND */ SIZEOFFSET, /* META_LOOKBEHINDNOT */ + 0, /* META_LOOKAHEAD_NA */ + SIZEOFFSET, /* META_LOOKBEHIND_NA */ 1, /* META_MARK - plus the string length */ 0, /* META_ACCEPT */ 0, /* META_FAIL */ @@ -634,10 +644,14 @@ typedef struct alasitem { static const char alasnames[] = STRING_pla0 STRING_plb0 + STRING_napla0 + STRING_naplb0 STRING_nla0 STRING_nlb0 STRING_positive_lookahead0 STRING_positive_lookbehind0 + STRING_non_atomic_positive_lookahead0 + STRING_non_atomic_positive_lookbehind0 STRING_negative_lookahead0 STRING_negative_lookbehind0 STRING_atomic0 @@ -649,10 +663,14 @@ static const char alasnames[] = static const alasitem alasmeta[] = { { 3, META_LOOKAHEAD }, { 3, META_LOOKBEHIND }, + { 5, META_LOOKAHEAD_NA }, + { 5, META_LOOKBEHIND_NA }, { 3, META_LOOKAHEADNOT }, { 3, META_LOOKBEHINDNOT }, { 18, META_LOOKAHEAD }, { 19, META_LOOKBEHIND }, + { 29, META_LOOKAHEAD_NA }, + { 30, META_LOOKBEHIND_NA }, { 18, META_LOOKAHEADNOT }, { 19, META_LOOKBEHINDNOT }, { 6, META_ATOMIC }, @@ -746,8 +764,8 @@ are allowed. */ #define PUBLIC_LITERAL_COMPILE_OPTIONS \ (PCRE2_ANCHORED|PCRE2_AUTO_CALLOUT|PCRE2_CASELESS|PCRE2_ENDANCHORED| \ - PCRE2_FIRSTLINE|PCRE2_LITERAL|PCRE2_NO_START_OPTIMIZE| \ - PCRE2_NO_UTF_CHECK|PCRE2_USE_OFFSET_LIMIT|PCRE2_UTF) + PCRE2_FIRSTLINE|PCRE2_LITERAL|PCRE2_MATCH_INVALID_UTF| \ + PCRE2_NO_START_OPTIMIZE|PCRE2_NO_UTF_CHECK|PCRE2_USE_OFFSET_LIMIT|PCRE2_UTF) #define PUBLIC_COMPILE_OPTIONS \ (PUBLIC_LITERAL_COMPILE_OPTIONS| \ @@ -781,7 +799,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, ERR95, ERR96 }; + ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98 }; /* 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 @@ -1012,6 +1030,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_LOOKAHEAD_NA: fprintf(stderr, "META (*napla:"); 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; @@ -1043,6 +1062,12 @@ for (;;) fprintf(stderr, "%zd", offset); break; + case META_LOOKBEHIND_NA: + fprintf(stderr, "META (*naplb: %d offset=", meta_arg); + GETOFFSET(offset, pptr); + fprintf(stderr, "%zd", offset); + break; + case META_LOOKBEHINDNOT: fprintf(stderr, "META (?<! %d offset=", meta_arg); GETOFFSET(offset, pptr); @@ -1419,9 +1444,6 @@ the result is "not a repeat quantifier". */ EXIT: if (yield || *errorcodeptr != 0) *ptrptr = p; return yield; - - - } @@ -2450,8 +2472,9 @@ must be last. */ enum { RANGE_NO, RANGE_STARTED, RANGE_OK_ESCAPED, RANGE_OK_LITERAL }; -/* Only in 32-bit mode can there be literals > META_END. A macros encapsulates -the storing of literal values in the parsed pattern. */ +/* Only in 32-bit mode can there be literals > META_END. A macro encapsulates +the storing of literal values in the main parsed pattern, where they can always +be quantified. */ #if PCRE2_CODE_UNIT_WIDTH == 32 #define PARSED_LITERAL(c, p) \ @@ -2474,6 +2497,7 @@ uint32_t delimiter; uint32_t namelen; uint32_t class_range_state; uint32_t *verblengthptr = NULL; /* Value avoids compiler warning */ +uint32_t *verbstartptr = NULL; uint32_t *previous_callout = NULL; uint32_t *parsed_pattern = cb->parsed_pattern; uint32_t *parsed_pattern_end = cb->parsed_pattern_end; @@ -2600,10 +2624,20 @@ while (ptr < ptrend) errorcode = ERR28; goto FAILED; } - if (!inverbname && after_manual_callout-- <= 0) - parsed_pattern = manage_callouts(thisptr, &previous_callout, - auto_callout, parsed_pattern, cb); - PARSED_LITERAL(c, parsed_pattern); + if (inverbname) + { /* Don't use PARSED_LITERAL() because it */ +#if PCRE2_CODE_UNIT_WIDTH == 32 /* sets okquantifier. */ + if (c >= META_END) *parsed_pattern++ = META_BIGVALUE; +#endif + *parsed_pattern++ = c; + } + else + { + if (after_manual_callout-- <= 0) + parsed_pattern = manage_callouts(thisptr, &previous_callout, + auto_callout, parsed_pattern, cb); + PARSED_LITERAL(c, parsed_pattern); + } meta_quantifier = 0; } continue; /* Next character */ @@ -2640,13 +2674,15 @@ while (ptr < ptrend) switch(c) { - default: - PARSED_LITERAL(c, parsed_pattern); + default: /* Don't use PARSED_LITERAL() because it */ +#if PCRE2_CODE_UNIT_WIDTH == 32 /* sets okquantifier. */ + if (c >= META_END) *parsed_pattern++ = META_BIGVALUE; +#endif + *parsed_pattern++ = c; break; case CHAR_RIGHT_PARENTHESIS: inverbname = FALSE; - okquantifier = FALSE; /* Was probably set by literals */ /* This is the length in characters */ verbnamelength = (PCRE2_SIZE)(parsed_pattern - verblengthptr - 1); /* But the limit on the length is in code units */ @@ -2680,8 +2716,11 @@ while (ptr < ptrend) switch(escape) { - case 0: - PARSED_LITERAL(c, parsed_pattern); + case 0: /* Don't use PARSED_LITERAL() because it */ +#if PCRE2_CODE_UNIT_WIDTH == 32 /* sets okquantifier. */ + if (c >= META_END) *parsed_pattern++ = META_BIGVALUE; +#endif + *parsed_pattern++ = c; break; case ESC_Q: @@ -3135,6 +3174,21 @@ while (ptr < ptrend) goto FAILED_BACK; } + /* Most (*VERB)s are not allowed to be quantified, but an ungreedy + quantifier can be useful for (*ACCEPT) - meaning "succeed on backtrack", a + sort of negated (*COMMIT). We therefore allow (*ACCEPT) to be quantified by + wrapping it in non-capturing brackets, but we have to allow for a preceding + (*MARK) for when (*ACCEPT) has an argument. */ + + if (parsed_pattern[-1] == META_ACCEPT) + { + uint32_t *p; + for (p = parsed_pattern - 1; p >= verbstartptr; p--) p[1] = p[0]; + *verbstartptr = META_NOCAPTURE; + parsed_pattern[1] = META_KET; + parsed_pattern += 2; + } + /* Now we can put the quantifier into the parsed pattern vector. At this stage, we have only the basic quantifier. The check for a following + or ? modifier happens at the top of the loop, after any intervening comments @@ -3581,6 +3635,8 @@ while (ptr < ptrend) if (c == CHAR_RIGHT_SQUARE_BRACKET && !inescq) break; } /* End of class-processing loop */ + /* -] at the end of a class is a literal '-' */ + if (class_range_state == RANGE_STARTED) { parsed_pattern[-1] = CHAR_MINUS; @@ -3611,6 +3667,11 @@ while (ptr < ptrend) nest_depth++; if ((options & PCRE2_NO_AUTO_CAPTURE) == 0) { + if (cb->bracount >= MAX_GROUP_NUMBER) + { + errorcode = ERR97; + goto FAILED; + } cb->bracount++; *parsed_pattern++ = META_CAPTURE | cb->bracount; } @@ -3658,19 +3719,20 @@ while (ptr < ptrend) goto FAILED; } - /* Check for expecting an assertion condition. If so, only lookaround - assertions are valid. */ + /* Check for expecting an assertion condition. If so, only atomic + lookaround assertions are valid. */ meta = alasmeta[i].meta; if (prev_expect_cond_assert > 0 && (meta < META_LOOKAHEAD || meta > META_LOOKBEHINDNOT)) { - errorcode = ERR28; /* Assertion expected */ + errorcode = (meta == META_LOOKAHEAD_NA || meta == META_LOOKBEHIND_NA)? + ERR98 : ERR28; /* (Atomic) assertion expected */ goto FAILED; } - /* The lookaround alphabetic synonyms can be almost entirely handled by - jumping to the code that handles the traditional symbolic forms. */ + /* The lookaround alphabetic synonyms can mostly be handled by jumping + to the code that handles the traditional symbolic forms. */ switch(meta) { @@ -3684,11 +3746,17 @@ while (ptr < ptrend) case META_LOOKAHEAD: goto POSITIVE_LOOK_AHEAD; + case META_LOOKAHEAD_NA: + *parsed_pattern++ = meta; + ptr++; + goto POST_ASSERTION; + case META_LOOKAHEADNOT: goto NEGATIVE_LOOK_AHEAD; case META_LOOKBEHIND: case META_LOOKBEHINDNOT: + case META_LOOKBEHIND_NA: *parsed_pattern++ = meta; ptr--; goto POST_LOOKBEHIND; @@ -3770,6 +3838,12 @@ while (ptr < ptrend) goto FAILED; } + /* Remember where this verb, possibly with a preceding (*MARK), starts, + for handling quantified (*ACCEPT). */ + + verbstartptr = parsed_pattern; + okquantifier = (verbs[i].meta == META_ACCEPT); + /* It appears that Perl allows any characters whatsoever, other than a closing parenthesis, to appear in arguments ("names"), so we no longer insist on letters, digits, and underscores. Perl does not, however, do @@ -4386,7 +4460,7 @@ while (ptr < ptrend) *parsed_pattern++ = (ptr[1] == CHAR_EQUALS_SIGN)? META_LOOKBEHIND : META_LOOKBEHINDNOT; - POST_LOOKBEHIND: /* Come from (*plb: and (*nlb: */ + POST_LOOKBEHIND: /* Come from (*plb: (*naplb: and (*nlb: */ *has_lookbehind = TRUE; offset = (PCRE2_SIZE)(ptr - cb->start_pattern - 2); PUTOFFSET(offset, parsed_pattern); @@ -4435,6 +4509,11 @@ while (ptr < ptrend) /* We have a name for this capturing group. It is also assigned a number, which is its primary means of identification. */ + if (cb->bracount >= MAX_GROUP_NUMBER) + { + errorcode = ERR97; + goto FAILED; + } cb->bracount++; *parsed_pattern++ = META_CAPTURE | cb->bracount; nest_depth++; @@ -4661,6 +4740,7 @@ for (;;) case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: + case OP_ASSERTBACK_NA: if (!skipassert) return code; do code += GET(code, 1); while (*code == OP_ALT); code += PRIV(OP_lengths)[*code]; @@ -5221,8 +5301,10 @@ PCRE2_UCHAR *tempcode; PCRE2_UCHAR *previous = NULL; PCRE2_UCHAR op_previous; BOOL groupsetfirstcu = FALSE; +BOOL had_accept = FALSE; BOOL matched_char = FALSE; BOOL previous_matched_char = FALSE; +BOOL reset_caseful = FALSE; const uint8_t *cbits = cb->cbits; uint8_t classbits[32]; @@ -5355,7 +5437,7 @@ for (;; pptr++) if (meta < META_ASTERISK || meta > META_MINMAX_QUERY) { previous = code; - if (matched_char) okreturn = 1; + if (matched_char && !had_accept) okreturn = 1; } previous_matched_char = matched_char; @@ -5499,7 +5581,45 @@ for (;; pptr++) } /* End of 1-char optimization */ /* Handle character classes that contain more than just one literal - character. */ + character. If there are exactly two characters in a positive class, see if + they are case partners. This can be optimized to generate a caseless single + character match (which also sets first/required code units if relevant). */ + + if (meta == META_CLASS && pptr[1] < META_END && pptr[2] < META_END && + pptr[3] == META_CLASS_END) + { + uint32_t c = pptr[1]; + +#ifdef SUPPORT_UNICODE + if (UCD_CASESET(c) == 0) +#endif + { + uint32_t d; + +#ifdef SUPPORT_UNICODE + if (utf && c > 127) d = UCD_OTHERCASE(c); else +#endif + { +#if PCRE2_CODE_UNIT_WIDTH != 8 + if (c > 255) d = c; else +#endif + d = TABLE_GET(c, cb->fcc, c); + } + + if (c != d && pptr[2] == d) + { + pptr += 3; /* Move on to class end */ + meta = c; + if ((options & PCRE2_CASELESS) == 0) + { + reset_caseful = TRUE; + options |= PCRE2_CASELESS; + req_caseopt = REQ_CASELESS; + } + goto CLASS_CASELESS_CHAR; + } + } + } /* If a non-extended class contains a negative special such as \S, we need to flip the negation flag at the end, so that support for characters > 255 @@ -5994,7 +6114,7 @@ for (;; pptr++) workspace overflow. Do not set firstcu after *ACCEPT. */ case META_ACCEPT: - cb->had_accept = TRUE; + cb->had_accept = had_accept = TRUE; for (oc = cb->open_caps; oc != NULL && oc->assert_depth >= cb->assert_depth; oc = oc->next) @@ -6252,6 +6372,11 @@ for (;; pptr++) cb->assert_depth += 1; goto GROUP_PROCESS; + case META_LOOKAHEAD_NA: + bravalue = OP_ASSERT_NA; + cb->assert_depth += 1; + goto GROUP_PROCESS; + /* Optimize (?!) to (*FAIL) unless it is quantified - which is a weird thing to do, but Perl allows all assertions to be quantified, and when they contain capturing parentheses there may be a potential use for @@ -6283,6 +6408,11 @@ for (;; pptr++) cb->assert_depth += 1; goto GROUP_PROCESS; + case META_LOOKBEHIND_NA: + bravalue = OP_ASSERTBACK_NA; + cb->assert_depth += 1; + goto GROUP_PROCESS; + case META_ATOMIC: bravalue = OP_ONCE; goto GROUP_PROCESS_NOTE_EMPTY; @@ -6341,7 +6471,7 @@ for (;; pptr++) /* If we've just compiled an assertion, pop the assert depth. */ - if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT) + if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NA) cb->assert_depth -= 1; /* At the end of compiling, code is still pointing to the start of the @@ -6491,8 +6621,8 @@ for (;; pptr++) we must only take the reqcu when the group also set a firstcu. Otherwise, in that example, 'X' ends up set for both. */ - else if (bravalue == OP_ASSERT && subreqcuflags >= 0 && - subfirstcuflags >= 0) + else if ((bravalue == OP_ASSERT || bravalue == OP_ASSERT_NA) && + subreqcuflags >= 0 && subfirstcuflags >= 0) { reqcu = subreqcu; reqcuflags = subreqcuflags; @@ -6713,10 +6843,6 @@ for (;; pptr++) reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY; op_type = 0; - /* If the repeat is {1} we can ignore it. */ - - if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT; - /* Adjust first and required code units for a zero repeat. */ if (repeat_min == 0) @@ -6759,7 +6885,10 @@ for (;; pptr++) tempcode = previous; op_previous = *previous; - /* Now handle repetition for the different types of item. */ + /* Now handle repetition for the different types of item. If the repeat + minimum and the repeat maximum are both 1, we can ignore the quantifier for + non-parenthesized items, as they have only one alternative. For anything in + parentheses, we must not ignore if {1} is possessive. */ switch (op_previous) { @@ -6773,6 +6902,7 @@ for (;; pptr++) case OP_CHARI: case OP_NOT: case OP_NOTI: + if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT; op_type = chartypeoffset[op_previous - OP_CHAR]; /* Deal with UTF characters that take up more than one code unit. */ @@ -6819,6 +6949,7 @@ for (;; pptr++) code = previous; goto END_REPEAT; } + if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT; if (repeat_min == 0 && repeat_max == REPEAT_UNLIMITED) *code++ = OP_CRSTAR + repeat_type; @@ -6853,6 +6984,8 @@ for (;; pptr++) repetition. */ case OP_RECURSE: + if (repeat_max == 1 && repeat_min == 1 && !possessive_quantifier) + goto END_REPEAT; /* Generate unwrapped repeats for a non-zero minimum, except when the minimum is 1 and the maximum unlimited, because that can be handled with @@ -6923,8 +7056,10 @@ for (;; pptr++) case OP_ASSERT: case OP_ASSERT_NOT: + case OP_ASSERT_NA: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: + case OP_ASSERTBACK_NA: case OP_ONCE: case OP_SCRIPT_RUN: case OP_BRA: @@ -6935,6 +7070,9 @@ for (;; pptr++) PCRE2_UCHAR *bralink = NULL; PCRE2_UCHAR *brazeroptr = NULL; + if (repeat_max == 1 && repeat_min == 1 && !possessive_quantifier) + goto END_REPEAT; + /* Repeating a DEFINE group (or any group where the condition is always FALSE and there is only one branch) is pointless, but Perl allows the syntax, so we just ignore the repeat. */ @@ -7151,11 +7289,12 @@ for (;; pptr++) 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 - KETRPOS. (It turns out to be convenient at runtime to detect this kind of - subpattern at both the start and at the end.) The use of special opcodes - makes it possible to reduce greatly the stack usage in pcre2_match(). If - the group is preceded by OP_BRAZERO, convert this to OP_BRAPOSZERO. + conditional, we convert the BRA code to the POS form, and the KET code + to KETRPOS. (It turns out to be convenient at runtime to detect this + kind of subpattern at both the start and at the end.) The use of + special opcodes makes it possible to reduce greatly the stack usage in + pcre2_match(). If the group is preceded by OP_BRAZERO, convert this to + OP_BRAPOSZERO. Then, if the minimum number of matches is 1 or 0, cancel the possessive flag so that the default action below, of wrapping everything inside @@ -7256,6 +7395,8 @@ for (;; pptr++) int prop_type, prop_value; PCRE2_UCHAR *oldcode; + if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT; + op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ mclength = 0; /* Not a character */ @@ -7718,9 +7859,15 @@ for (;; pptr++) } #endif - /* Caseful matches, or not one of the multicase characters. Get the - character's code units into mcbuffer, with the length in mclength. When not - in UTF mode, the length is always 1. */ + /* Caseful matches, or caseless and not one of the multicase characters. We + come here by goto in the case of a positive class that contains only + case-partners of a character with just two cases; matched_char has already + been set TRUE and options fudged if necessary. */ + + CLASS_CASELESS_CHAR: + + /* Get the character's code units into mcbuffer, with the length in + mclength. When not in UTF mode, the length is always 1. */ #ifdef SUPPORT_UNICODE if (utf) mclength = PRIV(ord2utf)(meta, mcbuffer); else @@ -7752,8 +7899,9 @@ for (;; pptr++) zeroreqcu = reqcu; zeroreqcuflags = reqcuflags; - /* If the character is more than one code unit long, we can set firstcu - only if it is not to be matched caselessly. */ + /* If the character is more than one code unit long, we can set a single + firstcu only if it is not to be matched caselessly. Multiple possible + starting code units may be picked up later in the studying code. */ if (mclength == 1 || req_caseopt == 0) { @@ -7783,7 +7931,17 @@ for (;; pptr++) reqcuflags = req_caseopt | cb->req_varyopt; } } - break; /* End default meta handling */ + + /* If caselessness was temporarily instated, reset it. */ + + if (reset_caseful) + { + options &= ~PCRE2_CASELESS; + req_caseopt = 0; + reset_caseful = FALSE; + } + + break; /* End literal character handling */ } /* End of big switch */ } /* End of big loop */ @@ -7874,7 +8032,10 @@ length = 2 + 2*LINK_SIZE + skipunits; /* Remember if this is a lookbehind assertion, and if it is, save its length and skip over the pattern offset. */ -lookbehind = *code == OP_ASSERTBACK || *code == OP_ASSERTBACK_NOT; +lookbehind = *code == OP_ASSERTBACK || + *code == OP_ASSERTBACK_NOT || + *code == OP_ASSERTBACK_NA; + if (lookbehind) { lookbehindlength = META_DATA(pptr[-1]); @@ -7948,7 +8109,7 @@ for (;;) /* If this is not the first branch, the first char and reqcu have to match the values from all the previous branches, except that if the previous value for reqcu didn't have REQ_VARY set, it can still match, - and we set REQ_VARY for the regex. */ + and we set REQ_VARY for the group from this branch's value. */ else { @@ -7987,7 +8148,7 @@ for (;;) else { reqcu = branchreqcu; - reqcuflags |= branchreqcuflags; /* To "or" REQ_VARY */ + reqcuflags |= branchreqcuflags; /* To "or" REQ_VARY if present */ } } } @@ -8167,7 +8328,7 @@ do { /* Positive forward assertion */ - else if (op == OP_ASSERT) + else if (op == OP_ASSERT || op == OP_ASSERT_NA) { if (!is_anchored(scode, bracket_map, cb, atomcount, TRUE)) return FALSE; } @@ -8305,7 +8466,7 @@ do { /* Positive forward assertions */ - else if (op == OP_ASSERT) + else if (op == OP_ASSERT || op == OP_ASSERT_NA) { if (!is_startline(scode, bracket_map, cb, atomcount, TRUE)) return FALSE; @@ -8547,9 +8708,11 @@ do { case OP_CBRAPOS: case OP_SCBRAPOS: case OP_ASSERT: + case OP_ASSERT_NA: case OP_ONCE: case OP_SCRIPT_RUN: - d = find_firstassertedcu(scode, &dflags, inassert + ((op==OP_ASSERT)?1:0)); + d = find_firstassertedcu(scode, &dflags, inassert + + ((op == OP_ASSERT || op == OP_ASSERT_NA)?1:0)); if (dflags < 0) return 0; if (cflags < 0) { c = d; cflags = dflags; } @@ -8578,6 +8741,19 @@ do { case OP_MINPLUSI: case OP_POSPLUSI: if (inassert == 0) return 0; + + /* If the character is more than one code unit long, we cannot set its + first code unit when matching caselessly. Later scanning may pick up + multiple code units. */ + +#ifdef SUPPORT_UNICODE +#if PCRE2_CODE_UNIT_WIDTH == 8 + if (scode[1] >= 0x80) return 0; +#elif PCRE2_CODE_UNIT_WIDTH == 16 + if (scode[1] >= 0xd800 && scode[1] <= 0xdfff) return 0; +#endif +#endif + if (cflags < 0) { c = scode[1]; cflags = REQ_CASELESS; } else if (c != scode[1]) return 0; break; @@ -8745,8 +8921,10 @@ for (;; pptr++) case META_COND_VERSION: case META_LOOKAHEAD: case META_LOOKAHEADNOT: + case META_LOOKAHEAD_NA: case META_LOOKBEHIND: case META_LOOKBEHINDNOT: + case META_LOOKBEHIND_NA: case META_NOCAPTURE: case META_SCRIPT_RUN: nestlevel++; @@ -8798,7 +8976,7 @@ Returns: the group length or a negative number static int get_grouplength(uint32_t **pptrptr, BOOL isinline, int *errcodeptr, int *lcptr, - int group, parsed_recurse_check *recurses, compile_block *cb) + int group, parsed_recurse_check *recurses, compile_block *cb) { int branchlength; int grouplength = -1; @@ -8847,8 +9025,7 @@ return -1; *************************************************/ /* Return a fixed length for a branch in a lookbehind, giving an error if the -length is not fixed. If any lookbehinds are encountered on the way, they get -their length set. On entry, *pptrptr points to the first element inside the +length is not fixed. On entry, *pptrptr points to the first element inside the branch. On exit it is set to point to the ALT or KET. Arguments: @@ -8978,15 +9155,16 @@ for (;; pptr++) } break; - /* Lookaheads can be ignored, but we must start the skip inside the group - so that it isn't treated as a group within the branch. */ + /* Lookaheads do not contribute to the length of this branch, but they may + contain lookbehinds within them whose lengths need to be set. */ case META_LOOKAHEAD: case META_LOOKAHEADNOT: - pptr = parsed_skip(pptr + 1, PSKIP_KET); - if (pptr == NULL) goto PARSED_SKIP_FAILED; + case META_LOOKAHEAD_NA: + *errcodeptr = check_lookbehinds(pptr + 1, &pptr, recurses, cb); + if (*errcodeptr != 0) return -1; - /* Also ignore any qualifiers that follow a lookahead assertion. */ + /* Ignore any qualifiers that follow a lookahead assertion. */ switch (pptr[1]) { @@ -9013,10 +9191,12 @@ for (;; pptr++) } break; - /* Lookbehinds can be ignored, but must themselves be checked. */ + /* A nested lookbehind does not contribute any length to this lookbehind, + but must itself be checked and have its lengths set. */ case META_LOOKBEHIND: case META_LOOKBEHINDNOT: + case META_LOOKBEHIND_NA: if (!set_lookbehind_lengths(&pptr, errcodeptr, lcptr, recurses, cb)) return -1; break; @@ -9178,8 +9358,26 @@ for (;; pptr++) case META_MINMAX_QUERY: if (pptr[1] == pptr[2]) { - if (pptr[1] == 0) branchlength -= lastitemlength; - else itemlength = (pptr[1] - 1) * lastitemlength; + switch(pptr[1]) + { + case 0: + branchlength -= lastitemlength; + break; + + case 1: + itemlength = 0; + break; + + default: /* Check for integer overflow */ + if (lastitemlength != 0 && /* Should not occur, but just in case */ + INT_MAX/lastitemlength < pptr[1] - 1) + { + *errcodeptr = ERR87; /* Integer overflow; lookbehind too big */ + return -1; + } + itemlength = (pptr[1] - 1) * lastitemlength; + break; + } pptr += 2; break; } @@ -9193,24 +9391,23 @@ for (;; pptr++) return -1; } - /* Add the item length to the branchlength, and save it for use if the next - thing is a quantifier. */ - - branchlength += itemlength; - lastitemlength = itemlength; - - /* Ensure that the length does not overflow the limit. */ + /* Add the item length to the branchlength, checking for integer overflow and + for the branch length exceeding the limit. */ - if (branchlength > LOOKBEHIND_MAX) + if (INT_MAX - branchlength < (int)itemlength || + (branchlength += itemlength) > LOOKBEHIND_MAX) { *errcodeptr = ERR87; return -1; } + + /* Save this item length for use if the next item is a quantifier. */ + + lastitemlength = itemlength; } EXIT: *pptrptr = pptr; -if (branchlength > cb->max_lookbehind) cb->max_lookbehind = branchlength; return branchlength; PARSED_SKIP_FAILED: @@ -9229,6 +9426,11 @@ branches. An error occurs if any branch does not have a fixed length that is less than the maximum (65535). On exit, the pointer must be left on the final ket. +The function also maintains the max_lookbehind value. Any lookbehind branch +that contains a nested lookbehind may actually look further back than the +length of the branch. The additional amount is passed back from +get_branchlength() as an "extra" value. + Arguments: pptrptr pointer to pointer in the parsed pattern errcodeptr pointer to error code @@ -9262,6 +9464,7 @@ do if (cb->erroroffset == PCRE2_UNSET) cb->erroroffset = offset; return FALSE; } + if (branchlength > cb->max_lookbehind) cb->max_lookbehind = branchlength; *bptr |= branchlength; /* branchlength never more than 65535 */ bptr = *pptrptr; } @@ -9282,20 +9485,30 @@ set_lookbehind_lengths() for each one. At the start, the errorcode is zero and the error offset is marked unset. The enables the functions above not to override settings from deeper nestings. -Arguments cb points to the compile block -Returns: 0 on success, or an errorcode (cb->erroroffset will be set) +This function is called recursively from get_branchlength() for lookaheads in +order to process any lookbehinds that they may contain. It stops when it hits a +non-nested closing parenthesis in this case, returning a pointer to it. + +Arguments + pptr points to where to start (start of pattern or start of lookahead) + retptr if not NULL, return the ket pointer here + recurses chain of recurse_check to catch mutual recursion + cb points to the compile block + +Returns: 0 on success, or an errorcode (cb->erroroffset will be set) */ static int -check_lookbehinds(compile_block *cb) +check_lookbehinds(uint32_t *pptr, uint32_t **retptr, + parsed_recurse_check *recurses, compile_block *cb) { -uint32_t *pptr; int errorcode = 0; int loopcount = 0; +int nestlevel = 0; cb->erroroffset = PCRE2_UNSET; -for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++) +for (; *pptr != META_END; pptr++) { if (*pptr < META_END) continue; /* Literal */ @@ -9309,14 +9522,31 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++) pptr += 1; break; + case META_KET: + if (--nestlevel < 0) + { + if (retptr != NULL) *retptr = pptr; + return 0; + } + break; + + case META_ATOMIC: + case META_CAPTURE: + case META_COND_ASSERT: + case META_LOOKAHEAD: + case META_LOOKAHEADNOT: + case META_LOOKAHEAD_NA: + case META_NOCAPTURE: + case META_SCRIPT_RUN: + nestlevel++; + break; + case META_ACCEPT: case META_ALT: case META_ASTERISK: case META_ASTERISK_PLUS: case META_ASTERISK_QUERY: - case META_ATOMIC: case META_BACKREF: - case META_CAPTURE: case META_CIRCUMFLEX: case META_CLASS: case META_CLASS_EMPTY: @@ -9324,14 +9554,9 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++) case META_CLASS_END: case META_CLASS_NOT: case META_COMMIT: - case META_COND_ASSERT: case META_DOLLAR: case META_DOT: case META_FAIL: - case META_KET: - case META_LOOKAHEAD: - case META_LOOKAHEADNOT: - case META_NOCAPTURE: case META_PLUS: case META_PLUS_PLUS: case META_PLUS_QUERY: @@ -9341,7 +9566,6 @@ 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; @@ -9351,13 +9575,22 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++) break; case META_BACKREF_BYNAME: + case META_RECURSE_BYNAME: + pptr += 1 + SIZEOFFSET; + break; + case META_COND_DEFINE: case META_COND_NAME: case META_COND_NUMBER: case META_COND_RNAME: case META_COND_RNUMBER: - case META_RECURSE_BYNAME: pptr += 1 + SIZEOFFSET; + nestlevel++; + break; + + case META_COND_VERSION: + pptr += 3; + nestlevel++; break; case META_CALLOUT_STRING: @@ -9378,7 +9611,6 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++) break; case META_CALLOUT_NUMBER: - case META_COND_VERSION: pptr += 3; break; @@ -9392,7 +9624,8 @@ for (pptr = cb->parsed_pattern; *pptr != META_END; pptr++) case META_LOOKBEHIND: case META_LOOKBEHINDNOT: - if (!set_lookbehind_lengths(&pptr, &errorcode, &loopcount, NULL, cb)) + case META_LOOKBEHIND_NA: + if (!set_lookbehind_lengths(&pptr, &errorcode, &loopcount, recurses, cb)) return errorcode; break; } @@ -9494,6 +9727,10 @@ if (pattern == NULL) if (ccontext == NULL) ccontext = (pcre2_compile_context *)(&PRIV(default_compile_context)); +/* PCRE2_MATCH_INVALID_UTF implies UTF */ + +if ((options & PCRE2_MATCH_INVALID_UTF) != 0) options |= PCRE2_UTF; + /* Check that all undefined public option bits are zero. */ if ((options & ~PUBLIC_COMPILE_OPTIONS) != 0 || @@ -9672,7 +9909,7 @@ if ((options & PCRE2_LITERAL) == 0) ptr += skipatstart; -/* Can't support UTF or UCP unless PCRE2 has been compiled with UTF support. */ +/* Can't support UTF or UCP if PCRE2 was built without Unicode support. */ #ifndef SUPPORT_UNICODE if ((cb.external_options & (PCRE2_UTF|PCRE2_UCP)) != 0) @@ -9842,7 +10079,7 @@ lengths. */ if (has_lookbehind) { - errorcode = check_lookbehinds(&cb); + errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb); if (errorcode != 0) goto HAD_CB_ERROR; } @@ -9990,8 +10227,9 @@ re->max_lookbehind = cb.max_lookbehind; if (cb.had_accept) { - reqcu = 0; /* Must disable after (*ACCEPT) */ + reqcu = 0; /* Must disable after (*ACCEPT) */ reqcuflags = REQ_NONE; + re->flags |= PCRE2_HASACCEPT; /* Disables minimum length */ } /* Fill in the final opcode and check for disastrous overflow. If no overflow, @@ -10112,6 +10350,8 @@ unit. */ if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0) { + int minminlength = 0; /* For minimal minlength from first/required CU */ + /* If we do not have a first code unit, see if there is one that is asserted (these are not saved during the compile because they can cause conflicts with actual literals that follow). */ @@ -10119,12 +10359,14 @@ if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0) if (firstcuflags < 0) firstcu = find_firstassertedcu(codestart, &firstcuflags, 0); - /* Save the data for a first code unit. */ + /* Save the data for a first code unit. The existence of one means the + minimum length must be at least 1. */ if (firstcuflags >= 0) { re->first_codeunit = firstcu; re->flags |= PCRE2_FIRSTSET; + minminlength++; /* Handle caseless first code units. */ @@ -10158,39 +10400,72 @@ if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0) is_startline(codestart, 0, &cb, 0, FALSE)) re->flags |= PCRE2_STARTLINE; - /* Handle the "required code unit", if one is set. In the case of an anchored - pattern, do this only if it follows a variable length item in the pattern. */ + /* Handle the "required code unit", if one is set. In the UTF case we can + increment the minimum minimum length only if we are sure this really is a + different character and not a non-starting code unit of the first character, + because the minimum length count is in characters, not code units. */ - if (reqcuflags >= 0 && - ((re->overall_options & PCRE2_ANCHORED) == 0 || - (reqcuflags & REQ_VARY) != 0)) + if (reqcuflags >= 0) { - re->last_codeunit = reqcu; - re->flags |= PCRE2_LASTSET; +#if PCRE2_CODE_UNIT_WIDTH == 16 + if ((re->overall_options & PCRE2_UTF) == 0 || /* Not UTF */ + firstcuflags < 0 || /* First not set */ + (firstcu & 0xf800) != 0xd800 || /* First not surrogate */ + (reqcu & 0xfc00) != 0xdc00) /* Req not low surrogate */ +#elif PCRE2_CODE_UNIT_WIDTH == 8 + if ((re->overall_options & PCRE2_UTF) == 0 || /* Not UTF */ + firstcuflags < 0 || /* First not set */ + (firstcu & 0x80) == 0 || /* First is ASCII */ + (reqcu & 0x80) == 0) /* Req is ASCII */ +#endif + { + minminlength++; + } - /* Handle caseless required code units as for first code units (above). */ + /* In the case of an anchored pattern, set up the value only if it follows + a variable length item in the pattern. */ - if ((reqcuflags & REQ_CASELESS) != 0) + if ((re->overall_options & PCRE2_ANCHORED) == 0 || + (reqcuflags & REQ_VARY) != 0) { - if (reqcu < 128 || (!utf && reqcu < 255)) + re->last_codeunit = reqcu; + re->flags |= PCRE2_LASTSET; + + /* Handle caseless required code units as for first code units (above). */ + + if ((reqcuflags & REQ_CASELESS) != 0) { - if (cb.fcc[reqcu] != reqcu) re->flags |= PCRE2_LASTCASELESS; - } + if (reqcu < 128 || (!utf && reqcu < 255)) + { + if (cb.fcc[reqcu] != reqcu) re->flags |= PCRE2_LASTCASELESS; + } #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8 - else if (reqcu <= MAX_UTF_CODE_POINT && UCD_OTHERCASE(reqcu) != reqcu) - re->flags |= PCRE2_LASTCASELESS; + else if (reqcu <= MAX_UTF_CODE_POINT && UCD_OTHERCASE(reqcu) != reqcu) + re->flags |= PCRE2_LASTCASELESS; #endif + } } } - /* Finally, study the compiled pattern to set up information such as a bitmap - of starting code units and a minimum matching length. */ + /* Study the compiled pattern to set up information such as a bitmap of + starting code units and a minimum matching length. */ if (PRIV(study)(re) != 0) { errorcode = ERR31; goto HAD_CB_ERROR; } + + /* If study() set a bitmap of starting code units, it implies a minimum + length of at least one. */ + + if ((re->flags & PCRE2_FIRSTMAPSET) != 0 && minminlength == 0) + minminlength = 1; + + /* If the minimum length set (or not set) by study() is less than the minimum + implied by required code units, override it. */ + + if (re->minlength < minminlength) re->minlength = minminlength; } /* End of start-of-match optimizations. */ /* Control ends up here in all cases. When running under valgrind, make a diff --git a/thirdparty/pcre2/src/pcre2_context.c b/thirdparty/pcre2/src/pcre2_context.c index 9c2886a6d0..f904a494a0 100644 --- a/thirdparty/pcre2/src/pcre2_context.c +++ b/thirdparty/pcre2/src/pcre2_context.c @@ -323,7 +323,7 @@ data. */ PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION pcre2_set_character_tables(pcre2_compile_context *ccontext, - const unsigned char *tables) + const uint8_t *tables) { ccontext->tables = tables; return 0; diff --git a/thirdparty/pcre2/src/pcre2_dfa_match.c b/thirdparty/pcre2/src/pcre2_dfa_match.c index bbf3e21064..7d8ffe8a3e 100644 --- a/thirdparty/pcre2/src/pcre2_dfa_match.c +++ b/thirdparty/pcre2/src/pcre2_dfa_match.c @@ -173,6 +173,8 @@ static const uint8_t coptable[] = { 0, /* Assert not */ 0, /* Assert behind */ 0, /* Assert behind not */ + 0, /* NA assert */ + 0, /* NA assert behind */ 0, /* ONCE */ 0, /* SCRIPT_RUN */ 0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */ @@ -248,6 +250,8 @@ static const uint8_t poptable[] = { 0, /* Assert not */ 0, /* Assert behind */ 0, /* Assert behind not */ + 0, /* NA assert */ + 0, /* NA assert behind */ 0, /* ONCE */ 0, /* SCRIPT_RUN */ 0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */ @@ -962,7 +966,7 @@ for (;;) if (ptr >= end_subject) { if ((mb->moptions & PCRE2_PARTIAL_HARD) != 0) - could_continue = TRUE; + return PCRE2_ERROR_PARTIAL; else { ADD_ACTIVE(state_offset + 1, 0); } } break; @@ -1011,10 +1015,12 @@ for (;;) /*-----------------------------------------------------------------*/ case OP_EODN: - if (clen == 0 && (mb->moptions & PCRE2_PARTIAL_HARD) != 0) - could_continue = TRUE; - else if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - mb->nllen)) - { ADD_ACTIVE(state_offset + 1, 0); } + if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - mb->nllen)) + { + if ((mb->moptions & PCRE2_PARTIAL_HARD) != 0) + return PCRE2_ERROR_PARTIAL; + ADD_ACTIVE(state_offset + 1, 0); + } break; /*-----------------------------------------------------------------*/ @@ -3152,8 +3158,8 @@ for (;;) /* We have finished the processing at the current subject character. If no new states have been set for the next character, we have found all the - matches that we are going to find. If we are at the top level and partial - matching has been requested, check for appropriate conditions. + matches that we are going to find. If partial matching has been requested, + check for appropriate conditions. The "forced_ fail" variable counts the number of (*F) encountered for the character. If it is equal to the original active_count (saved in @@ -3165,22 +3171,24 @@ for (;;) if (new_count <= 0) { - if (rlevel == 1 && /* Top level, and */ - could_continue && /* Some could go on, and */ + if (could_continue && /* Some could go on, and */ forced_fail != workspace[1] && /* Not all forced fail & */ ( /* either... */ (mb->moptions & PCRE2_PARTIAL_HARD) != 0 /* Hard partial */ || /* or... */ ((mb->moptions & PCRE2_PARTIAL_SOFT) != 0 && /* Soft partial and */ - match_count < 0) /* no matches */ + match_count < 0) /* no matches */ ) && /* And... */ ( - partial_newline || /* Either partial NL */ - ( /* or ... */ - ptr >= end_subject && /* End of subject and */ - ptr > mb->start_used_ptr) /* Inspected non-empty string */ + partial_newline || /* Either partial NL */ + ( /* or ... */ + ptr >= end_subject && /* End of subject and */ + ( /* either */ + ptr > mb->start_used_ptr || /* Inspected non-empty string */ + mb->allowemptypartial /* or pattern has lookbehind */ + ) /* or could match empty */ ) - ) + )) match_count = PCRE2_ERROR_PARTIAL; break; /* Exit from loop along the subject string */ } @@ -3246,6 +3254,11 @@ BOOL utf, anchored, startline, firstline; BOOL has_first_cu = FALSE; BOOL has_req_cu = FALSE; +#if PCRE2_CODE_UNIT_WIDTH == 8 +BOOL memchr_not_found_first_cu = FALSE; +BOOL memchr_not_found_first_cu2 = FALSE; +#endif + PCRE2_UCHAR first_cu = 0; PCRE2_UCHAR first_cu2 = 0; PCRE2_UCHAR req_cu = 0; @@ -3295,6 +3308,11 @@ if ((options & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) != 0 && ((re->overall_options | options) & PCRE2_ENDANCHORED) != 0) return PCRE2_ERROR_BADOPTION; +/* Invalid UTF support is not available for DFA matching. */ + +if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) != 0) + return PCRE2_ERROR_DFA_UINVALID_UTF; + /* Check that the first field in the block is the magic number. If it is not, return with PCRE2_ERROR_BADMAGIC. */ @@ -3404,6 +3422,8 @@ mb->tables = re->tables; mb->start_subject = subject; mb->end_subject = end_subject; mb->start_offset = start_offset; +mb->allowemptypartial = (re->max_lookbehind > 0) || + (re->flags & PCRE2_MATCH_EMPTY) != 0; mb->moptions = options; mb->poptions = re->overall_options; mb->match_call_count = 0; @@ -3619,7 +3639,10 @@ for (;;) /* Not anchored. Advance to a unique first code unit if there is one. In 8-bit mode, the use of memchr() gives a big speed up, even though we have to call it twice in caseless mode, in order to find the earliest occurrence - of the character in either of its cases. */ + of the character in either of its cases. If a call to memchr() that + searches the rest of the subject fails to find one case, remember that in + order not to keep on repeating the search. This can make a huge difference + when the strings are very long and only one case is present. */ else { @@ -3633,11 +3656,29 @@ for (;;) (smc = UCHAR21TEST(start_match)) != first_cu && smc != first_cu2) start_match++; + #else /* 8-bit code units */ - PCRE2_SPTR pp1 = - memchr(start_match, first_cu, end_subject-start_match); - PCRE2_SPTR pp2 = - memchr(start_match, first_cu2, end_subject-start_match); + PCRE2_SPTR pp1 = NULL; + PCRE2_SPTR pp2 = NULL; + PCRE2_SIZE cu2size = end_subject - start_match; + + if (!memchr_not_found_first_cu) + { + pp1 = memchr(start_match, first_cu, end_subject - start_match); + if (pp1 == NULL) memchr_not_found_first_cu = TRUE; + else cu2size = pp1 - start_match; + } + + /* If pp1 is not NULL, we have arranged to search only as far as pp1, + to see if the other case is earlier, so we can set "not found" only + when both searches have returned NULL. */ + + if (!memchr_not_found_first_cu2) + { + pp2 = memchr(start_match, first_cu2, cu2size); + memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL); + } + if (pp1 == NULL) start_match = (pp2 == NULL)? end_subject : pp2; else @@ -3653,7 +3694,7 @@ for (;;) while (start_match < end_subject && UCHAR21TEST(start_match) != first_cu) start_match++; -#else +#else /* 8-bit code units */ start_match = memchr(start_match, first_cu, end_subject - start_match); if (start_match == NULL) start_match = end_subject; #endif @@ -3740,6 +3781,8 @@ for (;;) if ((mb->moptions & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) == 0) { + PCRE2_SPTR p; + /* The minimum matching length is a lower bound; no actual string of that length may actually match the pattern. Although the value is, strictly, in characters, we treat it as code units to avoid spending too much time @@ -3753,37 +3796,63 @@ for (;;) point. This optimization can save a huge amount of backtracking in patterns with nested unlimited repeats that aren't going to match. Writing separate code for cased/caseless versions makes it go faster, as - does using an autoincrement and backing off on a match. + does using an autoincrement and backing off on a match. As in the case of + the first code unit, using memchr() in the 8-bit library gives a big + speed up. Unlike the first_cu check above, we do not need to call + memchr() twice in the caseless case because we only need to check for the + presence of the character in either case, not find the first occurrence. + + The search can be skipped if the code unit was found later than the + current starting point in a previous iteration of the bumpalong loop. HOWEVER: when the subject string is very, very long, searching to its end can take a long time, and give bad performance on quite ordinary patterns. This showed up when somebody was matching something like /^\d+C/ on a 32-megabyte string... so we don't do this when the string is - sufficiently long. */ + sufficiently long, but it's worth searching a lot more for unanchored + patterns. */ - if (has_req_cu && end_subject - start_match < REQ_CU_MAX) + p = start_match + (has_first_cu? 1:0); + if (has_req_cu && p > req_cu_ptr) { - PCRE2_SPTR p = start_match + (has_first_cu? 1:0); - - /* We don't need to repeat the search if we haven't yet reached the - place we found it at last time. */ + PCRE2_SIZE check_length = end_subject - start_match; - if (p > req_cu_ptr) + if (check_length < REQ_CU_MAX || + (!anchored && check_length < REQ_CU_MAX * 1000)) { - if (req_cu != req_cu2) + if (req_cu != req_cu2) /* Caseless */ { +#if PCRE2_CODE_UNIT_WIDTH != 8 while (p < end_subject) { uint32_t pp = UCHAR21INCTEST(p); if (pp == req_cu || pp == req_cu2) { p--; break; } } +#else /* 8-bit code units */ + PCRE2_SPTR pp = p; + p = memchr(pp, req_cu, end_subject - pp); + if (p == NULL) + { + p = memchr(pp, req_cu2, end_subject - pp); + if (p == NULL) p = end_subject; + } +#endif /* PCRE2_CODE_UNIT_WIDTH != 8 */ } + + /* The caseful case */ + else { +#if PCRE2_CODE_UNIT_WIDTH != 8 while (p < end_subject) { if (UCHAR21INCTEST(p) == req_cu) { p--; break; } } + +#else /* 8-bit code units */ + p = memchr(p, req_cu, end_subject - p); + if (p == NULL) p = end_subject; +#endif } /* If we can't find the required code unit, break the matching loop, diff --git a/thirdparty/pcre2/src/pcre2_error.c b/thirdparty/pcre2/src/pcre2_error.c index 1d02cf14a3..c61648cb7f 100644 --- a/thirdparty/pcre2/src/pcre2_error.c +++ b/thirdparty/pcre2/src/pcre2_error.c @@ -184,6 +184,8 @@ static const unsigned char compile_error_texts[] = /* 95 */ "(*alpha_assertion) not recognized\0" "script runs require Unicode support, which this version of PCRE2 does not have\0" + "too many capturing groups (maximum 65535)\0" + "atomic assertion expected after (?( or (?(?C)\0" ; /* Match-time and UTF error texts are in the same format. */ @@ -268,6 +270,7 @@ static const unsigned char match_error_texts[] = "invalid syntax\0" /* 65 */ "internal error - duplicate substitution match\0" + "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching\0" ; diff --git a/thirdparty/pcre2/src/pcre2_internal.h b/thirdparty/pcre2/src/pcre2_internal.h index 814d91bddb..fe8ffe5c80 100644 --- a/thirdparty/pcre2/src/pcre2_internal.h +++ b/thirdparty/pcre2/src/pcre2_internal.h @@ -517,6 +517,7 @@ bytes in a code unit in that mode. */ #define PCRE2_HASBKPORX 0x00100000 /* contains \P, \p, or \X */ #define PCRE2_DUPCAPUSED 0x00200000 /* contains (?| */ #define PCRE2_HASBKC 0x00400000 /* contains \C */ +#define PCRE2_HASACCEPT 0x00800000 /* contains (*ACCEPT) */ #define PCRE2_MODE_MASK (PCRE2_MODE8 | PCRE2_MODE16 | PCRE2_MODE32) @@ -535,13 +536,14 @@ enum { PCRE2_MATCHEDBY_INTERPRETER, /* pcre2_match() */ #define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ /* The maximum remaining length of subject we are prepared to search for a -req_unit match. In 8-bit mode, memchr() is used and is much faster than the -search loop that has to be used in 16-bit and 32-bit modes. */ +req_unit match from an anchored pattern. In 8-bit mode, memchr() is used and is +much faster than the search loop that has to be used in 16-bit and 32-bit +modes. */ #if PCRE2_CODE_UNIT_WIDTH == 8 -#define REQ_CU_MAX 2000 +#define REQ_CU_MAX 5000 #else -#define REQ_CU_MAX 1000 +#define REQ_CU_MAX 2000 #endif /* Offsets for the bitmap tables in the cbits set of tables. Each table @@ -881,12 +883,16 @@ a positive value. */ #define STRING_atomic0 "atomic\0" #define STRING_pla0 "pla\0" #define STRING_plb0 "plb\0" +#define STRING_napla0 "napla\0" +#define STRING_naplb0 "naplb\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_non_atomic_positive_lookahead0 "non_atomic_positive_lookahead\0" +#define STRING_non_atomic_positive_lookbehind0 "non_atomic_positive_lookbehind\0" #define STRING_negative_lookahead0 "negative_lookahead\0" #define STRING_negative_lookbehind0 "negative_lookbehind\0" #define STRING_script_run0 "script_run\0" @@ -1171,12 +1177,16 @@ only. */ #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_napla0 STR_n STR_a STR_p STR_l STR_a "\0" +#define STRING_naplb0 STR_n STR_a 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_non_atomic_positive_lookahead0 STR_n STR_o STR_n STR_UNDERSCORE STR_a STR_t STR_o STR_m STR_i STR_c STR_UNDERSCORE 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_non_atomic_positive_lookbehind0 STR_n STR_o STR_n STR_UNDERSCORE STR_a STR_t STR_o STR_m STR_i STR_c STR_UNDERSCORE 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" @@ -1301,7 +1311,7 @@ enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, Starting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in order to the list of escapes immediately above. Furthermore, values up to OP_DOLLM must not be changed without adjusting the table called autoposstab in -pcre2_auto_possess.c +pcre2_auto_possess.c. Whenever this list is updated, the two macro definitions that follow must be updated to match. The possessification table called "opcode_possessify" in @@ -1499,80 +1509,81 @@ enum { OP_KETRMIN, /* 123 order. They are for groups the repeat for ever. */ OP_KETRPOS, /* 124 Possessive unlimited repeat. */ - /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four - asserts must remain in order. */ + /* The assertions must come before BRA, CBRA, ONCE, and COND. */ OP_REVERSE, /* 125 Move pointer back - used in lookbehind assertions */ OP_ASSERT, /* 126 Positive lookahead */ OP_ASSERT_NOT, /* 127 Negative lookahead */ OP_ASSERTBACK, /* 128 Positive lookbehind */ OP_ASSERTBACK_NOT, /* 129 Negative lookbehind */ + OP_ASSERT_NA, /* 130 Positive non-atomic lookahead */ + OP_ASSERTBACK_NA, /* 131 Positive non-atomic lookbehind */ /* 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_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 */ + OP_ONCE, /* 132 Atomic group, contains captures */ + OP_SCRIPT_RUN, /* 133 Non-capture, but check characters' scripts */ + OP_BRA, /* 134 Start of non-capturing bracket */ + OP_BRAPOS, /* 135 Ditto, with unlimited, possessive repeat */ + OP_CBRA, /* 136 Start of capturing bracket */ + OP_CBRAPOS, /* 137 Ditto, with unlimited, possessive repeat */ + OP_COND, /* 138 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, /* 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 */ + OP_SBRA, /* 139 Start of non-capturing bracket, check empty */ + OP_SBRAPOS, /* 149 Ditto, with unlimited, possessive repeat */ + OP_SCBRA, /* 141 Start of capturing bracket, check empty */ + OP_SCBRAPOS, /* 142 Ditto, with unlimited, possessive repeat */ + OP_SCOND, /* 143 Conditional group, check empty */ /* The next two pairs must (respectively) be kept together. */ - 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_CREF, /* 144 Used to hold a capture number as condition */ + OP_DNCREF, /* 145 Used to point to duplicate names as a condition */ + OP_RREF, /* 146 Used to hold a recursion number as condition */ + OP_DNRREF, /* 147 Used to point to duplicate names as a condition */ + OP_FALSE, /* 148 Always false (used by DEFINE and VERSION) */ + OP_TRUE, /* 149 Always true (used by VERSION) */ - OP_BRAZERO, /* 148 These two must remain together and in this */ - OP_BRAMINZERO, /* 149 order. */ - OP_BRAPOSZERO, /* 150 */ + OP_BRAZERO, /* 150 These two must remain together and in this */ + OP_BRAMINZERO, /* 151 order. */ + OP_BRAPOSZERO, /* 152 */ /* These are backtracking control verbs */ - 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 */ + OP_MARK, /* 153 always has an argument */ + OP_PRUNE, /* 154 */ + OP_PRUNE_ARG, /* 155 same, but with argument */ + OP_SKIP, /* 156 */ + OP_SKIP_ARG, /* 157 same, but with argument */ + OP_THEN, /* 158 */ + OP_THEN_ARG, /* 159 same, but with argument */ + OP_COMMIT, /* 160 */ + OP_COMMIT_ARG, /* 161 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, /* 160 */ - OP_ACCEPT, /* 161 */ - OP_ASSERT_ACCEPT, /* 162 Used inside assertions */ - OP_CLOSE, /* 163 Used before OP_ACCEPT to close open captures */ + OP_FAIL, /* 162 */ + OP_ACCEPT, /* 163 */ + OP_ASSERT_ACCEPT, /* 164 Used inside assertions */ + OP_CLOSE, /* 165 Used before OP_ACCEPT to close open captures */ /* This is used to skip a subpattern with a {0} quantifier */ - OP_SKIPZERO, /* 164 */ + OP_SKIPZERO, /* 166 */ /* 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, /* 165 */ + OP_DEFINE, /* 167 */ /* 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 @@ -1585,7 +1596,7 @@ enum { /* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro definitions that follow must also be updated to match. There are also tables called "opcode_possessify" in pcre2_compile.c and "coptable" and "poptable" in -pcre2_dfa_exec.c that must be updated. */ +pcre2_dfa_match.c that must be updated. */ /* This macro defines textual names for all the opcodes. These are used only @@ -1618,7 +1629,9 @@ some cases doesn't actually use these names at all). */ "class", "nclass", "xclass", "Ref", "Refi", "DnRef", "DnRefi", \ "Recurse", "Callout", "CalloutStr", \ "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos", \ - "Reverse", "Assert", "Assert not", "AssertB", "AssertB not", \ + "Reverse", "Assert", "Assert not", \ + "Assert back", "Assert back not", \ + "Non-atomic assert", "Non-atomic assert back", \ "Once", \ "Script run", \ "Bra", "BraPos", "CBra", "CBraPos", \ @@ -1703,6 +1716,8 @@ in UTF-8 mode. The code that uses this table must know about such things. */ 1+LINK_SIZE, /* Assert not */ \ 1+LINK_SIZE, /* Assert behind */ \ 1+LINK_SIZE, /* Assert behind not */ \ + 1+LINK_SIZE, /* NA Assert */ \ + 1+LINK_SIZE, /* NA Assert behind */ \ 1+LINK_SIZE, /* ONCE */ \ 1+LINK_SIZE, /* SCRIPT_RUN */ \ 1+LINK_SIZE, /* BRA */ \ diff --git a/thirdparty/pcre2/src/pcre2_intmodedep.h b/thirdparty/pcre2/src/pcre2_intmodedep.h index bf3a235984..ea3b3ec698 100644 --- a/thirdparty/pcre2/src/pcre2_intmodedep.h +++ b/thirdparty/pcre2/src/pcre2_intmodedep.h @@ -205,19 +205,19 @@ whether its argument, which is assumed to be one code unit, is less than 256. The CHMAX_255 macro does not assume one code unit. The maximum length of a MARK name must fit in one code unit; currently it is set to 255 or 65535. The TABLE_GET macro is used to access elements of tables containing exactly 256 -items. When code points can be greater than 255, a check is needed before -accessing these tables. */ +items. Its argument is a code unit. When code points can be greater than 255, a +check is needed before accessing these tables. */ #if PCRE2_CODE_UNIT_WIDTH == 8 #define MAX_255(c) TRUE #define MAX_MARK ((1u << 8) - 1) +#define TABLE_GET(c, table, default) ((table)[c]) #ifdef SUPPORT_UNICODE #define SUPPORT_WIDE_CHARS #define CHMAX_255(c) ((c) <= 255u) #else #define CHMAX_255(c) TRUE #endif /* SUPPORT_UNICODE */ -#define TABLE_GET(c, table, default) ((table)[c]) #else /* Code units are 16 or 32 bits */ #define CHMAX_255(c) ((c) <= 255u) @@ -228,7 +228,6 @@ accessing these tables. */ #endif - /* ----------------- Character-handling macros ----------------- */ /* There is a proposed future special "UTF-21" mode, in which only the lowest @@ -854,6 +853,7 @@ typedef struct match_block { uint32_t match_call_count; /* Number of times a new frame is created */ BOOL hitend; /* Hit the end of the subject at some point */ BOOL hasthen; /* Pattern contains (*THEN) */ + BOOL allowemptypartial; /* Allow empty hard partial */ const uint8_t *lcc; /* Points to lower casing table */ const uint8_t *fcc; /* Points to case-flipping table */ const uint8_t *ctypes; /* Points to table of type maps */ @@ -866,6 +866,7 @@ typedef struct match_block { PCRE2_SPTR name_table; /* Table of group names */ PCRE2_SPTR start_code; /* For use when recursing */ PCRE2_SPTR start_subject; /* Start of the subject string */ + PCRE2_SPTR check_subject; /* Where UTF-checked from */ PCRE2_SPTR end_subject; /* End of the subject string */ PCRE2_SPTR end_match_ptr; /* Subject position at end match */ PCRE2_SPTR start_used_ptr; /* Earliest consulted character */ @@ -908,6 +909,7 @@ typedef struct dfa_match_block { uint32_t poptions; /* Pattern options */ uint32_t nltype; /* Newline type */ uint32_t nllen; /* Newline string length */ + BOOL allowemptypartial; /* Allow empty hard partial */ PCRE2_UCHAR nl[4]; /* Newline string when fixed */ uint16_t bsr_convention; /* \R interpretation */ pcre2_callout_block *cb; /* Points to a callout block */ diff --git a/thirdparty/pcre2/src/pcre2_jit_compile.c b/thirdparty/pcre2/src/pcre2_jit_compile.c index 1f21bfb6ad..f564127c2a 100644 --- a/thirdparty/pcre2/src/pcre2_jit_compile.c +++ b/thirdparty/pcre2/src/pcre2_jit_compile.c @@ -6,8 +6,9 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel + This module by Zoltan Herczeg 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 @@ -212,12 +213,6 @@ typedef struct stub_list { struct stub_list *next; } stub_list; -typedef struct label_addr_list { - struct sljit_label *label; - sljit_uw *update_addr; - struct label_addr_list *next; -} label_addr_list; - enum frame_types { no_frame = -1, no_stack = -2 @@ -271,6 +266,8 @@ typedef struct bracket_backtrack { assert_backtrack *assert; /* For OP_ONCE. Less than 0 if not needed. */ int framesize; + /* For brackets with >3 alternatives. */ + struct sljit_put_label *matching_put_label; } u; /* Points to our private memory word on the stack. */ int private_data_ptr; @@ -416,6 +413,8 @@ typedef struct compiler_common { sljit_sw lcc; /* Mode can be PCRE2_JIT_COMPLETE and others. */ int mode; + /* TRUE, when empty match is accepted for partial matching. */ + BOOL allow_empty_partial; /* TRUE, when minlength is greater than 0. */ BOOL might_be_empty; /* \K is found in the pattern. */ @@ -454,7 +453,6 @@ typedef struct compiler_common { struct sljit_label *accept_label; struct sljit_label *ff_newline_shortcut; stub_list *stubs; - label_addr_list *label_addrs; recurse_entry *entries; recurse_entry *currententry; jump_list *partialmatch; @@ -563,6 +561,12 @@ typedef struct compare_context { #define ARGUMENTS SLJIT_S4 #define RETURN_ADDR SLJIT_R4 +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) +#define HAS_VIRTUAL_REGISTERS 1 +#else +#define HAS_VIRTUAL_REGISTERS 0 +#endif + /* Local space layout. */ /* These two locals can be used by the current opcode. */ #define LOCALS0 (0 * sizeof(sljit_sw)) @@ -696,11 +700,12 @@ the start pointers when the end of the capturing group has not yet reached. */ #define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \ { \ - if (ptr[-1] <= 0x7f) \ - c = *ptr--; \ + c = ptr[-1]; \ + if (c <= 0x7f) \ + ptr--; \ else if (ptr - 1 > start && ptr[-1] >= 0x80 && ptr[-1] < 0xc0) \ { \ - c = ptr[-1] - 0x80; \ + c -= 0x80; \ \ if (ptr[-2] >= 0xc2 && ptr[-2] <= 0xdf) \ { \ @@ -775,11 +780,12 @@ the start pointers when the end of the capturing group has not yet reached. */ #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[-1]; \ + if (c < 0xd800 || c >= 0xe000) \ + ptr--; \ + else if (c >= 0xdc00 && ptr - 1 > start && ptr[-2] >= 0xd800 && ptr[-2] < 0xdc00) \ { \ - c = (((ptr[-2] - 0xd800) << 10) | (ptr[-1] - 0xdc00)) + 0x10000; \ + c = (((ptr[-2] - 0xd800) << 10) | (c - 0xdc00)) + 0x10000; \ ptr -= 2; \ } \ else \ @@ -793,7 +799,7 @@ the start pointers when the end of the capturing group has not yet reached. */ #define GETCHARINC_INVALID(c, ptr, end, invalid_action) \ { \ - if (ptr[0] < 0x110000) \ + if (ptr[0] < 0xd800 || (ptr[0] >= 0xe000 && ptr[0] < 0x110000)) \ c = *ptr++; \ else \ { \ @@ -801,6 +807,17 @@ the start pointers when the end of the capturing group has not yet reached. */ } \ } +#define GETCHARBACK_INVALID(c, ptr, start, invalid_action) \ + { \ + c = ptr[-1]; \ + if (ptr[-1] < 0xd800 || (ptr[-1] >= 0xe000 && ptr[-1] < 0x110000)) \ + ptr--; \ + else \ + { \ + invalid_action; \ + } \ + } + #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ #endif /* SUPPORT_UNICODE */ @@ -1033,8 +1050,8 @@ switch(*cc) return cc + 1 + 2 + cc[1]; default: - /* All opcodes are supported now! */ - SLJIT_UNREACHABLE(); + /* Unsupported opcodes: OP_ASSERT_NA and OP_ASSERTBACK_NA */ + /* SLJIT_UNREACHABLE(); */ return NULL; } } @@ -2371,14 +2388,14 @@ if (base_reg != TMP2) else { status.saved_tmp_regs[1] = RETURN_ADDR; - if (sljit_get_register_index(RETURN_ADDR) == -1) + if (HAS_VIRTUAL_REGISTERS) 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 (HAS_VIRTUAL_REGISTERS) status.tmp_regs[2] = STR_END; else status.tmp_regs[2] = TMP3; @@ -2829,20 +2846,6 @@ while (list_item) common->stubs = NULL; } -static void add_label_addr(compiler_common *common, sljit_uw *update_addr) -{ -DEFINE_COMPILER; -label_addr_list *label_addr; - -label_addr = sljit_alloc_memory(compiler, sizeof(label_addr_list)); -if (label_addr == NULL) - return; -label_addr->label = LABEL(); -label_addr->update_addr = update_addr; -label_addr->next = common->label_addrs; -common->label_addrs = label_addr; -} - static SLJIT_INLINE void count_match(compiler_common *common) { DEFINE_COMPILER; @@ -2985,12 +2988,18 @@ else } } -OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0); +if (!HAS_VIRTUAL_REGISTERS) + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, stack)); +else + OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0); + if (common->mark_ptr != 0) OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0); if (common->control_head_ptr != 0) OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0); -OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack)); +if (HAS_VIRTUAL_REGISTERS) + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr); OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, end)); } @@ -3029,21 +3038,36 @@ BOOL has_pre; OP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(1), STR_PTR, 0); -OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0); -OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr); -if (common->mark_ptr != 0) - OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); -OP1(SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, oveccount)); -OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0); -if (common->mark_ptr != 0) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0); -OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, match_data), - SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE)); +if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr); + if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); + OP1(SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, oveccount)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0); + if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0); + OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, match_data), + SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE)); + } +else + { + OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, match_data)); + if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); + OP1(SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, oveccount)); + OP1(SLJIT_MOV, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0); + if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R0, 0); + OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE)); + } has_pre = sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)) == SLJIT_SUCCESS; GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START - (has_pre ? sizeof(sljit_sw) : 0)); -OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, begin)); +OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? SLJIT_R0 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); loop = LABEL(); @@ -3105,20 +3129,22 @@ static SLJIT_INLINE void return_with_partial_match(compiler_common *common, stru { DEFINE_COMPILER; sljit_s32 mov_opcode; +sljit_s32 arguments_reg = !HAS_VIRTUAL_REGISTERS ? ARGUMENTS : SLJIT_R1; SLJIT_COMPILE_ASSERT(STR_END == SLJIT_S0, str_end_must_be_saved_reg0); SLJIT_ASSERT(common->start_used_ptr != 0 && common->start_ptr != 0 && (common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start != 0 : common->hit_start == 0)); -OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0); +if (arguments_reg != ARGUMENTS) + OP1(SLJIT_MOV, arguments_reg, 0, ARGUMENTS, 0); OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start : common->start_ptr); OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_PARTIAL); /* Store match begin and end. */ -OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, begin)); -OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_R2, 0); -OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, match_data)); +OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, begin)); +OP1(SLJIT_MOV, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_R2, 0); +OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(arguments_reg), SLJIT_OFFSETOF(jit_arguments, match_data)); mov_opcode = (sizeof(PCRE2_SIZE) == 4) ? SLJIT_MOV_U32 : SLJIT_MOV; @@ -3279,7 +3305,7 @@ SLJIT_ASSERT(!force || common->mode != PCRE2_JIT_COMPLETE); if (common->mode == PCRE2_JIT_COMPLETE) return; -if (!force) +if (!force && !common->allow_empty_partial) jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); else if (common->mode == PCRE2_JIT_PARTIAL_SOFT) jump = CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1); @@ -3341,7 +3367,11 @@ if (common->mode == PCRE2_JIT_COMPLETE) /* Partial matching mode. */ jump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0); -add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0)); +if (!common->allow_empty_partial) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0)); +else if (common->mode == PCRE2_JIT_PARTIAL_SOFT) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1)); + if (common->mode == PCRE2_JIT_PARTIAL_SOFT) { OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0); @@ -3357,6 +3387,35 @@ else JUMPHERE(jump); } +static void process_partial_match(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; + +/* Partial matching mode. */ +if (common->mode == PCRE2_JIT_PARTIAL_SOFT) + { + jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0); + JUMPHERE(jump); + } +else if (common->mode == PCRE2_JIT_PARTIAL_HARD) + { + if (common->partialmatchlabel != NULL) + CMPTO(SLJIT_LESS, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0, common->partialmatchlabel); + else + add_jump(compiler, &common->partialmatch, CMP(SLJIT_LESS, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0)); + } +} + +static void detect_partial_match_to(compiler_common *common, struct sljit_label *label) +{ +DEFINE_COMPILER; + +CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, label); +process_partial_match(common); +} + 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. @@ -3420,12 +3479,21 @@ if (common->utf) #elif PCRE2_CODE_UNIT_WIDTH == 32 if (common->invalid_utf) { + if (max < 0xd800) return; + if (backtracks != NULL) + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000)); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800)); + } else { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); 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); + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800); + CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR); } } #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ @@ -3490,8 +3558,12 @@ if (common->utf) 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)); +if (common->invalid_utf) + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000)); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800)); + } #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ #endif /* SUPPORT_UNICODE */ } @@ -3653,7 +3725,7 @@ if (common->utf) /* Skip low surrogate if necessary. */ OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); - if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && sljit_get_register_index(RETURN_ADDR) >= 0) + if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && !HAS_VIRTUAL_REGISTERS) { if (options & READ_CHAR_UPDATE_STR_PTR) OP2(SLJIT_ADD, RETURN_ADDR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); @@ -3677,11 +3749,18 @@ if (common->utf) if (common->invalid_utf) { if (backtracks != NULL) + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 0x110000)); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800)); + } else { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); 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); + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0xe000 - 0xd800); + CMOV(SLJIT_LESS, TMP1, SLJIT_IMM, INVALID_UTF_CHAR); } } #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ @@ -3832,7 +3911,7 @@ if (common->utf && negated) { 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) + if (sljit_has_cpu_feature(SLJIT_HAS_CMOV) && !HAS_VIRTUAL_REGISTERS) { 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); @@ -3865,9 +3944,9 @@ if (common->utf && negated) static void move_back(compiler_common *common, jump_list **backtracks, BOOL must_be_valid) { -/* 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. */ +/* Goes one character back. Affects STR_PTR and TMP1. If must_be_valid is TRUE, +TMP2 is not used. Otherwise TMP2 must contain the start of the subject buffer, +and it is destroyed. Does not modify STR_PTR for invalid character sequences. */ DEFINE_COMPILER; SLJIT_UNUSED_ARG(backtracks); @@ -4407,7 +4486,7 @@ sljit_emit_fast_return(compiler, RETURN_ADDR, 0); static void do_utfpeakcharback(compiler_common *common) { -/* Peak a character back. */ +/* Peak a character back. Does not modify STR_PTR. */ DEFINE_COMPILER; struct sljit_jump *jump[2]; @@ -4444,7 +4523,7 @@ sljit_emit_fast_return(compiler, RETURN_ADDR, 0); static void do_utfpeakcharback_invalid(compiler_common *common) { -/* Peak a character back. */ +/* Peak a character back. Does not modify STR_PTR. */ DEFINE_COMPILER; sljit_s32 i; sljit_s32 has_cmov = sljit_has_cpu_feature(SLJIT_HAS_CMOV); @@ -4672,7 +4751,7 @@ sljit_emit_fast_return(compiler, RETURN_ADDR, 0); static void do_utfpeakcharback_invalid(compiler_common *common) { -/* Peak a character back. */ +/* Peak a character back. Does not modify STR_PTR. */ DEFINE_COMPILER; struct sljit_jump *jump; struct sljit_jump *exit_invalid[3]; @@ -4786,18 +4865,12 @@ 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)); - +/* TMP2 is multiplied by 12. Same as (TMP2 << 2) + ((TMP2 << 2) << 1). */ OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype)); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 1); - 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); } @@ -4866,15 +4939,27 @@ else if ((overall_options & PCRE2_USE_OFFSET_LIMIT) != 0) /* Check whether offset limit is set and valid. */ SLJIT_ASSERT(common->match_end_ptr != 0); - OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, offset_limit)); + if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, offset_limit)); + } + else + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, offset_limit)); + 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 (HAS_VIRTUAL_REGISTERS) + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + else + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); + #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)); + if (HAS_VIRTUAL_REGISTERS) + 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); OP1(SLJIT_MOV, TMP2, 0, STR_END, 0); @@ -5434,699 +5519,56 @@ CMPTO(SLJIT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00, label); } #endif -#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) +#include "pcre2_jit_simd_inc.h" -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 -static struct sljit_jump *jump_if_utf_char_start(struct sljit_compiler *compiler, sljit_s32 reg) -{ -#if PCRE2_CODE_UNIT_WIDTH == 8 -OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xc0); -return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0x80); -#elif PCRE2_CODE_UNIT_WIDTH == 16 -OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xfc00); -return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00); -#else -#error "Unknown code width" -#endif -} -#endif - -static sljit_s32 character_to_int32(PCRE2_UCHAR chr) -{ -sljit_u32 value = chr; -#if PCRE2_CODE_UNIT_WIDTH == 8 -#define SSE2_COMPARE_TYPE_INDEX 0 -return (sljit_s32)((value << 24) | (value << 16) | (value << 8) | value); -#elif PCRE2_CODE_UNIT_WIDTH == 16 -#define SSE2_COMPARE_TYPE_INDEX 1 -return (sljit_s32)((value << 16) | value); -#elif PCRE2_CODE_UNIT_WIDTH == 32 -#define SSE2_COMPARE_TYPE_INDEX 2 -return (sljit_s32)(value); -#else -#error "Unsupported unit width" -#endif -} +#ifdef JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD -static void load_from_mem_sse2(struct sljit_compiler *compiler, sljit_s32 dst_xmm_reg, sljit_s32 src_general_reg) +static BOOL check_fast_forward_char_pair_simd(compiler_common *common, fast_forward_char_data *chars, int max) { -#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) -sljit_u8 instruction[5]; -#else -sljit_u8 instruction[4]; -#endif - -SLJIT_ASSERT(dst_xmm_reg < 8); - -/* MOVDQA xmm1, xmm2/m128 */ -#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) -if (src_general_reg < 8) - { - instruction[0] = 0x66; - instruction[1] = 0x0f; - instruction[2] = 0x6f; - instruction[3] = (dst_xmm_reg << 3) | src_general_reg; - sljit_emit_op_custom(compiler, instruction, 4); - } -else - { - instruction[0] = 0x66; - instruction[1] = 0x41; - instruction[2] = 0x0f; - instruction[3] = 0x6f; - instruction[4] = (dst_xmm_reg << 3) | (src_general_reg & 0x7); - sljit_emit_op_custom(compiler, instruction, 4); - } -#else -instruction[0] = 0x66; -instruction[1] = 0x0f; -instruction[2] = 0x6f; -instruction[3] = (dst_xmm_reg << 3) | src_general_reg; -sljit_emit_op_custom(compiler, instruction, 4); -#endif -} - -static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, PCRE2_UCHAR char1, PCRE2_UCHAR char2, - sljit_u32 bit, sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind) -{ -sljit_u8 instruction[4]; -instruction[0] = 0x66; -instruction[1] = 0x0f; - -if (char1 == char2 || bit != 0) - { - if (bit != 0) - { - /* POR xmm1, xmm2/m128 */ - /* instruction[0] = 0x66; */ - /* instruction[1] = 0x0f; */ - instruction[2] = 0xeb; - instruction[3] = 0xc0 | (dst_ind << 3) | cmp2_ind; - sljit_emit_op_custom(compiler, instruction, 4); - } - - /* PCMPEQB/W/D xmm1, xmm2/m128 */ - /* instruction[0] = 0x66; */ - /* instruction[1] = 0x0f; */ - instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX; - instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind; - sljit_emit_op_custom(compiler, instruction, 4); - } -else - { - /* MOVDQA xmm1, xmm2/m128 */ - /* instruction[0] = 0x66; */ - /* instruction[1] = 0x0f; */ - instruction[2] = 0x6f; - instruction[3] = 0xc0 | (tmp_ind << 3) | dst_ind; - sljit_emit_op_custom(compiler, instruction, 4); - - /* PCMPEQB/W/D xmm1, xmm2/m128 */ - /* instruction[0] = 0x66; */ - /* instruction[1] = 0x0f; */ - instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX; - instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind; - sljit_emit_op_custom(compiler, instruction, 4); - - instruction[3] = 0xc0 | (tmp_ind << 3) | cmp2_ind; - sljit_emit_op_custom(compiler, instruction, 4); - - /* POR xmm1, xmm2/m128 */ - /* instruction[0] = 0x66; */ - /* instruction[1] = 0x0f; */ - instruction[2] = 0xeb; - instruction[3] = 0xc0 | (dst_ind << 3) | tmp_ind; - sljit_emit_op_custom(compiler, instruction, 4); - } -} - -static void fast_forward_first_char2_sse2(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset) -{ -DEFINE_COMPILER; -struct sljit_label *start; -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 -struct sljit_label *restart; -#endif -struct sljit_jump *quit; -struct sljit_jump *partial_quit[2]; -sljit_u8 instruction[8]; -sljit_s32 tmp1_ind = sljit_get_register_index(TMP1); -sljit_s32 str_ptr_ind = sljit_get_register_index(STR_PTR); -sljit_s32 data_ind = 0; -sljit_s32 tmp_ind = 1; -sljit_s32 cmp1_ind = 2; -sljit_s32 cmp2_ind = 3; -sljit_u32 bit = 0; - -SLJIT_UNUSED_ARG(offset); - -if (char1 != char2) - { - bit = char1 ^ char2; - if (!is_powerof2(bit)) - bit = 0; - } - -partial_quit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); -if (common->mode == PCRE2_JIT_COMPLETE) - add_jump(compiler, &common->failed_match, partial_quit[0]); - -/* First part (unaligned start) */ - -OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit)); - -SLJIT_ASSERT(tmp1_ind < 8); - -/* MOVD xmm, r/m32 */ -instruction[0] = 0x66; -instruction[1] = 0x0f; -instruction[2] = 0x6e; -instruction[3] = 0xc0 | (cmp1_ind << 3) | tmp1_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -if (char1 != char2) - { - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2)); - - /* MOVD xmm, r/m32 */ - instruction[3] = 0xc0 | (cmp2_ind << 3) | tmp1_ind; - sljit_emit_op_custom(compiler, instruction, 4); - } - -OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0); - -/* PSHUFD xmm1, xmm2/m128, imm8 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x70; -instruction[3] = 0xc0 | (cmp1_ind << 3) | 2; -instruction[4] = 0; -sljit_emit_op_custom(compiler, instruction, 5); - -if (char1 != char2) - { - /* PSHUFD xmm1, xmm2/m128, imm8 */ - instruction[3] = 0xc0 | (cmp2_ind << 3) | 3; - sljit_emit_op_custom(compiler, instruction, 5); - } - -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 -restart = LABEL(); -#endif -OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf); -OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf); - -load_from_mem_sse2(compiler, data_ind, str_ptr_ind); -fast_forward_char_pair_sse2_compare(compiler, char1, char2, bit, data_ind, cmp1_ind, cmp2_ind, tmp_ind); - -/* PMOVMSKB reg, xmm */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0xd7; -instruction[3] = 0xc0 | (tmp1_ind << 3) | 0; -sljit_emit_op_custom(compiler, instruction, 4); - -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); -OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0); - -/* BSF r32, r/m32 */ -instruction[0] = 0x0f; -instruction[1] = 0xbc; -instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind; -sljit_emit_op_custom(compiler, instruction, 3); -sljit_set_current_flags(compiler, SLJIT_SET_Z); - -quit = JUMP(SLJIT_NOT_ZERO); - -OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); - -start = LABEL(); -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16); - -partial_quit[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); -if (common->mode == PCRE2_JIT_COMPLETE) - add_jump(compiler, &common->failed_match, partial_quit[1]); - -/* Second part (aligned) */ - -load_from_mem_sse2(compiler, 0, str_ptr_ind); -fast_forward_char_pair_sse2_compare(compiler, char1, char2, bit, data_ind, cmp1_ind, cmp2_ind, tmp_ind); - -/* PMOVMSKB reg, xmm */ -instruction[0] = 0x66; -instruction[1] = 0x0f; -instruction[2] = 0xd7; -instruction[3] = 0xc0 | (tmp1_ind << 3) | 0; -sljit_emit_op_custom(compiler, instruction, 4); - -/* BSF r32, r/m32 */ -instruction[0] = 0x0f; -instruction[1] = 0xbc; -instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind; -sljit_emit_op_custom(compiler, instruction, 3); -sljit_set_current_flags(compiler, SLJIT_SET_Z); - -JUMPTO(SLJIT_ZERO, start); - -JUMPHERE(quit); -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); - -if (common->mode != PCRE2_JIT_COMPLETE) - { - JUMPHERE(partial_quit[0]); - JUMPHERE(partial_quit[1]); - OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0); - CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0); - } -else - add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); - -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 -if (common->utf && offset > 0) - { - SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE); - - OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset)); - - quit = jump_if_utf_char_start(compiler, TMP1); - - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); - add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); - OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0); - JUMPTO(SLJIT_JUMP, restart); - - JUMPHERE(quit); - } -#endif -} - -#ifndef _WIN64 - -static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_sse2_offset(void) -{ -#if PCRE2_CODE_UNIT_WIDTH == 8 -return 15; -#elif PCRE2_CODE_UNIT_WIDTH == 16 -return 7; -#elif PCRE2_CODE_UNIT_WIDTH == 32 -return 3; -#else -#error "Unsupported unit width" -#endif -} - -static void fast_forward_char_pair_sse2(compiler_common *common, sljit_s32 offs1, - PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b) -{ -DEFINE_COMPILER; -sljit_u32 bit1 = 0; -sljit_u32 bit2 = 0; -sljit_u32 diff = IN_UCHARS(offs1 - offs2); -sljit_s32 tmp1_ind = sljit_get_register_index(TMP1); -sljit_s32 tmp2_ind = sljit_get_register_index(TMP2); -sljit_s32 str_ptr_ind = sljit_get_register_index(STR_PTR); -sljit_s32 data1_ind = 0; -sljit_s32 data2_ind = 1; -sljit_s32 tmp_ind = 2; -sljit_s32 cmp1a_ind = 3; -sljit_s32 cmp1b_ind = 4; -sljit_s32 cmp2a_ind = 5; -sljit_s32 cmp2b_ind = 6; -struct sljit_label *start; -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 -struct sljit_label *restart; -#endif -struct sljit_jump *jump[2]; - -sljit_u8 instruction[8]; - -SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2); -SLJIT_ASSERT(diff <= IN_UCHARS(max_fast_forward_char_pair_sse2_offset())); -SLJIT_ASSERT(tmp1_ind < 8 && tmp2_ind == 1); - -/* Initialize. */ -if (common->match_end_ptr != 0) - { - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); - OP1(SLJIT_MOV, TMP3, 0, STR_END, 0); - OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1)); - - OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, STR_END, 0); - CMOV(SLJIT_LESS, STR_END, TMP1, 0); - } - -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1)); -add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); - -/* MOVD xmm, r/m32 */ -instruction[0] = 0x66; -instruction[1] = 0x0f; -instruction[2] = 0x6e; - -if (char1a == char1b) - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a)); -else - { - bit1 = char1a ^ char1b; - if (is_powerof2(bit1)) - { - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a | bit1)); - OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit1)); - } - else - { - bit1 = 0; - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a)); - OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char1b)); - } - } - -instruction[3] = 0xc0 | (cmp1a_ind << 3) | tmp1_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -if (char1a != char1b) - { - instruction[3] = 0xc0 | (cmp1b_ind << 3) | tmp2_ind; - sljit_emit_op_custom(compiler, instruction, 4); - } - -if (char2a == char2b) - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a)); -else - { - bit2 = char2a ^ char2b; - if (is_powerof2(bit2)) - { - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a | bit2)); - OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit2)); - } - else - { - bit2 = 0; - OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a)); - OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char2b)); - } - } - -instruction[3] = 0xc0 | (cmp2a_ind << 3) | tmp1_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -if (char2a != char2b) - { - instruction[3] = 0xc0 | (cmp2b_ind << 3) | tmp2_ind; - sljit_emit_op_custom(compiler, instruction, 4); - } - -/* PSHUFD xmm1, xmm2/m128, imm8 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x70; -instruction[4] = 0; - -instruction[3] = 0xc0 | (cmp1a_ind << 3) | cmp1a_ind; -sljit_emit_op_custom(compiler, instruction, 5); - -if (char1a != char1b) - { - instruction[3] = 0xc0 | (cmp1b_ind << 3) | cmp1b_ind; - sljit_emit_op_custom(compiler, instruction, 5); - } - -instruction[3] = 0xc0 | (cmp2a_ind << 3) | cmp2a_ind; -sljit_emit_op_custom(compiler, instruction, 5); - -if (char2a != char2b) - { - instruction[3] = 0xc0 | (cmp2b_ind << 3) | cmp2b_ind; - sljit_emit_op_custom(compiler, instruction, 5); - } - -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 -restart = LABEL(); -#endif - -OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1 - offs2)); -OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0); -OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf); -OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, ~0xf); - -load_from_mem_sse2(compiler, data1_ind, str_ptr_ind); - -jump[0] = CMP(SLJIT_EQUAL, STR_PTR, 0, TMP1, 0); - -load_from_mem_sse2(compiler, data2_ind, tmp1_ind); - -/* MOVDQA xmm1, xmm2/m128 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x6f; -instruction[3] = 0xc0 | (tmp_ind << 3) | data1_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -/* PSLLDQ xmm1, xmm2/m128, imm8 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x73; -instruction[3] = 0xc0 | (7 << 3) | tmp_ind; -instruction[4] = diff; -sljit_emit_op_custom(compiler, instruction, 5); - -/* PSRLDQ xmm1, xmm2/m128, imm8 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -/* instruction[2] = 0x73; */ -instruction[3] = 0xc0 | (3 << 3) | data2_ind; -instruction[4] = 16 - diff; -sljit_emit_op_custom(compiler, instruction, 5); - -/* POR xmm1, xmm2/m128 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0xeb; -instruction[3] = 0xc0 | (data2_ind << 3) | tmp_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -jump[1] = JUMP(SLJIT_JUMP); - -JUMPHERE(jump[0]); - -/* MOVDQA xmm1, xmm2/m128 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x6f; -instruction[3] = 0xc0 | (data2_ind << 3) | data1_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -/* PSLLDQ xmm1, xmm2/m128, imm8 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x73; -instruction[3] = 0xc0 | (7 << 3) | data2_ind; -instruction[4] = diff; -sljit_emit_op_custom(compiler, instruction, 5); - -JUMPHERE(jump[1]); - -OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf); - -fast_forward_char_pair_sse2_compare(compiler, char2a, char2b, bit2, data2_ind, cmp2a_ind, cmp2b_ind, tmp_ind); -fast_forward_char_pair_sse2_compare(compiler, char1a, char1b, bit1, data1_ind, cmp1a_ind, cmp1b_ind, tmp_ind); - -/* PAND xmm1, xmm2/m128 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0xdb; -instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -/* PMOVMSKB reg, xmm */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0xd7; -instruction[3] = 0xc0 | (tmp1_ind << 3) | 0; -sljit_emit_op_custom(compiler, instruction, 4); - -/* Ignore matches before the first STR_PTR. */ -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); -OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0); - -/* BSF r32, r/m32 */ -instruction[0] = 0x0f; -instruction[1] = 0xbc; -instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind; -sljit_emit_op_custom(compiler, instruction, 3); -sljit_set_current_flags(compiler, SLJIT_SET_Z); - -jump[0] = JUMP(SLJIT_NOT_ZERO); - -OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); - -/* Main loop. */ -instruction[0] = 0x66; -instruction[1] = 0x0f; - -start = LABEL(); - -load_from_mem_sse2(compiler, data2_ind, str_ptr_ind); - -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16); -add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); - -load_from_mem_sse2(compiler, data1_ind, str_ptr_ind); - -/* PSRLDQ xmm1, xmm2/m128, imm8 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x73; -instruction[3] = 0xc0 | (3 << 3) | data2_ind; -instruction[4] = 16 - diff; -sljit_emit_op_custom(compiler, instruction, 5); - -/* MOVDQA xmm1, xmm2/m128 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x6f; -instruction[3] = 0xc0 | (tmp_ind << 3) | data1_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -/* PSLLDQ xmm1, xmm2/m128, imm8 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0x73; -instruction[3] = 0xc0 | (7 << 3) | tmp_ind; -instruction[4] = diff; -sljit_emit_op_custom(compiler, instruction, 5); - -/* POR xmm1, xmm2/m128 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0xeb; -instruction[3] = 0xc0 | (data2_ind << 3) | tmp_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -fast_forward_char_pair_sse2_compare(compiler, char1a, char1b, bit1, data1_ind, cmp1a_ind, cmp1b_ind, tmp_ind); -fast_forward_char_pair_sse2_compare(compiler, char2a, char2b, bit2, data2_ind, cmp2a_ind, cmp2b_ind, tmp_ind); - -/* PAND xmm1, xmm2/m128 */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0xdb; -instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind; -sljit_emit_op_custom(compiler, instruction, 4); - -/* PMOVMSKB reg, xmm */ -/* instruction[0] = 0x66; */ -/* instruction[1] = 0x0f; */ -instruction[2] = 0xd7; -instruction[3] = 0xc0 | (tmp1_ind << 3) | 0; -sljit_emit_op_custom(compiler, instruction, 4); - -/* BSF r32, r/m32 */ -instruction[0] = 0x0f; -instruction[1] = 0xbc; -instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind; -sljit_emit_op_custom(compiler, instruction, 3); -sljit_set_current_flags(compiler, SLJIT_SET_Z); - -JUMPTO(SLJIT_ZERO, start); - -JUMPHERE(jump[0]); - -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); - -add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); - -if (common->match_end_ptr != 0) - OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); - -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 -if (common->utf) - { - OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offs1)); - - jump[0] = jump_if_utf_char_start(compiler, TMP1); - - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); - CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, restart); - - add_jump(compiler, &common->failed_match, JUMP(SLJIT_JUMP)); - - JUMPHERE(jump[0]); - } -#endif - -OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1)); - -if (common->match_end_ptr != 0) - OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); -} - -static BOOL check_fast_forward_char_pair_sse2(compiler_common *common, fast_forward_char_data *chars, int max) -{ -sljit_s32 i, j, priority, count; -sljit_u32 priorities; -PCRE2_UCHAR a1, a2, b1, b2; - -priorities = 0; - -count = 0; -for (i = 0; i < max; i++) - { - if (chars[i].last_count > 2) - { - SLJIT_ASSERT(chars[i].last_count <= 7); - - priorities |= (1 << chars[i].last_count); - count++; - } - } - -if (count < 2) - return FALSE; - -for (priority = 7; priority > 2; priority--) - { - if ((priorities & (1 << priority)) == 0) - continue; + sljit_s32 i, j, max_i = 0, max_j = 0; + sljit_u32 max_pri = 0; + PCRE2_UCHAR a1, a2, a_pri, b1, b2, b_pri; for (i = max - 1; i >= 1; i--) - if (chars[i].last_count >= priority) + { + if (chars[i].last_count > 2) { - SLJIT_ASSERT(chars[i].count <= 2 && chars[i].count >= 1); - a1 = chars[i].chars[0]; a2 = chars[i].chars[1]; + a_pri = chars[i].last_count; - j = i - max_fast_forward_char_pair_sse2_offset(); + j = i - max_fast_forward_char_pair_offset(); if (j < 0) j = 0; while (j < i) { - if (chars[j].last_count >= priority) + b_pri = chars[j].last_count; + if (b_pri > 2 && a_pri + b_pri >= max_pri) { b1 = chars[j].chars[0]; b2 = chars[j].chars[1]; if (a1 != b1 && a1 != b2 && a2 != b1 && a2 != b2) { - fast_forward_char_pair_sse2(common, i, a1, a2, j, b1, b2); - return TRUE; + max_pri = a_pri + b_pri; + max_i = i; + max_j = j; } } j++; } } - } - -return FALSE; -} + } -#endif +if (max_pri == 0) + return FALSE; -#undef SSE2_COMPARE_TYPE_INDEX +fast_forward_char_pair_simd(common, max_i, chars[max_i].chars[0], chars[max_i].chars[1], max_j, chars[max_j].chars[0], chars[max_j].chars[1]); +return TRUE; +} -#endif +#endif /* JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD */ static void fast_forward_first_char2(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset) { @@ -6154,13 +5596,11 @@ if (has_match_end) CMOV(SLJIT_GREATER, STR_END, TMP1, 0); } -#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) +#ifdef JIT_HAS_FAST_FORWARD_CHAR_SIMD -/* SSE2 accelerated first character search. */ - -if (sljit_has_cpu_feature(SLJIT_HAS_SSE2)) +if (JIT_HAS_FAST_FORWARD_CHAR_SIMD) { - fast_forward_first_char2_sse2(common, char1, char2, offset); + fast_forward_char_simd(common, char1, char2, offset); if (offset > 0) OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset)); @@ -6267,8 +5707,8 @@ for (i = 0; i < max; i++) chars[i].last_count = (chars[i].count == 255) ? 0 : 1; } -#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) && !(defined _WIN64) -if (sljit_has_cpu_feature(SLJIT_HAS_SSE2) && check_fast_forward_char_pair_sse2(common, chars, max)) +#ifdef JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD +if (JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD && check_fast_forward_char_pair_simd(common, chars, max)) return TRUE; #endif @@ -6353,18 +5793,21 @@ if (common->match_end_ptr != 0) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); OP1(SLJIT_MOV, TMP3, 0, STR_END, 0); - OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max)); + OP2(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max)); + add_jump(compiler, &common->failed_match, JUMP(SLJIT_LESS)); OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_END, 0, TMP1, 0); CMOV(SLJIT_GREATER, STR_END, TMP1, 0); } else - OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max)); + { + OP2(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max)); + add_jump(compiler, &common->failed_match, JUMP(SLJIT_LESS)); + } SLJIT_ASSERT(range_right >= 0); -#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) -OP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table); -#endif +if (!HAS_VIRTUAL_REGISTERS) + OP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table); start = LABEL(); add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0)); @@ -6375,11 +5818,11 @@ OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right)); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right + 1) - 1); #endif -#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) -OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0); -#else -OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table); -#endif +if (!HAS_VIRTUAL_REGISTERS) + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0); +else + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, start); @@ -6473,9 +5916,17 @@ if (common->match_end_ptr != 0) if (common->nltype == NLTYPE_FIXED && common->newline > 255) { lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); - OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); - OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + } + else + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); + } firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0); OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(2)); @@ -6503,9 +5954,15 @@ if (common->nltype == NLTYPE_FIXED && common->newline > 255) return; } -OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + } +else + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str)); + /* 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); move_back(common, NULL, FALSE); @@ -6586,7 +6043,7 @@ if (!optimize_class(common, start_bits, (start_bits[31] & 0x80) != 0, FALSE, &ma OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)start_bits); - if (sljit_get_register_index(TMP3) >= 0) + if (!HAS_VIRTUAL_REGISTERS) { OP2(SLJIT_SHL, TMP3, 0, SLJIT_IMM, 1, TMP2, 0); OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP3, 0); @@ -6693,7 +6150,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 (HAS_VIRTUAL_REGISTERS) { 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))); @@ -6718,7 +6175,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 (HAS_VIRTUAL_REGISTERS) { 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)); @@ -6737,7 +6194,11 @@ static void check_wordboundary(compiler_common *common) DEFINE_COMPILER; struct sljit_jump *skipread; jump_list *skipread_list = NULL; -jump_list *invalid_utf = NULL; +#ifdef SUPPORT_UNICODE +struct sljit_label *valid_utf; +jump_list *invalid_utf1 = NULL; +#endif /* SUPPORT_UNICODE */ +jump_list *invalid_utf2 = NULL; #if PCRE2_CODE_UNIT_WIDTH != 8 || defined SUPPORT_UNICODE struct sljit_jump *jump; #endif /* PCRE2_CODE_UNIT_WIDTH != 8 || SUPPORT_UNICODE */ @@ -6751,14 +6212,30 @@ 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); +#ifdef SUPPORT_UNICODE +if (common->invalid_utf) + { + peek_char_back(common, READ_CHAR_MAX, &invalid_utf1); + + if (common->mode != PCRE2_JIT_COMPLETE) + { + OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0); + move_back(common, NULL, TRUE); + check_start_used_ptr(common); + OP1(SLJIT_MOV, STR_PTR, 0, TMP2, 0); + } + } else +#endif /* SUPPORT_UNICODE */ { - 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); + if (common->mode == PCRE2_JIT_COMPLETE) + peek_char_back(common, READ_CHAR_MAX, NULL); + else + { + move_back(common, NULL, TRUE); + check_start_used_ptr(common); + read_char(common, 0, READ_CHAR_MAX, NULL, READ_CHAR_UPDATE_STR_PTR); + } } /* Testing char type. */ @@ -6802,10 +6279,13 @@ JUMPHERE(skipread); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); check_str_end(common, &skipread_list); -peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, &invalid_utf); +peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, &invalid_utf2); /* Testing char type. This is a code duplication. */ #ifdef SUPPORT_UNICODE + +valid_utf = LABEL(); + if (common->use_ucp) { OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1); @@ -6851,13 +6331,19 @@ sljit_emit_fast_return(compiler, TMP1, 0); #ifdef SUPPORT_UNICODE if (common->invalid_utf) { - SLJIT_ASSERT(invalid_utf != NULL); + set_jumps(invalid_utf1, LABEL()); + + peek_char(common, READ_CHAR_MAX, SLJIT_MEM1(SLJIT_SP), LOCALS1, NULL); + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR, valid_utf); - 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; + + set_jumps(invalid_utf2, LABEL()); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + OP1(SLJIT_MOV, TMP2, 0, TMP3, 0); + sljit_emit_fast_return(compiler, TMP1, 0); } #endif /* SUPPORT_UNICODE */ } @@ -7225,7 +6711,7 @@ struct sljit_label *label; int char1_reg; int char2_reg; -if (sljit_get_register_index(TMP3) < 0) +if (HAS_VIRTUAL_REGISTERS) { char1_reg = STR_END; char2_reg = STACK_TOP; @@ -7307,7 +6793,7 @@ int char2_reg; int lcc_table; int opt_type = 0; -if (sljit_get_register_index(TMP3) < 0) +if (HAS_VIRTUAL_REGISTERS) { char2_reg = STACK_TOP; lcc_table = STACK_LIMIT; @@ -7790,8 +7276,6 @@ if (needstype || needsscript) 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); @@ -7845,7 +7329,6 @@ if (needstype || needsscript) 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); @@ -7860,7 +7343,6 @@ if (needstype || needsscript) 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); @@ -8174,14 +7656,24 @@ struct sljit_label *label; switch(type) { case OP_SOD: - OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + } + else + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0)); return cc; case OP_SOM: - OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + } + else + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str)); add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0)); return cc; @@ -8191,9 +7683,7 @@ switch(type) #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)); + add_jump(compiler, backtracks, CMP((type == OP_NOT_WORD_BOUNDARY) ? SLJIT_NOT_EQUAL : SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0)); return cc; } #endif /* SUPPORT_UNICODE */ @@ -8267,17 +7757,24 @@ switch(type) JUMPHERE(jump[3]); } JUMPHERE(jump[0]); - check_partial(common, FALSE); + if (common->mode != PCRE2_JIT_COMPLETE) + check_partial(common, TRUE); return cc; case OP_EOD: add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0)); - check_partial(common, FALSE); + if (common->mode != PCRE2_JIT_COMPLETE) + check_partial(common, TRUE); return cc; case OP_DOLL: - OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); - OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); + if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); + } + else + OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); if (!common->endonly) @@ -8291,8 +7788,13 @@ switch(type) case OP_DOLLM: jump[1] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0); - OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); - OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); + if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); + } + else + OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL); add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); check_partial(common, FALSE); jump[0] = JUMP(SLJIT_JUMP); @@ -8327,18 +7829,38 @@ switch(type) return cc; case OP_CIRC: - OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); - add_jump(compiler, backtracks, 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); - add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); + add_jump(compiler, backtracks, 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); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + } + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0)); + OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32)); + } return cc; case OP_CIRCM: - 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); + /* TMP2 might be used by peek_char_back. */ + if (HAS_VIRTUAL_REGISTERS) + { + 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); + } + else + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), 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(ARGUMENTS), 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]); @@ -8367,11 +7889,16 @@ switch(type) length = GET(cc, 0); if (length == 0) return cc + LINK_SIZE; - OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + } + else + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); #ifdef SUPPORT_UNICODE if (common->utf) { - 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, TMP2, 0)); @@ -8382,9 +7909,8 @@ switch(type) else #endif { - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length)); - add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP1, 0)); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0)); } check_start_used_ptr(common); return cc + LINK_SIZE; @@ -8402,12 +7928,12 @@ 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, ricount; -PCRE2_SPTR prevcc, startcc, bptr; +PCRE2_SPTR prevcc, endcc, bptr; BOOL first = TRUE; uint32_t c; prevcc = cc; -startcc = NULL; +endcc = NULL; do { GETCHARINC(c, cc); @@ -8416,7 +7942,7 @@ do if (first) { lgb = rgb; - startcc = cc; + endcc = cc; first = FALSE; continue; } @@ -8455,25 +7981,27 @@ do lgb != ucp_gbExtended_Pictographic) lgb = rgb; - prevcc = startcc; - startcc = cc; + prevcc = endcc; + endcc = cc; } while (cc < end_subject); -return startcc; +return endcc; } +#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */ + 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; +PCRE2_SPTR prevcc, endcc, bptr; BOOL first = TRUE; uint32_t c; prevcc = cc; -startcc = NULL; +endcc = NULL; do { GETCHARINC_INVALID(c, cc, end_subject, break); @@ -8482,7 +8010,7 @@ do if (first) { lgb = rgb; - startcc = cc; + endcc = cc; first = FALSE; continue; } @@ -8520,16 +8048,14 @@ do lgb != ucp_gbExtended_Pictographic) lgb = rgb; - prevcc = startcc; - startcc = cc; + prevcc = endcc; + endcc = cc; } while (cc < end_subject); -return startcc; +return endcc; } -#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */ - static PCRE2_SPTR SLJIT_FUNC do_extuni_no_utf(jit_arguments *args, PCRE2_SPTR cc) { PCRE2_SPTR start_subject = args->begin; @@ -8538,7 +8064,10 @@ int lgb, rgb, ricount; PCRE2_SPTR bptr; uint32_t c; -GETCHARINC(c, cc); +/* Patch by PH */ +/* GETCHARINC(c, cc); */ +c = *cc++; + #if PCRE2_CODE_UNIT_WIDTH == 32 if (c >= 0x110000) return NULL; @@ -8800,8 +8329,10 @@ switch(type) 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)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, + common->invalid_utf ? SLJIT_FUNC_OFFSET(do_extuni_utf_invalid) : SLJIT_FUNC_OFFSET(do_extuni_no_utf)); + if (!common->utf || common->invalid_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); @@ -9198,8 +8729,6 @@ if (common->utf && *cc == OP_REFI) 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)); @@ -10759,10 +10288,23 @@ if (ket != OP_KET || bra != OP_BRA) if (offset != 0) stacksize = match_capture_common(common, stacksize, offset, private_data_ptr); +/* Skip and count the other alternatives. */ +i = 1; +while (*cc == OP_ALT) + { + cc += GET(cc, 1); + i++; + } + if (has_alternatives) { if (opcode != OP_ONCE) - OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + { + if (i <= 3) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + else + BACKTRACK_AS(bracket_backtrack)->u.matching_put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(stacksize)); + } if (ket != OP_KETRMAX) BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL(); } @@ -10851,9 +10393,6 @@ if (bra == OP_BRAMINZERO) if ((ket != OP_KET && bra != OP_BRAMINZERO) || bra == OP_BRAZERO) count_match(common); -/* Skip the other alternatives. */ -while (*cc == OP_ALT) - cc += GET(cc, 1); cc += 1 + LINK_SIZE; if (opcode == OP_ONCE) @@ -11412,174 +10951,232 @@ switch(opcode) JUMPTO(SLJIT_JUMP, label); if (jump != NULL) JUMPHERE(jump); + BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL(); + break; } - else - { - charpos_enabled = FALSE; - charpos_char = 0; - charpos_othercasebit = 0; - - if ((type != OP_CHAR && type != OP_CHARI) && (*end == OP_CHAR || *end == OP_CHARI)) - { - charpos_enabled = TRUE; #ifdef SUPPORT_UNICODE - charpos_enabled = !common->utf || !HAS_EXTRALEN(end[1]); -#endif - if (charpos_enabled && *end == OP_CHARI && char_has_othercase(common, end + 1)) - { - charpos_othercasebit = char_get_othercase_bit(common, end + 1); - if (charpos_othercasebit == 0) - charpos_enabled = FALSE; - } - - if (charpos_enabled) - { - charpos_char = end[1]; - /* Consumpe the OP_CHAR opcode. */ - end += 2; -#if PCRE2_CODE_UNIT_WIDTH == 8 - SLJIT_ASSERT((charpos_othercasebit >> 8) == 0); -#elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32 - SLJIT_ASSERT((charpos_othercasebit >> 9) == 0); - if ((charpos_othercasebit & 0x100) != 0) - charpos_othercasebit = (charpos_othercasebit & 0xff) << 8; + else if (type == OP_ALLANY && !common->invalid_utf) +#else + else if (type == OP_ALLANY) #endif - if (charpos_othercasebit != 0) - charpos_char |= charpos_othercasebit; - - BACKTRACK_AS(char_iterator_backtrack)->u.charpos.enabled = TRUE; - BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char; - BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit; - } - } - - if (charpos_enabled) + { + if (opcode == OP_STAR) { - if (opcode == OP_UPTO) - OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max + 1); + if (private_data_ptr == 0) + allocate_stack(common, 2); - /* Search the first instance of charpos_char. */ - jump = JUMP(SLJIT_JUMP); - label = LABEL(); - if (opcode == OP_UPTO) - { - OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); - add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO)); - } - compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE); - if (fast_str_ptr != 0) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); - JUMPHERE(jump); + OP1(SLJIT_MOV, base, offset0, STR_END, 0); + OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); - detect_partial_match(common, &backtrack->topbacktracks); - OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); - if (charpos_othercasebit != 0) - OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit); - CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label); + OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0); + process_partial_match(common); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_END, 0); + BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL(); + break; + } +#ifdef SUPPORT_UNICODE + else if (!common->utf) +#else + else +#endif + { if (private_data_ptr == 0) allocate_stack(common, 2); - OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); - if (opcode == OP_UPTO) - { - OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); - add_jump(compiler, &no_match, JUMP(SLJIT_ZERO)); - } + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(max)); - /* Search the last instance of charpos_char. */ - label = LABEL(); - compile_char1_matchingpath(common, type, cc, &no_match, FALSE); - if (fast_str_ptr != 0) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); - detect_partial_match(common, &no_match); - OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); - if (charpos_othercasebit != 0) - OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit); - if (opcode == OP_STAR) + if (common->mode == PCRE2_JIT_COMPLETE) { - CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label); - OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0); + CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0); } else { - jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char); - OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, STR_END, 0); + process_partial_match(common); JUMPHERE(jump); } - if (opcode == OP_UPTO) - { - OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); - JUMPTO(SLJIT_NOT_ZERO, label); - } - else - JUMPTO(SLJIT_JUMP, label); - - set_jumps(no_match, LABEL()); - OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL(); + break; } -#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 - else if (common->utf) + } + + charpos_enabled = FALSE; + charpos_char = 0; + charpos_othercasebit = 0; + + if ((type != OP_CHAR && type != OP_CHARI) && (*end == OP_CHAR || *end == OP_CHARI)) + { +#ifdef SUPPORT_UNICODE + charpos_enabled = !common->utf || !HAS_EXTRALEN(end[1]); +#else + charpos_enabled = TRUE; +#endif + if (charpos_enabled && *end == OP_CHARI && char_has_othercase(common, end + 1)) { - if (private_data_ptr == 0) - allocate_stack(common, 2); + charpos_othercasebit = char_get_othercase_bit(common, end + 1); + if (charpos_othercasebit == 0) + charpos_enabled = FALSE; + } - OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); - OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); + if (charpos_enabled) + { + charpos_char = end[1]; + /* Consumpe the OP_CHAR opcode. */ + end += 2; +#if PCRE2_CODE_UNIT_WIDTH == 8 + SLJIT_ASSERT((charpos_othercasebit >> 8) == 0); +#elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32 + SLJIT_ASSERT((charpos_othercasebit >> 9) == 0); + if ((charpos_othercasebit & 0x100) != 0) + charpos_othercasebit = (charpos_othercasebit & 0xff) << 8; +#endif + if (charpos_othercasebit != 0) + charpos_char |= charpos_othercasebit; - if (opcode == OP_UPTO) - OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + BACKTRACK_AS(char_iterator_backtrack)->u.charpos.enabled = TRUE; + BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char; + BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit; + } + } - label = LABEL(); - compile_char1_matchingpath(common, type, cc, &no_match, TRUE); - OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + if (charpos_enabled) + { + if (opcode == OP_UPTO) + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max + 1); - if (opcode == OP_UPTO) - { - OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); - JUMPTO(SLJIT_NOT_ZERO, label); - } - else - JUMPTO(SLJIT_JUMP, label); + /* Search the first instance of charpos_char. */ + jump = JUMP(SLJIT_JUMP); + label = LABEL(); + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO)); + } + compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + JUMPHERE(jump); - set_jumps(no_match, LABEL()); - OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); - if (fast_str_ptr != 0) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + detect_partial_match(common, &backtrack->topbacktracks); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (charpos_othercasebit != 0) + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit); + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label); + + if (private_data_ptr == 0) + allocate_stack(common, 2); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + add_jump(compiler, &no_match, JUMP(SLJIT_ZERO)); + } + + /* Search the last instance of charpos_char. */ + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &no_match, FALSE); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + detect_partial_match(common, &no_match); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (charpos_othercasebit != 0) + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit); + if (opcode == OP_STAR) + { + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); } -#endif else { - if (private_data_ptr == 0) - allocate_stack(common, 2); + jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + JUMPHERE(jump); + } - OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); - if (opcode == OP_UPTO) - OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + } + else + JUMPTO(SLJIT_JUMP, label); - label = LABEL(); - detect_partial_match(common, &no_match); - compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); - if (opcode == OP_UPTO) - { - OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); - JUMPTO(SLJIT_NOT_ZERO, label); - OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); - } - else - JUMPTO(SLJIT_JUMP, label); + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + } +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 + else if (common->utf) + { + if (private_data_ptr == 0) + allocate_stack(common, 2); - set_jumps(no_char1_match, LABEL()); - OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); - set_jumps(no_match, LABEL()); - OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); - if (fast_str_ptr != 0) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); + + if (opcode == OP_UPTO) + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + + detect_partial_match(common, &no_match); + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &no_match, FALSE); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + add_jump(compiler, &no_match, JUMP(SLJIT_ZERO)); + } + + detect_partial_match_to(common, label); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + } +#endif + else + { + if (private_data_ptr == 0) + allocate_stack(common, 2); + + OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); + if (opcode == OP_UPTO) + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + + detect_partial_match(common, &no_match); + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + add_jump(compiler, &no_match, JUMP(SLJIT_ZERO)); } + + detect_partial_match_to(common, label); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + set_jumps(no_char1_match, LABEL()); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); } + BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL(); break; @@ -11616,25 +11213,47 @@ switch(opcode) break; case OP_POSSTAR: +#if defined SUPPORT_UNICODE + if (type == OP_ALLANY && !common->invalid_utf) +#else + if (type == OP_ALLANY) +#endif + { + OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0); + process_partial_match(common); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_END, 0); + break; + } + #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 if (common->utf) { OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0); + detect_partial_match(common, &no_match); label = LABEL(); - compile_char1_matchingpath(common, type, cc, &no_match, TRUE); + compile_char1_matchingpath(common, type, cc, &no_match, FALSE); OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0); - JUMPTO(SLJIT_JUMP, label); + detect_partial_match_to(common, label); + set_jumps(no_match, LABEL()); OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset); if (fast_str_ptr != 0) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + { + if (tmp_base == TMP3) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, TMP3, 0); + else + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + } break; } #endif - label = LABEL(); detect_partial_match(common, &no_match); + label = LABEL(); compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); - JUMPTO(SLJIT_JUMP, label); + detect_partial_match_to(common, label); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + set_jumps(no_char1_match, LABEL()); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); set_jumps(no_match, LABEL()); @@ -11649,23 +11268,52 @@ switch(opcode) { OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0); OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + + detect_partial_match(common, &no_match); label = LABEL(); - compile_char1_matchingpath(common, type, cc, &no_match, TRUE); + compile_char1_matchingpath(common, type, cc, &no_match, FALSE); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0); OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); - JUMPTO(SLJIT_NOT_ZERO, label); + add_jump(compiler, &no_match, JUMP(SLJIT_ZERO)); + detect_partial_match_to(common, label); + set_jumps(no_match, LABEL()); OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1); break; } #endif + + if (type == OP_ALLANY) + { + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(max)); + + if (common->mode == PCRE2_JIT_COMPLETE) + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0); + CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0); + } + else + { + jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, STR_END, 0); + process_partial_match(common); + JUMPHERE(jump); + } + + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + break; + } + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); - label = LABEL(); + detect_partial_match(common, &no_match); + label = LABEL(); compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); - JUMPTO(SLJIT_NOT_ZERO, label); + add_jump(compiler, &no_match, JUMP(SLJIT_ZERO)); + detect_partial_match_to(common, label); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + set_jumps(no_char1_match, LABEL()); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); set_jumps(no_match, LABEL()); @@ -11719,8 +11367,15 @@ if (common->accept_label == NULL) add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0))); else CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), common->accept_label); -OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); -OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options)); + +if (HAS_VIRTUAL_REGISTERS) + { + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options)); + } +else + OP1(SLJIT_MOV_U32, TMP2, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options)); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY); add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_NOT_ZERO)); OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY_ATSTART); @@ -11728,7 +11383,8 @@ if (common->accept_label == NULL) add_jump(compiler, &common->accept, JUMP(SLJIT_ZERO)); else JUMPTO(SLJIT_ZERO, common->accept_label); -OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, str)); if (common->accept_label == NULL) add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0)); else @@ -11778,10 +11434,11 @@ if (opcode == OP_SKIP) if (opcode == OP_COMMIT_ARG || opcode == OP_PRUNE_ARG || opcode == OP_THEN_ARG) { - OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + if (HAS_VIRTUAL_REGISTERS) + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2)); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0); - OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0); } return ccend; @@ -12072,11 +11729,12 @@ while (cc < ccend) SLJIT_ASSERT(common->mark_ptr != 0); OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); allocate_stack(common, common->has_skip_arg ? 5 : 1); - OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + if (HAS_VIRTUAL_REGISTERS) + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(common->has_skip_arg ? 4 : 0), TMP2, 0); OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2)); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0); - OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(HAS_VIRTUAL_REGISTERS ? TMP1 : ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0); if (common->has_skip_arg) { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); @@ -12403,16 +12061,15 @@ PCRE2_SPTR ccprev; PCRE2_UCHAR bra = OP_BRA; PCRE2_UCHAR ket; assert_backtrack *assert; -sljit_uw *next_update_addr = NULL; BOOL has_alternatives; BOOL needs_control_head = FALSE; struct sljit_jump *brazero = NULL; -struct sljit_jump *alt1 = NULL; -struct sljit_jump *alt2 = NULL; +struct sljit_jump *next_alt = NULL; struct sljit_jump *once = NULL; struct sljit_jump *cond = NULL; struct sljit_label *rmin_label = NULL; struct sljit_label *exact_label = NULL; +struct sljit_put_label *put_label = NULL; if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO) { @@ -12561,7 +12218,7 @@ else if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND) free_stack(common, 1); alt_max = 2; - alt1 = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw)); + next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0); } } else if (has_alternatives) @@ -12569,21 +12226,15 @@ else if (has_alternatives) OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); free_stack(common, 1); - if (alt_max > 4) + if (alt_max > 3) { - /* Table jump if alt_max is greater than 4. */ - next_update_addr = allocate_read_only_data(common, alt_max * sizeof(sljit_uw)); - if (SLJIT_UNLIKELY(next_update_addr == NULL)) - return; - sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM1(TMP1), (sljit_sw)next_update_addr); - add_label_addr(common, next_update_addr++); + sljit_emit_ijump(compiler, SLJIT_JUMP, TMP1, 0); + + SLJIT_ASSERT(CURRENT_AS(bracket_backtrack)->u.matching_put_label); + sljit_set_put_label(CURRENT_AS(bracket_backtrack)->u.matching_put_label, LABEL()); } else - { - if (alt_max == 4) - alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw)); - alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw)); - } + next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0); } COMPILE_BACKTRACKINGPATH(current->top); @@ -12620,7 +12271,7 @@ if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) if (has_alternatives) { - alt_count = sizeof(sljit_uw); + alt_count = 1; do { current->top = NULL; @@ -12699,7 +12350,12 @@ if (has_alternatives) stacksize = match_capture_common(common, stacksize, offset, private_data_ptr); if (opcode != OP_ONCE) - OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, alt_count); + { + if (alt_max <= 3) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, alt_count); + else + put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(stacksize)); + } if (offset != 0 && ket == OP_KETRMAX && common->optimized_cbracket[offset >> 1] != 0) { @@ -12712,24 +12368,18 @@ if (has_alternatives) if (opcode != OP_ONCE) { - if (alt_max > 4) - add_label_addr(common, next_update_addr++); - else + if (alt_max <= 3) { - if (alt_count != 2 * sizeof(sljit_uw)) - { - JUMPHERE(alt1); - if (alt_max == 3 && alt_count == sizeof(sljit_uw)) - alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw)); - } - else + JUMPHERE(next_alt); + alt_count++; + if (alt_count < alt_max) { - JUMPHERE(alt2); - if (alt_max == 4) - alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_uw)); + SLJIT_ASSERT(alt_count == 2 && alt_max == 3); + next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 1); } } - alt_count += sizeof(sljit_uw); + else + sljit_set_put_label(put_label, LABEL()); } COMPILE_BACKTRACKINGPATH(current->top); @@ -13219,11 +12869,10 @@ int private_data_size = get_recurse_data_length(common, ccbegin, ccend, &needs_c int alt_count, alt_max, local_size; backtrack_common altbacktrack; jump_list *match = NULL; -sljit_uw *next_update_addr = NULL; -struct sljit_jump *alt1 = NULL; -struct sljit_jump *alt2 = NULL; +struct sljit_jump *next_alt = NULL; struct sljit_jump *accept_exit = NULL; struct sljit_label *quit; +struct sljit_put_label *put_label; /* Recurse captures then. */ common->then_trap = NULL; @@ -13284,7 +12933,12 @@ while (1) OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr); if (alt_max > 1 || has_accept) - OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_count); + { + if (alt_max > 3) + put_label = sljit_emit_put_label(compiler, SLJIT_MEM1(STACK_TOP), STACK(1)); + else + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_count); + } add_jump(compiler, &match, JUMP(SLJIT_JUMP)); @@ -13298,7 +12952,7 @@ while (1) sljit_emit_fast_enter(compiler, TMP1, 0); if (has_accept) - accept_exit = CMP(SLJIT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_max * sizeof (sljit_sw)); + accept_exit = CMP(SLJIT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, -1); OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); /* Save return address. */ @@ -13311,44 +12965,30 @@ while (1) OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); free_stack(common, 2); - if (alt_max > 4) + if (alt_max > 3) { - /* Table jump if alt_max is greater than 4. */ - next_update_addr = allocate_read_only_data(common, alt_max * sizeof(sljit_uw)); - if (SLJIT_UNLIKELY(next_update_addr == NULL)) - return; - sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM1(TMP1), (sljit_sw)next_update_addr); - add_label_addr(common, next_update_addr++); + sljit_emit_ijump(compiler, SLJIT_JUMP, TMP1, 0); + sljit_set_put_label(put_label, LABEL()); } else - { - if (alt_max == 4) - alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw)); - alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw)); - } + next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0); } else free_stack(common, has_accept ? 2 : 1); } - else if (alt_max > 4) - add_label_addr(common, next_update_addr++); + else if (alt_max > 3) + sljit_set_put_label(put_label, LABEL()); else { - if (alt_count != 2 * sizeof(sljit_uw)) - { - JUMPHERE(alt1); - if (alt_max == 3 && alt_count == sizeof(sljit_uw)) - alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw)); - } - else + JUMPHERE(next_alt); + if (alt_count + 1 < alt_max) { - JUMPHERE(alt2); - if (alt_max == 4) - alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_uw)); + SLJIT_ASSERT(alt_count == 1 && alt_max == 3); + next_alt = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 1); } } - alt_count += sizeof(sljit_uw); + alt_count++; compile_backtrackingpath(common, altbacktrack.top); if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) @@ -13409,7 +13049,7 @@ if (common->accept != NULL) OP1(SLJIT_MOV, TMP2, 0, STACK_TOP, 0); allocate_stack(common, 2); - OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, alt_count); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, -1); } set_jumps(match, LABEL()); @@ -13444,7 +13084,6 @@ executable_functions *functions; void *executable_func; sljit_uw executable_size; sljit_uw total_length; -label_addr_list *label_addr; struct sljit_label *mainloop_label = NULL; struct sljit_label *continue_match_label; struct sljit_label *empty_match_found_label = NULL; @@ -13459,6 +13098,14 @@ struct sljit_jump *end_anchor_failed = NULL; SLJIT_ASSERT(tables); +#if HAS_VIRTUAL_REGISTERS == 1 +SLJIT_ASSERT(sljit_get_register_index(TMP3) < 0 && sljit_get_register_index(ARGUMENTS) < 0 && sljit_get_register_index(RETURN_ADDR) < 0); +#elif HAS_VIRTUAL_REGISTERS == 0 +SLJIT_ASSERT(sljit_get_register_index(TMP3) >= 0 && sljit_get_register_index(ARGUMENTS) >= 0 && sljit_get_register_index(RETURN_ADDR) >= 0); +#else +#error "Invalid value for HAS_VIRTUAL_REGISTERS" +#endif + memset(&rootbacktrack, 0, sizeof(backtrack_common)); memset(common, 0, sizeof(compiler_common)); common->re = re; @@ -13476,6 +13123,7 @@ common->fcc = tables + fcc_offset; common->lcc = (sljit_sw)(tables + lcc_offset); common->mode = mode; common->might_be_empty = re->minlength == 0; +common->allow_empty_partial = (re->max_lookbehind > 0) || (re->flags & PCRE2_MATCH_EMPTY) != 0; common->nltype = NLTYPE_FIXED; switch(re->newline_convention) { @@ -13742,7 +13390,7 @@ if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) sljit_free_compiler(compiler); SLJIT_FREE(common->optimized_cbracket, allocator_data); SLJIT_FREE(common->private_data_ptrs, allocator_data); - PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data); + PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data); return PCRE2_ERROR_NOMEMORY; } @@ -13796,7 +13444,7 @@ if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) sljit_free_compiler(compiler); SLJIT_FREE(common->optimized_cbracket, allocator_data); SLJIT_FREE(common->private_data_ptrs, allocator_data); - PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data); + PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data); return PCRE2_ERROR_NOMEMORY; } @@ -13885,7 +13533,7 @@ while (common->currententry != NULL) sljit_free_compiler(compiler); SLJIT_FREE(common->optimized_cbracket, allocator_data); SLJIT_FREE(common->private_data_ptrs, allocator_data); - PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data); + PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data); return PCRE2_ERROR_NOMEMORY; } flush_stubs(common); @@ -14028,16 +13676,11 @@ SLJIT_FREE(common->private_data_ptrs, allocator_data); executable_func = sljit_generate_code(compiler); executable_size = sljit_get_generated_code_size(compiler); -label_addr = common->label_addrs; -while (label_addr != NULL) - { - *label_addr->update_addr = sljit_get_label_addr(label_addr->label); - label_addr = label_addr->next; - } sljit_free_compiler(compiler); + if (executable_func == NULL) { - PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data); + PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data); return PCRE2_ERROR_NOMEMORY; } @@ -14052,7 +13695,7 @@ else /* This case is highly unlikely since we just recently freed a lot of memory. Not impossible though. */ sljit_free_code(executable_func); - PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data); + PRIV(jit_free_rodata)(common->read_only_data_head, allocator_data); return PCRE2_ERROR_NOMEMORY; } memset(functions, 0, sizeof(executable_functions)); @@ -14097,18 +13740,12 @@ Returns: 0: success or (*NOJIT) was used PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION pcre2_jit_compile(pcre2_code *code, uint32_t options) { -#ifndef SUPPORT_JIT - -(void)code; -(void)options; -return PCRE2_ERROR_JIT_BADOPTION; - -#else /* SUPPORT_JIT */ - pcre2_real_code *re = (pcre2_real_code *)code; -executable_functions *functions; -uint32_t excluded_options; -int result; + +#ifdef SUPPORT_JIT +executable_functions *functions = (executable_functions *)re->executable_jit; +static int executable_allocator_is_working = 0; +#endif if (code == NULL) return PCRE2_ERROR_NULL; @@ -14116,30 +13753,98 @@ if (code == NULL) if ((options & ~PUBLIC_JIT_COMPILE_OPTIONS) != 0) return PCRE2_ERROR_JIT_BADOPTION; +/* Support for invalid UTF was first introduced in JIT, with the option +PCRE2_JIT_INVALID_UTF. Later, support was added to the interpreter, and the +compile-time option PCRE2_MATCH_INVALID_UTF was created. This is now the +preferred feature, with the earlier option deprecated. However, for backward +compatibility, if the earlier option is set, it forces the new option so that +if JIT matching falls back to the interpreter, there is still support for +invalid UTF. However, if this function has already been successfully called +without PCRE2_JIT_INVALID_UTF and without PCRE2_MATCH_INVALID_UTF (meaning that +non-invalid-supporting JIT code was compiled), give an error. + +If in the future support for PCRE2_JIT_INVALID_UTF is withdrawn, the following +actions are needed: + + 1. Remove the definition from pcre2.h.in and from the list in + PUBLIC_JIT_COMPILE_OPTIONS above. + + 2. Replace PCRE2_JIT_INVALID_UTF with a local flag in this module. + + 3. Replace PCRE2_JIT_INVALID_UTF in pcre2_jit_test.c. + + 4. Delete the following short block of code. The setting of "re" and + "functions" can be moved into the JIT-only block below, but if that is + done, (void)re and (void)functions will be needed in the non-JIT case, to + avoid compiler warnings. +*/ + +if ((options & PCRE2_JIT_INVALID_UTF) != 0) + { + if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) == 0) + { +#ifdef SUPPORT_JIT + if (functions != NULL) return PCRE2_ERROR_JIT_BADOPTION; +#endif + re->overall_options |= PCRE2_MATCH_INVALID_UTF; + } + } + +/* The above tests are run with and without JIT support. This means that +PCRE2_JIT_INVALID_UTF propagates back into the regex options (ensuring +interpreter support) even in the absence of JIT. But now, if there is no JIT +support, give an error return. */ + +#ifndef SUPPORT_JIT +return PCRE2_ERROR_JIT_BADOPTION; +#else /* SUPPORT_JIT */ + +/* There is JIT support. Do the necessary. */ + if ((re->flags & PCRE2_NOJIT) != 0) return 0; -functions = (executable_functions *)re->executable_jit; +if (executable_allocator_is_working == 0) + { + /* Checks whether the executable allocator is working. This check + might run multiple times in multi-threaded environments, but the + result should not be affected by it. */ + void *ptr = SLJIT_MALLOC_EXEC(32); + + executable_allocator_is_working = -1; + + if (ptr != NULL) + { + SLJIT_FREE_EXEC(((sljit_u8*)(ptr)) + SLJIT_EXEC_OFFSET(ptr)); + executable_allocator_is_working = 1; + } + } + +if (executable_allocator_is_working < 0) + return PCRE2_ERROR_NOMEMORY; + +if ((re->overall_options & PCRE2_MATCH_INVALID_UTF) != 0) + options |= PCRE2_JIT_INVALID_UTF; if ((options & PCRE2_JIT_COMPLETE) != 0 && (functions == NULL || functions->executable_funcs[0] == NULL)) { - excluded_options = (PCRE2_JIT_PARTIAL_SOFT | PCRE2_JIT_PARTIAL_HARD); - result = jit_compile(code, options & ~excluded_options); + uint32_t excluded_options = (PCRE2_JIT_PARTIAL_SOFT | PCRE2_JIT_PARTIAL_HARD); + int 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)) { - excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_HARD); - result = jit_compile(code, options & ~excluded_options); + uint32_t excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_HARD); + int 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)) { - excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_SOFT); - result = jit_compile(code, options & ~excluded_options); + uint32_t excluded_options = (PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_SOFT); + int 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 eee038644d..7e13b8cfee 100644 --- a/thirdparty/pcre2/src/pcre2_jit_match.c +++ b/thirdparty/pcre2/src/pcre2_jit_match.c @@ -74,7 +74,6 @@ Arguments: options option bits match_data points to a match_data block mcontext points to a match context - jit_stack points to a JIT stack Returns: > 0 => success; value is the number of ovector pairs filled = 0 => success, but ovector is not big enough diff --git a/thirdparty/pcre2/src/pcre2_jit_neon_inc.h b/thirdparty/pcre2/src/pcre2_jit_neon_inc.h new file mode 100644 index 0000000000..55b1f32ac9 --- /dev/null +++ b/thirdparty/pcre2/src/pcre2_jit_neon_inc.h @@ -0,0 +1,321 @@ +/************************************************* +* 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 + This module by Zoltan Herczeg and Sebastian Pop + Original API code Copyright (c) 1997-2012 University of Cambridge + New API code Copyright (c) 2016-2019 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. +----------------------------------------------------------------------------- +*/ + +# if defined(FFCS) +# if defined(FF_UTF) +# define FF_FUN ffcs_utf +# else +# define FF_FUN ffcs +# endif + +# elif defined(FFCS_2) +# if defined(FF_UTF) +# define FF_FUN ffcs_2_utf +# else +# define FF_FUN ffcs_2 +# endif + +# elif defined(FFCS_MASK) +# if defined(FF_UTF) +# define FF_FUN ffcs_mask_utf +# else +# define FF_FUN ffcs_mask +# endif + +# elif defined(FFCPS_0) +# if defined (FF_UTF) +# define FF_FUN ffcps_0_utf +# else +# define FF_FUN ffcps_0 +# endif + +# elif defined (FFCPS_1) +# if defined (FF_UTF) +# define FF_FUN ffcps_1_utf +# else +# define FF_FUN ffcps_1 +# endif + +# elif defined (FFCPS_DEFAULT) +# if defined (FF_UTF) +# define FF_FUN ffcps_default_utf +# else +# define FF_FUN ffcps_default +# endif +# endif + +static sljit_u8* SLJIT_FUNC FF_FUN(sljit_u8 *str_end, sljit_u8 *str_ptr, sljit_uw offs1, sljit_uw offs2, sljit_uw chars) +#undef FF_FUN +{ +quad_word qw; +int_char ic; +ic.x = chars; + +#if defined(FFCS) +sljit_u8 c1 = ic.c.c1; +vect_t vc1 = VDUPQ(c1); + +#elif defined(FFCS_2) +sljit_u8 c1 = ic.c.c1; +vect_t vc1 = VDUPQ(c1); +sljit_u8 c2 = ic.c.c2; +vect_t vc2 = VDUPQ(c2); + +#elif defined(FFCS_MASK) +sljit_u8 c1 = ic.c.c1; +vect_t vc1 = VDUPQ(c1); +sljit_u8 mask = ic.c.c2; +vect_t vmask = VDUPQ(mask); +#endif + +#if defined(FFCPS) +compare_type compare1_type = compare_match1; +compare_type compare2_type = compare_match1; +vect_t cmp1a, cmp1b, cmp2a, cmp2b; +const sljit_u32 diff = IN_UCHARS(offs1 - offs2); +PCRE2_UCHAR char1a = ic.c.c1; +PCRE2_UCHAR char2a = ic.c.c3; + +# ifdef FFCPS_CHAR1A2A +cmp1a = VDUPQ(char1a); +cmp2a = VDUPQ(char2a); +# else +PCRE2_UCHAR char1b = ic.c.c2; +PCRE2_UCHAR char2b = ic.c.c4; +if (char1a == char1b) + cmp1a = VDUPQ(char1a); +else + { + sljit_u32 bit1 = char1a ^ char1b; + if (is_powerof2(bit1)) + { + compare1_type = compare_match1i; + cmp1a = VDUPQ(char1a | bit1); + cmp1b = VDUPQ(bit1); + } + else + { + compare1_type = compare_match2; + cmp1a = VDUPQ(char1a); + cmp1b = VDUPQ(char1b); + } + } + +if (char2a == char2b) + cmp2a = VDUPQ(char2a); +else + { + sljit_u32 bit2 = char2a ^ char2b; + if (is_powerof2(bit2)) + { + compare2_type = compare_match1i; + cmp2a = VDUPQ(char2a | bit2); + cmp2b = VDUPQ(bit2); + } + else + { + compare2_type = compare_match2; + cmp2a = VDUPQ(char2a); + cmp2b = VDUPQ(char2b); + } + } +# endif + +str_ptr += IN_UCHARS(offs1); +#endif + +#if PCRE2_CODE_UNIT_WIDTH != 8 +vect_t char_mask = VDUPQ(0xff); +#endif + +#if defined(FF_UTF) +restart:; +#endif + +#if defined(FFCPS) +sljit_u8 *p1 = str_ptr - diff; +#endif +sljit_s32 align_offset = ((uint64_t)str_ptr & 0xf); +str_ptr = (sljit_u8 *) ((uint64_t)str_ptr & ~0xf); +vect_t data = VLD1Q(str_ptr); +#if PCRE2_CODE_UNIT_WIDTH != 8 +data = VANDQ(data, char_mask); +#endif + +#if defined(FFCS) +vect_t eq = VCEQQ(data, vc1); + +#elif defined(FFCS_2) +vect_t eq1 = VCEQQ(data, vc1); +vect_t eq2 = VCEQQ(data, vc2); +vect_t eq = VORRQ(eq1, eq2); + +#elif defined(FFCS_MASK) +vect_t eq = VORRQ(data, vmask); +eq = VCEQQ(eq, vc1); + +#elif defined(FFCPS) +# if defined(FFCPS_DIFF1) +vect_t prev_data = data; +# endif + +vect_t data2; +if (p1 < str_ptr) + { + data2 = VLD1Q(str_ptr - diff); +#if PCRE2_CODE_UNIT_WIDTH != 8 + data2 = VANDQ(data2, char_mask); +#endif + } +else + data2 = shift_left_n_lanes(data, offs1 - offs2); + +data = fast_forward_char_pair_compare(compare1_type, data, cmp1a, cmp1b); +data2 = fast_forward_char_pair_compare(compare2_type, data2, cmp2a, cmp2b); +vect_t eq = VANDQ(data, data2); +#endif + +VST1Q(qw.mem, eq); +/* Ignore matches before the first STR_PTR. */ +if (align_offset < 8) + { + qw.dw[0] >>= align_offset * 8; + if (qw.dw[0]) + { + str_ptr += align_offset + __builtin_ctzll(qw.dw[0]) / 8; + goto match; + } + if (qw.dw[1]) + { + str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8; + goto match; + } + } +else + { + qw.dw[1] >>= (align_offset - 8) * 8; + if (qw.dw[1]) + { + str_ptr += align_offset + __builtin_ctzll(qw.dw[1]) / 8; + goto match; + } + } +str_ptr += 16; + +while (str_ptr < str_end) + { + vect_t orig_data = VLD1Q(str_ptr); +#if PCRE2_CODE_UNIT_WIDTH != 8 + orig_data = VANDQ(orig_data, char_mask); +#endif + data = orig_data; + +#if defined(FFCS) + eq = VCEQQ(data, vc1); + +#elif defined(FFCS_2) + eq1 = VCEQQ(data, vc1); + eq2 = VCEQQ(data, vc2); + eq = VORRQ(eq1, eq2); + +#elif defined(FFCS_MASK) + eq = VORRQ(data, vmask); + eq = VCEQQ(eq, vc1); +#endif + +#if defined(FFCPS) +# if defined (FFCPS_DIFF1) + data2 = VEXTQ(prev_data, data, VECTOR_FACTOR - 1); +# else + data2 = VLD1Q(str_ptr - diff); +# if PCRE2_CODE_UNIT_WIDTH != 8 + data2 = VANDQ(data2, char_mask); +# endif +# endif + +# ifdef FFCPS_CHAR1A2A + data = VCEQQ(data, cmp1a); + data2 = VCEQQ(data2, cmp2a); +# else + data = fast_forward_char_pair_compare(compare1_type, data, cmp1a, cmp1b); + data2 = fast_forward_char_pair_compare(compare2_type, data2, cmp2a, cmp2b); +# endif + + eq = VANDQ(data, data2); +#endif + + VST1Q(qw.mem, eq); + if (qw.dw[0]) + str_ptr += __builtin_ctzll(qw.dw[0]) / 8; + else if (qw.dw[1]) + str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8; + else { + str_ptr += 16; +#if defined (FFCPS_DIFF1) + prev_data = orig_data; +#endif + continue; + } + +match:; + if (str_ptr >= str_end) + /* Failed match. */ + return NULL; + +#if defined(FF_UTF) + if (utf_continue(str_ptr + IN_UCHARS(-offs1))) + { + /* Not a match. */ + str_ptr += IN_UCHARS(1); + goto restart; + } +#endif + + /* Match. */ +#if defined (FFCPS) + str_ptr -= IN_UCHARS(offs1); +#endif + return str_ptr; + } + +/* Failed match. */ +return NULL; +} diff --git a/thirdparty/pcre2/src/pcre2_jit_simd_inc.h b/thirdparty/pcre2/src/pcre2_jit_simd_inc.h new file mode 100644 index 0000000000..f7d56b29f8 --- /dev/null +++ b/thirdparty/pcre2/src/pcre2_jit_simd_inc.h @@ -0,0 +1,993 @@ +/************************************************* +* 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 + This module by Zoltan Herczeg + Original API code Copyright (c) 1997-2012 University of Cambridge + New API code Copyright (c) 2016-2019 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. +----------------------------------------------------------------------------- +*/ + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +static struct sljit_jump *jump_if_utf_char_start(struct sljit_compiler *compiler, sljit_s32 reg) +{ +#if PCRE2_CODE_UNIT_WIDTH == 8 +OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xc0); +return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0x80); +#elif PCRE2_CODE_UNIT_WIDTH == 16 +OP2(SLJIT_AND, reg, 0, reg, 0, SLJIT_IMM, 0xfc00); +return CMP(SLJIT_NOT_EQUAL, reg, 0, SLJIT_IMM, 0xdc00); +#else +#error "Unknown code width" +#endif +} +#endif + +static sljit_s32 character_to_int32(PCRE2_UCHAR chr) +{ +sljit_u32 value = chr; +#if PCRE2_CODE_UNIT_WIDTH == 8 +#define SSE2_COMPARE_TYPE_INDEX 0 +return (sljit_s32)((value << 24) | (value << 16) | (value << 8) | value); +#elif PCRE2_CODE_UNIT_WIDTH == 16 +#define SSE2_COMPARE_TYPE_INDEX 1 +return (sljit_s32)((value << 16) | value); +#elif PCRE2_CODE_UNIT_WIDTH == 32 +#define SSE2_COMPARE_TYPE_INDEX 2 +return (sljit_s32)(value); +#else +#error "Unsupported unit width" +#endif +} + +static void load_from_mem_sse2(struct sljit_compiler *compiler, sljit_s32 dst_xmm_reg, sljit_s32 src_general_reg, sljit_s8 offset) +{ +sljit_u8 instruction[5]; + +SLJIT_ASSERT(dst_xmm_reg < 8); +SLJIT_ASSERT(src_general_reg < 8); + +/* MOVDQA xmm1, xmm2/m128 */ +instruction[0] = ((sljit_u8)offset & 0xf) == 0 ? 0x66 : 0xf3; +instruction[1] = 0x0f; +instruction[2] = 0x6f; + +if (offset == 0) + { + instruction[3] = (dst_xmm_reg << 3) | src_general_reg; + sljit_emit_op_custom(compiler, instruction, 4); + return; + } + +instruction[3] = 0x40 | (dst_xmm_reg << 3) | src_general_reg; +instruction[4] = (sljit_u8)offset; +sljit_emit_op_custom(compiler, instruction, 5); +} + +typedef enum { + sse2_compare_match1, + sse2_compare_match1i, + sse2_compare_match2, +} sse2_compare_type; + +static void fast_forward_char_pair_sse2_compare(struct sljit_compiler *compiler, sse2_compare_type compare_type, + int step, sljit_s32 dst_ind, sljit_s32 cmp1_ind, sljit_s32 cmp2_ind, sljit_s32 tmp_ind) +{ +sljit_u8 instruction[4]; +instruction[0] = 0x66; +instruction[1] = 0x0f; + +SLJIT_ASSERT(step >= 0 && step <= 3); + +if (compare_type != sse2_compare_match2) + { + if (step == 0) + { + if (compare_type == sse2_compare_match1i) + { + /* POR xmm1, xmm2/m128 */ + /* instruction[0] = 0x66; */ + /* instruction[1] = 0x0f; */ + instruction[2] = 0xeb; + instruction[3] = 0xc0 | (dst_ind << 3) | cmp2_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + return; + } + + if (step != 2) + return; + + /* PCMPEQB/W/D xmm1, xmm2/m128 */ + /* instruction[0] = 0x66; */ + /* instruction[1] = 0x0f; */ + instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX; + instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind; + sljit_emit_op_custom(compiler, instruction, 4); + return; + } + +switch (step) + { + case 0: + /* MOVDQA xmm1, xmm2/m128 */ + /* instruction[0] = 0x66; */ + /* instruction[1] = 0x0f; */ + instruction[2] = 0x6f; + instruction[3] = 0xc0 | (tmp_ind << 3) | dst_ind; + sljit_emit_op_custom(compiler, instruction, 4); + return; + + case 1: + /* PCMPEQB/W/D xmm1, xmm2/m128 */ + /* instruction[0] = 0x66; */ + /* instruction[1] = 0x0f; */ + instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX; + instruction[3] = 0xc0 | (dst_ind << 3) | cmp1_ind; + sljit_emit_op_custom(compiler, instruction, 4); + return; + + case 2: + /* PCMPEQB/W/D xmm1, xmm2/m128 */ + /* instruction[0] = 0x66; */ + /* instruction[1] = 0x0f; */ + instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX; + instruction[3] = 0xc0 | (tmp_ind << 3) | cmp2_ind; + sljit_emit_op_custom(compiler, instruction, 4); + return; + + case 3: + /* POR xmm1, xmm2/m128 */ + /* instruction[0] = 0x66; */ + /* instruction[1] = 0x0f; */ + instruction[2] = 0xeb; + instruction[3] = 0xc0 | (dst_ind << 3) | tmp_ind; + sljit_emit_op_custom(compiler, instruction, 4); + return; + } +} + +#define JIT_HAS_FAST_FORWARD_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2)) + +static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset) +{ +DEFINE_COMPILER; +struct sljit_label *start; +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +struct sljit_label *restart; +#endif +struct sljit_jump *quit; +struct sljit_jump *partial_quit[2]; +sse2_compare_type compare_type = sse2_compare_match1; +sljit_u8 instruction[8]; +sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1); +sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR); +sljit_s32 data_ind = 0; +sljit_s32 tmp_ind = 1; +sljit_s32 cmp1_ind = 2; +sljit_s32 cmp2_ind = 3; +sljit_u32 bit = 0; +int i; + +SLJIT_UNUSED_ARG(offset); + +if (char1 != char2) + { + bit = char1 ^ char2; + compare_type = sse2_compare_match1i; + + if (!is_powerof2(bit)) + { + bit = 0; + compare_type = sse2_compare_match2; + } + } + +partial_quit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +if (common->mode == PCRE2_JIT_COMPLETE) + add_jump(compiler, &common->failed_match, partial_quit[0]); + +/* First part (unaligned start) */ + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit)); + +SLJIT_ASSERT(tmp1_reg_ind < 8); + +/* MOVD xmm, r/m32 */ +instruction[0] = 0x66; +instruction[1] = 0x0f; +instruction[2] = 0x6e; +instruction[3] = 0xc0 | (cmp1_ind << 3) | tmp1_reg_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +if (char1 != char2) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2)); + + /* MOVD xmm, r/m32 */ + instruction[3] = 0xc0 | (cmp2_ind << 3) | tmp1_reg_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + +OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0); + +/* PSHUFD xmm1, xmm2/m128, imm8 */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0x70; +instruction[3] = 0xc0 | (cmp1_ind << 3) | cmp1_ind; +instruction[4] = 0; +sljit_emit_op_custom(compiler, instruction, 5); + +if (char1 != char2) + { + /* PSHUFD xmm1, xmm2/m128, imm8 */ + instruction[3] = 0xc0 | (cmp2_ind << 3) | cmp2_ind; + sljit_emit_op_custom(compiler, instruction, 5); + } + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +restart = LABEL(); +#endif +OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf); + +load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0); +for (i = 0; i < 4; i++) + fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + +/* PMOVMSKB reg, xmm */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0xd7; +instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); +OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0); + +quit = CMP(SLJIT_NOT_ZERO, TMP1, 0, SLJIT_IMM, 0); + +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + +/* Second part (aligned) */ +start = LABEL(); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16); + +partial_quit[1] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +if (common->mode == PCRE2_JIT_COMPLETE) + add_jump(compiler, &common->failed_match, partial_quit[1]); + +load_from_mem_sse2(compiler, data_ind, str_ptr_reg_ind, 0); +for (i = 0; i < 4; i++) + fast_forward_char_pair_sse2_compare(compiler, compare_type, i, data_ind, cmp1_ind, cmp2_ind, tmp_ind); + +/* PMOVMSKB reg, xmm */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0xd7; +instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | data_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start); + +JUMPHERE(quit); + +/* BSF r32, r/m32 */ +instruction[0] = 0x0f; +instruction[1] = 0xbc; +instruction[2] = 0xc0 | (tmp1_reg_ind << 3) | tmp1_reg_ind; +sljit_emit_op_custom(compiler, instruction, 3); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + +if (common->mode != PCRE2_JIT_COMPLETE) + { + JUMPHERE(partial_quit[0]); + JUMPHERE(partial_quit[1]); + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0); + CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0); + } +else + add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +if (common->utf && offset > 0) + { + SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE); + + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset)); + + quit = jump_if_utf_char_start(compiler, TMP1); + + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0); + JUMPTO(SLJIT_JUMP, restart); + + JUMPHERE(quit); + } +#endif +} + +#ifndef _WIN64 + +static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_offset(void) +{ +#if PCRE2_CODE_UNIT_WIDTH == 8 +return 15; +#elif PCRE2_CODE_UNIT_WIDTH == 16 +return 7; +#elif PCRE2_CODE_UNIT_WIDTH == 32 +return 3; +#else +#error "Unsupported unit width" +#endif +} + +#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2)) + +static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1, + PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b) +{ +DEFINE_COMPILER; +sse2_compare_type compare1_type = sse2_compare_match1; +sse2_compare_type compare2_type = sse2_compare_match1; +sljit_u32 bit1 = 0; +sljit_u32 bit2 = 0; +sljit_u32 diff = IN_UCHARS(offs1 - offs2); +sljit_s32 tmp1_reg_ind = sljit_get_register_index(TMP1); +sljit_s32 tmp2_reg_ind = sljit_get_register_index(TMP2); +sljit_s32 str_ptr_reg_ind = sljit_get_register_index(STR_PTR); +sljit_s32 data1_ind = 0; +sljit_s32 data2_ind = 1; +sljit_s32 tmp1_ind = 2; +sljit_s32 tmp2_ind = 3; +sljit_s32 cmp1a_ind = 4; +sljit_s32 cmp1b_ind = 5; +sljit_s32 cmp2a_ind = 6; +sljit_s32 cmp2b_ind = 7; +struct sljit_label *start; +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +struct sljit_label *restart; +#endif +struct sljit_jump *jump[2]; +sljit_u8 instruction[8]; +int i; + +SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2); +SLJIT_ASSERT(diff <= IN_UCHARS(max_fast_forward_char_pair_offset())); +SLJIT_ASSERT(tmp1_reg_ind < 8 && tmp2_reg_ind == 1); + +/* Initialize. */ +if (common->match_end_ptr != 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + OP1(SLJIT_MOV, TMP3, 0, STR_END, 0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1)); + + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, STR_END, 0); + CMOV(SLJIT_LESS, STR_END, TMP1, 0); + } + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1)); +add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + +/* MOVD xmm, r/m32 */ +instruction[0] = 0x66; +instruction[1] = 0x0f; +instruction[2] = 0x6e; + +if (char1a == char1b) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a)); +else + { + bit1 = char1a ^ char1b; + if (is_powerof2(bit1)) + { + compare1_type = sse2_compare_match1i; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a | bit1)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit1)); + } + else + { + compare1_type = sse2_compare_match2; + bit1 = 0; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1a)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char1b)); + } + } + +instruction[3] = 0xc0 | (cmp1a_ind << 3) | tmp1_reg_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +if (char1a != char1b) + { + instruction[3] = 0xc0 | (cmp1b_ind << 3) | tmp2_reg_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + +if (char2a == char2b) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a)); +else + { + bit2 = char2a ^ char2b; + if (is_powerof2(bit2)) + { + compare2_type = sse2_compare_match1i; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a | bit2)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(bit2)); + } + else + { + compare2_type = sse2_compare_match2; + bit2 = 0; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char2a)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, character_to_int32(char2b)); + } + } + +instruction[3] = 0xc0 | (cmp2a_ind << 3) | tmp1_reg_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +if (char2a != char2b) + { + instruction[3] = 0xc0 | (cmp2b_ind << 3) | tmp2_reg_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + +/* PSHUFD xmm1, xmm2/m128, imm8 */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0x70; +instruction[4] = 0; + +instruction[3] = 0xc0 | (cmp1a_ind << 3) | cmp1a_ind; +sljit_emit_op_custom(compiler, instruction, 5); + +if (char1a != char1b) + { + instruction[3] = 0xc0 | (cmp1b_ind << 3) | cmp1b_ind; + sljit_emit_op_custom(compiler, instruction, 5); + } + +instruction[3] = 0xc0 | (cmp2a_ind << 3) | cmp2a_ind; +sljit_emit_op_custom(compiler, instruction, 5); + +if (char2a != char2b) + { + instruction[3] = 0xc0 | (cmp2b_ind << 3) | cmp2b_ind; + sljit_emit_op_custom(compiler, instruction, 5); + } + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +restart = LABEL(); +#endif + +OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, diff); +OP1(SLJIT_MOV, TMP2, 0, STR_PTR, 0); +OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf); + +load_from_mem_sse2(compiler, data1_ind, str_ptr_reg_ind, 0); + +jump[0] = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_PTR, 0); + +load_from_mem_sse2(compiler, data2_ind, str_ptr_reg_ind, -(sljit_s8)diff); +jump[1] = JUMP(SLJIT_JUMP); + +JUMPHERE(jump[0]); + +/* MOVDQA xmm1, xmm2/m128 */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0x6f; +instruction[3] = 0xc0 | (data2_ind << 3) | data1_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +/* PSLLDQ xmm1, imm8 */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0x73; +instruction[3] = 0xc0 | (7 << 3) | data2_ind; +instruction[4] = diff; +sljit_emit_op_custom(compiler, instruction, 5); + +JUMPHERE(jump[1]); + +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xf); + +for (i = 0; i < 4; i++) + { + fast_forward_char_pair_sse2_compare(compiler, compare2_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp2_ind); + fast_forward_char_pair_sse2_compare(compiler, compare1_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp1_ind); + } + +/* PAND xmm1, xmm2/m128 */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0xdb; +instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +/* PMOVMSKB reg, xmm */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0xd7; +instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | 0; +sljit_emit_op_custom(compiler, instruction, 4); + +/* Ignore matches before the first STR_PTR. */ +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); +OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, TMP2, 0); + +jump[0] = CMP(SLJIT_NOT_ZERO, TMP1, 0, SLJIT_IMM, 0); + +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + +/* Main loop. */ +start = LABEL(); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16); +add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + +load_from_mem_sse2(compiler, data1_ind, str_ptr_reg_ind, 0); +load_from_mem_sse2(compiler, data2_ind, str_ptr_reg_ind, -(sljit_s8)diff); + +for (i = 0; i < 4; i++) + { + fast_forward_char_pair_sse2_compare(compiler, compare1_type, i, data1_ind, cmp1a_ind, cmp1b_ind, tmp2_ind); + fast_forward_char_pair_sse2_compare(compiler, compare2_type, i, data2_ind, cmp2a_ind, cmp2b_ind, tmp1_ind); + } + +/* PAND xmm1, xmm2/m128 */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0xdb; +instruction[3] = 0xc0 | (data1_ind << 3) | data2_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +/* PMOVMSKB reg, xmm */ +/* instruction[0] = 0x66; */ +/* instruction[1] = 0x0f; */ +instruction[2] = 0xd7; +instruction[3] = 0xc0 | (tmp1_reg_ind << 3) | 0; +sljit_emit_op_custom(compiler, instruction, 4); + +CMPTO(SLJIT_ZERO, TMP1, 0, SLJIT_IMM, 0, start); + +JUMPHERE(jump[0]); + +/* BSF r32, r/m32 */ +instruction[0] = 0x0f; +instruction[1] = 0xbc; +instruction[2] = 0xc0 | (tmp1_reg_ind << 3) | tmp1_reg_ind; +sljit_emit_op_custom(compiler, instruction, 3); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + +add_jump(compiler, &common->failed_match, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + +if (common->match_end_ptr != 0) + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +if (common->utf) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offs1)); + + jump[0] = jump_if_utf_char_start(compiler, TMP1); + + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, restart); + + add_jump(compiler, &common->failed_match, JUMP(SLJIT_JUMP)); + + JUMPHERE(jump[0]); + } +#endif + +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offs1)); + +if (common->match_end_ptr != 0) + OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); +} + +#endif /* !_WIN64 */ + +#undef SSE2_COMPARE_TYPE_INDEX + +#endif /* SLJIT_CONFIG_X86 && !SUPPORT_VALGRIND */ + +#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64 && (defined __ARM_NEON || defined __ARM_NEON__)) + +#include <arm_neon.h> + +typedef union { + unsigned int x; + struct { unsigned char c1, c2, c3, c4; } c; +} int_char; + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +static SLJIT_INLINE int utf_continue(sljit_u8 *s) +{ +#if PCRE2_CODE_UNIT_WIDTH == 8 +return (*s & 0xc0) == 0x80; +#elif PCRE2_CODE_UNIT_WIDTH == 16 +return (*s & 0xfc00) == 0xdc00; +#else +#error "Unknown code width" +#endif +} +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */ + +#if PCRE2_CODE_UNIT_WIDTH == 8 +# define VECTOR_FACTOR 16 +# define vect_t uint8x16_t +# define VLD1Q(X) vld1q_u8((sljit_u8 *)(X)) +# define VCEQQ vceqq_u8 +# define VORRQ vorrq_u8 +# define VST1Q vst1q_u8 +# define VDUPQ vdupq_n_u8 +# define VEXTQ vextq_u8 +# define VANDQ vandq_u8 +typedef union { + uint8_t mem[16]; + uint64_t dw[2]; +} quad_word; +#elif PCRE2_CODE_UNIT_WIDTH == 16 +# define VECTOR_FACTOR 8 +# define vect_t uint16x8_t +# define VLD1Q(X) vld1q_u16((sljit_u16 *)(X)) +# define VCEQQ vceqq_u16 +# define VORRQ vorrq_u16 +# define VST1Q vst1q_u16 +# define VDUPQ vdupq_n_u16 +# define VEXTQ vextq_u16 +# define VANDQ vandq_u16 +typedef union { + uint16_t mem[8]; + uint64_t dw[2]; +} quad_word; +#else +# define VECTOR_FACTOR 4 +# define vect_t uint32x4_t +# define VLD1Q(X) vld1q_u32((sljit_u32 *)(X)) +# define VCEQQ vceqq_u32 +# define VORRQ vorrq_u32 +# define VST1Q vst1q_u32 +# define VDUPQ vdupq_n_u32 +# define VEXTQ vextq_u32 +# define VANDQ vandq_u32 +typedef union { + uint32_t mem[4]; + uint64_t dw[2]; +} quad_word; +#endif + +#define FFCS +#include "pcre2_jit_neon_inc.h" +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +# define FF_UTF +# include "pcre2_jit_neon_inc.h" +# undef FF_UTF +#endif +#undef FFCS + +#define FFCS_2 +#include "pcre2_jit_neon_inc.h" +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +# define FF_UTF +# include "pcre2_jit_neon_inc.h" +# undef FF_UTF +#endif +#undef FFCS_2 + +#define FFCS_MASK +#include "pcre2_jit_neon_inc.h" +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +# define FF_UTF +# include "pcre2_jit_neon_inc.h" +# undef FF_UTF +#endif +#undef FFCS_MASK + +#define JIT_HAS_FAST_FORWARD_CHAR_SIMD 1 + +static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset) +{ +DEFINE_COMPILER; +int_char ic; +struct sljit_jump *partial_quit; +/* Save temporary registers. */ +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STR_PTR, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP3, 0); + +/* Prepare function arguments */ +OP1(SLJIT_MOV, SLJIT_R0, 0, STR_END, 0); +OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0); +OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, offset); + +if (char1 == char2) + { + ic.c.c1 = char1; + ic.c.c2 = char2; + OP1(SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, ic.x); + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 + if (common->utf && offset > 0) + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_utf)); + else + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs)); +#else + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs)); +#endif + } +else + { + PCRE2_UCHAR mask = char1 ^ char2; + if (is_powerof2(mask)) + { + ic.c.c1 = char1 | mask; + ic.c.c2 = mask; + OP1(SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, ic.x); + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 + if (common->utf && offset > 0) + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask_utf)); + else + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask)); +#else + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask)); +#endif + } + else + { + ic.c.c1 = char1; + ic.c.c2 = char2; + OP1(SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, ic.x); + +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 + if (common->utf && offset > 0) + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2_utf)); + else + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2)); +#else + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW), + SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2)); +#endif + } + } +/* Restore registers. */ +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); +OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); + +/* Check return value. */ +partial_quit = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); +if (common->mode == PCRE2_JIT_COMPLETE) + add_jump(compiler, &common->failed_match, partial_quit); + +/* Fast forward STR_PTR to the result of memchr. */ +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); + +if (common->mode != PCRE2_JIT_COMPLETE) + JUMPHERE(partial_quit); +} + +typedef enum { + compare_match1, + compare_match1i, + compare_match2, +} compare_type; + +static inline vect_t fast_forward_char_pair_compare(compare_type ctype, vect_t dst, vect_t cmp1, vect_t cmp2) +{ +if (ctype == compare_match2) + { + vect_t tmp = dst; + dst = VCEQQ(dst, cmp1); + tmp = VCEQQ(tmp, cmp2); + dst = VORRQ(dst, tmp); + return dst; + } + +if (ctype == compare_match1i) + dst = VORRQ(dst, cmp2); +dst = VCEQQ(dst, cmp1); +return dst; +} + +static SLJIT_INLINE sljit_u32 max_fast_forward_char_pair_offset(void) +{ +#if PCRE2_CODE_UNIT_WIDTH == 8 +return 15; +#elif PCRE2_CODE_UNIT_WIDTH == 16 +return 7; +#elif PCRE2_CODE_UNIT_WIDTH == 32 +return 3; +#else +#error "Unsupported unit width" +#endif +} + +/* ARM doesn't have a shift left across lanes. */ +static SLJIT_INLINE vect_t shift_left_n_lanes(vect_t a, sljit_u8 n) +{ +vect_t zero = VDUPQ(0); +SLJIT_ASSERT(0 < n && n < VECTOR_FACTOR); +/* VEXTQ takes an immediate as last argument. */ +#define C(X) case X: return VEXTQ(zero, a, VECTOR_FACTOR - X); +switch (n) + { + C(1); C(2); C(3); +#if PCRE2_CODE_UNIT_WIDTH != 32 + C(4); C(5); C(6); C(7); +# if PCRE2_CODE_UNIT_WIDTH != 16 + C(8); C(9); C(10); C(11); C(12); C(13); C(14); C(15); +# endif +#endif + default: + /* Based on the ASSERT(0 < n && n < VECTOR_FACTOR) above, this won't + happen. The return is still here for compilers to not warn. */ + return a; + } +} + +#define FFCPS +#define FFCPS_DIFF1 +#define FFCPS_CHAR1A2A + +#define FFCPS_0 +#include "pcre2_jit_neon_inc.h" +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +# define FF_UTF +# include "pcre2_jit_neon_inc.h" +# undef FF_UTF +#endif +#undef FFCPS_0 + +#undef FFCPS_CHAR1A2A + +#define FFCPS_1 +#include "pcre2_jit_neon_inc.h" +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +# define FF_UTF +# include "pcre2_jit_neon_inc.h" +# undef FF_UTF +#endif +#undef FFCPS_1 + +#undef FFCPS_DIFF1 + +#define FFCPS_DEFAULT +#include "pcre2_jit_neon_inc.h" +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 +# define FF_UTF +# include "pcre2_jit_neon_inc.h" +# undef FF_UTF +#endif +#undef FFCPS + +#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD 1 + +static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1, + PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b) +{ +DEFINE_COMPILER; +sljit_u32 diff = IN_UCHARS(offs1 - offs2); +struct sljit_jump *partial_quit; +int_char ic; +SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE && offs1 > offs2); +SLJIT_ASSERT(diff <= IN_UCHARS(max_fast_forward_char_pair_offset())); +SLJIT_ASSERT(compiler->scratches == 5); + +/* Save temporary register STR_PTR. */ +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STR_PTR, 0); + +/* Prepare arguments for the function call. */ +if (common->match_end_ptr == 0) + OP1(SLJIT_MOV, SLJIT_R0, 0, STR_END, 0); +else + { + OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + OP2(SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1)); + + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, STR_END, 0, SLJIT_R0, 0); + CMOV(SLJIT_LESS, SLJIT_R0, STR_END, 0); + } + +OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0); +OP1(SLJIT_MOV_S32, SLJIT_R2, 0, SLJIT_IMM, offs1); +OP1(SLJIT_MOV_S32, SLJIT_R3, 0, SLJIT_IMM, offs2); +ic.c.c1 = char1a; +ic.c.c2 = char1b; +ic.c.c3 = char2a; +ic.c.c4 = char2b; +OP1(SLJIT_MOV_U32, SLJIT_R4, 0, SLJIT_IMM, ic.x); + +if (diff == 1) { + if (char1a == char1b && char2a == char2b) { +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 + if (common->utf) + 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(ffcps_0_utf)); + else +#endif + 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(ffcps_0)); + } else { +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 + if (common->utf) + 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(ffcps_1_utf)); + else +#endif + 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(ffcps_1)); + } +} else { +#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 + if (common->utf) + 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(ffcps_default_utf)); + else +#endif + 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(ffcps_default)); +} + +/* Restore STR_PTR register. */ +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + +/* Check return value. */ +partial_quit = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); +add_jump(compiler, &common->failed_match, partial_quit); + +/* Fast forward STR_PTR to the result of memchr. */ +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); + +JUMPHERE(partial_quit); +} + +#endif /* SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64 */ diff --git a/thirdparty/pcre2/src/pcre2_maketables.c b/thirdparty/pcre2/src/pcre2_maketables.c index 5921e90793..8c93b4b573 100644 --- a/thirdparty/pcre2/src/pcre2_maketables.c +++ b/thirdparty/pcre2/src/pcre2_maketables.c @@ -147,4 +147,15 @@ for (i = 0; i < 256; i++) return yield; } +#ifndef DFTABLES +PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION +pcre2_maketables_free(pcre2_general_context *gcontext, const uint8_t *tables) +{ + if (gcontext) + gcontext->memctl.free((void *)tables, gcontext->memctl.memory_data); + else + free((void *)tables); +} +#endif + /* End of pcre2_maketables.c */ diff --git a/thirdparty/pcre2/src/pcre2_match.c b/thirdparty/pcre2/src/pcre2_match.c index 419561fd64..48e7b9dbb2 100644 --- a/thirdparty/pcre2/src/pcre2_match.c +++ b/thirdparty/pcre2/src/pcre2_match.c @@ -415,8 +415,7 @@ if (caseless) else #endif - /* Not in UTF mode */ - + /* Not in UTF mode */ { for (; length > 0; length--) { @@ -491,27 +490,32 @@ heap is used for a larger vector. *************************************************/ /* These macros pack up tests that are used for partial matching several times -in the code. We set the "hit end" flag if the pointer is at the end of the -subject and also past the earliest inspected character (i.e. something has been -matched, even if not part of the actual matched string). For hard partial -matching, we then return immediately. The second one is used when we already -know we are past the end of the subject. */ +in the code. The second one is used when we already know we are past the end of +the subject. We set the "hit end" flag if the pointer is at the end of the +subject and either (a) the pointer is past the earliest inspected character +(i.e. something has been matched, even if not part of the actual matched +string), or (b) the pattern contains a lookbehind. These are the conditions for +which adding more characters may allow the current match to continue. + +For hard partial matching, we immediately return a partial match. Otherwise, +carrying on means that a complete match on the current subject will be sought. +A partial match is returned only if no complete match can be found. */ #define CHECK_PARTIAL()\ - if (mb->partial != 0 && Feptr >= mb->end_subject && \ - Feptr > mb->start_used_ptr) \ + if (Feptr >= mb->end_subject) \ { \ - mb->hitend = TRUE; \ - if (mb->partial > 1) return PCRE2_ERROR_PARTIAL; \ + SCHECK_PARTIAL(); \ } #define SCHECK_PARTIAL()\ - if (mb->partial != 0 && Feptr > mb->start_used_ptr) \ + if (mb->partial != 0 && \ + (Feptr > mb->start_used_ptr || mb->allowemptypartial)) \ { \ mb->hitend = TRUE; \ if (mb->partial > 1) return PCRE2_ERROR_PARTIAL; \ } + /* These macros are used to implement backtracking. They simulate a recursive call to the match() function by means of a local vector of frames which remember the backtracking points. */ @@ -5127,6 +5131,8 @@ fprintf(stderr, "++ op=%d\n", *Fecode); case OP_ASSERT: case OP_ASSERTBACK: + case OP_ASSERT_NA: + case OP_ASSERTBACK_NA: Lframe_type = GF_NOCAPTURE | Fop; for (;;) { @@ -5412,7 +5418,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); { while (number-- > 0) { - if (Feptr <= mb->start_subject) RRETURN(MATCH_NOMATCH); + if (Feptr <= mb->check_subject) RRETURN(MATCH_NOMATCH); Feptr--; BACKCHAR(Feptr); } @@ -5420,7 +5426,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); else #endif - /* No UTF-8 support, or not in UTF-8 mode: count is byte count */ + /* No UTF-8 support, or not in UTF-8 mode: count is code unit count */ { if ((ptrdiff_t)number > Feptr - mb->start_subject) RRETURN(MATCH_NOMATCH); @@ -5472,15 +5478,16 @@ fprintf(stderr, "++ op=%d\n", *Fecode); /* If we are at the end of an assertion that is a condition, return a match, discarding any intermediate backtracking points. Copy back the - captures into the frame before N so that they are set on return. Doing - this for all assertions, both positive and negative, seems to match what - Perl does. */ + mark setting and the captures into the frame before N so that they are + set on return. Doing this for all assertions, both positive and negative, + seems to match what Perl does. */ if (GF_IDMASK(N->group_frame_type) == GF_CONDASSERT) { memcpy((char *)P + offsetof(heapframe, ovector), Fovector, Foffset_top * sizeof(PCRE2_SIZE)); P->offset_top = Foffset_top; + P->mark = Fmark; Fback_frame = (char *)F - (char *)P; RRETURN(MATCH_MATCH); } @@ -5496,10 +5503,20 @@ fprintf(stderr, "++ op=%d\n", *Fecode); case OP_SCOND: break; - /* Positive assertions are like OP_ONCE, except that in addition the + /* Non-atomic positive assertions are like OP_BRA, except that the subject pointer must be put back to where it was at the start of the assertion. */ + case OP_ASSERT_NA: + case OP_ASSERTBACK_NA: + if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr; + Feptr = P->eptr; + break; + + /* Atomic positive assertions are like OP_ONCE, except that in addition + the subject pointer must be put back to where it was at the start of the + assertion. */ + case OP_ASSERT: case OP_ASSERTBACK: if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr; @@ -5640,7 +5657,11 @@ fprintf(stderr, "++ op=%d\n", *Fecode); case OP_EOD: if (Feptr < mb->end_subject) RRETURN(MATCH_NOMATCH); - SCHECK_PARTIAL(); + if (mb->partial != 0) + { + mb->hitend = TRUE; + if (mb->partial > 1) return PCRE2_ERROR_PARTIAL; + } Fecode++; break; @@ -5665,7 +5686,11 @@ fprintf(stderr, "++ op=%d\n", *Fecode); /* Either at end of string or \n before end. */ - SCHECK_PARTIAL(); + if (mb->partial != 0) + { + mb->hitend = TRUE; + if (mb->partial > 1) return PCRE2_ERROR_PARTIAL; + } Fecode++; break; @@ -5743,7 +5768,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode); case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: - if (Feptr == mb->start_subject) prev_is_word = FALSE; else + if (Feptr == mb->check_subject) prev_is_word = FALSE; else { PCRE2_SPTR lastptr = Feptr - 1; #ifdef SUPPORT_UNICODE @@ -5946,6 +5971,7 @@ in rrc. */ #define LBL(val) case val: goto L_RM##val; RETURN_SWITCH: +if (Feptr > mb->last_used_ptr) mb->last_used_ptr = Feptr; if (Frdepth == 0) return rrc; /* Exit from the top level */ F = (heapframe *)((char *)F - Fback_frame); /* Backtrack */ mb->cb->callout_flags |= PCRE2_CALLOUT_BACKTRACK; /* Note for callouts */ @@ -5999,9 +6025,9 @@ Arguments: Returns: > 0 => success; value is the number of ovector pairs filled = 0 => success, but ovector is not big enough - -1 => failed to match (PCRE2_ERROR_NOMATCH) - -2 => partial match (PCRE2_ERROR_PARTIAL) - < -2 => some kind of unexpected problem + = -1 => failed to match (PCRE2_ERROR_NOMATCH) + = -2 => partial match (PCRE2_ERROR_PARTIAL) + < -2 => some kind of unexpected problem */ PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION @@ -6014,7 +6040,6 @@ 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; @@ -6022,6 +6047,11 @@ BOOL has_req_cu = FALSE; BOOL startline; BOOL utf; +#if PCRE2_CODE_UNIT_WIDTH == 8 +BOOL memchr_not_found_first_cu = FALSE; +BOOL memchr_not_found_first_cu2 = FALSE; +#endif + PCRE2_UCHAR first_cu = 0; PCRE2_UCHAR first_cu2 = 0; PCRE2_UCHAR req_cu = 0; @@ -6029,10 +6059,23 @@ PCRE2_UCHAR req_cu2 = 0; PCRE2_SPTR bumpalong_limit; PCRE2_SPTR end_subject; +PCRE2_SPTR true_end_subject; PCRE2_SPTR start_match = subject + start_offset; PCRE2_SPTR req_cu_ptr = start_match - 1; -PCRE2_SPTR start_partial = NULL; -PCRE2_SPTR match_partial = NULL; +PCRE2_SPTR start_partial; +PCRE2_SPTR match_partial; + +#ifdef SUPPORT_JIT +BOOL use_jit; +#endif + +#ifdef SUPPORT_UNICODE +BOOL allow_invalid; +uint32_t fragment_options = 0; +#ifdef SUPPORT_JIT +BOOL jit_checked_utf = FALSE; +#endif +#endif PCRE2_SIZE frame_size; @@ -6059,7 +6102,7 @@ if (length == PCRE2_ZERO_TERMINATED) length = PRIV(strlen)(subject); was_zero_terminated = 1; } -end_subject = subject + length; +true_end_subject = end_subject = subject + length; /* Plausibility checks */ @@ -6095,12 +6138,24 @@ options |= (re->flags & FF) / ((FF & (~FF+1)) / (OO & (~OO+1))); #undef FF #undef OO -/* These two settings are used in the code for checking a UTF string that -follows immediately afterwards. Other values in the mb block are used only -during interpretive processing, not when the JIT support is in use, so they are -set up later. */ +/* If the pattern was successfully studied with JIT support, we will 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. */ + +#ifdef SUPPORT_JIT +use_jit = (re->executable_jit != NULL && + (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0); +#endif + +/* Initialize UTF parameters. */ utf = (re->overall_options & PCRE2_UTF) != 0; +#ifdef SUPPORT_UNICODE +allow_invalid = (re->overall_options & PCRE2_MATCH_INVALID_UTF) != 0; +#endif + +/* Convert the partial matching flags into an integer. */ + mb->partial = ((options & PCRE2_PARTIAL_HARD) != 0)? 2 : ((options & PCRE2_PARTIAL_SOFT) != 0)? 1 : 0; @@ -6111,88 +6166,107 @@ if (mb->partial != 0 && ((re->overall_options | options) & PCRE2_ENDANCHORED) != 0) return PCRE2_ERROR_BADOPTION; -/* Check a UTF string for validity if required. For 8-bit and 16-bit strings, -we must also check that a starting offset does not point into the middle of a -multiunit character. We check only the portion of the subject that is going to -be inspected during matching - from the offset minus the maximum back reference -to the given length. This saves time when a small part of a large subject is -being matched by the use of a starting offset. Note that the maximum lookbehind -is a number of characters, not code units. */ +/* It is an error to set an offset limit without setting the flag at compile +time. */ -#ifdef SUPPORT_UNICODE -if (utf && (options & PCRE2_NO_UTF_CHECK) == 0) +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) { - PCRE2_SPTR check_subject = start_match; /* start_match includes offset */ + match_data->memctl.free((void *)match_data->subject, + match_data->memctl.memory_data); + match_data->flags &= ~PCRE2_MD_COPIED_SUBJECT; + } +match_data->subject = NULL; + +/* Zero the error offset in case the first code unit is invalid UTF. */ + +match_data->startchar = 0; + + +/* ============================= JIT matching ============================== */ + +/* Prepare for JIT matching. Check a UTF string for validity unless no check is +requested or invalid UTF can be handled. We check only the portion of the +subject that might be be inspected during matching - from the offset minus the +maximum lookbehind to the given length. This saves time when a small part of a +large subject is being matched by the use of a starting offset. Note that the +maximum lookbehind is a number of characters, not code units. */ - if (start_offset > 0) +#ifdef SUPPORT_JIT +if (use_jit) + { +#ifdef SUPPORT_UNICODE + if (utf && (options & PCRE2_NO_UTF_CHECK) == 0 && !allow_invalid) { #if PCRE2_CODE_UNIT_WIDTH != 32 unsigned int i; +#endif + + /* For 8-bit and 16-bit UTF, check that the first code unit is a valid + character start. */ + +#if PCRE2_CODE_UNIT_WIDTH != 32 if (start_match < end_subject && NOT_FIRSTCU(*start_match)) - return PCRE2_ERROR_BADUTFOFFSET; - for (i = re->max_lookbehind; i > 0 && check_subject > subject; i--) { - check_subject--; - while (check_subject > subject && + if (start_offset > 0) return PCRE2_ERROR_BADUTFOFFSET; +#if PCRE2_CODE_UNIT_WIDTH == 8 + return PCRE2_ERROR_UTF8_ERR20; /* Isolated 0x80 byte */ +#else + return PCRE2_ERROR_UTF16_ERR3; /* Isolated low surrogate */ +#endif + } +#endif /* WIDTH != 32 */ + + /* Move back by the maximum lookbehind, just in case it happens at the very + start of matching. */ + +#if PCRE2_CODE_UNIT_WIDTH != 32 + for (i = re->max_lookbehind; i > 0 && start_match > subject; i--) + { + start_match--; + while (start_match > subject && #if PCRE2_CODE_UNIT_WIDTH == 8 - (*check_subject & 0xc0) == 0x80) + (*start_match & 0xc0) == 0x80) #else /* 16-bit */ - (*check_subject & 0xfc00) == 0xdc00) -#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */ - check_subject--; + (*start_match & 0xfc00) == 0xdc00) +#endif + start_match--; } -#else +#else /* PCRE2_CODE_UNIT_WIDTH != 32 */ + /* In the 32-bit library, one code unit equals one character. However, we cannot just subtract the lookbehind and then compare pointers, because a very large lookbehind could create an invalid pointer. */ if (start_offset >= re->max_lookbehind) - check_subject -= re->max_lookbehind; + start_match -= re->max_lookbehind; else - check_subject = subject; + start_match = subject; #endif /* PCRE2_CODE_UNIT_WIDTH != 32 */ - } - /* Validate the relevant portion of the subject. After an error, adjust the - offset to be an absolute offset in the whole string. */ + /* Validate the relevant portion of the subject. Adjust the offset of an + invalid code point to be an absolute offset in the whole string. */ - match_data->rc = PRIV(valid_utf)(check_subject, - length - (check_subject - subject), &(match_data->startchar)); - if (match_data->rc != 0) - { - match_data->startchar += check_subject - subject; - return match_data->rc; + match_data->rc = PRIV(valid_utf)(start_match, + length - (start_match - subject), &(match_data->startchar)); + if (match_data->rc != 0) + { + match_data->startchar += start_match - subject; + return match_data->rc; + } + jit_checked_utf = TRUE; } - } #endif /* SUPPORT_UNICODE */ -/* It is an error to set an offset limit without setting the flag at compile -time. */ - -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 JIT returns BADOPTION, which means that the selected complete or + partial matching mode was not compiled, fall through to the interpreter. */ -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 -an unsupported option is set or if JIT returns BADOPTION (which means that the -selected normal or partial matching mode was not compiled). */ - -#ifdef SUPPORT_JIT -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) @@ -6209,10 +6283,152 @@ if (re->executable_jit != NULL && (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0) return rc; } } +#endif /* SUPPORT_JIT */ + +/* ========================= End of JIT matching ========================== */ + + +/* Proceed with non-JIT matching. The default is to allow lookbehinds to the +start of the subject. A UTF check when there is a non-zero offset may change +this. */ + +mb->check_subject = subject; + +/* If a UTF subject string was not checked for validity in the JIT code above, +check it here, and handle support for invalid UTF strings. The check above +happens only when invalid UTF is not supported and PCRE2_NO_CHECK_UTF is unset. +If we get here in those circumstances, it means the subject string is valid, +but for some reason JIT matching was not successful. There is no need to check +the subject again. + +We check only the portion of the subject that might be be inspected during +matching - from the offset minus the maximum lookbehind to the given length. +This saves time when a small part of a large subject is being matched by the +use of a starting offset. Note that the maximum lookbehind is a number of +characters, not code units. + +Note also that support for invalid UTF forces a check, overriding the setting +of PCRE2_NO_CHECK_UTF. */ + +#ifdef SUPPORT_UNICODE +if (utf && +#ifdef SUPPORT_JIT + !jit_checked_utf && +#endif + ((options & PCRE2_NO_UTF_CHECK) == 0 || allow_invalid)) + { +#if PCRE2_CODE_UNIT_WIDTH != 32 + BOOL skipped_bad_start = FALSE; +#endif + + /* For 8-bit and 16-bit UTF, check that the first code unit is a valid + character start. If we are handling invalid UTF, just skip over such code + units. Otherwise, give an appropriate error. */ + +#if PCRE2_CODE_UNIT_WIDTH != 32 + if (allow_invalid) + { + while (start_match < end_subject && NOT_FIRSTCU(*start_match)) + { + start_match++; + skipped_bad_start = TRUE; + } + } + else if (start_match < end_subject && NOT_FIRSTCU(*start_match)) + { + if (start_offset > 0) return PCRE2_ERROR_BADUTFOFFSET; +#if PCRE2_CODE_UNIT_WIDTH == 8 + return PCRE2_ERROR_UTF8_ERR20; /* Isolated 0x80 byte */ +#else + return PCRE2_ERROR_UTF16_ERR3; /* Isolated low surrogate */ +#endif + } +#endif /* WIDTH != 32 */ + + /* The mb->check_subject field points to the start of UTF checking; + lookbehinds can go back no further than this. */ + + mb->check_subject = start_match; + + /* Move back by the maximum lookbehind, just in case it happens at the very + start of matching, but don't do this if we skipped bad 8-bit or 16-bit code + units above. */ + +#if PCRE2_CODE_UNIT_WIDTH != 32 + if (!skipped_bad_start) + { + unsigned int i; + for (i = re->max_lookbehind; i > 0 && mb->check_subject > subject; i--) + { + mb->check_subject--; + while (mb->check_subject > subject && +#if PCRE2_CODE_UNIT_WIDTH == 8 + (*mb->check_subject & 0xc0) == 0x80) +#else /* 16-bit */ + (*mb->check_subject & 0xfc00) == 0xdc00) +#endif + mb->check_subject--; + } + } +#else /* PCRE2_CODE_UNIT_WIDTH != 32 */ + + /* In the 32-bit library, one code unit equals one character. However, + we cannot just subtract the lookbehind and then compare pointers, because + a very large lookbehind could create an invalid pointer. */ + + if (start_offset >= re->max_lookbehind) + mb->check_subject -= re->max_lookbehind; + else + mb->check_subject = subject; +#endif /* PCRE2_CODE_UNIT_WIDTH != 32 */ + + /* Validate the relevant portion of the subject. There's a loop in case we + encounter bad UTF in the characters preceding start_match which we are + scanning because of a lookbehind. */ + + for (;;) + { + match_data->rc = PRIV(valid_utf)(mb->check_subject, + length - (mb->check_subject - subject), &(match_data->startchar)); + + if (match_data->rc == 0) break; /* Valid UTF string */ + + /* Invalid UTF string. Adjust the offset to be an absolute offset in the + whole string. If we are handling invalid UTF strings, set end_subject to + stop before the bad code unit, and set the options to "not end of line". + Otherwise return the error. */ + + match_data->startchar += mb->check_subject - subject; + if (!allow_invalid || match_data->rc > 0) return match_data->rc; + end_subject = subject + match_data->startchar; + + /* If the end precedes start_match, it means there is invalid UTF in the + extra code units we reversed over because of a lookbehind. Advance past the + first bad code unit, and then skip invalid character starting code units in + 8-bit and 16-bit modes, and try again. */ + + if (end_subject < start_match) + { + mb->check_subject = end_subject + 1; +#if PCRE2_CODE_UNIT_WIDTH != 32 + while (mb->check_subject < start_match && NOT_FIRSTCU(*mb->check_subject)) + mb->check_subject++; #endif + } + + /* Otherwise, set the not end of line option, and do the match. */ + + else + { + fragment_options = PCRE2_NOTEOL; + break; + } + } + } +#endif /* SUPPORT_UNICODE */ -/* Carry on with non-JIT matching. A NULL match context means "use a default -context", but we take the memory control functions from the pattern. */ +/* A NULL match context means "use a default context", but we take the memory +control functions from the pattern. */ if (mcontext == NULL) { @@ -6224,8 +6440,8 @@ else mb->memctl = mcontext->memctl; anchored = ((re->overall_options | options) & PCRE2_ANCHORED) != 0; firstline = (re->overall_options & PCRE2_FIRSTLINE) != 0; startline = (re->flags & PCRE2_STARTLINE) != 0; -bumpalong_limit = (mcontext->offset_limit == PCRE2_UNSET)? - end_subject : subject + mcontext->offset_limit; +bumpalong_limit = (mcontext->offset_limit == PCRE2_UNSET)? + true_end_subject : subject + mcontext->offset_limit; /* Initialize and set up the fixed fields in the callout block, with a pointer in the match block. */ @@ -6236,7 +6452,8 @@ cb.subject = subject; cb.subject_length = (PCRE2_SIZE)(end_subject - subject); cb.callout_flags = 0; -/* Fill in the remaining fields in the match block. */ +/* Fill in the remaining fields in the match block, except for moptions, which +gets set later. */ mb->callout = mcontext->callout; mb->callout_data = mcontext->callout_data; @@ -6245,13 +6462,11 @@ mb->start_subject = subject; mb->start_offset = start_offset; mb->end_subject = end_subject; mb->hasthen = (re->flags & PCRE2_HASTHEN) != 0; - -mb->moptions = options; /* Match options */ -mb->poptions = re->overall_options; /* Pattern options */ - +mb->allowemptypartial = (re->max_lookbehind > 0) || + (re->flags & PCRE2_MATCH_EMPTY) != 0; +mb->poptions = re->overall_options; /* Pattern options */ mb->ignore_skip_arg = 0; -mb->mark = mb->nomatch_mark = NULL; /* In case never set */ -mb->hitend = FALSE; +mb->mark = mb->nomatch_mark = NULL; /* In case never set */ /* The name table is needed for finding all the numbers associated with a given name, for condition testing. The code follows the name table. */ @@ -6404,6 +6619,13 @@ if ((re->flags & PCRE2_LASTSET) != 0) /* Loop for handling unanchored repeated matching attempts; for anchored regexs the loop runs just once. */ +#ifdef SUPPORT_UNICODE +FRAGMENT_RESTART: +#endif + +start_partial = match_partial = NULL; +mb->hitend = FALSE; + for(;;) { PCRE2_SPTR new_start_match; @@ -6473,7 +6695,10 @@ for(;;) /* Not anchored. Advance to a unique first code unit if there is one. In 8-bit mode, the use of memchr() gives a big speed up, even though we have to call it twice in caseless mode, in order to find the earliest occurrence - of the character in either of its cases. */ + of the character in either of its cases. If a call to memchr() that + searches the rest of the subject fails to find one case, remember that in + order not to keep on repeating the search. This can make a huge difference + when the strings are very long and only one case is present. */ else { @@ -6487,11 +6712,29 @@ for(;;) (smc = UCHAR21TEST(start_match)) != first_cu && smc != first_cu2) start_match++; + #else /* 8-bit code units */ - PCRE2_SPTR pp1 = - memchr(start_match, first_cu, end_subject-start_match); - PCRE2_SPTR pp2 = - memchr(start_match, first_cu2, end_subject-start_match); + PCRE2_SPTR pp1 = NULL; + PCRE2_SPTR pp2 = NULL; + PCRE2_SIZE cu2size = end_subject - start_match; + + if (!memchr_not_found_first_cu) + { + pp1 = memchr(start_match, first_cu, end_subject - start_match); + if (pp1 == NULL) memchr_not_found_first_cu = TRUE; + else cu2size = pp1 - start_match; + } + + /* If pp1 is not NULL, we have arranged to search only as far as pp1, + to see if the other case is earlier, so we can set "not found" only + when both searches have returned NULL. */ + + if (!memchr_not_found_first_cu2) + { + pp2 = memchr(start_match, first_cu2, cu2size); + memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL); + } + if (pp1 == NULL) start_match = (pp2 == NULL)? end_subject : pp2; else @@ -6523,7 +6766,7 @@ for(;;) we also let the cycle run, because the matching string is legitimately allowed to start with the first code unit of a newline. */ - if (!mb->partial && start_match >= mb->end_subject) + if (mb->partial == 0 && start_match >= mb->end_subject) { rc = MATCH_NOMATCH; break; @@ -6582,7 +6825,7 @@ for(;;) /* See comment above in first_cu checking about the next few lines. */ - if (!mb->partial && start_match >= mb->end_subject) + if (mb->partial == 0 && start_match >= mb->end_subject) { rc = MATCH_NOMATCH; break; @@ -6596,8 +6839,10 @@ for(;;) /* The following two optimizations must be disabled for partial matching. */ - if (!mb->partial) + if (mb->partial == 0) { + PCRE2_SPTR p; + /* The minimum matching length is a lower bound; no string of that length may actually match the pattern. Although the value is, strictly, in characters, we treat it as code units to avoid spending too much time in @@ -6621,60 +6866,57 @@ for(;;) memchr() twice in the caseless case because we only need to check for the presence of the character in either case, not find the first occurrence. + The search can be skipped if the code unit was found later than the + current starting point in a previous iteration of the bumpalong loop. + HOWEVER: when the subject string is very, very long, searching to its end can take a long time, and give bad performance on quite ordinary - patterns. This showed up when somebody was matching something like - /^\d+C/ on a 32-megabyte string... so we don't do this when the string is - sufficiently long. */ + anchored patterns. This showed up when somebody was matching something + like /^\d+C/ on a 32-megabyte string... so we don't do this when the + string is sufficiently long, but it's worth searching a lot more for + unanchored patterns. */ - if (has_req_cu && end_subject - start_match < REQ_CU_MAX) + p = start_match + (has_first_cu? 1:0); + if (has_req_cu && p > req_cu_ptr) { - PCRE2_SPTR p = start_match + (has_first_cu? 1:0); - - /* We don't need to repeat the search if we haven't yet reached the - place we found it last time round the bumpalong loop. */ + PCRE2_SIZE check_length = end_subject - start_match; - if (p > req_cu_ptr) + if (check_length < REQ_CU_MAX || + (!anchored && check_length < REQ_CU_MAX * 1000)) { - if (p < end_subject) + if (req_cu != req_cu2) /* Caseless */ { - if (req_cu != req_cu2) /* Caseless */ - { #if PCRE2_CODE_UNIT_WIDTH != 8 - do - { - uint32_t pp = UCHAR21INCTEST(p); - if (pp == req_cu || pp == req_cu2) { p--; break; } - } - while (p < end_subject); - + while (p < end_subject) + { + uint32_t pp = UCHAR21INCTEST(p); + if (pp == req_cu || pp == req_cu2) { p--; break; } + } #else /* 8-bit code units */ - PCRE2_SPTR pp = p; - p = memchr(pp, req_cu, end_subject - pp); - if (p == NULL) - { - p = memchr(pp, req_cu2, end_subject - pp); - if (p == NULL) p = end_subject; - } -#endif /* PCRE2_CODE_UNIT_WIDTH != 8 */ + PCRE2_SPTR pp = p; + p = memchr(pp, req_cu, end_subject - pp); + if (p == NULL) + { + p = memchr(pp, req_cu2, end_subject - pp); + if (p == NULL) p = end_subject; } +#endif /* PCRE2_CODE_UNIT_WIDTH != 8 */ + } - /* The caseful case */ + /* The caseful case */ - else - { + else + { #if PCRE2_CODE_UNIT_WIDTH != 8 - do - { - if (UCHAR21INCTEST(p) == req_cu) { p--; break; } - } - while (p < end_subject); + while (p < end_subject) + { + if (UCHAR21INCTEST(p) == req_cu) { p--; break; } + } #else /* 8-bit code units */ - p = memchr(p, req_cu, end_subject - p); - if (p == NULL) p = end_subject; + p = memchr(p, req_cu, end_subject - p); + if (p == NULL) p = end_subject; #endif - } } /* If we can't find the required code unit, break the bumpalong loop, @@ -6714,6 +6956,11 @@ for(;;) mb->start_used_ptr = start_match; mb->last_used_ptr = start_match; +#ifdef SUPPORT_UNICODE + mb->moptions = options | fragment_options; +#else + mb->moptions = options; +#endif mb->match_call_count = 0; mb->end_offset_top = 0; mb->skip_arg_count = 0; @@ -6839,6 +7086,68 @@ for(;;) ENDLOOP: +/* If end_subject != true_end_subject, it means we are handling invalid UTF, +and have just processed a non-terminal fragment. If this resulted in no match +or a partial match we must carry on to the next fragment (a partial match is +returned to the caller only at the very end of the subject). A loop is used to +avoid trying to match against empty fragments; if the pattern can match an +empty string it would have done so already. */ + +#ifdef SUPPORT_UNICODE +if (utf && end_subject != true_end_subject && + (rc == MATCH_NOMATCH || rc == PCRE2_ERROR_PARTIAL)) + { + for (;;) + { + /* Advance past the first bad code unit, and then skip invalid character + starting code units in 8-bit and 16-bit modes. */ + + start_match = end_subject + 1; +#if PCRE2_CODE_UNIT_WIDTH != 32 + while (start_match < true_end_subject && NOT_FIRSTCU(*start_match)) + start_match++; +#endif + + /* If we have hit the end of the subject, there isn't another non-empty + fragment, so give up. */ + + if (start_match >= true_end_subject) + { + rc = MATCH_NOMATCH; /* In case it was partial */ + break; + } + + /* Check the rest of the subject */ + + mb->check_subject = start_match; + rc = PRIV(valid_utf)(start_match, length - (start_match - subject), + &(match_data->startchar)); + + /* The rest of the subject is valid UTF. */ + + if (rc == 0) + { + mb->end_subject = end_subject = true_end_subject; + fragment_options = PCRE2_NOTBOL; + goto FRAGMENT_RESTART; + } + + /* A subsequent UTF error has been found; if the next fragment is + non-empty, set up to process it. Otherwise, let the loop advance. */ + + else if (rc < 0) + { + mb->end_subject = end_subject = start_match + match_data->startchar; + if (end_subject > start_match) + { + fragment_options = PCRE2_NOTBOL|PCRE2_NOTEOL; + goto FRAGMENT_RESTART; + } + } + } + } +#endif /* SUPPORT_UNICODE */ + /* Release an enlarged frame vector that is on the heap. */ if (mb->match_frames != mb->stack_frames) diff --git a/thirdparty/pcre2/src/pcre2_match_data.c b/thirdparty/pcre2/src/pcre2_match_data.c index ccc5f6740e..53e4698707 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-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 @@ -150,4 +150,17 @@ pcre2_get_startchar(pcre2_match_data *match_data) return match_data->startchar; } + + +/************************************************* +* Get size of match data block * +*************************************************/ + +PCRE2_EXP_DEFN PCRE2_SIZE PCRE2_CALL_CONVENTION +pcre2_get_match_data_size(pcre2_match_data *match_data) +{ +return offsetof(pcre2_match_data, ovector) + + 2 * (match_data->oveccount) * sizeof(PCRE2_SIZE); +} + /* End of pcre2_match_data.c */ diff --git a/thirdparty/pcre2/src/pcre2_study.c b/thirdparty/pcre2/src/pcre2_study.c index e883c2eb4c..2883868618 100644 --- a/thirdparty/pcre2/src/pcre2_study.c +++ b/thirdparty/pcre2/src/pcre2_study.c @@ -88,11 +88,13 @@ Arguments: countptr pointer to call count (to catch over complexity) backref_cache vector for caching back references. +This function is no longer called when the pattern contains (*ACCEPT); however, +the old code for returning -1 is retained, just in case. + Returns: the minimum length -1 \C in UTF-8 mode or (*ACCEPT) or pattern too complicated - or back reference to duplicate name/number -2 internal error (missing capturing bracket) -3 internal error (opcode not listed) */ @@ -103,6 +105,7 @@ find_minlength(const pcre2_real_code *re, PCRE2_SPTR code, int *backref_cache) { int length = -1; +int branchlength = 0; int prev_cap_recno = -1; int prev_cap_d = 0; int prev_recurse_recno = -1; @@ -110,9 +113,9 @@ int prev_recurse_d = 0; uint32_t once_fudge = 0; BOOL had_recurse = FALSE; BOOL dupcapused = (re->flags & PCRE2_DUPCAPUSED) != 0; -recurse_check this_recurse; -int branchlength = 0; +PCRE2_SPTR nextbranch = code + GET(code, 1); PCRE2_UCHAR *cc = (PCRE2_UCHAR *)code + 1 + LINK_SIZE; +recurse_check this_recurse; /* If this is a "could be empty" group, its minimum length is 0. */ @@ -128,16 +131,20 @@ if ((*countptr)++ > 1000) return -1; /* Scan along the opcodes for this branch. If we get to the end of the branch, check the length against that of the other branches. If the accumulated length -passes 16-bits, stop. */ +passes 16-bits, reset to that value and skip the rest of the branch. */ for (;;) { int d, min, recno; - PCRE2_UCHAR *cs, *ce; - PCRE2_UCHAR op = *cc; + PCRE2_UCHAR op, *cs, *ce; - if (branchlength >= UINT16_MAX) return UINT16_MAX; + if (branchlength >= UINT16_MAX) + { + branchlength = UINT16_MAX; + cc = (PCRE2_UCHAR *)nextbranch; + } + op = *cc; switch (op) { case OP_COND: @@ -206,7 +213,9 @@ for (;;) cc += 1 + LINK_SIZE; break; - /* ACCEPT makes things far too complicated; we have to give up. */ + /* ACCEPT makes things far too complicated; we have to give up. In fact, + from 10.34 onwards, if a pattern contains (*ACCEPT), this function is not + used. However, leave the code in place, just in case. */ case OP_ACCEPT: case OP_ASSERT_ACCEPT: @@ -214,9 +223,9 @@ for (;;) /* Reached end of a branch; if it's a ket it is the end of a nested call. If it's ALT it is an alternation in a nested call. If it is END it's - the end of the outer call. All can be handled by the same code. If an - ACCEPT was previously encountered, use the length that was in force at that - time, and pass back the shortest ACCEPT length. */ + the end of the outer call. All can be handled by the same code. If the + length of any branch is zero, there is no need to scan any subsequent + branches. */ case OP_ALT: case OP_KET: @@ -226,7 +235,8 @@ for (;;) case OP_END: if (length < 0 || (!had_recurse && branchlength < length)) length = branchlength; - if (op != OP_ALT) return length; + if (op != OP_ALT || length == 0) return length; + nextbranch = cc + GET(cc, 1); cc += 1 + LINK_SIZE; branchlength = 0; had_recurse = FALSE; @@ -238,6 +248,8 @@ for (;;) case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: + case OP_ASSERT_NA: + case OP_ASSERTBACK_NA: do cc += GET(cc, 1); while (*cc == OP_ALT); /* Fall through */ @@ -451,15 +463,17 @@ for (;;) If PCRE2_MATCH_UNSET_BACKREF is set, a backreference to an unset bracket matches an empty string (by default it causes a matching failure), so in - that case we must set the minimum length to zero. */ + that case we must set the minimum length to zero. + + For backreferenes, if duplicate numbers are present in the pattern we check + for a reference to a duplicate. If it is, we don't know which version will + be referenced, so we have to set the minimum length to zero. */ - /* Duplicate named pattern back reference. We cannot reliably find a length - for this if duplicate numbers are present in the pattern. */ + /* Duplicate named pattern back reference. */ case OP_DNREF: case OP_DNREFI: - if (dupcapused) return -1; - if ((re->overall_options & PCRE2_MATCH_UNSET_BACKREF) == 0) + if (!dupcapused && (re->overall_options & PCRE2_MATCH_UNSET_BACKREF) == 0) { int count = GET2(cc, 1+IMM2_SIZE); PCRE2_UCHAR *slot = @@ -482,28 +496,32 @@ for (;;) ce = cs = (PCRE2_UCHAR *)PRIV(find_bracket)(startcode, utf, recno); if (cs == NULL) return -2; do ce += GET(ce, 1); while (*ce == OP_ALT); - if (cc > cs && cc < ce) /* Simple recursion */ - { - dd = 0; - had_recurse = TRUE; - } - else + + dd = 0; + if (!dupcapused || + (PCRE2_UCHAR *)PRIV(find_bracket)(ce, utf, recno) == NULL) { - recurse_check *r = recurses; - for (r = recurses; r != NULL; r = r->prev) - if (r->group == cs) break; - if (r != NULL) /* Mutual recursion */ + if (cc > cs && cc < ce) /* Simple recursion */ { - dd = 0; had_recurse = TRUE; } else { - this_recurse.prev = recurses; - this_recurse.group = cs; - dd = find_minlength(re, cs, startcode, utf, &this_recurse, - countptr, backref_cache); - if (dd < 0) return dd; + recurse_check *r = recurses; + for (r = recurses; r != NULL; r = r->prev) + if (r->group == cs) break; + if (r != NULL) /* Mutual recursion */ + { + had_recurse = TRUE; + } + else + { + this_recurse.prev = recurses; /* No recursion */ + this_recurse.group = cs; + dd = find_minlength(re, cs, startcode, utf, &this_recurse, + countptr, backref_cache); + if (dd < 0) return dd; + } } } @@ -521,48 +539,51 @@ for (;;) cc += 1 + 2*IMM2_SIZE; goto REPEAT_BACK_REFERENCE; - /* Single back reference. We cannot find a length for this if duplicate - numbers are present in the pattern. */ + /* Single back reference by number. References by name are converted to by + number when there is no duplication. */ case OP_REF: case OP_REFI: - if (dupcapused) return -1; recno = GET2(cc, 1); if (recno <= backref_cache[0] && backref_cache[recno] >= 0) d = backref_cache[recno]; else { int i; + d = 0; + if ((re->overall_options & PCRE2_MATCH_UNSET_BACKREF) == 0) { ce = cs = (PCRE2_UCHAR *)PRIV(find_bracket)(startcode, utf, recno); if (cs == NULL) return -2; do ce += GET(ce, 1); while (*ce == OP_ALT); - if (cc > cs && cc < ce) /* Simple recursion */ - { - d = 0; - had_recurse = TRUE; - } - else + + if (!dupcapused || + (PCRE2_UCHAR *)PRIV(find_bracket)(ce, utf, recno) == NULL) { - recurse_check *r = recurses; - for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break; - if (r != NULL) /* Mutual recursion */ + if (cc > cs && cc < ce) /* Simple recursion */ { - d = 0; had_recurse = TRUE; } else { - this_recurse.prev = recurses; - this_recurse.group = cs; - d = find_minlength(re, cs, startcode, utf, &this_recurse, countptr, - backref_cache); - if (d < 0) return d; + recurse_check *r = recurses; + for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break; + if (r != NULL) /* Mutual recursion */ + { + had_recurse = TRUE; + } + else /* No recursion */ + { + this_recurse.prev = recurses; + this_recurse.group = cs; + d = find_minlength(re, cs, startcode, utf, &this_recurse, countptr, + backref_cache); + if (d < 0) return d; + } } } } - else d = 0; backref_cache[recno] = d; for (i = backref_cache[0] + 1; i < recno; i++) backref_cache[i] = -1; @@ -888,7 +909,7 @@ if (table_limit != 32) for (c = 24; c < 32; c++) re->start_bitmap[c] = 0xff; /************************************************* -* Create bitmap of starting bytes * +* Create bitmap of starting code units * *************************************************/ /* This function scans a compiled unanchored expression recursively and @@ -938,6 +959,9 @@ do { int rc; uint8_t *classmap = NULL; +#ifdef SUPPORT_WIDE_CHARS + PCRE2_UCHAR xclassflags; +#endif switch(*tcode) { @@ -1078,6 +1102,7 @@ do case OP_ONCE: case OP_SCRIPT_RUN: case OP_ASSERT: + case OP_ASSERT_NA: rc = set_start_bits(re, tcode, utf); if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc; if (rc == SSB_DONE) try_next = FALSE; else @@ -1120,6 +1145,7 @@ do case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: + case OP_ASSERTBACK_NA: do tcode += GET(tcode, 1); while (*tcode == OP_ALT); tcode += 1 + LINK_SIZE; break; @@ -1444,20 +1470,59 @@ do negative XCLASS without a map, give up. If there are no property checks, there must be wide characters on the XCLASS list, because otherwise an XCLASS would not have been created. This means that code points >= 255 - are always potential starters. */ + are potential starters. In the UTF-8 case we can scan them and set bits + for the relevant leading bytes. */ #ifdef SUPPORT_WIDE_CHARS case OP_XCLASS: - if ((tcode[1 + LINK_SIZE] & XCL_HASPROP) != 0 || - (tcode[1 + LINK_SIZE] & (XCL_MAP|XCL_NOT)) == XCL_NOT) + xclassflags = tcode[1 + LINK_SIZE]; + if ((xclassflags & XCL_HASPROP) != 0 || + (xclassflags & (XCL_MAP|XCL_NOT)) == XCL_NOT) return SSB_FAIL; /* We have a positive XCLASS or a negative one without a map. Set up the map pointer if there is one, and fall through. */ - classmap = ((tcode[1 + LINK_SIZE] & XCL_MAP) == 0)? NULL : + classmap = ((xclassflags & XCL_MAP) == 0)? NULL : (uint8_t *)(tcode + 1 + LINK_SIZE + 1); -#endif + + /* In UTF-8 mode, scan the character list and set bits for leading bytes, + then jump to handle the map. */ + +#if PCRE2_CODE_UNIT_WIDTH == 8 + if (utf && (xclassflags & XCL_NOT) == 0) + { + PCRE2_UCHAR b, e; + PCRE2_SPTR p = tcode + 1 + LINK_SIZE + 1 + ((classmap == NULL)? 0:32); + tcode += GET(tcode, 1); + + for (;;) switch (*p++) + { + case XCL_SINGLE: + b = *p++; + while ((*p & 0xc0) == 0x80) p++; + re->start_bitmap[b/8] |= (1u << (b&7)); + break; + + case XCL_RANGE: + b = *p++; + while ((*p & 0xc0) == 0x80) p++; + e = *p++; + while ((*p & 0xc0) == 0x80) p++; + for (; b <= e; b++) + re->start_bitmap[b/8] |= (1u << (b&7)); + break; + + case XCL_END: + goto HANDLE_CLASSMAP; + + default: + return SSB_UNKNOWN; /* Internal error, should not occur */ + } + } +#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */ +#endif /* SUPPORT_WIDE_CHARS */ + /* It seems that the fall through comment must be outside the #ifdef if it is to avoid the gcc compiler warning. */ @@ -1499,6 +1564,9 @@ do greater than 127. In fact, there are only two possible starting bytes for characters in the range 128 - 255. */ +#if defined SUPPORT_WIDE_CHARS && PCRE2_CODE_UNIT_WIDTH == 8 + HANDLE_CLASSMAP: +#endif if (classmap != NULL) { #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 @@ -1569,7 +1637,9 @@ return yield; /* This function is handed a compiled expression that it must study to produce information that will speed up the matching. -Argument: points to the compiled expression +Argument: + re points to the compiled expression + Returns: 0 normally; non-zero should never normally occur 1 unknown opcode in set_start_bits 2 missing capturing bracket @@ -1579,7 +1649,6 @@ Returns: 0 normally; non-zero should never normally occur int PRIV(study)(pcre2_real_code *re) { -int min; int count = 0; PCRE2_UCHAR *code; BOOL utf = (re->overall_options & PCRE2_UTF) != 0; @@ -1597,25 +1666,121 @@ if ((re->flags & (PCRE2_FIRSTSET|PCRE2_STARTLINE)) == 0) { int rc = set_start_bits(re, code, utf); if (rc == SSB_UNKNOWN) return 1; - if (rc == SSB_DONE) re->flags |= PCRE2_FIRSTMAPSET; + + /* If a list of starting code units was set up, scan the list to see if only + one or two were listed. Having only one listed is rare because usually a + single starting code unit will have been recognized and PCRE2_FIRSTSET set. + If two are listed, see if they are caseless versions of the same character; + if so we can replace the list with a caseless first code unit. This gives + better performance and is plausibly worth doing for patterns such as [Ww]ord + or (word|WORD). */ + + if (rc == SSB_DONE) + { + int i; + int a = -1; + int b = -1; + uint8_t *p = re->start_bitmap; + uint32_t flags = PCRE2_FIRSTMAPSET; + + for (i = 0; i < 256; p++, i += 8) + { + uint8_t x = *p; + if (x != 0) + { + int c; + uint8_t y = x & (~x + 1); /* Least significant bit */ + if (y != x) goto DONE; /* More than one bit set */ + + /* In the 16-bit and 32-bit libraries, the bit for 0xff means "0xff and + all wide characters", so we cannot use it here. */ + +#if PCRE2_CODE_UNIT_WIDTH != 8 + if (i == 248 && x == 0x80) goto DONE; +#endif + + /* Compute the character value */ + + c = i; + switch (x) + { + case 1: break; + case 2: c += 1; break; case 4: c += 2; break; + case 8: c += 3; break; case 16: c += 4; break; + case 32: c += 5; break; case 64: c += 6; break; + case 128: c += 7; break; + } + + /* c contains the code unit value, in the range 0-255. In 8-bit UTF + mode, only values < 128 can be used. */ + +#if PCRE2_CODE_UNIT_WIDTH == 8 + if (c > 127) goto DONE; +#endif + if (a < 0) a = c; /* First one found */ + else if (b < 0) /* Second one found */ + { + int d = TABLE_GET((unsigned int)c, re->tables + fcc_offset, c); + +#ifdef SUPPORT_UNICODE +#if PCRE2_CODE_UNIT_WIDTH == 8 + if (utf && UCD_CASESET(c) != 0) goto DONE; /* Multiple case set */ +#else /* 16-bit or 32-bit */ + if (UCD_CASESET(c) != 0) goto DONE; /* Multiple case set */ + if (utf && c > 127) d = UCD_OTHERCASE(c); +#endif /* Code width */ +#endif /* SUPPORT_UNICODE */ + + if (d != a) goto DONE; /* Not other case of a */ + b = c; + } + else goto DONE; /* More than two characters found */ + } + } + + /* Replace the start code unit bits with a first code unit, but only if it + is not the same as a required later code unit. This is because a search for + a required code unit starts after an explicit first code unit, but at a + code unit found from the bitmap. Patterns such as /a*a/ don't work + if both the start unit and required unit are the same. */ + + if (a >= 0 && + ( + (re->flags & PCRE2_LASTSET) == 0 || + ( + re->last_codeunit != (uint32_t)a && + (b < 0 || re->last_codeunit != (uint32_t)b) + ) + )) + { + re->first_codeunit = a; + flags = PCRE2_FIRSTSET; + if (b >= 0) flags |= PCRE2_FIRSTCASELESS; + } + + DONE: + re->flags |= flags; + } } /* Find the minimum length of subject string. If the pattern can match an empty -string, the minimum length is already known. If there are more back references -than the size of the vector we are going to cache them in, do nothing. A -pattern that complicated will probably take a long time to analyze and may in -any case turn out to be too complicated. Note that back reference minima are -held as 16-bit numbers. */ - -if ((re->flags & PCRE2_MATCH_EMPTY) == 0 && +string, the minimum length is already known. If the pattern contains (*ACCEPT) +all bets are off, and we don't even try to find a minimum length. If there are +more back references than the size of the vector we are going to cache them in, +do nothing. A pattern that complicated will probably take a long time to +analyze and may in any case turn out to be too complicated. Note that back +reference minima are held as 16-bit numbers. */ + +if ((re->flags & (PCRE2_MATCH_EMPTY|PCRE2_HASACCEPT)) == 0 && re->top_backref <= MAX_CACHE_BACKREF) { + int min; int backref_cache[MAX_CACHE_BACKREF+1]; backref_cache[0] = 0; /* Highest one that is set */ min = find_minlength(re, code, code, utf, NULL, &count, backref_cache); switch(min) { - case -1: /* \C in UTF mode or (*ACCEPT) or over-complex regex */ + case -1: /* \C in UTF mode or over-complex regex */ break; /* Leave minlength unchanged (will be zero) */ case -2: @@ -1625,8 +1790,7 @@ if ((re->flags & PCRE2_MATCH_EMPTY) == 0 && return 3; /* unrecognized opcode */ default: - if (min > UINT16_MAX) min = UINT16_MAX; - re->minlength = min; + re->minlength = (min > UINT16_MAX)? UINT16_MAX : min; break; } } diff --git a/thirdparty/pcre2/src/pcre2_tables.c b/thirdparty/pcre2/src/pcre2_tables.c index 84019361fc..25531d98c6 100644 --- a/thirdparty/pcre2/src/pcre2_tables.c +++ b/thirdparty/pcre2/src/pcre2_tables.c @@ -279,6 +279,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Duployan0 STR_D STR_u STR_p STR_l STR_o STR_y STR_a STR_n "\0" #define STRING_Egyptian_Hieroglyphs0 STR_E STR_g STR_y STR_p STR_t STR_i STR_a STR_n STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s "\0" #define STRING_Elbasan0 STR_E STR_l STR_b STR_a STR_s STR_a STR_n "\0" +#define STRING_Elymaic0 STR_E STR_l STR_y STR_m STR_a STR_i STR_c "\0" #define STRING_Ethiopic0 STR_E STR_t STR_h STR_i STR_o STR_p STR_i STR_c "\0" #define STRING_Georgian0 STR_G STR_e STR_o STR_r STR_g STR_i STR_a STR_n "\0" #define STRING_Glagolitic0 STR_G STR_l STR_a STR_g STR_o STR_l STR_i STR_t STR_i STR_c "\0" @@ -348,6 +349,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Myanmar0 STR_M STR_y STR_a STR_n STR_m STR_a STR_r "\0" #define STRING_N0 STR_N "\0" #define STRING_Nabataean0 STR_N STR_a STR_b STR_a STR_t STR_a STR_e STR_a STR_n "\0" +#define STRING_Nandinagari0 STR_N STR_a STR_n STR_d STR_i STR_n STR_a STR_g STR_a STR_r STR_i "\0" #define STRING_Nd0 STR_N STR_d "\0" #define STRING_New_Tai_Lue0 STR_N STR_e STR_w STR_UNDERSCORE STR_T STR_a STR_i STR_UNDERSCORE STR_L STR_u STR_e "\0" #define STRING_Newa0 STR_N STR_e STR_w STR_a "\0" @@ -355,6 +357,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #define STRING_Nl0 STR_N STR_l "\0" #define STRING_No0 STR_N STR_o "\0" #define STRING_Nushu0 STR_N STR_u STR_s STR_h STR_u "\0" +#define STRING_Nyiakeng_Puachue_Hmong0 STR_N STR_y STR_i STR_a STR_k STR_e STR_n STR_g STR_UNDERSCORE STR_P STR_u STR_a STR_c STR_h STR_u STR_e STR_UNDERSCORE STR_H STR_m STR_o STR_n STR_g "\0" #define STRING_Ogham0 STR_O STR_g STR_h STR_a STR_m "\0" #define STRING_Ol_Chiki0 STR_O STR_l STR_UNDERSCORE STR_C STR_h STR_i STR_k STR_i "\0" #define STRING_Old_Hungarian0 STR_O STR_l STR_d STR_UNDERSCORE STR_H STR_u STR_n STR_g STR_a STR_r STR_i STR_a STR_n "\0" @@ -419,6 +422,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */ #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_Wancho0 STR_W STR_a STR_n STR_c STR_h STR_o "\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" #define STRING_Xps0 STR_X STR_p STR_s "\0" @@ -474,6 +478,7 @@ const char PRIV(utt_names)[] = STRING_Duployan0 STRING_Egyptian_Hieroglyphs0 STRING_Elbasan0 + STRING_Elymaic0 STRING_Ethiopic0 STRING_Georgian0 STRING_Glagolitic0 @@ -543,6 +548,7 @@ const char PRIV(utt_names)[] = STRING_Myanmar0 STRING_N0 STRING_Nabataean0 + STRING_Nandinagari0 STRING_Nd0 STRING_New_Tai_Lue0 STRING_Newa0 @@ -550,6 +556,7 @@ const char PRIV(utt_names)[] = STRING_Nl0 STRING_No0 STRING_Nushu0 + STRING_Nyiakeng_Puachue_Hmong0 STRING_Ogham0 STRING_Ol_Chiki0 STRING_Old_Hungarian0 @@ -614,6 +621,7 @@ const char PRIV(utt_names)[] = STRING_Ugaritic0 STRING_Unknown0 STRING_Vai0 + STRING_Wancho0 STRING_Warang_Citi0 STRING_Xan0 STRING_Xps0 @@ -669,158 +677,162 @@ const ucp_type_table PRIV(utt)[] = { { 299, PT_SC, ucp_Duployan }, { 308, PT_SC, ucp_Egyptian_Hieroglyphs }, { 329, PT_SC, ucp_Elbasan }, - { 337, PT_SC, ucp_Ethiopic }, - { 346, PT_SC, ucp_Georgian }, - { 355, PT_SC, ucp_Glagolitic }, - { 366, PT_SC, ucp_Gothic }, - { 373, PT_SC, ucp_Grantha }, - { 381, PT_SC, ucp_Greek }, - { 387, PT_SC, ucp_Gujarati }, - { 396, PT_SC, ucp_Gunjala_Gondi }, - { 410, PT_SC, ucp_Gurmukhi }, - { 419, PT_SC, ucp_Han }, - { 423, PT_SC, ucp_Hangul }, - { 430, PT_SC, ucp_Hanifi_Rohingya }, - { 446, PT_SC, ucp_Hanunoo }, - { 454, PT_SC, ucp_Hatran }, - { 461, PT_SC, ucp_Hebrew }, - { 468, PT_SC, ucp_Hiragana }, - { 477, PT_SC, ucp_Imperial_Aramaic }, - { 494, PT_SC, ucp_Inherited }, - { 504, PT_SC, ucp_Inscriptional_Pahlavi }, - { 526, PT_SC, ucp_Inscriptional_Parthian }, - { 549, PT_SC, ucp_Javanese }, - { 558, PT_SC, ucp_Kaithi }, - { 565, PT_SC, ucp_Kannada }, - { 573, PT_SC, ucp_Katakana }, - { 582, PT_SC, ucp_Kayah_Li }, - { 591, PT_SC, ucp_Kharoshthi }, - { 602, PT_SC, ucp_Khmer }, - { 608, PT_SC, ucp_Khojki }, - { 615, PT_SC, ucp_Khudawadi }, - { 625, PT_GC, ucp_L }, - { 627, PT_LAMP, 0 }, - { 630, PT_SC, ucp_Lao }, - { 634, PT_SC, ucp_Latin }, - { 640, PT_SC, ucp_Lepcha }, - { 647, PT_SC, ucp_Limbu }, - { 653, PT_SC, ucp_Linear_A }, - { 662, PT_SC, ucp_Linear_B }, - { 671, PT_SC, ucp_Lisu }, - { 676, PT_PC, ucp_Ll }, - { 679, PT_PC, ucp_Lm }, - { 682, PT_PC, ucp_Lo }, - { 685, PT_PC, ucp_Lt }, - { 688, PT_PC, ucp_Lu }, - { 691, PT_SC, ucp_Lycian }, - { 698, PT_SC, ucp_Lydian }, - { 705, PT_GC, ucp_M }, - { 707, PT_SC, ucp_Mahajani }, - { 716, PT_SC, ucp_Makasar }, - { 724, PT_SC, ucp_Malayalam }, - { 734, PT_SC, ucp_Mandaic }, - { 742, PT_SC, ucp_Manichaean }, - { 753, PT_SC, ucp_Marchen }, - { 761, PT_SC, ucp_Masaram_Gondi }, - { 775, PT_PC, ucp_Mc }, - { 778, PT_PC, ucp_Me }, - { 781, PT_SC, ucp_Medefaidrin }, - { 793, PT_SC, ucp_Meetei_Mayek }, - { 806, PT_SC, ucp_Mende_Kikakui }, - { 820, PT_SC, ucp_Meroitic_Cursive }, - { 837, PT_SC, ucp_Meroitic_Hieroglyphs }, - { 858, PT_SC, ucp_Miao }, - { 863, PT_PC, ucp_Mn }, - { 866, PT_SC, ucp_Modi }, - { 871, PT_SC, ucp_Mongolian }, - { 881, PT_SC, ucp_Mro }, - { 885, PT_SC, ucp_Multani }, - { 893, PT_SC, ucp_Myanmar }, - { 901, PT_GC, ucp_N }, - { 903, PT_SC, ucp_Nabataean }, - { 913, PT_PC, ucp_Nd }, - { 916, PT_SC, ucp_New_Tai_Lue }, - { 928, PT_SC, ucp_Newa }, - { 933, PT_SC, ucp_Nko }, - { 937, PT_PC, ucp_Nl }, - { 940, PT_PC, ucp_No }, - { 943, PT_SC, ucp_Nushu }, - { 949, PT_SC, ucp_Ogham }, - { 955, PT_SC, ucp_Ol_Chiki }, - { 964, PT_SC, ucp_Old_Hungarian }, - { 978, PT_SC, ucp_Old_Italic }, - { 989, PT_SC, ucp_Old_North_Arabian }, - { 1007, PT_SC, ucp_Old_Permic }, - { 1018, PT_SC, ucp_Old_Persian }, - { 1030, PT_SC, ucp_Old_Sogdian }, - { 1042, PT_SC, ucp_Old_South_Arabian }, - { 1060, PT_SC, ucp_Old_Turkic }, - { 1071, PT_SC, ucp_Oriya }, - { 1077, PT_SC, ucp_Osage }, - { 1083, PT_SC, ucp_Osmanya }, - { 1091, PT_GC, ucp_P }, - { 1093, PT_SC, ucp_Pahawh_Hmong }, - { 1106, PT_SC, ucp_Palmyrene }, - { 1116, PT_SC, ucp_Pau_Cin_Hau }, - { 1128, PT_PC, ucp_Pc }, - { 1131, PT_PC, ucp_Pd }, - { 1134, PT_PC, ucp_Pe }, - { 1137, PT_PC, ucp_Pf }, - { 1140, PT_SC, ucp_Phags_Pa }, - { 1149, PT_SC, ucp_Phoenician }, - { 1160, PT_PC, ucp_Pi }, - { 1163, PT_PC, ucp_Po }, - { 1166, PT_PC, ucp_Ps }, - { 1169, PT_SC, ucp_Psalter_Pahlavi }, - { 1185, PT_SC, ucp_Rejang }, - { 1192, PT_SC, ucp_Runic }, - { 1198, PT_GC, ucp_S }, - { 1200, PT_SC, ucp_Samaritan }, - { 1210, PT_SC, ucp_Saurashtra }, - { 1221, PT_PC, ucp_Sc }, - { 1224, PT_SC, ucp_Sharada }, - { 1232, PT_SC, ucp_Shavian }, - { 1240, PT_SC, ucp_Siddham }, - { 1248, PT_SC, ucp_SignWriting }, - { 1260, PT_SC, ucp_Sinhala }, - { 1268, PT_PC, ucp_Sk }, - { 1271, PT_PC, ucp_Sm }, - { 1274, PT_PC, ucp_So }, - { 1277, PT_SC, ucp_Sogdian }, - { 1285, PT_SC, ucp_Sora_Sompeng }, - { 1298, PT_SC, ucp_Soyombo }, - { 1306, PT_SC, ucp_Sundanese }, - { 1316, PT_SC, ucp_Syloti_Nagri }, - { 1329, PT_SC, ucp_Syriac }, - { 1336, PT_SC, ucp_Tagalog }, - { 1344, PT_SC, ucp_Tagbanwa }, - { 1353, PT_SC, ucp_Tai_Le }, - { 1360, PT_SC, ucp_Tai_Tham }, - { 1369, PT_SC, ucp_Tai_Viet }, - { 1378, PT_SC, ucp_Takri }, - { 1384, PT_SC, ucp_Tamil }, - { 1390, PT_SC, ucp_Tangut }, - { 1397, PT_SC, ucp_Telugu }, - { 1404, PT_SC, ucp_Thaana }, - { 1411, PT_SC, ucp_Thai }, - { 1416, PT_SC, ucp_Tibetan }, - { 1424, PT_SC, ucp_Tifinagh }, - { 1433, PT_SC, ucp_Tirhuta }, - { 1441, PT_SC, ucp_Ugaritic }, - { 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 } + { 337, PT_SC, ucp_Elymaic }, + { 345, PT_SC, ucp_Ethiopic }, + { 354, PT_SC, ucp_Georgian }, + { 363, PT_SC, ucp_Glagolitic }, + { 374, PT_SC, ucp_Gothic }, + { 381, PT_SC, ucp_Grantha }, + { 389, PT_SC, ucp_Greek }, + { 395, PT_SC, ucp_Gujarati }, + { 404, PT_SC, ucp_Gunjala_Gondi }, + { 418, PT_SC, ucp_Gurmukhi }, + { 427, PT_SC, ucp_Han }, + { 431, PT_SC, ucp_Hangul }, + { 438, PT_SC, ucp_Hanifi_Rohingya }, + { 454, PT_SC, ucp_Hanunoo }, + { 462, PT_SC, ucp_Hatran }, + { 469, PT_SC, ucp_Hebrew }, + { 476, PT_SC, ucp_Hiragana }, + { 485, PT_SC, ucp_Imperial_Aramaic }, + { 502, PT_SC, ucp_Inherited }, + { 512, PT_SC, ucp_Inscriptional_Pahlavi }, + { 534, PT_SC, ucp_Inscriptional_Parthian }, + { 557, PT_SC, ucp_Javanese }, + { 566, PT_SC, ucp_Kaithi }, + { 573, PT_SC, ucp_Kannada }, + { 581, PT_SC, ucp_Katakana }, + { 590, PT_SC, ucp_Kayah_Li }, + { 599, PT_SC, ucp_Kharoshthi }, + { 610, PT_SC, ucp_Khmer }, + { 616, PT_SC, ucp_Khojki }, + { 623, PT_SC, ucp_Khudawadi }, + { 633, PT_GC, ucp_L }, + { 635, PT_LAMP, 0 }, + { 638, PT_SC, ucp_Lao }, + { 642, PT_SC, ucp_Latin }, + { 648, PT_SC, ucp_Lepcha }, + { 655, PT_SC, ucp_Limbu }, + { 661, PT_SC, ucp_Linear_A }, + { 670, PT_SC, ucp_Linear_B }, + { 679, PT_SC, ucp_Lisu }, + { 684, PT_PC, ucp_Ll }, + { 687, PT_PC, ucp_Lm }, + { 690, PT_PC, ucp_Lo }, + { 693, PT_PC, ucp_Lt }, + { 696, PT_PC, ucp_Lu }, + { 699, PT_SC, ucp_Lycian }, + { 706, PT_SC, ucp_Lydian }, + { 713, PT_GC, ucp_M }, + { 715, PT_SC, ucp_Mahajani }, + { 724, PT_SC, ucp_Makasar }, + { 732, PT_SC, ucp_Malayalam }, + { 742, PT_SC, ucp_Mandaic }, + { 750, PT_SC, ucp_Manichaean }, + { 761, PT_SC, ucp_Marchen }, + { 769, PT_SC, ucp_Masaram_Gondi }, + { 783, PT_PC, ucp_Mc }, + { 786, PT_PC, ucp_Me }, + { 789, PT_SC, ucp_Medefaidrin }, + { 801, PT_SC, ucp_Meetei_Mayek }, + { 814, PT_SC, ucp_Mende_Kikakui }, + { 828, PT_SC, ucp_Meroitic_Cursive }, + { 845, PT_SC, ucp_Meroitic_Hieroglyphs }, + { 866, PT_SC, ucp_Miao }, + { 871, PT_PC, ucp_Mn }, + { 874, PT_SC, ucp_Modi }, + { 879, PT_SC, ucp_Mongolian }, + { 889, PT_SC, ucp_Mro }, + { 893, PT_SC, ucp_Multani }, + { 901, PT_SC, ucp_Myanmar }, + { 909, PT_GC, ucp_N }, + { 911, PT_SC, ucp_Nabataean }, + { 921, PT_SC, ucp_Nandinagari }, + { 933, PT_PC, ucp_Nd }, + { 936, PT_SC, ucp_New_Tai_Lue }, + { 948, PT_SC, ucp_Newa }, + { 953, PT_SC, ucp_Nko }, + { 957, PT_PC, ucp_Nl }, + { 960, PT_PC, ucp_No }, + { 963, PT_SC, ucp_Nushu }, + { 969, PT_SC, ucp_Nyiakeng_Puachue_Hmong }, + { 992, PT_SC, ucp_Ogham }, + { 998, PT_SC, ucp_Ol_Chiki }, + { 1007, PT_SC, ucp_Old_Hungarian }, + { 1021, PT_SC, ucp_Old_Italic }, + { 1032, PT_SC, ucp_Old_North_Arabian }, + { 1050, PT_SC, ucp_Old_Permic }, + { 1061, PT_SC, ucp_Old_Persian }, + { 1073, PT_SC, ucp_Old_Sogdian }, + { 1085, PT_SC, ucp_Old_South_Arabian }, + { 1103, PT_SC, ucp_Old_Turkic }, + { 1114, PT_SC, ucp_Oriya }, + { 1120, PT_SC, ucp_Osage }, + { 1126, PT_SC, ucp_Osmanya }, + { 1134, PT_GC, ucp_P }, + { 1136, PT_SC, ucp_Pahawh_Hmong }, + { 1149, PT_SC, ucp_Palmyrene }, + { 1159, PT_SC, ucp_Pau_Cin_Hau }, + { 1171, PT_PC, ucp_Pc }, + { 1174, PT_PC, ucp_Pd }, + { 1177, PT_PC, ucp_Pe }, + { 1180, PT_PC, ucp_Pf }, + { 1183, PT_SC, ucp_Phags_Pa }, + { 1192, PT_SC, ucp_Phoenician }, + { 1203, PT_PC, ucp_Pi }, + { 1206, PT_PC, ucp_Po }, + { 1209, PT_PC, ucp_Ps }, + { 1212, PT_SC, ucp_Psalter_Pahlavi }, + { 1228, PT_SC, ucp_Rejang }, + { 1235, PT_SC, ucp_Runic }, + { 1241, PT_GC, ucp_S }, + { 1243, PT_SC, ucp_Samaritan }, + { 1253, PT_SC, ucp_Saurashtra }, + { 1264, PT_PC, ucp_Sc }, + { 1267, PT_SC, ucp_Sharada }, + { 1275, PT_SC, ucp_Shavian }, + { 1283, PT_SC, ucp_Siddham }, + { 1291, PT_SC, ucp_SignWriting }, + { 1303, PT_SC, ucp_Sinhala }, + { 1311, PT_PC, ucp_Sk }, + { 1314, PT_PC, ucp_Sm }, + { 1317, PT_PC, ucp_So }, + { 1320, PT_SC, ucp_Sogdian }, + { 1328, PT_SC, ucp_Sora_Sompeng }, + { 1341, PT_SC, ucp_Soyombo }, + { 1349, PT_SC, ucp_Sundanese }, + { 1359, PT_SC, ucp_Syloti_Nagri }, + { 1372, PT_SC, ucp_Syriac }, + { 1379, PT_SC, ucp_Tagalog }, + { 1387, PT_SC, ucp_Tagbanwa }, + { 1396, PT_SC, ucp_Tai_Le }, + { 1403, PT_SC, ucp_Tai_Tham }, + { 1412, PT_SC, ucp_Tai_Viet }, + { 1421, PT_SC, ucp_Takri }, + { 1427, PT_SC, ucp_Tamil }, + { 1433, PT_SC, ucp_Tangut }, + { 1440, PT_SC, ucp_Telugu }, + { 1447, PT_SC, ucp_Thaana }, + { 1454, PT_SC, ucp_Thai }, + { 1459, PT_SC, ucp_Tibetan }, + { 1467, PT_SC, ucp_Tifinagh }, + { 1476, PT_SC, ucp_Tirhuta }, + { 1484, PT_SC, ucp_Ugaritic }, + { 1493, PT_SC, ucp_Unknown }, + { 1501, PT_SC, ucp_Vai }, + { 1505, PT_SC, ucp_Wancho }, + { 1512, PT_SC, ucp_Warang_Citi }, + { 1524, PT_ALNUM, 0 }, + { 1528, PT_PXSPACE, 0 }, + { 1532, PT_SPACE, 0 }, + { 1536, PT_UCNC, 0 }, + { 1540, PT_WORD, 0 }, + { 1544, PT_SC, ucp_Yi }, + { 1547, PT_GC, ucp_Z }, + { 1549, PT_SC, ucp_Zanabazar_Square }, + { 1566, PT_PC, ucp_Zl }, + { 1569, PT_PC, ucp_Zp }, + { 1572, 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 cc53c24001..55ba03bd43 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: 97152 bytes, block size: 128. */ +/* Total size: 99316 bytes, block size: 128. */ /* The tables herein are needed only when UCP support is built, and in PCRE2 that happens automatically with UTF support. @@ -39,7 +39,7 @@ const uint16_t PRIV(ucd_stage2)[] = {0}; const uint32_t PRIV(ucd_caseless_sets)[] = {0}; #else -const char *PRIV(unicode_version) = "11.0.0"; +const char *PRIV(unicode_version) = "12.1.0"; /* If the 32-bit library is run in non-32-bit mode, character values greater than 0x10ffff may be encountered. For these we set up a @@ -116,7 +116,7 @@ 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 */ + 63, /* 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, @@ -124,7 +124,7 @@ const uint32_t PRIV(ucd_digit_sets)[] = { 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, + 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, 0x1e959, }; /* This vector is a list of lists of scripts for the Script Extension @@ -145,38 +145,42 @@ const uint8_t PRIV(ucd_script_sets)[] = { /* 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 */ + /* 40 */ 15, 150, 0, + /* 43 */ 15, 100, 0, + /* 46 */ 15, 54, 0, + /* 49 */ 17, 34, 0, + /* 52 */ 107, 54, 0, + /* 55 */ 21, 108, 0, + /* 58 */ 22, 129, 0, + /* 61 */ 27, 30, 0, + /* 64 */ 29, 150, 0, + /* 67 */ 34, 38, 0, + /* 70 */ 38, 65, 0, + /* 73 */ 1, 50, 56, 0, + /* 77 */ 3, 96, 49, 0, + /* 81 */ 96, 39, 53, 0, + /* 85 */ 12, 110, 36, 0, + /* 89 */ 15, 107, 29, 0, + /* 93 */ 15, 107, 34, 0, + /* 97 */ 23, 27, 30, 0, + /* 101 */ 69, 34, 39, 0, + /* 105 */ 1, 144, 50, 56, 0, + /* 110 */ 3, 15, 107, 29, 0, + /* 115 */ 7, 25, 52, 51, 0, + /* 120 */ 15, 142, 85, 111, 0, + /* 125 */ 4, 24, 23, 27, 30, 0, + /* 131 */ 4, 24, 23, 27, 30, 61, 0, + /* 138 */ 15, 29, 37, 44, 54, 55, 0, + /* 145 */ 132, 1, 95, 112, 121, 144, 148, 50, 0, + /* 154 */ 3, 15, 107, 29, 150, 44, 55, 124, 0, + /* 163 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0, + /* 175 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0, + /* 188 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0, + /* 202 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 150, 109, 102, 124, 0, + /* 216 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 150, 109, 102, 124, 0, + /* 231 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, + /* 252 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 35, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0, + /* 274 */ }; /* These are the main two-stage UCD tables. The fields in each record are: @@ -185,7 +189,7 @@ 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 */ +const ucd_record PRIV(ucd_records)[] = { /* 11508 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 */ @@ -288,832 +292,863 @@ const ucd_record PRIV(ucd_records)[] = { /* 11136 bytes, record size 12 */ { 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 */ + { 34, 5, 12, 0, 42307, 34, 0, }, /* 102 */ + { 34, 5, 12, 0, 42282, 34, 0, }, /* 103 */ + { 34, 5, 12, 0, -69, 34, 0, }, /* 104 */ + { 34, 5, 12, 0, -217, 34, 0, }, /* 105 */ + { 34, 5, 12, 0, -71, 34, 0, }, /* 106 */ + { 34, 5, 12, 0, -219, 34, 0, }, /* 107 */ + { 34, 5, 12, 0, 42261, 34, 0, }, /* 108 */ + { 34, 5, 12, 0, 42258, 34, 0, }, /* 109 */ + { 34, 6, 12, 0, 0, 34, 0, }, /* 110 */ + { 10, 6, 12, 0, 0, 10, 0, }, /* 111 */ + { 4, 24, 12, 0, 0, 4, 0, }, /* 112 */ + { 28, 12, 3, 0, 0, 28, 0, }, /* 113 */ + { 28, 12, 3, 0, 0, 20, 0, }, /* 114 */ + { 28, 12, 3, 21, 116, 20, 0, }, /* 115 */ + { 28, 12, 3, 0, 0, 34, 0, }, /* 116 */ + { 20, 9, 12, 0, 1, 20, 0, }, /* 117 */ + { 20, 5, 12, 0, -1, 20, 0, }, /* 118 */ + { 20, 24, 12, 0, 0, 20, 0, }, /* 119 */ + { 0, 2, 12, 0, 0, 0, 0, }, /* 120 */ + { 20, 6, 12, 0, 0, 20, 0, }, /* 121 */ + { 20, 5, 12, 0, 130, 20, 0, }, /* 122 */ + { 20, 9, 12, 0, 116, 20, 0, }, /* 123 */ + { 20, 9, 12, 0, 38, 20, 0, }, /* 124 */ + { 20, 9, 12, 0, 37, 20, 0, }, /* 125 */ + { 20, 9, 12, 0, 64, 20, 0, }, /* 126 */ + { 20, 9, 12, 0, 63, 20, 0, }, /* 127 */ + { 20, 5, 12, 0, 0, 20, 0, }, /* 128 */ + { 20, 9, 12, 0, 32, 20, 0, }, /* 129 */ + { 20, 9, 12, 34, 32, 20, 0, }, /* 130 */ + { 20, 9, 12, 59, 32, 20, 0, }, /* 131 */ + { 20, 9, 12, 38, 32, 20, 0, }, /* 132 */ + { 20, 9, 12, 21, 32, 20, 0, }, /* 133 */ + { 20, 9, 12, 51, 32, 20, 0, }, /* 134 */ + { 20, 9, 12, 26, 32, 20, 0, }, /* 135 */ + { 20, 9, 12, 47, 32, 20, 0, }, /* 136 */ + { 20, 9, 12, 55, 32, 20, 0, }, /* 137 */ + { 20, 9, 12, 30, 32, 20, 0, }, /* 138 */ + { 20, 9, 12, 43, 32, 20, 0, }, /* 139 */ + { 20, 9, 12, 96, 32, 20, 0, }, /* 140 */ + { 20, 5, 12, 0, -38, 20, 0, }, /* 141 */ + { 20, 5, 12, 0, -37, 20, 0, }, /* 142 */ + { 20, 5, 12, 0, -32, 20, 0, }, /* 143 */ + { 20, 5, 12, 34, -32, 20, 0, }, /* 144 */ + { 20, 5, 12, 59, -32, 20, 0, }, /* 145 */ + { 20, 5, 12, 38, -32, 20, 0, }, /* 146 */ + { 20, 5, 12, 21, -116, 20, 0, }, /* 147 */ + { 20, 5, 12, 51, -32, 20, 0, }, /* 148 */ + { 20, 5, 12, 26, -775, 20, 0, }, /* 149 */ + { 20, 5, 12, 47, -32, 20, 0, }, /* 150 */ + { 20, 5, 12, 55, -32, 20, 0, }, /* 151 */ + { 20, 5, 12, 30, 1, 20, 0, }, /* 152 */ + { 20, 5, 12, 30, -32, 20, 0, }, /* 153 */ + { 20, 5, 12, 43, -32, 20, 0, }, /* 154 */ + { 20, 5, 12, 96, -32, 20, 0, }, /* 155 */ + { 20, 5, 12, 0, -64, 20, 0, }, /* 156 */ + { 20, 5, 12, 0, -63, 20, 0, }, /* 157 */ + { 20, 9, 12, 0, 8, 20, 0, }, /* 158 */ + { 20, 5, 12, 34, -30, 20, 0, }, /* 159 */ + { 20, 5, 12, 38, -25, 20, 0, }, /* 160 */ + { 20, 9, 12, 0, 0, 20, 0, }, /* 161 */ + { 20, 5, 12, 43, -15, 20, 0, }, /* 162 */ + { 20, 5, 12, 47, -22, 20, 0, }, /* 163 */ + { 20, 5, 12, 0, -8, 20, 0, }, /* 164 */ + { 11, 9, 12, 0, 1, 11, 0, }, /* 165 */ + { 11, 5, 12, 0, -1, 11, 0, }, /* 166 */ + { 20, 5, 12, 51, -54, 20, 0, }, /* 167 */ + { 20, 5, 12, 55, -48, 20, 0, }, /* 168 */ + { 20, 5, 12, 0, 7, 20, 0, }, /* 169 */ + { 20, 5, 12, 0, -116, 20, 0, }, /* 170 */ + { 20, 9, 12, 38, -60, 20, 0, }, /* 171 */ + { 20, 5, 12, 59, -64, 20, 0, }, /* 172 */ + { 20, 25, 12, 0, 0, 20, 0, }, /* 173 */ + { 20, 9, 12, 0, -7, 20, 0, }, /* 174 */ + { 20, 9, 12, 0, -130, 20, 0, }, /* 175 */ + { 13, 9, 12, 0, 80, 13, 0, }, /* 176 */ + { 13, 9, 12, 0, 32, 13, 0, }, /* 177 */ + { 13, 9, 12, 63, 32, 13, 0, }, /* 178 */ + { 13, 9, 12, 67, 32, 13, 0, }, /* 179 */ + { 13, 9, 12, 71, 32, 13, 0, }, /* 180 */ + { 13, 9, 12, 75, 32, 13, 0, }, /* 181 */ + { 13, 9, 12, 79, 32, 13, 0, }, /* 182 */ + { 13, 9, 12, 84, 32, 13, 0, }, /* 183 */ + { 13, 5, 12, 0, -32, 13, 0, }, /* 184 */ + { 13, 5, 12, 63, -32, 13, 0, }, /* 185 */ + { 13, 5, 12, 67, -32, 13, 0, }, /* 186 */ + { 13, 5, 12, 71, -32, 13, 0, }, /* 187 */ + { 13, 5, 12, 75, -32, 13, 0, }, /* 188 */ + { 13, 5, 12, 79, -32, 13, 0, }, /* 189 */ + { 13, 5, 12, 84, -32, 13, 0, }, /* 190 */ + { 13, 5, 12, 0, -80, 13, 0, }, /* 191 */ + { 13, 9, 12, 0, 1, 13, 0, }, /* 192 */ + { 13, 5, 12, 0, -1, 13, 0, }, /* 193 */ + { 13, 9, 12, 88, 1, 13, 0, }, /* 194 */ + { 13, 5, 12, 88, -1, 13, 0, }, /* 195 */ + { 13, 26, 12, 0, 0, 13, 0, }, /* 196 */ + { 13, 12, 3, 0, 0, -34, 0, }, /* 197 */ + { 13, 12, 3, 0, 0, -28, 0, }, /* 198 */ + { 28, 12, 3, 0, 0, -31, 0, }, /* 199 */ + { 13, 11, 3, 0, 0, 13, 0, }, /* 200 */ + { 13, 9, 12, 0, 15, 13, 0, }, /* 201 */ + { 13, 5, 12, 0, -15, 13, 0, }, /* 202 */ + { 2, 9, 12, 0, 48, 2, 0, }, /* 203 */ + { 2, 6, 12, 0, 0, 2, 0, }, /* 204 */ + { 2, 21, 12, 0, 0, 2, 0, }, /* 205 */ + { 2, 5, 12, 0, 0, 2, 0, }, /* 206 */ + { 2, 5, 12, 0, -48, 2, 0, }, /* 207 */ + { 10, 21, 12, 0, 0, -13, 0, }, /* 208 */ + { 2, 17, 12, 0, 0, 2, 0, }, /* 209 */ + { 2, 26, 12, 0, 0, 2, 0, }, /* 210 */ + { 2, 23, 12, 0, 0, 2, 0, }, /* 211 */ + { 26, 12, 3, 0, 0, 26, 0, }, /* 212 */ + { 26, 17, 12, 0, 0, 26, 0, }, /* 213 */ + { 26, 21, 12, 0, 0, 26, 0, }, /* 214 */ + { 26, 7, 12, 0, 0, 26, 0, }, /* 215 */ + { 1, 1, 4, 0, 0, 1, 0, }, /* 216 */ + { 10, 1, 4, 0, 0, 10, 0, }, /* 217 */ + { 1, 25, 12, 0, 0, 1, 0, }, /* 218 */ + { 1, 21, 12, 0, 0, 1, 0, }, /* 219 */ + { 1, 23, 12, 0, 0, 1, 0, }, /* 220 */ + { 10, 21, 12, 0, 0, -105, 0, }, /* 221 */ + { 1, 26, 12, 0, 0, 1, 0, }, /* 222 */ + { 1, 12, 3, 0, 0, 1, 0, }, /* 223 */ + { 1, 1, 2, 0, 0, -73, 0, }, /* 224 */ + { 1, 7, 12, 0, 0, 1, 0, }, /* 225 */ + { 10, 6, 12, 0, 0, -145, 0, }, /* 226 */ + { 28, 12, 3, 0, 0, -7, 0, }, /* 227 */ + { 1, 13, 12, 0, 0, -10, 0, }, /* 228 */ + { 1, 21, 12, 0, 0, -4, 0, }, /* 229 */ + { 1, 6, 12, 0, 0, 1, 0, }, /* 230 */ + { 1, 13, 12, 0, 0, 1, 0, }, /* 231 */ + { 50, 21, 12, 0, 0, 50, 0, }, /* 232 */ + { 50, 1, 4, 0, 0, 50, 0, }, /* 233 */ + { 50, 7, 12, 0, 0, 50, 0, }, /* 234 */ + { 50, 12, 3, 0, 0, 50, 0, }, /* 235 */ + { 56, 7, 12, 0, 0, 56, 0, }, /* 236 */ + { 56, 12, 3, 0, 0, 56, 0, }, /* 237 */ + { 64, 13, 12, 0, 0, 64, 0, }, /* 238 */ + { 64, 7, 12, 0, 0, 64, 0, }, /* 239 */ + { 64, 12, 3, 0, 0, 64, 0, }, /* 240 */ + { 64, 6, 12, 0, 0, 64, 0, }, /* 241 */ + { 64, 26, 12, 0, 0, 64, 0, }, /* 242 */ + { 64, 21, 12, 0, 0, 64, 0, }, /* 243 */ + { 64, 23, 12, 0, 0, 64, 0, }, /* 244 */ + { 90, 7, 12, 0, 0, 90, 0, }, /* 245 */ + { 90, 12, 3, 0, 0, 90, 0, }, /* 246 */ + { 90, 6, 12, 0, 0, 90, 0, }, /* 247 */ + { 90, 21, 12, 0, 0, 90, 0, }, /* 248 */ + { 95, 7, 12, 0, 0, 95, 0, }, /* 249 */ + { 95, 12, 3, 0, 0, 95, 0, }, /* 250 */ + { 95, 21, 12, 0, 0, 95, 0, }, /* 251 */ + { 15, 12, 3, 0, 0, 15, 0, }, /* 252 */ + { 15, 10, 5, 0, 0, 15, 0, }, /* 253 */ + { 15, 7, 12, 0, 0, 15, 0, }, /* 254 */ + { 28, 12, 3, 0, 0, -188, 0, }, /* 255 */ + { 28, 12, 3, 0, 0, -175, 0, }, /* 256 */ + { 10, 21, 12, 0, 0, -231, 0, }, /* 257 */ + { 10, 21, 12, 0, 0, -252, 0, }, /* 258 */ + { 15, 13, 12, 0, 0, -120, 0, }, /* 259 */ + { 15, 21, 12, 0, 0, 15, 0, }, /* 260 */ + { 15, 6, 12, 0, 0, 15, 0, }, /* 261 */ + { 3, 7, 12, 0, 0, 3, 0, }, /* 262 */ + { 3, 12, 3, 0, 0, 3, 0, }, /* 263 */ + { 3, 10, 5, 0, 0, 3, 0, }, /* 264 */ + { 3, 10, 3, 0, 0, 3, 0, }, /* 265 */ + { 3, 13, 12, 0, 0, -77, 0, }, /* 266 */ + { 3, 23, 12, 0, 0, 3, 0, }, /* 267 */ + { 3, 15, 12, 0, 0, 3, 0, }, /* 268 */ + { 3, 26, 12, 0, 0, 3, 0, }, /* 269 */ + { 3, 21, 12, 0, 0, 3, 0, }, /* 270 */ + { 22, 12, 3, 0, 0, 22, 0, }, /* 271 */ + { 22, 10, 5, 0, 0, 22, 0, }, /* 272 */ + { 22, 7, 12, 0, 0, 22, 0, }, /* 273 */ + { 22, 13, 12, 0, 0, -58, 0, }, /* 274 */ + { 22, 21, 12, 0, 0, 22, 0, }, /* 275 */ + { 21, 12, 3, 0, 0, 21, 0, }, /* 276 */ + { 21, 10, 5, 0, 0, 21, 0, }, /* 277 */ + { 21, 7, 12, 0, 0, 21, 0, }, /* 278 */ + { 21, 13, 12, 0, 0, -55, 0, }, /* 279 */ + { 21, 21, 12, 0, 0, 21, 0, }, /* 280 */ + { 21, 23, 12, 0, 0, 21, 0, }, /* 281 */ + { 44, 12, 3, 0, 0, 44, 0, }, /* 282 */ + { 44, 10, 5, 0, 0, 44, 0, }, /* 283 */ + { 44, 7, 12, 0, 0, 44, 0, }, /* 284 */ + { 44, 10, 3, 0, 0, 44, 0, }, /* 285 */ + { 44, 13, 12, 0, 0, 44, 0, }, /* 286 */ + { 44, 26, 12, 0, 0, 44, 0, }, /* 287 */ + { 44, 15, 12, 0, 0, 44, 0, }, /* 288 */ + { 54, 12, 3, 0, 0, 54, 0, }, /* 289 */ + { 54, 7, 12, 0, 0, 54, 0, }, /* 290 */ + { 54, 10, 3, 0, 0, 54, 0, }, /* 291 */ + { 54, 10, 5, 0, 0, 54, 0, }, /* 292 */ + { 54, 13, 12, 0, 0, -52, 0, }, /* 293 */ + { 54, 15, 12, 0, 0, -52, 0, }, /* 294 */ + { 54, 26, 12, 0, 0, -52, 0, }, /* 295 */ + { 54, 26, 12, 0, 0, 54, 0, }, /* 296 */ + { 54, 23, 12, 0, 0, 54, 0, }, /* 297 */ + { 55, 12, 3, 0, 0, 55, 0, }, /* 298 */ + { 55, 10, 5, 0, 0, 55, 0, }, /* 299 */ + { 55, 7, 12, 0, 0, 55, 0, }, /* 300 */ + { 55, 13, 12, 0, 0, 55, 0, }, /* 301 */ + { 55, 21, 12, 0, 0, 55, 0, }, /* 302 */ + { 55, 15, 12, 0, 0, 55, 0, }, /* 303 */ + { 55, 26, 12, 0, 0, 55, 0, }, /* 304 */ + { 29, 7, 12, 0, 0, 29, 0, }, /* 305 */ + { 29, 12, 3, 0, 0, 29, 0, }, /* 306 */ + { 29, 10, 5, 0, 0, 29, 0, }, /* 307 */ + { 29, 21, 12, 0, 0, 29, 0, }, /* 308 */ + { 29, 10, 3, 0, 0, 29, 0, }, /* 309 */ + { 29, 13, 12, 0, 0, -64, 0, }, /* 310 */ + { 37, 12, 3, 0, 0, 37, 0, }, /* 311 */ + { 37, 10, 5, 0, 0, 37, 0, }, /* 312 */ + { 37, 7, 12, 0, 0, 37, 0, }, /* 313 */ + { 37, 10, 3, 0, 0, 37, 0, }, /* 314 */ + { 37, 7, 4, 0, 0, 37, 0, }, /* 315 */ + { 37, 26, 12, 0, 0, 37, 0, }, /* 316 */ + { 37, 15, 12, 0, 0, 37, 0, }, /* 317 */ + { 37, 13, 12, 0, 0, 37, 0, }, /* 318 */ + { 48, 10, 5, 0, 0, 48, 0, }, /* 319 */ + { 48, 7, 12, 0, 0, 48, 0, }, /* 320 */ + { 48, 12, 3, 0, 0, 48, 0, }, /* 321 */ + { 48, 10, 3, 0, 0, 48, 0, }, /* 322 */ + { 48, 13, 12, 0, 0, 48, 0, }, /* 323 */ + { 48, 21, 12, 0, 0, 48, 0, }, /* 324 */ + { 57, 7, 12, 0, 0, 57, 0, }, /* 325 */ + { 57, 12, 3, 0, 0, 57, 0, }, /* 326 */ + { 57, 7, 5, 0, 0, 57, 0, }, /* 327 */ + { 57, 6, 12, 0, 0, 57, 0, }, /* 328 */ + { 57, 21, 12, 0, 0, 57, 0, }, /* 329 */ + { 57, 13, 12, 0, 0, 57, 0, }, /* 330 */ + { 33, 7, 12, 0, 0, 33, 0, }, /* 331 */ + { 33, 12, 3, 0, 0, 33, 0, }, /* 332 */ + { 33, 7, 5, 0, 0, 33, 0, }, /* 333 */ + { 33, 6, 12, 0, 0, 33, 0, }, /* 334 */ + { 33, 13, 12, 0, 0, 33, 0, }, /* 335 */ + { 58, 7, 12, 0, 0, 58, 0, }, /* 336 */ + { 58, 26, 12, 0, 0, 58, 0, }, /* 337 */ + { 58, 21, 12, 0, 0, 58, 0, }, /* 338 */ + { 58, 12, 3, 0, 0, 58, 0, }, /* 339 */ + { 58, 13, 12, 0, 0, 58, 0, }, /* 340 */ + { 58, 15, 12, 0, 0, 58, 0, }, /* 341 */ + { 58, 22, 12, 0, 0, 58, 0, }, /* 342 */ + { 58, 18, 12, 0, 0, 58, 0, }, /* 343 */ + { 58, 10, 5, 0, 0, 58, 0, }, /* 344 */ + { 39, 7, 12, 0, 0, 39, 0, }, /* 345 */ + { 39, 10, 12, 0, 0, 39, 0, }, /* 346 */ + { 39, 12, 3, 0, 0, 39, 0, }, /* 347 */ + { 39, 10, 5, 0, 0, 39, 0, }, /* 348 */ + { 39, 13, 12, 0, 0, -81, 0, }, /* 349 */ + { 39, 21, 12, 0, 0, 39, 0, }, /* 350 */ + { 39, 13, 12, 0, 0, 39, 0, }, /* 351 */ + { 39, 26, 12, 0, 0, 39, 0, }, /* 352 */ + { 17, 9, 12, 0, 7264, 17, 0, }, /* 353 */ + { 17, 5, 12, 0, 3008, 17, 0, }, /* 354 */ + { 10, 21, 12, 0, 0, -49, 0, }, /* 355 */ + { 17, 6, 12, 0, 0, 17, 0, }, /* 356 */ + { 24, 7, 6, 0, 0, 24, 0, }, /* 357 */ + { 24, 7, 7, 0, 0, 24, 0, }, /* 358 */ + { 24, 7, 8, 0, 0, 24, 0, }, /* 359 */ + { 16, 7, 12, 0, 0, 16, 0, }, /* 360 */ + { 16, 12, 3, 0, 0, 16, 0, }, /* 361 */ + { 16, 21, 12, 0, 0, 16, 0, }, /* 362 */ + { 16, 15, 12, 0, 0, 16, 0, }, /* 363 */ + { 16, 26, 12, 0, 0, 16, 0, }, /* 364 */ + { 9, 9, 12, 0, 38864, 9, 0, }, /* 365 */ + { 9, 9, 12, 0, 8, 9, 0, }, /* 366 */ + { 9, 5, 12, 0, -8, 9, 0, }, /* 367 */ + { 8, 17, 12, 0, 0, 8, 0, }, /* 368 */ + { 8, 7, 12, 0, 0, 8, 0, }, /* 369 */ + { 8, 26, 12, 0, 0, 8, 0, }, /* 370 */ + { 8, 21, 12, 0, 0, 8, 0, }, /* 371 */ + { 41, 29, 12, 0, 0, 41, 0, }, /* 372 */ + { 41, 7, 12, 0, 0, 41, 0, }, /* 373 */ + { 41, 22, 12, 0, 0, 41, 0, }, /* 374 */ + { 41, 18, 12, 0, 0, 41, 0, }, /* 375 */ + { 46, 7, 12, 0, 0, 46, 0, }, /* 376 */ + { 46, 14, 12, 0, 0, 46, 0, }, /* 377 */ + { 51, 7, 12, 0, 0, 51, 0, }, /* 378 */ + { 51, 12, 3, 0, 0, 51, 0, }, /* 379 */ + { 25, 7, 12, 0, 0, 25, 0, }, /* 380 */ + { 25, 12, 3, 0, 0, 25, 0, }, /* 381 */ + { 10, 21, 12, 0, 0, -115, 0, }, /* 382 */ + { 7, 7, 12, 0, 0, 7, 0, }, /* 383 */ + { 7, 12, 3, 0, 0, 7, 0, }, /* 384 */ + { 52, 7, 12, 0, 0, 52, 0, }, /* 385 */ + { 52, 12, 3, 0, 0, 52, 0, }, /* 386 */ + { 32, 7, 12, 0, 0, 32, 0, }, /* 387 */ + { 32, 12, 3, 0, 0, 32, 0, }, /* 388 */ + { 32, 10, 5, 0, 0, 32, 0, }, /* 389 */ + { 32, 21, 12, 0, 0, 32, 0, }, /* 390 */ + { 32, 6, 12, 0, 0, 32, 0, }, /* 391 */ + { 32, 23, 12, 0, 0, 32, 0, }, /* 392 */ + { 32, 13, 12, 0, 0, 32, 0, }, /* 393 */ + { 32, 15, 12, 0, 0, 32, 0, }, /* 394 */ + { 38, 21, 12, 0, 0, 38, 0, }, /* 395 */ + { 10, 21, 12, 0, 0, -70, 0, }, /* 396 */ + { 38, 17, 12, 0, 0, 38, 0, }, /* 397 */ + { 38, 12, 3, 0, 0, 38, 0, }, /* 398 */ + { 38, 1, 2, 0, 0, 38, 0, }, /* 399 */ + { 38, 13, 12, 0, 0, 38, 0, }, /* 400 */ + { 38, 7, 12, 0, 0, 38, 0, }, /* 401 */ + { 38, 6, 12, 0, 0, 38, 0, }, /* 402 */ + { 35, 7, 12, 0, 0, 35, 0, }, /* 403 */ + { 35, 12, 3, 0, 0, 35, 0, }, /* 404 */ + { 35, 10, 5, 0, 0, 35, 0, }, /* 405 */ + { 35, 26, 12, 0, 0, 35, 0, }, /* 406 */ + { 35, 21, 12, 0, 0, 35, 0, }, /* 407 */ + { 35, 13, 12, 0, 0, 35, 0, }, /* 408 */ + { 53, 7, 12, 0, 0, 53, 0, }, /* 409 */ + { 40, 7, 12, 0, 0, 40, 0, }, /* 410 */ + { 40, 13, 12, 0, 0, 40, 0, }, /* 411 */ + { 40, 15, 12, 0, 0, 40, 0, }, /* 412 */ + { 40, 26, 12, 0, 0, 40, 0, }, /* 413 */ + { 32, 26, 12, 0, 0, 32, 0, }, /* 414 */ + { 6, 7, 12, 0, 0, 6, 0, }, /* 415 */ + { 6, 12, 3, 0, 0, 6, 0, }, /* 416 */ + { 6, 10, 5, 0, 0, 6, 0, }, /* 417 */ + { 6, 21, 12, 0, 0, 6, 0, }, /* 418 */ + { 91, 7, 12, 0, 0, 91, 0, }, /* 419 */ + { 91, 10, 5, 0, 0, 91, 0, }, /* 420 */ + { 91, 12, 3, 0, 0, 91, 0, }, /* 421 */ + { 91, 10, 12, 0, 0, 91, 0, }, /* 422 */ + { 91, 13, 12, 0, 0, 91, 0, }, /* 423 */ + { 91, 21, 12, 0, 0, 91, 0, }, /* 424 */ + { 91, 6, 12, 0, 0, 91, 0, }, /* 425 */ + { 28, 11, 3, 0, 0, 28, 0, }, /* 426 */ + { 62, 12, 3, 0, 0, 62, 0, }, /* 427 */ + { 62, 10, 5, 0, 0, 62, 0, }, /* 428 */ + { 62, 7, 12, 0, 0, 62, 0, }, /* 429 */ + { 62, 10, 3, 0, 0, 62, 0, }, /* 430 */ + { 62, 13, 12, 0, 0, 62, 0, }, /* 431 */ + { 62, 21, 12, 0, 0, 62, 0, }, /* 432 */ + { 62, 26, 12, 0, 0, 62, 0, }, /* 433 */ + { 76, 12, 3, 0, 0, 76, 0, }, /* 434 */ + { 76, 10, 5, 0, 0, 76, 0, }, /* 435 */ + { 76, 7, 12, 0, 0, 76, 0, }, /* 436 */ + { 76, 13, 12, 0, 0, 76, 0, }, /* 437 */ + { 93, 7, 12, 0, 0, 93, 0, }, /* 438 */ + { 93, 12, 3, 0, 0, 93, 0, }, /* 439 */ + { 93, 10, 5, 0, 0, 93, 0, }, /* 440 */ + { 93, 21, 12, 0, 0, 93, 0, }, /* 441 */ + { 70, 7, 12, 0, 0, 70, 0, }, /* 442 */ + { 70, 10, 5, 0, 0, 70, 0, }, /* 443 */ + { 70, 12, 3, 0, 0, 70, 0, }, /* 444 */ + { 70, 21, 12, 0, 0, 70, 0, }, /* 445 */ + { 70, 13, 12, 0, 0, 70, 0, }, /* 446 */ + { 73, 13, 12, 0, 0, 73, 0, }, /* 447 */ + { 73, 7, 12, 0, 0, 73, 0, }, /* 448 */ + { 73, 6, 12, 0, 0, 73, 0, }, /* 449 */ + { 73, 21, 12, 0, 0, 73, 0, }, /* 450 */ + { 13, 5, 12, 63, -6222, 13, 0, }, /* 451 */ + { 13, 5, 12, 67, -6221, 13, 0, }, /* 452 */ + { 13, 5, 12, 71, -6212, 13, 0, }, /* 453 */ + { 13, 5, 12, 75, -6210, 13, 0, }, /* 454 */ + { 13, 5, 12, 79, -6210, 13, 0, }, /* 455 */ + { 13, 5, 12, 79, -6211, 13, 0, }, /* 456 */ + { 13, 5, 12, 84, -6204, 13, 0, }, /* 457 */ + { 13, 5, 12, 88, -6180, 13, 0, }, /* 458 */ + { 13, 5, 12, 108, 35267, 13, 0, }, /* 459 */ + { 17, 9, 12, 0, -3008, 17, 0, }, /* 460 */ + { 76, 21, 12, 0, 0, 76, 0, }, /* 461 */ + { 28, 12, 3, 0, 0, -110, 0, }, /* 462 */ + { 28, 12, 3, 0, 0, 15, 0, }, /* 463 */ + { 10, 21, 12, 0, 0, -37, 0, }, /* 464 */ + { 28, 12, 3, 0, 0, -16, 0, }, /* 465 */ + { 28, 12, 3, 0, 0, -43, 0, }, /* 466 */ + { 28, 12, 3, 0, 0, -138, 0, }, /* 467 */ + { 10, 10, 5, 0, 0, -16, 0, }, /* 468 */ + { 10, 7, 12, 0, 0, -40, 0, }, /* 469 */ + { 10, 7, 12, 0, 0, -16, 0, }, /* 470 */ + { 10, 7, 12, 0, 0, 15, 0, }, /* 471 */ + { 10, 7, 12, 0, 0, -154, 0, }, /* 472 */ + { 10, 7, 12, 0, 0, -37, 0, }, /* 473 */ + { 28, 12, 3, 0, 0, -89, 0, }, /* 474 */ + { 10, 10, 5, 0, 0, 3, 0, }, /* 475 */ + { 28, 12, 3, 0, 0, -37, 0, }, /* 476 */ + { 10, 7, 12, 0, 0, 150, 0, }, /* 477 */ + { 13, 5, 12, 0, 0, 13, 0, }, /* 478 */ + { 13, 6, 12, 0, 0, 13, 0, }, /* 479 */ + { 34, 5, 12, 0, 35332, 34, 0, }, /* 480 */ + { 34, 5, 12, 0, 3814, 34, 0, }, /* 481 */ + { 34, 5, 12, 0, 35384, 34, 0, }, /* 482 */ + { 34, 9, 12, 92, 1, 34, 0, }, /* 483 */ + { 34, 5, 12, 92, -1, 34, 0, }, /* 484 */ + { 34, 5, 12, 92, -58, 34, 0, }, /* 485 */ + { 34, 9, 12, 0, -7615, 34, 0, }, /* 486 */ + { 20, 5, 12, 0, 8, 20, 0, }, /* 487 */ + { 20, 9, 12, 0, -8, 20, 0, }, /* 488 */ + { 20, 5, 12, 0, 74, 20, 0, }, /* 489 */ + { 20, 5, 12, 0, 86, 20, 0, }, /* 490 */ + { 20, 5, 12, 0, 100, 20, 0, }, /* 491 */ + { 20, 5, 12, 0, 128, 20, 0, }, /* 492 */ + { 20, 5, 12, 0, 112, 20, 0, }, /* 493 */ + { 20, 5, 12, 0, 126, 20, 0, }, /* 494 */ + { 20, 8, 12, 0, -8, 20, 0, }, /* 495 */ + { 20, 5, 12, 0, 9, 20, 0, }, /* 496 */ + { 20, 9, 12, 0, -74, 20, 0, }, /* 497 */ + { 20, 8, 12, 0, -9, 20, 0, }, /* 498 */ + { 20, 5, 12, 21, -7173, 20, 0, }, /* 499 */ + { 20, 9, 12, 0, -86, 20, 0, }, /* 500 */ + { 20, 9, 12, 0, -100, 20, 0, }, /* 501 */ + { 20, 9, 12, 0, -112, 20, 0, }, /* 502 */ + { 20, 9, 12, 0, -128, 20, 0, }, /* 503 */ + { 20, 9, 12, 0, -126, 20, 0, }, /* 504 */ + { 28, 1, 3, 0, 0, 28, 0, }, /* 505 */ + { 28, 1, 13, 0, 0, 28, 0, }, /* 506 */ + { 10, 27, 2, 0, 0, 10, 0, }, /* 507 */ + { 10, 28, 2, 0, 0, 10, 0, }, /* 508 */ + { 10, 29, 12, 0, 0, -67, 0, }, /* 509 */ + { 10, 21, 14, 0, 0, 10, 0, }, /* 510 */ + { 0, 2, 2, 0, 0, 0, 0, }, /* 511 */ + { 28, 12, 3, 0, 0, -93, 0, }, /* 512 */ + { 10, 9, 12, 0, 0, 10, 0, }, /* 513 */ + { 10, 5, 12, 0, 0, 10, 0, }, /* 514 */ + { 20, 9, 12, 96, -7517, 20, 0, }, /* 515 */ + { 34, 9, 12, 100, -8383, 34, 0, }, /* 516 */ + { 34, 9, 12, 104, -8262, 34, 0, }, /* 517 */ + { 34, 9, 12, 0, 28, 34, 0, }, /* 518 */ + { 10, 7, 12, 0, 0, 10, 0, }, /* 519 */ + { 10, 5, 14, 0, 0, 10, 0, }, /* 520 */ + { 34, 5, 12, 0, -28, 34, 0, }, /* 521 */ + { 34, 14, 12, 0, 16, 34, 0, }, /* 522 */ + { 34, 14, 12, 0, -16, 34, 0, }, /* 523 */ + { 34, 14, 12, 0, 0, 34, 0, }, /* 524 */ + { 10, 25, 14, 0, 0, 10, 0, }, /* 525 */ + { 10, 26, 12, 0, 26, 10, 0, }, /* 526 */ + { 10, 26, 14, 0, 26, 10, 0, }, /* 527 */ + { 10, 26, 12, 0, -26, 10, 0, }, /* 528 */ + { 5, 26, 12, 0, 0, 5, 0, }, /* 529 */ + { 18, 9, 12, 0, 48, 18, 0, }, /* 530 */ + { 18, 5, 12, 0, -48, 18, 0, }, /* 531 */ + { 34, 9, 12, 0, -10743, 34, 0, }, /* 532 */ + { 34, 9, 12, 0, -3814, 34, 0, }, /* 533 */ + { 34, 9, 12, 0, -10727, 34, 0, }, /* 534 */ + { 34, 5, 12, 0, -10795, 34, 0, }, /* 535 */ + { 34, 5, 12, 0, -10792, 34, 0, }, /* 536 */ + { 34, 9, 12, 0, -10780, 34, 0, }, /* 537 */ + { 34, 9, 12, 0, -10749, 34, 0, }, /* 538 */ + { 34, 9, 12, 0, -10783, 34, 0, }, /* 539 */ + { 34, 9, 12, 0, -10782, 34, 0, }, /* 540 */ + { 34, 9, 12, 0, -10815, 34, 0, }, /* 541 */ + { 11, 5, 12, 0, 0, 11, 0, }, /* 542 */ + { 11, 26, 12, 0, 0, 11, 0, }, /* 543 */ + { 11, 12, 3, 0, 0, 11, 0, }, /* 544 */ + { 11, 21, 12, 0, 0, 11, 0, }, /* 545 */ + { 11, 15, 12, 0, 0, 11, 0, }, /* 546 */ + { 17, 5, 12, 0, -7264, 17, 0, }, /* 547 */ + { 59, 7, 12, 0, 0, 59, 0, }, /* 548 */ + { 59, 6, 12, 0, 0, 59, 0, }, /* 549 */ + { 59, 21, 12, 0, 0, 59, 0, }, /* 550 */ + { 59, 12, 3, 0, 0, 59, 0, }, /* 551 */ + { 13, 12, 3, 0, 0, 13, 0, }, /* 552 */ + { 10, 21, 12, 0, 0, -28, 0, }, /* 553 */ + { 23, 26, 12, 0, 0, 23, 0, }, /* 554 */ + { 10, 21, 12, 0, 0, -131, 0, }, /* 555 */ + { 10, 21, 12, 0, 0, -125, 0, }, /* 556 */ + { 23, 6, 12, 0, 0, 23, 0, }, /* 557 */ + { 10, 7, 12, 0, 0, 23, 0, }, /* 558 */ + { 23, 14, 12, 0, 0, 23, 0, }, /* 559 */ + { 10, 22, 12, 0, 0, -131, 0, }, /* 560 */ + { 10, 18, 12, 0, 0, -131, 0, }, /* 561 */ + { 10, 26, 12, 0, 0, -125, 0, }, /* 562 */ + { 10, 17, 12, 0, 0, -125, 0, }, /* 563 */ + { 10, 22, 12, 0, 0, -125, 0, }, /* 564 */ + { 10, 18, 12, 0, 0, -125, 0, }, /* 565 */ + { 28, 12, 3, 0, 0, -19, 0, }, /* 566 */ + { 24, 10, 3, 0, 0, 24, 0, }, /* 567 */ + { 10, 17, 14, 0, 0, -125, 0, }, /* 568 */ + { 10, 6, 12, 0, 0, -61, 0, }, /* 569 */ + { 10, 7, 12, 0, 0, -97, 0, }, /* 570 */ + { 10, 21, 14, 0, 0, -97, 0, }, /* 571 */ + { 10, 26, 12, 0, 0, 23, 0, }, /* 572 */ + { 27, 7, 12, 0, 0, 27, 0, }, /* 573 */ + { 28, 12, 3, 0, 0, -61, 0, }, /* 574 */ + { 10, 24, 12, 0, 0, -61, 0, }, /* 575 */ + { 27, 6, 12, 0, 0, 27, 0, }, /* 576 */ + { 10, 17, 12, 0, 0, -61, 0, }, /* 577 */ + { 30, 7, 12, 0, 0, 30, 0, }, /* 578 */ + { 30, 6, 12, 0, 0, 30, 0, }, /* 579 */ + { 4, 7, 12, 0, 0, 4, 0, }, /* 580 */ + { 24, 7, 12, 0, 0, 24, 0, }, /* 581 */ + { 10, 15, 12, 0, 0, 23, 0, }, /* 582 */ + { 24, 26, 12, 0, 0, 24, 0, }, /* 583 */ + { 10, 26, 14, 0, 0, 23, 0, }, /* 584 */ + { 30, 26, 12, 0, 0, 30, 0, }, /* 585 */ + { 23, 7, 12, 0, 0, 23, 0, }, /* 586 */ + { 61, 7, 12, 0, 0, 61, 0, }, /* 587 */ + { 61, 6, 12, 0, 0, 61, 0, }, /* 588 */ + { 61, 26, 12, 0, 0, 61, 0, }, /* 589 */ + { 86, 7, 12, 0, 0, 86, 0, }, /* 590 */ + { 86, 6, 12, 0, 0, 86, 0, }, /* 591 */ + { 86, 21, 12, 0, 0, 86, 0, }, /* 592 */ + { 77, 7, 12, 0, 0, 77, 0, }, /* 593 */ + { 77, 6, 12, 0, 0, 77, 0, }, /* 594 */ + { 77, 21, 12, 0, 0, 77, 0, }, /* 595 */ + { 77, 13, 12, 0, 0, 77, 0, }, /* 596 */ + { 13, 9, 12, 108, 1, 13, 0, }, /* 597 */ + { 13, 5, 12, 108, -35267, 13, 0, }, /* 598 */ + { 13, 7, 12, 0, 0, 13, 0, }, /* 599 */ + { 13, 21, 12, 0, 0, 13, 0, }, /* 600 */ + { 79, 7, 12, 0, 0, 79, 0, }, /* 601 */ + { 79, 14, 12, 0, 0, 79, 0, }, /* 602 */ + { 79, 12, 3, 0, 0, 79, 0, }, /* 603 */ + { 79, 21, 12, 0, 0, 79, 0, }, /* 604 */ + { 34, 9, 12, 0, -35332, 34, 0, }, /* 605 */ + { 34, 9, 12, 0, -42280, 34, 0, }, /* 606 */ + { 34, 5, 12, 0, 48, 34, 0, }, /* 607 */ + { 34, 9, 12, 0, -42308, 34, 0, }, /* 608 */ + { 34, 9, 12, 0, -42319, 34, 0, }, /* 609 */ + { 34, 9, 12, 0, -42315, 34, 0, }, /* 610 */ + { 34, 9, 12, 0, -42305, 34, 0, }, /* 611 */ + { 34, 9, 12, 0, -42258, 34, 0, }, /* 612 */ + { 34, 9, 12, 0, -42282, 34, 0, }, /* 613 */ + { 34, 9, 12, 0, -42261, 34, 0, }, /* 614 */ + { 34, 9, 12, 0, 928, 34, 0, }, /* 615 */ + { 34, 9, 12, 0, -48, 34, 0, }, /* 616 */ + { 34, 9, 12, 0, -42307, 34, 0, }, /* 617 */ + { 34, 9, 12, 0, -35384, 34, 0, }, /* 618 */ + { 49, 7, 12, 0, 0, 49, 0, }, /* 619 */ + { 49, 12, 3, 0, 0, 49, 0, }, /* 620 */ + { 49, 10, 5, 0, 0, 49, 0, }, /* 621 */ + { 49, 26, 12, 0, 0, 49, 0, }, /* 622 */ + { 10, 15, 12, 0, 0, -216, 0, }, /* 623 */ + { 10, 15, 12, 0, 0, -202, 0, }, /* 624 */ + { 10, 26, 12, 0, 0, -163, 0, }, /* 625 */ + { 10, 23, 12, 0, 0, -163, 0, }, /* 626 */ + { 65, 7, 12, 0, 0, 65, 0, }, /* 627 */ + { 65, 21, 12, 0, 0, 65, 0, }, /* 628 */ + { 75, 10, 5, 0, 0, 75, 0, }, /* 629 */ + { 75, 7, 12, 0, 0, 75, 0, }, /* 630 */ + { 75, 12, 3, 0, 0, 75, 0, }, /* 631 */ + { 75, 21, 12, 0, 0, 75, 0, }, /* 632 */ + { 75, 13, 12, 0, 0, 75, 0, }, /* 633 */ + { 15, 12, 3, 0, 0, -16, 0, }, /* 634 */ + { 15, 7, 12, 0, 0, -46, 0, }, /* 635 */ + { 69, 13, 12, 0, 0, 69, 0, }, /* 636 */ + { 69, 7, 12, 0, 0, 69, 0, }, /* 637 */ + { 69, 12, 3, 0, 0, 69, 0, }, /* 638 */ + { 10, 21, 12, 0, 0, -101, 0, }, /* 639 */ + { 69, 21, 12, 0, 0, 69, 0, }, /* 640 */ + { 74, 7, 12, 0, 0, 74, 0, }, /* 641 */ + { 74, 12, 3, 0, 0, 74, 0, }, /* 642 */ + { 74, 10, 5, 0, 0, 74, 0, }, /* 643 */ + { 74, 21, 12, 0, 0, 74, 0, }, /* 644 */ + { 84, 12, 3, 0, 0, 84, 0, }, /* 645 */ + { 84, 10, 5, 0, 0, 84, 0, }, /* 646 */ + { 84, 7, 12, 0, 0, 84, 0, }, /* 647 */ + { 84, 21, 12, 0, 0, 84, 0, }, /* 648 */ + { 10, 6, 12, 0, 0, -22, 0, }, /* 649 */ + { 84, 13, 12, 0, 0, 84, 0, }, /* 650 */ + { 39, 6, 12, 0, 0, 39, 0, }, /* 651 */ + { 68, 7, 12, 0, 0, 68, 0, }, /* 652 */ + { 68, 12, 3, 0, 0, 68, 0, }, /* 653 */ + { 68, 10, 5, 0, 0, 68, 0, }, /* 654 */ + { 68, 13, 12, 0, 0, 68, 0, }, /* 655 */ + { 68, 21, 12, 0, 0, 68, 0, }, /* 656 */ + { 92, 7, 12, 0, 0, 92, 0, }, /* 657 */ + { 92, 12, 3, 0, 0, 92, 0, }, /* 658 */ + { 92, 6, 12, 0, 0, 92, 0, }, /* 659 */ + { 92, 21, 12, 0, 0, 92, 0, }, /* 660 */ + { 87, 7, 12, 0, 0, 87, 0, }, /* 661 */ + { 87, 10, 5, 0, 0, 87, 0, }, /* 662 */ + { 87, 12, 3, 0, 0, 87, 0, }, /* 663 */ + { 87, 21, 12, 0, 0, 87, 0, }, /* 664 */ + { 87, 6, 12, 0, 0, 87, 0, }, /* 665 */ + { 34, 5, 12, 0, -928, 34, 0, }, /* 666 */ + { 9, 5, 12, 0, -38864, 9, 0, }, /* 667 */ + { 87, 13, 12, 0, 0, 87, 0, }, /* 668 */ + { 24, 7, 9, 0, 0, 24, 0, }, /* 669 */ + { 24, 7, 10, 0, 0, 24, 0, }, /* 670 */ + { 0, 4, 12, 0, 0, 0, 0, }, /* 671 */ + { 0, 3, 12, 0, 0, 0, 0, }, /* 672 */ + { 26, 25, 12, 0, 0, 26, 0, }, /* 673 */ + { 1, 24, 12, 0, 0, 1, 0, }, /* 674 */ + { 1, 7, 12, 0, 0, -10, 0, }, /* 675 */ + { 1, 26, 12, 0, 0, -10, 0, }, /* 676 */ + { 10, 6, 3, 0, 0, -61, 0, }, /* 677 */ + { 36, 7, 12, 0, 0, 36, 0, }, /* 678 */ + { 10, 21, 12, 0, 0, -25, 0, }, /* 679 */ + { 10, 15, 12, 0, 0, -85, 0, }, /* 680 */ + { 10, 26, 12, 0, 0, -25, 0, }, /* 681 */ + { 20, 14, 12, 0, 0, 20, 0, }, /* 682 */ + { 20, 15, 12, 0, 0, 20, 0, }, /* 683 */ + { 20, 26, 12, 0, 0, 20, 0, }, /* 684 */ + { 71, 7, 12, 0, 0, 71, 0, }, /* 685 */ + { 67, 7, 12, 0, 0, 67, 0, }, /* 686 */ + { 28, 12, 3, 0, 0, -1, 0, }, /* 687 */ + { 10, 15, 12, 0, 0, -1, 0, }, /* 688 */ + { 42, 7, 12, 0, 0, 42, 0, }, /* 689 */ + { 42, 15, 12, 0, 0, 42, 0, }, /* 690 */ + { 19, 7, 12, 0, 0, 19, 0, }, /* 691 */ + { 19, 14, 12, 0, 0, 19, 0, }, /* 692 */ + { 118, 7, 12, 0, 0, 118, 0, }, /* 693 */ + { 118, 12, 3, 0, 0, 118, 0, }, /* 694 */ + { 60, 7, 12, 0, 0, 60, 0, }, /* 695 */ + { 60, 21, 12, 0, 0, 60, 0, }, /* 696 */ + { 43, 7, 12, 0, 0, 43, 0, }, /* 697 */ + { 43, 21, 12, 0, 0, 43, 0, }, /* 698 */ + { 43, 14, 12, 0, 0, 43, 0, }, /* 699 */ + { 14, 9, 12, 0, 40, 14, 0, }, /* 700 */ + { 14, 5, 12, 0, -40, 14, 0, }, /* 701 */ + { 47, 7, 12, 0, 0, 47, 0, }, /* 702 */ + { 45, 7, 12, 0, 0, 45, 0, }, /* 703 */ + { 45, 13, 12, 0, 0, 45, 0, }, /* 704 */ + { 136, 9, 12, 0, 40, 136, 0, }, /* 705 */ + { 136, 5, 12, 0, -40, 136, 0, }, /* 706 */ + { 106, 7, 12, 0, 0, 106, 0, }, /* 707 */ + { 104, 7, 12, 0, 0, 104, 0, }, /* 708 */ + { 104, 21, 12, 0, 0, 104, 0, }, /* 709 */ + { 110, 7, 12, 0, 0, 110, 0, }, /* 710 */ + { 12, 7, 12, 0, 0, 12, 0, }, /* 711 */ + { 81, 7, 12, 0, 0, 81, 0, }, /* 712 */ + { 81, 21, 12, 0, 0, 81, 0, }, /* 713 */ + { 81, 15, 12, 0, 0, 81, 0, }, /* 714 */ + { 120, 7, 12, 0, 0, 120, 0, }, /* 715 */ + { 120, 26, 12, 0, 0, 120, 0, }, /* 716 */ + { 120, 15, 12, 0, 0, 120, 0, }, /* 717 */ + { 116, 7, 12, 0, 0, 116, 0, }, /* 718 */ + { 116, 15, 12, 0, 0, 116, 0, }, /* 719 */ + { 128, 7, 12, 0, 0, 128, 0, }, /* 720 */ + { 128, 15, 12, 0, 0, 128, 0, }, /* 721 */ + { 66, 7, 12, 0, 0, 66, 0, }, /* 722 */ + { 66, 15, 12, 0, 0, 66, 0, }, /* 723 */ + { 66, 21, 12, 0, 0, 66, 0, }, /* 724 */ + { 72, 7, 12, 0, 0, 72, 0, }, /* 725 */ + { 72, 21, 12, 0, 0, 72, 0, }, /* 726 */ + { 98, 7, 12, 0, 0, 98, 0, }, /* 727 */ + { 97, 7, 12, 0, 0, 97, 0, }, /* 728 */ + { 97, 15, 12, 0, 0, 97, 0, }, /* 729 */ + { 31, 7, 12, 0, 0, 31, 0, }, /* 730 */ + { 31, 12, 3, 0, 0, 31, 0, }, /* 731 */ + { 31, 15, 12, 0, 0, 31, 0, }, /* 732 */ + { 31, 21, 12, 0, 0, 31, 0, }, /* 733 */ + { 88, 7, 12, 0, 0, 88, 0, }, /* 734 */ + { 88, 15, 12, 0, 0, 88, 0, }, /* 735 */ + { 88, 21, 12, 0, 0, 88, 0, }, /* 736 */ + { 117, 7, 12, 0, 0, 117, 0, }, /* 737 */ + { 117, 15, 12, 0, 0, 117, 0, }, /* 738 */ + { 112, 7, 12, 0, 0, 112, 0, }, /* 739 */ + { 112, 26, 12, 0, 0, 112, 0, }, /* 740 */ + { 112, 12, 3, 0, 0, 112, 0, }, /* 741 */ + { 112, 15, 12, 0, 0, 112, 0, }, /* 742 */ + { 112, 21, 12, 0, 0, 112, 0, }, /* 743 */ + { 78, 7, 12, 0, 0, 78, 0, }, /* 744 */ + { 78, 21, 12, 0, 0, 78, 0, }, /* 745 */ + { 83, 7, 12, 0, 0, 83, 0, }, /* 746 */ + { 83, 15, 12, 0, 0, 83, 0, }, /* 747 */ + { 82, 7, 12, 0, 0, 82, 0, }, /* 748 */ + { 82, 15, 12, 0, 0, 82, 0, }, /* 749 */ + { 121, 7, 12, 0, 0, 121, 0, }, /* 750 */ + { 121, 21, 12, 0, 0, 121, 0, }, /* 751 */ + { 121, 15, 12, 0, 0, 121, 0, }, /* 752 */ + { 89, 7, 12, 0, 0, 89, 0, }, /* 753 */ + { 130, 9, 12, 0, 64, 130, 0, }, /* 754 */ + { 130, 5, 12, 0, -64, 130, 0, }, /* 755 */ + { 130, 15, 12, 0, 0, 130, 0, }, /* 756 */ + { 144, 7, 12, 0, 0, 144, 0, }, /* 757 */ + { 144, 12, 3, 0, 0, 144, 0, }, /* 758 */ + { 144, 13, 12, 0, 0, 144, 0, }, /* 759 */ + { 1, 15, 12, 0, 0, 1, 0, }, /* 760 */ + { 147, 7, 12, 0, 0, 147, 0, }, /* 761 */ + { 147, 15, 12, 0, 0, 147, 0, }, /* 762 */ + { 148, 7, 12, 0, 0, 148, 0, }, /* 763 */ + { 148, 12, 3, 0, 0, 148, 0, }, /* 764 */ + { 148, 15, 12, 0, 0, 148, 0, }, /* 765 */ + { 148, 21, 12, 0, 0, 148, 0, }, /* 766 */ + { 149, 7, 12, 0, 0, 149, 0, }, /* 767 */ + { 94, 10, 5, 0, 0, 94, 0, }, /* 768 */ + { 94, 12, 3, 0, 0, 94, 0, }, /* 769 */ + { 94, 7, 12, 0, 0, 94, 0, }, /* 770 */ + { 94, 21, 12, 0, 0, 94, 0, }, /* 771 */ + { 94, 15, 12, 0, 0, 94, 0, }, /* 772 */ + { 94, 13, 12, 0, 0, 94, 0, }, /* 773 */ + { 85, 12, 3, 0, 0, 85, 0, }, /* 774 */ + { 85, 10, 5, 0, 0, 85, 0, }, /* 775 */ + { 85, 7, 12, 0, 0, 85, 0, }, /* 776 */ + { 85, 21, 12, 0, 0, 85, 0, }, /* 777 */ + { 85, 1, 4, 0, 0, 85, 0, }, /* 778 */ + { 101, 7, 12, 0, 0, 101, 0, }, /* 779 */ + { 101, 13, 12, 0, 0, 101, 0, }, /* 780 */ + { 96, 12, 3, 0, 0, 96, 0, }, /* 781 */ + { 96, 7, 12, 0, 0, 96, 0, }, /* 782 */ + { 96, 10, 5, 0, 0, 96, 0, }, /* 783 */ + { 96, 13, 12, 0, 0, 96, 0, }, /* 784 */ + { 96, 21, 12, 0, 0, 96, 0, }, /* 785 */ + { 111, 7, 12, 0, 0, 111, 0, }, /* 786 */ + { 111, 12, 3, 0, 0, 111, 0, }, /* 787 */ + { 111, 21, 12, 0, 0, 111, 0, }, /* 788 */ + { 100, 12, 3, 0, 0, 100, 0, }, /* 789 */ + { 100, 10, 5, 0, 0, 100, 0, }, /* 790 */ + { 100, 7, 12, 0, 0, 100, 0, }, /* 791 */ + { 100, 7, 4, 0, 0, 100, 0, }, /* 792 */ + { 100, 21, 12, 0, 0, 100, 0, }, /* 793 */ + { 100, 13, 12, 0, 0, 100, 0, }, /* 794 */ + { 48, 15, 12, 0, 0, 48, 0, }, /* 795 */ + { 108, 7, 12, 0, 0, 108, 0, }, /* 796 */ + { 108, 10, 5, 0, 0, 108, 0, }, /* 797 */ + { 108, 12, 3, 0, 0, 108, 0, }, /* 798 */ + { 108, 21, 12, 0, 0, 108, 0, }, /* 799 */ + { 129, 7, 12, 0, 0, 129, 0, }, /* 800 */ + { 129, 21, 12, 0, 0, 129, 0, }, /* 801 */ + { 109, 7, 12, 0, 0, 109, 0, }, /* 802 */ + { 109, 12, 3, 0, 0, 109, 0, }, /* 803 */ + { 109, 10, 5, 0, 0, 109, 0, }, /* 804 */ + { 109, 13, 12, 0, 0, 109, 0, }, /* 805 */ + { 107, 12, 3, 0, 0, 107, 0, }, /* 806 */ + { 107, 12, 3, 0, 0, -52, 0, }, /* 807 */ + { 107, 10, 5, 0, 0, 107, 0, }, /* 808 */ + { 107, 10, 5, 0, 0, -52, 0, }, /* 809 */ + { 107, 7, 12, 0, 0, 107, 0, }, /* 810 */ + { 28, 12, 3, 0, 0, -52, 0, }, /* 811 */ + { 107, 10, 3, 0, 0, 107, 0, }, /* 812 */ + { 135, 7, 12, 0, 0, 135, 0, }, /* 813 */ + { 135, 10, 5, 0, 0, 135, 0, }, /* 814 */ + { 135, 12, 3, 0, 0, 135, 0, }, /* 815 */ + { 135, 21, 12, 0, 0, 135, 0, }, /* 816 */ + { 135, 13, 12, 0, 0, 135, 0, }, /* 817 */ + { 124, 7, 12, 0, 0, 124, 0, }, /* 818 */ + { 124, 10, 3, 0, 0, 124, 0, }, /* 819 */ + { 124, 10, 5, 0, 0, 124, 0, }, /* 820 */ + { 124, 12, 3, 0, 0, 124, 0, }, /* 821 */ + { 124, 21, 12, 0, 0, 124, 0, }, /* 822 */ + { 124, 13, 12, 0, 0, 124, 0, }, /* 823 */ + { 123, 7, 12, 0, 0, 123, 0, }, /* 824 */ + { 123, 10, 3, 0, 0, 123, 0, }, /* 825 */ + { 123, 10, 5, 0, 0, 123, 0, }, /* 826 */ + { 123, 12, 3, 0, 0, 123, 0, }, /* 827 */ + { 123, 21, 12, 0, 0, 123, 0, }, /* 828 */ + { 114, 7, 12, 0, 0, 114, 0, }, /* 829 */ + { 114, 10, 5, 0, 0, 114, 0, }, /* 830 */ + { 114, 12, 3, 0, 0, 114, 0, }, /* 831 */ + { 114, 21, 12, 0, 0, 114, 0, }, /* 832 */ + { 114, 13, 12, 0, 0, 114, 0, }, /* 833 */ + { 102, 7, 12, 0, 0, 102, 0, }, /* 834 */ + { 102, 12, 3, 0, 0, 102, 0, }, /* 835 */ + { 102, 10, 5, 0, 0, 102, 0, }, /* 836 */ + { 102, 13, 12, 0, 0, 102, 0, }, /* 837 */ + { 126, 7, 12, 0, 0, 126, 0, }, /* 838 */ + { 126, 12, 3, 0, 0, 126, 0, }, /* 839 */ + { 126, 10, 5, 0, 0, 126, 0, }, /* 840 */ + { 126, 13, 12, 0, 0, 126, 0, }, /* 841 */ + { 126, 15, 12, 0, 0, 126, 0, }, /* 842 */ + { 126, 21, 12, 0, 0, 126, 0, }, /* 843 */ + { 126, 26, 12, 0, 0, 126, 0, }, /* 844 */ + { 142, 7, 12, 0, 0, 142, 0, }, /* 845 */ + { 142, 10, 5, 0, 0, 142, 0, }, /* 846 */ + { 142, 12, 3, 0, 0, 142, 0, }, /* 847 */ + { 142, 21, 12, 0, 0, 142, 0, }, /* 848 */ + { 125, 9, 12, 0, 32, 125, 0, }, /* 849 */ + { 125, 5, 12, 0, -32, 125, 0, }, /* 850 */ + { 125, 13, 12, 0, 0, 125, 0, }, /* 851 */ + { 125, 15, 12, 0, 0, 125, 0, }, /* 852 */ + { 125, 7, 12, 0, 0, 125, 0, }, /* 853 */ + { 150, 7, 12, 0, 0, 150, 0, }, /* 854 */ + { 150, 10, 5, 0, 0, 150, 0, }, /* 855 */ + { 150, 12, 3, 0, 0, 150, 0, }, /* 856 */ + { 150, 21, 12, 0, 0, 150, 0, }, /* 857 */ + { 141, 7, 12, 0, 0, 141, 0, }, /* 858 */ + { 141, 12, 3, 0, 0, 141, 0, }, /* 859 */ + { 141, 10, 5, 0, 0, 141, 0, }, /* 860 */ + { 141, 7, 4, 0, 0, 141, 0, }, /* 861 */ + { 141, 21, 12, 0, 0, 141, 0, }, /* 862 */ + { 140, 7, 12, 0, 0, 140, 0, }, /* 863 */ + { 140, 12, 3, 0, 0, 140, 0, }, /* 864 */ + { 140, 10, 5, 0, 0, 140, 0, }, /* 865 */ + { 140, 7, 4, 0, 0, 140, 0, }, /* 866 */ + { 140, 21, 12, 0, 0, 140, 0, }, /* 867 */ + { 122, 7, 12, 0, 0, 122, 0, }, /* 868 */ + { 133, 7, 12, 0, 0, 133, 0, }, /* 869 */ + { 133, 10, 5, 0, 0, 133, 0, }, /* 870 */ + { 133, 12, 3, 0, 0, 133, 0, }, /* 871 */ + { 133, 21, 12, 0, 0, 133, 0, }, /* 872 */ + { 133, 13, 12, 0, 0, 133, 0, }, /* 873 */ + { 133, 15, 12, 0, 0, 133, 0, }, /* 874 */ + { 134, 21, 12, 0, 0, 134, 0, }, /* 875 */ + { 134, 7, 12, 0, 0, 134, 0, }, /* 876 */ + { 134, 12, 3, 0, 0, 134, 0, }, /* 877 */ + { 134, 10, 5, 0, 0, 134, 0, }, /* 878 */ + { 138, 7, 12, 0, 0, 138, 0, }, /* 879 */ + { 138, 12, 3, 0, 0, 138, 0, }, /* 880 */ + { 138, 7, 4, 0, 0, 138, 0, }, /* 881 */ + { 138, 13, 12, 0, 0, 138, 0, }, /* 882 */ + { 143, 7, 12, 0, 0, 143, 0, }, /* 883 */ + { 143, 10, 5, 0, 0, 143, 0, }, /* 884 */ + { 143, 12, 3, 0, 0, 143, 0, }, /* 885 */ + { 143, 13, 12, 0, 0, 143, 0, }, /* 886 */ + { 145, 7, 12, 0, 0, 145, 0, }, /* 887 */ + { 145, 12, 3, 0, 0, 145, 0, }, /* 888 */ + { 145, 10, 5, 0, 0, 145, 0, }, /* 889 */ + { 145, 21, 12, 0, 0, 145, 0, }, /* 890 */ + { 54, 15, 12, 0, 0, 54, 0, }, /* 891 */ + { 54, 21, 12, 0, 0, 54, 0, }, /* 892 */ + { 63, 7, 12, 0, 0, 63, 0, }, /* 893 */ + { 63, 14, 12, 0, 0, 63, 0, }, /* 894 */ + { 63, 21, 12, 0, 0, 63, 0, }, /* 895 */ + { 80, 7, 12, 0, 0, 80, 0, }, /* 896 */ + { 80, 1, 2, 0, 0, 80, 0, }, /* 897 */ + { 127, 7, 12, 0, 0, 127, 0, }, /* 898 */ + { 115, 7, 12, 0, 0, 115, 0, }, /* 899 */ + { 115, 13, 12, 0, 0, 115, 0, }, /* 900 */ + { 115, 21, 12, 0, 0, 115, 0, }, /* 901 */ + { 103, 7, 12, 0, 0, 103, 0, }, /* 902 */ + { 103, 12, 3, 0, 0, 103, 0, }, /* 903 */ + { 103, 21, 12, 0, 0, 103, 0, }, /* 904 */ + { 119, 7, 12, 0, 0, 119, 0, }, /* 905 */ + { 119, 12, 3, 0, 0, 119, 0, }, /* 906 */ + { 119, 21, 12, 0, 0, 119, 0, }, /* 907 */ + { 119, 26, 12, 0, 0, 119, 0, }, /* 908 */ + { 119, 6, 12, 0, 0, 119, 0, }, /* 909 */ + { 119, 13, 12, 0, 0, 119, 0, }, /* 910 */ + { 119, 15, 12, 0, 0, 119, 0, }, /* 911 */ + { 146, 9, 12, 0, 32, 146, 0, }, /* 912 */ + { 146, 5, 12, 0, -32, 146, 0, }, /* 913 */ + { 146, 15, 12, 0, 0, 146, 0, }, /* 914 */ + { 146, 21, 12, 0, 0, 146, 0, }, /* 915 */ + { 99, 7, 12, 0, 0, 99, 0, }, /* 916 */ + { 99, 12, 3, 0, 0, 99, 0, }, /* 917 */ + { 99, 10, 5, 0, 0, 99, 0, }, /* 918 */ + { 99, 6, 12, 0, 0, 99, 0, }, /* 919 */ + { 137, 6, 12, 0, 0, 137, 0, }, /* 920 */ + { 139, 6, 12, 0, 0, 139, 0, }, /* 921 */ + { 137, 7, 12, 0, 0, 137, 0, }, /* 922 */ + { 139, 7, 12, 0, 0, 139, 0, }, /* 923 */ + { 105, 7, 12, 0, 0, 105, 0, }, /* 924 */ + { 105, 26, 12, 0, 0, 105, 0, }, /* 925 */ + { 105, 12, 3, 0, 0, 105, 0, }, /* 926 */ + { 105, 21, 12, 0, 0, 105, 0, }, /* 927 */ + { 10, 1, 2, 0, 0, 105, 0, }, /* 928 */ + { 10, 10, 3, 0, 0, 10, 0, }, /* 929 */ + { 10, 10, 5, 0, 0, 10, 0, }, /* 930 */ + { 20, 12, 3, 0, 0, 20, 0, }, /* 931 */ + { 131, 26, 12, 0, 0, 131, 0, }, /* 932 */ + { 131, 12, 3, 0, 0, 131, 0, }, /* 933 */ + { 131, 21, 12, 0, 0, 131, 0, }, /* 934 */ + { 18, 12, 3, 0, 0, 18, 0, }, /* 935 */ + { 151, 7, 12, 0, 0, 151, 0, }, /* 936 */ + { 151, 12, 3, 0, 0, 151, 0, }, /* 937 */ + { 151, 6, 12, 0, 0, 151, 0, }, /* 938 */ + { 151, 13, 12, 0, 0, 151, 0, }, /* 939 */ + { 151, 26, 12, 0, 0, 151, 0, }, /* 940 */ + { 152, 7, 12, 0, 0, 152, 0, }, /* 941 */ + { 152, 12, 3, 0, 0, 152, 0, }, /* 942 */ + { 152, 13, 12, 0, 0, 152, 0, }, /* 943 */ + { 152, 23, 12, 0, 0, 152, 0, }, /* 944 */ + { 113, 7, 12, 0, 0, 113, 0, }, /* 945 */ + { 113, 15, 12, 0, 0, 113, 0, }, /* 946 */ + { 113, 12, 3, 0, 0, 113, 0, }, /* 947 */ + { 132, 9, 12, 0, 34, 132, 0, }, /* 948 */ + { 132, 5, 12, 0, -34, 132, 0, }, /* 949 */ + { 132, 12, 3, 0, 0, 132, 0, }, /* 950 */ + { 132, 6, 12, 0, 0, 132, 0, }, /* 951 */ + { 132, 13, 12, 0, 0, 132, 0, }, /* 952 */ + { 132, 21, 12, 0, 0, 132, 0, }, /* 953 */ + { 0, 2, 14, 0, 0, 0, 0, }, /* 954 */ + { 10, 26, 11, 0, 0, 10, 0, }, /* 955 */ + { 27, 26, 12, 0, 0, 27, 0, }, /* 956 */ + { 10, 24, 3, 0, 0, 10, 0, }, /* 957 */ + { 10, 1, 3, 0, 0, 10, 0, }, /* 958 */ }; const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ @@ -1150,37 +1185,37 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 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 */ +151,152,153,154,155,156,157,158,159,160,161,142,162,142,163,164, /* U+10800 */ +165,166,167,168,169,170,171,142,172,173,142,174,175,176,177,142, /* U+11000 */ +178,179,142,180,181,182,142,142,183,184,185,186,142,187,142,188, /* U+11800 */ +189,189,189,189,189,189,189,190,191,189,192,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 */ +193,193,193,193,193,193,193,193,194,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,195,195,195,195,196,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 */ +197,197,197,197,198,199,200,201,142,142,142,142,202,203,204,205, /* U+16800 */ +206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206, /* U+17000 */ +206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206, /* U+17800 */ +206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,207, /* U+18000 */ +206,206,206,206,206,208,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 */ +209,210,211,212,212,213,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */ +142,142,142,142,142,142,142,142,214,215,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 */ + 71,216,217,218,219,220,221,142,222,223,224,225,226,227,228,229, /* U+1D000 */ +230,230,230,230,231,232,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */ +233,142,234,142,142,235,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */ +236,237,238,142,142,142,142,142,239,240,241,142,242,243,142,142, /* U+1E800 */ +244,245,246,247,248,249,250,251,250,250,252,250,253,254,255,256, /* U+1F000 */ +257,258,259,260,261,262,249,249,249,249,249,249,249,249,249,263, /* 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 */ @@ -1201,18 +1236,18 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 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,264, 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,265, 98, /* U+2B000 */ +266, 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,267, 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 */ + 98, 98, 98, 98, 98, 98, 98,268,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 */ + 98, 98, 98, 98,269,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 */ @@ -1565,8 +1600,8 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 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 */ +270,271,272,273,271,271,271,271,271,271,271,271,271,271,271,271, /* U+E0000 */ +271,271,271,271,271,271,271,271,271,271,271,271,271,271,271,271, /* 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 */ @@ -1628,7 +1663,7 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 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,274, /* 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 */ @@ -1660,10 +1695,10 @@ const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */ 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 */ +126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,274, /* U+10F800 */ }; -const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ +const uint16_t PRIV(ucd_stage2)[] = { /* 70400 bytes, block = 128 */ /* block 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, @@ -1715,534 +1750,534 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 35, 97, 98, 35, 35, 99, 35, 35, 35, 35, 35, 35, 35,100, 35, 35, /* block 5 */ -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, +101, 35,102,101, 35, 35, 35,103,101,104,105,105,106, 35, 35, 35, + 35, 35,107, 35, 22, 35, 35, 35, 35, 35, 35, 35, 35,108,109, 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, +110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111, +111,111, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111,111, +111,111, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +110,110,110,110,110, 15, 15, 15, 15, 15,112,112,111, 15,111, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, /* block 6 */ -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,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, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,114,113,113,115,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,116,116,116,116,116,116,116,116,116,116,116,116,116, +117,118,117,118,111,119,117,118,120,120,121,122,122,122, 5,123, /* block 7 */ -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, +120,120,120,120,119, 15,124, 5,125,125,125,120,126,120,127,127, +128,129,130,129,129,131,129,129,132,133,134,129,135,129,129,129, +136,137,120,138,129,129,139,129,129,140,129,129,141,142,142,142, +128,143,144,143,143,145,143,143,146,147,148,143,149,143,143,143, +150,151,152,153,143,143,154,143,143,155,143,143,156,157,157,158, +159,160,161,161,161,162,163,164,117,118,117,118,117,118,117,118, +117,118,165,166,165,166,165,166,165,166,165,166,165,166,165,166, +167,168,169,170,171,172,173,117,118,174,117,118,128,175,175,175, /* block 8 */ -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, +176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176, +177,177,178,177,179,177,177,177,177,177,177,177,177,177,180,177, +177,181,182,177,177,177,177,177,177,177,183,177,177,177,177,177, +184,184,185,184,186,184,184,184,184,184,184,184,184,184,187,184, +184,188,189,184,184,184,184,184,184,184,190,184,184,184,184,184, +191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, +192,193,194,195,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, /* block 9 */ -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, +192,193,196,197,198,199,199,198,200,200,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +201,192,193,192,193,192,193,192,193,192,193,192,193,192,193,202, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, /* block 10 */ -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, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +120,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203, +203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203, +203,203,203,203,203,203,203,120,120,204,205,205,205,205,205,205, +206,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207, +207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207, /* block 11 */ -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, +207,207,207,207,207,207,207,206,206,208,209,120,120,210,210,211, +120,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212, +212,212,212,212,212,212,212,212,212,212,212,212,212,212,212,212, +212,212,212,212,212,212,212,212,212,212,212,212,212,212,213,212, +214,212,212,214,212,212,214,212,120,120,120,120,120,120,120,120, +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,120,120,120,120,215, +215,215,215,214,214,120,120,120,120,120,120,120,120,120,120,120, /* block 12 */ -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, +216,216,216,216,216,217,218,218,218,219,219,220,221,219,222,222, +223,223,223,223,223,223,223,223,223,223,223,221,224,120,219,221, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +226,225,225,225,225,225,225,225,225,225,225,227,227,227,227,227, +227,227,227,227,227,227,223,223,223,223,223,223,223,223,223,223, +228,228,228,228,228,228,228,228,228,228,219,219,219,219,225,225, +227,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 13 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,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, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,229,225,223,223,223,223,223,223,223,217,222,223, +223,223,223,223,223,230,230,223,223,222,223,223,223,223,225,225, +231,231,231,231,231,231,231,231,231,231,225,225,225,222,222,225, /* block 14 */ -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, +232,232,232,232,232,232,232,232,232,232,232,232,232,232,120,233, +234,235,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,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, +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,120,120,234,234,234, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* 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, +236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236, +236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236, +236,236,236,236,236,236,237,237,237,237,237,237,237,237,237,237, +237,236,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,239, +239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239, +239,239,239,239,239,239,239,239,239,239,239,240,240,240,240,240, +240,240,240,240,241,241,242,243,243,243,241,120,120,240,244,244, /* block 16 */ -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, +245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245, +245,245,245,245,245,245,246,246,246,246,247,246,246,246,246,246, +246,246,246,246,247,246,246,246,247,246,246,246,246,246,120,120, +248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,120, +249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249, +249,249,249,249,249,249,249,249,249,250,250,250,120,120,251,120, +234,234,234,234,234,234,234,234,234,234,234,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 17 */ -119,119,119,119,119,119,119,119,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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,120,225,225,225,225,225,225,225,225,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,223,223,223,223,223,223,223,223,223,223,223,223,223, +223,223,217,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,223,223, /* block 18 */ -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, +252,252,252,253,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254, +254,254,254,254,254,254,254,254,254,254,252,253,252,254,253,253, +253,252,252,252,252,252,252,252,252,253,253,253,253,252,253,253, +254,255,256,113,113,252,252,252,254,254,254,254,254,254,254,254, +254,254,252,252,257,258,259,259,259,259,259,259,259,259,259,259, +260,261,254,254,254,254,254,254,254,254,254,254,254,254,254,254, /* block 19 */ -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, +262,263,264,264,120,262,262,262,262,262,262,262,262,120,120,262, +262,120,120,262,262,262,262,262,262,262,262,262,262,262,262,262, +262,262,262,262,262,262,262,262,262,120,262,262,262,262,262,262, +262,120,262,120,120,120,262,262,262,262,120,120,263,262,265,264, +264,263,263,263,263,120,120,264,264,120,120,264,264,263,262,120, +120,120,120,120,120,120,120,265,120,120,120,120,262,262,120,262, +262,262,263,263,120,120,266,266,266,266,266,266,266,266,266,266, +262,262,267,267,268,268,268,268,268,268,269,267,262,270,263,120, /* block 20 */ -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, +120,271,271,272,120,273,273,273,273,273,273,120,120,120,120,273, +273,120,120,273,273,273,273,273,273,273,273,273,273,273,273,273, +273,273,273,273,273,273,273,273,273,120,273,273,273,273,273,273, +273,120,273,273,120,273,273,120,273,273,120,120,271,120,272,272, +272,271,271,120,120,120,120,271,271,120,120,271,271,271,120,120, +120,271,120,120,120,120,120,120,120,273,273,273,273,120,273,120, +120,120,120,120,120,120,274,274,274,274,274,274,274,274,274,274, +271,271,273,273,273,271,275,120,120,120,120,120,120,120,120,120, /* block 21 */ -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, +120,276,276,277,120,278,278,278,278,278,278,278,278,278,120,278, +278,278,120,278,278,278,278,278,278,278,278,278,278,278,278,278, +278,278,278,278,278,278,278,278,278,120,278,278,278,278,278,278, +278,120,278,278,120,278,278,278,278,278,120,120,276,278,277,277, +277,276,276,276,276,276,120,276,276,277,120,277,277,276,120,120, +278,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +278,278,276,276,120,120,279,279,279,279,279,279,279,279,279,279, +280,281,120,120,120,120,120,120,120,278,276,276,276,276,276,276, /* block 22 */ -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, +120,282,283,283,120,284,284,284,284,284,284,284,284,120,120,284, +284,120,120,284,284,284,284,284,284,284,284,284,284,284,284,284, +284,284,284,284,284,284,284,284,284,120,284,284,284,284,284,284, +284,120,284,284,120,284,284,284,284,284,120,120,282,284,285,282, +283,282,282,282,282,120,120,283,283,120,120,283,283,282,120,120, +120,120,120,120,120,120,282,285,120,120,120,120,284,284,120,284, +284,284,282,282,120,120,286,286,286,286,286,286,286,286,286,286, +287,284,288,288,288,288,288,288,120,120,120,120,120,120,120,120, /* block 23 */ -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, +120,120,289,290,120,290,290,290,290,290,290,120,120,120,290,290, +290,120,290,290,290,290,120,120,120,290,290,120,290,120,290,290, +120,120,120,290,290,120,120,120,290,290,290,120,120,120,290,290, +290,290,290,290,290,290,290,290,290,290,120,120,120,120,291,292, +289,292,292,120,120,120,292,292,292,120,292,292,292,289,120,120, +290,120,120,120,120,120,120,291,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,293,293,293,293,293,293,293,293,293,293, +294,294,294,295,296,296,296,296,296,297,296,120,120,120,120,120, /* block 24 */ -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, +298,299,299,299,298,300,300,300,300,300,300,300,300,120,300,300, +300,120,300,300,300,300,300,300,300,300,300,300,300,300,300,300, +300,300,300,300,300,300,300,300,300,120,300,300,300,300,300,300, +300,300,300,300,300,300,300,300,300,300,120,120,120,300,298,298, +298,299,299,299,299,120,298,298,298,120,298,298,298,298,120,120, +120,120,120,120,120,298,298,120,300,300,300,120,120,120,120,120, +300,300,298,298,120,120,301,301,301,301,301,301,301,301,301,301, +120,120,120,120,120,120,120,302,303,303,303,303,303,303,303,304, /* block 25 */ -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, +305,306,307,307,308,305,305,305,305,305,305,305,305,120,305,305, +305,120,305,305,305,305,305,305,305,305,305,305,305,305,305,305, +305,305,305,305,305,305,305,305,305,120,305,305,305,305,305,305, +305,305,305,305,120,305,305,305,305,305,120,120,306,305,307,306, +307,307,309,307,307,120,306,307,307,120,307,307,306,306,120,120, +120,120,120,120,120,309,309,120,120,120,120,120,120,120,305,120, +305,305,306,306,120,120,310,310,310,310,310,310,310,310,310,310, +120,305,305,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 26 */ -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, +311,311,312,312,120,313,313,313,313,313,313,313,313,120,313,313, +313,120,313,313,313,313,313,313,313,313,313,313,313,313,313,313, +313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313, +313,313,313,313,313,313,313,313,313,313,313,311,311,313,314,312, +312,311,311,311,311,120,312,312,312,120,312,312,312,311,315,316, +120,120,120,120,313,313,313,314,317,317,317,317,317,317,317,313, +313,313,311,311,120,120,318,318,318,318,318,318,318,318,318,318, +317,317,317,317,317,317,317,317,317,316,313,313,313,313,313,313, /* block 27 */ -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, +120,120,319,319,120,320,320,320,320,320,320,320,320,320,320,320, +320,320,320,320,320,320,320,120,120,120,320,320,320,320,320,320, +320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320, +320,320,120,320,320,320,320,320,320,320,320,320,120,320,120,120, +320,320,320,320,320,320,320,120,120,120,321,120,120,120,120,322, +319,319,321,321,321,120,321,120,319,319,319,319,319,319,319,322, +120,120,120,120,120,120,323,323,323,323,323,323,323,323,323,323, +120,120,319,319,324,120,120,120,120,120,120,120,120,120,120,120, /* block 28 */ -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, +120,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325, +325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325, +325,325,325,325,325,325,325,325,325,325,325,325,325,325,325,325, +325,326,325,327,326,326,326,326,326,326,326,120,120,120,120, 6, +325,325,325,325,325,325,328,326,326,326,326,326,326,326,326,329, +330,330,330,330,330,330,330,330,330,330,329,329,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 29 */ -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, +120,331,331,120,331,120,331,331,331,331,331,120,331,331,331,331, +331,331,331,331,331,331,331,331,331,331,331,331,331,331,331,331, +331,331,331,331,120,331,120,331,331,331,331,331,331,331,331,331, +331,332,331,333,332,332,332,332,332,332,332,332,332,331,120,120, +331,331,331,331,331,120,334,120,332,332,332,332,332,332,120,120, +335,335,335,335,335,335,335,335,335,335,120,120,331,331,331,331, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 30 */ -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, +336,337,337,337,338,338,338,338,338,338,338,338,338,338,338,338, +338,338,338,337,338,337,337,337,339,339,337,337,337,337,337,337, +340,340,340,340,340,340,340,340,340,340,341,341,341,341,341,341, +341,341,341,341,337,339,337,339,337,339,342,343,342,343,344,344, +336,336,336,336,336,336,336,336,120,336,336,336,336,336,336,336, +336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336, +336,336,336,336,336,336,336,336,336,336,336,336,336,120,120,120, +120,339,339,339,339,339,339,339,339,339,339,339,339,339,339,344, /* block 31 */ -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, +339,339,339,339,339,338,339,339,336,336,336,336,336,339,339,339, +339,339,339,339,339,339,339,339,120,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,120,337,337, +337,337,337,337,337,337,339,337,337,337,337,337,337,120,337,337, +338,338,338,338,338, 20, 20, 20, 20,338,338,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 32 */ -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, +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,347,347,347, +347,348,347,347,347,347,347,347,346,347,347,348,348,347,347,345, +349,349,349,349,349,349,349,349,349,349,350,350,350,350,350,350, +345,345,345,345,345,345,348,348,347,347,345,345,345,345,347,347, +347,345,346,346,346,345,345,346,346,346,346,346,346,346,345,345, +345,347,347,347,347,345,345,345,345,345,345,345,345,345,345,345, /* block 33 */ -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, +345,345,347,346,348,347,347,346,346,346,346,346,346,347,345,346, +351,351,351,351,351,351,351,351,351,351,346,346,346,347,352,352, +353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353, +353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353, +353,353,353,353,353,353,120,353,120,120,120,120,120,353,120,120, +354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354, +354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354, +354,354,354,354,354,354,354,354,354,354,354,355,356,354,354,354, /* block 34 */ -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 */ -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 */ -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, +357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357, 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, + +/* block 35 */ 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,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, + +/* block 36 */ +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,120,360,360,360,360,120,120, +360,360,360,360,360,360,360,120,360,120,360,360,360,360,120,120, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, /* block 37 */ -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, +360,360,360,360,360,360,360,360,360,120,360,360,360,360,120,120, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,120, +360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, /* block 38 */ -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, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,120,360,360,360,360,120,120,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,360,360,360,360,120,120,361,361,361, +362,362,362,362,362,362,362,362,362,363,363,363,363,363,363,363, +363,363,363,363,363,363,363,363,363,363,363,363,363,120,120,120, /* block 39 */ -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, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +364,364,364,364,364,364,364,364,364,364,120,120,120,120,120,120, +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,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,366,366,366,366,120,120,367,367,367,367,367,367,120,120, /* block 40 */ -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, +368,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, /* block 41 */ -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, /* block 42 */ -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,367,367,367,367,367,367,367,367,367,367,367, -367,367,367,367,367,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, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,370,371,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, /* block 43 */ -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, +372,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,374,375,120,120,120, +376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376, +376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376, +376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376, +376,376,376,376,376,376,376,376,376,376,376,376,376,376,376,376, +376,376,376,376,376,376,376,376,376,376,376, 5, 5, 5,377,377, +377,376,376,376,376,376,376,376,376,120,120,120,120,120,120,120, /* block 44 */ -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, +378,378,378,378,378,378,378,378,378,378,378,378,378,120,378,378, +378,378,379,379,379,120,120,120,120,120,120,120,120,120,120,120, 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, +380,380,381,381,381,382,382,120,120,120,120,120,120,120,120,120, +383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383, +383,383,384,384,120,120,120,120,120,120,120,120,120,120,120,120, +385,385,385,385,385,385,385,385,385,385,385,385,385,120,385,385, +385,120,386,386,120,120,120,120,120,120,120,120,120,120,120,120, /* block 45 */ -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, +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,387,387,387,387, +387,387,387,387,388,388,389,388,388,388,388,388,388,388,389,389, +389,389,389,389,389,389,388,389,389,388,388,388,388,388,388,388, +388,388,388,388,390,390,390,391,390,390,390,392,387,388,120,120, +393,393,393,393,393,393,393,393,393,393,120,120,120,120,120,120, +394,394,394,394,394,394,394,394,394,394,120,120,120,120,120,120, /* block 46 */ -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, +395,395,396,396,395,396,397,395,395,395,395,398,398,398,399,120, +400,400,400,400,400,400,400,400,400,400,120,120,120,120,120,120, +401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401, +401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401, +401,401,401,402,401,401,401,401,401,401,401,401,401,401,401,401, +401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401, +401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401, +401,401,401,401,401,401,401,401,401,120,120,120,120,120,120,120, /* block 47 */ -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, +401,401,401,401,401,398,398,401,401,401,401,401,401,401,401,401, +401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401, +401,401,401,401,401,401,401,401,401,398,401,120,120,120,120,120, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369, +369,369,369,369,369,369,120,120,120,120,120,120,120,120,120,120, /* block 48 */ -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, +403,403,403,403,403,403,403,403,403,403,403,403,403,403,403,403, +403,403,403,403,403,403,403,403,403,403,403,403,403,403,403,120, +404,404,404,405,405,405,405,404,404,405,405,405,120,120,120,120, +405,405,404,405,405,405,405,405,405,404,404,404,120,120,120,120, +406,120,120,120,407,407,408,408,408,408,408,408,408,408,408,408, +409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409, +409,409,409,409,409,409,409,409,409,409,409,409,409,409,120,120, +409,409,409,409,409,120,120,120,120,120,120,120,120,120,120,120, /* block 49 */ -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, +410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410, +410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410, +410,410,410,410,410,410,410,410,410,410,410,410,120,120,120,120, +410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410, +410,410,410,410,410,410,410,410,410,410,120,120,120,120,120,120, +411,411,411,411,411,411,411,411,411,411,412,120,120,120,413,413, +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, /* block 50 */ -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, +415,415,415,415,415,415,415,415,415,415,415,415,415,415,415,415, +415,415,415,415,415,415,415,416,416,417,417,416,120,120,418,418, +419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419, +419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419, +419,419,419,419,419,419,419,419,419,419,419,419,419,419,419,419, +419,419,419,419,419,420,421,420,421,421,421,421,421,421,421,120, +421,422,421,422,422,421,421,421,421,421,421,421,421,420,420,420, +420,420,420,421,421,421,421,421,421,421,421,421,421,120,120,421, /* block 51 */ -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, +423,423,423,423,423,423,423,423,423,423,120,120,120,120,120,120, +423,423,423,423,423,423,423,423,423,423,120,120,120,120,120,120, +424,424,424,424,424,424,424,425,424,424,424,424,424,424,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,426,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 52 */ -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, +427,427,427,427,428,429,429,429,429,429,429,429,429,429,429,429, +429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,429, +429,429,429,429,429,429,429,429,429,429,429,429,429,429,429,429, +429,429,429,429,427,430,427,427,427,427,427,428,427,428,428,428, +428,428,427,428,428,429,429,429,429,429,429,429,120,120,120,120, +431,431,431,431,431,431,431,431,431,431,432,432,432,432,432,432, +432,433,433,433,433,433,433,433,433,433,433,427,427,427,427,427, +427,427,427,427,433,433,433,433,433,433,433,433,433,120,120,120, /* block 53 */ -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 */ +434,434,435,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,435,434,434,434,434,435,435,434,434,435,434,434,434,436,436, +437,437,437,437,437,437,437,437,437,437,436,436,436,436,436,436, 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, +438,438,438,438,438,438,439,440,439,439,440,440,440,439,440,439, +439,439,440,440,120,120,120,120,120,120,120,120,441,441,441,441, + +/* block 54 */ +442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,442, +442,442,442,442,442,442,442,442,442,442,442,442,442,442,442,442, +442,442,442,442,443,443,443,443,443,443,443,443,444,444,444,444, +444,444,444,444,443,443,444,444,120,120,120,445,445,445,445,445, +446,446,446,446,446,446,446,446,446,446,120,120,120,442,442,442, +447,447,447,447,447,447,447,447,447,447,448,448,448,448,448,448, +448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448, +448,448,448,448,448,448,448,448,449,449,449,449,449,449,450,450, /* block 55 */ -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, +451,452,453,454,455,456,457,458,459,120,120,120,120,120,120,120, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, +460,460,460,460,460,460,460,460,460,460,460,120,120,460,460,460, +461,461,461,461,461,461,461,461,120,120,120,120,120,120,120,120, +462,463,462,464,463,465,465,466,465,466,467,463,466,466,463,463, +466,468,463,463,463,463,463,463,463,469,470,471,471,465,471,471, +471,471,472,473,474,470,470,475,476,476,477,120,120,120,120,120, /* block 56 */ 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, + 35, 35, 35, 35, 35, 35,128,128,128,128,128,478,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,121,121,121, +121,121,110,110,110,110,121,121,121,121,121, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35,479,480, 35, 35, 35,481, 35, 35, /* block 57 */ - 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, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,482, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,110,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, +110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,121, +114,114,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,120,113,113,113,113,113, /* block 58 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, @@ -2251,12 +2286,12 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 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, +483,484, 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 */ 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, 35, 35, 35, 35, 35,485, 35, 35,486, 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, @@ -2265,58 +2300,58 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, /* block 60 */ -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, +487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, +487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120, +487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, +487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, +487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120, +128,487,128,487,128,487,128,487,120,488,120,488,120,488,120,488, +487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488, +489,489,490,490,490,490,491,491,492,492,493,493,494,494,120,120, /* block 61 */ -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, +487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, +487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, +487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495, +487,487,128,496,128,120,128,128,488,488,497,497,498,119,499,119, +119,119,128,496,128,120,128,128,500,500,500,500,498,119,119,119, +487,487,128,128,120,120,128,128,488,488,501,501,120,119,119,119, +487,487,128,128,128,169,128,128,488,488,502,502,174,119,119,119, +120,120,128,496,128,120,128,128,503,503,504,504,498,119,119,120, /* block 62 */ - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,497,498, 24, 24, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,505,506, 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, 5, 5, 5, 5, 5, 5,507,508, 24, 24, 24, 24, 24,509, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,510, 5, 5, 16, + 16, 5, 5, 5, 9, 7, 8, 5, 5,510, 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, + 24, 24, 24, 24, 24,511, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25,110,120,120, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,110, /* block 63 */ - 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, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,120, +110,110,110,110,110,110,110,110,110,110,110,110,110,120,120,120, 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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,426,426,426, +426,113,426,426,426,113,113,113,113,113,113,113,113,113,113,113, +512,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 64 */ - 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, + 20, 20,513, 20, 20, 20, 20,513, 20, 20,514,513,513,513,514,514, +513,513,513,514, 20,513, 20, 20, 9,513,513,513,513,513, 20, 20, + 20, 20, 21, 20,513, 20,515, 20,513, 20,516,517,513,513, 20,514, +513,513,518,513,514,519,519,519,519,520, 20, 20,514,514,513,513, + 9, 9, 9, 9, 9,513,514,514,514,514, 20, 9, 20, 20,521, 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, +522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522, +523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523, /* block 65 */ -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, +524,524,524, 32, 33,524,524,524,524, 25, 20, 20,120,120,120,120, + 9, 9, 9, 9,525, 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, @@ -2357,10 +2392,10 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ /* block 69 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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, + 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 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, @@ -2368,10 +2403,10 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 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, + 20, 20, 20, 20, 20, 20,526,526,526,526,526,526,526,526,526,526, +526,526,527,526,526,526,526,526,526,526,526,526,526,526,526,526, +528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528, +528,528,528,528,528,528,528,528,528,528, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, /* block 71 */ @@ -2392,7 +2427,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 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, + 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,525,525,525,525, 9, /* block 73 */ 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -2401,7 +2436,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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,525, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* block 74 */ @@ -2435,20 +2470,20 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, /* block 77 */ -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, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, +529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529, /* block 78 */ 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,525,525, 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, @@ -2472,167 +2507,167 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 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, + 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, /* block 81 */ 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,120,120, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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 */ -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, +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,120, +531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531, +531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531, +531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,120, + 32, 33,532,533,534,535,536, 32, 33, 32, 33, 32, 33,537,538,539, +540, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,110,110,541,541, /* block 83 */ -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, +165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, +165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, +165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, +165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, +165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, +165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166, +165,166,165,166,542,543,543,543,543,543,543,165,166,165,166,544, +544,544,165,166,120,120,120,120,120,545,545,545,545,546,545,545, /* block 84 */ -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, +547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, +547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547, +547,547,547,547,547,547,120,547,120,120,120,120,120,547,120,120, +548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, +548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, +548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548, +548,548,548,548,548,548,548,548,120,120,120,120,120,120,120,549, +550,120,120,120,120,120,120,120,120,120,120,120,120,120,120,551, /* block 85 */ -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, +360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360, +360,360,360,360,360,360,360,120,120,120,120,120,120,120,120,120, +360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120, +360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120, +360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120, +360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120, +552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, +552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552, /* block 86 */ 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, + 23, 27, 7, 8, 7, 8, 7, 8, 7, 8, 5, 5, 5, 5, 5,111, 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, + 10, 5, 7,553, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 87 */ -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, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,120,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,120,120,120,120,120,120,120,120,120,120,120,120, /* block 88 */ -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, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, /* block 89 */ -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, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554, +554,554,554,554,554,554,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120, /* block 90 */ - 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, + 4,555,555,556, 20,557,558,559,560,561,560,561,560,561,560,561, +560,561, 20,562,560,561,560,561,560,561,560,561,563,564,565,565, + 20,559,559,559,559,559,559,559,559,559,566,566,566,566,567,567, +568,569,569,569,569,569, 20,562,559,559,559,557,570,571,572,572, +120,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, +573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, /* block 91 */ -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, +573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573, +573,573,573,573,573,573,573,120,120,574,574,575,575,576,576,573, +577,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,555,569,579,579,578, /* block 92 */ -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, +120,120,120,120,120,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, +120,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,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, /* block 93 */ -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, +581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120, +572,572,582,582,582,582,572,572,572,572,572,572,572,572,572,572, +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,120,120,120,120,120, +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,120,120,120,120,120,120,120,120,120,120,120,120, +578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 94 */ -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, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,120, +582,582,582,582,582,582,582,582,582,582,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, 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, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, +583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, 20, /* block 95 */ -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, +582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572, +572,572,572,572,572,572,572,584,572,584,572,572,572,572,572,572, +572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, +572, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +572,572,572,572,572,572,572,572,572,572,572,572, 20, 20, 20, 20, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,572, /* block 96 */ -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, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585, +585,585,585,585,585,585,585,585,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, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,572,572,572,572,572, /* block 97 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -2641,1160 +2676,1190 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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, +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, 20, /* block 98 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, +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,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,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,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, /* block 99 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,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, +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,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,120,120,120,120,120,120,120,120,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,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, +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,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,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,586,586,586,586,586,586,586, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 101 */ -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, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,588,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, /* block 102 */ -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, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, +587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587, /* block 103 */ -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, +587,587,587,587,587,587,587,587,587,587,587,587,587,120,120,120, +589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, +589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, +589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589, +589,589,589,589,589,589,589,120,120,120,120,120,120,120,120,120, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590, +590,590,590,590,590,590,590,590,591,591,591,591,591,591,592,592, /* block 104 */ -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, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, /* block 105 */ -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, +593,593,593,593,593,593,593,593,593,593,593,593,594,595,595,595, +593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593, +596,596,596,596,596,596,596,596,596,596,593,593,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +192,193,192,193,192,193,192,193,192,193,597,598,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,599,198, +200,200,200,600,552,552,552,552,552,552,552,552,552,552,600,479, /* block 106 */ -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, +192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193, +192,193,192,193,192,193,192,193,192,193,192,193,479,479,552,552, +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,602,602,602,602,602,602,602,602,602,602, +603,603,604,604,604,604,604,604,120,120,120,120,120,120,120,120, /* block 107 */ 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, 15, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111, 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, +110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,605, 32, 33, /* block 108 */ - 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, + 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,606, 35, 22, + 32, 33, 32, 33,607, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, + 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,608,609,610,611,608, 35, +612,613,614,615, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, +120,120, 32, 33,616,617,618,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120, 22,110,110, 35, 22, 22, 22, 22, 22, /* block 109 */ -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, +619,619,620,619,619,619,620,619,619,619,619,620,619,619,619,619, +619,619,619,619,619,619,619,619,619,619,619,619,619,619,619,619, +619,619,619,621,621,620,620,621,622,622,622,622,120,120,120,120, +623,623,623,624,624,624,625,625,626,625,120,120,120,120,120,120, +627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627, +627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627, +627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627, +627,627,627,627,628,628,628,628,120,120,120,120,120,120,120,120, /* block 110 */ -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, +629,629,630,630,630,630,630,630,630,630,630,630,630,630,630,630, +630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630, +630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630, +630,630,630,630,629,629,629,629,629,629,629,629,629,629,629,629, +629,629,629,629,631,631,120,120,120,120,120,120,120,120,632,632, +633,633,633,633,633,633,633,633,633,633,120,120,120,120,120,120, +252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252, +252,634,254,635,254,254,254,254,260,260,260,254,260,254,254,252, /* block 111 */ -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, +636,636,636,636,636,636,636,636,636,636,637,637,637,637,637,637, +637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637, +637,637,637,637,637,637,638,638,638,638,638,638,638,638,639,640, +641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641, +641,641,641,641,641,641,641,642,642,642,642,642,642,642,642,642, +642,642,643,643,120,120,120,120,120,120,120,120,120,120,120,644, +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,120,120,120, /* block 112 */ -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, +645,645,645,646,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,647,645,646,646,645,645,645,645,646,646,645,645,646,646, +646,648,648,648,648,648,648,648,648,648,648,648,648,648,120,649, +650,650,650,650,650,650,650,650,650,650,120,120,120,120,648,648, +345,345,345,345,345,347,651,345,345,345,345,345,345,345,345,345, +351,351,351,351,351,351,351,351,351,351,345,345,345,345,345,120, /* block 113 */ -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, +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,652,652,652, +652,652,652,652,652,652,652,652,652,653,653,653,653,653,653,654, +654,653,653,654,654,653,653,120,120,120,120,120,120,120,120,120, +652,652,652,653,652,652,652,652,652,652,652,652,653,654,120,120, +655,655,655,655,655,655,655,655,655,655,120,120,656,656,656,656, +345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345, +651,345,345,345,345,345,345,352,352,352,345,346,347,346,345,345, /* block 114 */ -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, +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,657,657,657,657, +657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657, +658,657,658,658,658,657,657,658,658,657,657,657,657,657,658,658, +657,658,657,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,657,657,659,660,660, +661,661,661,661,661,661,661,661,661,661,661,662,663,663,662,662, +664,664,661,665,665,662,663,120,120,120,120,120,120,120,120,120, /* block 115 */ -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, +120,360,360,360,360,360,360,120,120,360,360,360,360,360,360,120, +120,360,360,360,360,360,360,120,120,120,120,120,120,120,120,120, +360,360,360,360,360,360,360,120,360,360,360,360,360,360,360,120, 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, + 35, 35, 35,666, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110, + 35, 35, 35, 35, 35,128, 35, 35,120,120,120,120,120,120,120,120, +667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667, /* block 116 */ -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, +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,667,667,667, +667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667, +661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,661, +661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,661, +661,661,661,662,662,663,662,662,663,662,662,664,662,663,120,120, +668,668,668,668,668,668,668,668,668,668,120,120,120,120,120,120, /* block 117 */ -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, +669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, /* block 118 */ -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, +670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670, /* block 119 */ -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, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, /* block 120 */ -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, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, /* block 121 */ -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, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, /* block 122 */ -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, +670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670, /* block 123 */ -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, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +669,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,669,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,669,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, /* block 124 */ -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, +670,670,670,670,670,670,670,670,669,670,670,670,670,670,670,670, +670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670, +670,670,670,670,120,120,120,120,120,120,120,120,120,120,120,120, +358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358, +358,358,358,358,358,358,358,120,120,120,120,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359, +359,359,359,359,359,359,359,359,359,359,359,359,120,120,120,120, /* block 125 */ -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, +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,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, /* block 126 */ -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, +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,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,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, /* block 127 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,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, +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,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,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,586,586,586,586,586,120,120, +586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586, /* block 128 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,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, +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,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,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,586,586,586,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 129 */ - 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, + 35, 35, 35, 35, 35, 35, 35,120,120,120,120,120,120,120,120,120, +120,120,120,206,206,206,206,206,120,120,120,120,120,215,212,215, +215,215,215,215,215,215,215,215,215,673,215,215,215,215,215,215, +215,215,215,215,215,215,215,120,215,215,215,215,215,120,215,120, +215,215,120,215,215,120,215,215,215,215,215,215,215,215,215,215, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 130 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,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, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,674,674,674,674,674,674,674,674,674,674,674,674,674,674, +674,674,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 131 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,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,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 132 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,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, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225, 8, 7, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, /* block 133 */ -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, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +225,225,675,225,225,225,225,225,225,225,225,225,220,676,120,120, /* block 134 */ -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, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, + 5, 5, 5, 5, 5, 5, 5, 7, 8, 5,120,120,120,120,120,120, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,552,552, 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, + 8, 7, 8, 7, 8,556,556, 7, 8, 5, 5, 5, 5, 16, 16, 16, + 5, 5, 5,120, 5, 5, 5, 5, 10, 7, 8, 7, 8, 7, 8, 5, + 5, 5, 9, 10, 9, 9, 9,120, 5, 6, 5, 5,120,120,120,120, +225,225,225,225,225,120,225,225,225,225,225,225,225,225,225,225, /* block 135 */ -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224, -224,224,224,224,224,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, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,120,120, 24, /* block 136 */ -119, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5, +120, 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, + 8,555,560,561,555,555,578,578,578,578,578,578,578,578,578,578, +569,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578, /* block 137 */ -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, +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,677,677, +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,120, +120,120,581,581,581,581,581,581,120,120,581,581,581,581,581,581, +120,120,581,581,581,581,581,581,120,120,581,581,581,120,120,120, + 6, 6, 9, 15, 20, 6, 6,120, 20, 9, 9, 9, 9, 20, 20,120, +511,511,511,511,511,511,511,511,511, 24, 24, 24, 20, 20,120,120, /* block 138 */ -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, +678,678,678,678,678,678,678,678,678,678,678,678,120,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,120,678,678,678,678,678,678,678,678, +678,678,678,678,678,678,678,678,678,678,678,120,678,678,120,678, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120, +678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 139 */ -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, +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,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,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,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,120,120,120,120,120, /* block 140 */ -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, +679,679,679,120,120,120,120,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,680,680,680, +680,680,680,680,120,120,120,681,681,681,681,681,681,681,681,681, +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,682,682, +682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682, +682,682,682,682,682,683,683,683,683,684,684,684,684,684,684,684, /* block 141 */ -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, +684,684,684,684,684,684,684,684,684,684,683,683,684,684,684,120, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120, +684,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,120,120, /* block 142 */ -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 143 */ -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, +685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685, +685,685,685,685,685,685,685,685,685,685,685,685,685,120,120,120, +686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686, +686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686, +686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686, +686,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +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,120,120,120,120, /* block 144 */ -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, +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, +690,690,690,690,120,120,120,120,120,120,120,120,120,689,689,689, +691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691, +691,692,691,691,691,691,691,691,691,691,692,120,120,120,120,120, +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,694,694,694,694,694,120,120,120,120,120, /* block 145 */ -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, +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,120,696, +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,120,120,120,120,697,697,697,697,697,697,697,697, +698,699,699,699,699,699,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 146 */ -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, +700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,700, +700,700,700,700,700,700,700,700,700,700,700,700,700,700,700,700, +700,700,700,700,700,700,700,700,701,701,701,701,701,701,701,701, +701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701, +701,701,701,701,701,701,701,701,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,702,702,702,702,702,702,702,702,702, +702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702, /* block 147 */ -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, +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,120,120, +704,704,704,704,704,704,704,704,704,704,120,120,120,120,120,120, +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,705, +705,705,705,705,120,120,120,120,706,706,706,706,706,706,706,706, +706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706, +706,706,706,706,706,706,706,706,706,706,706,706,120,120,120,120, /* block 148 */ -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, +707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707, +707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707, +707,707,707,707,707,707,707,707,120,120,120,120,120,120,120,120, +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, +708,708,708,708,120,120,120,120,120,120,120,120,120,120,120,709, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 149 */ -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, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, /* block 150 */ -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, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,710,120,120,120,120,120,120,120,120,120, +710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710, +710,710,710,710,710,710,120,120,120,120,120,120,120,120,120,120, +710,710,710,710,710,710,710,710,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 151 */ -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, +711,711,711,711,711,711,120,120,711,120,711,711,711,711,711,711, +711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, +711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711, +711,711,711,711,711,711,120,711,711,120,120,120,711,120,120,711, +712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712, +712,712,712,712,712,712,120,713,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,716,716,717,717,717,717,717,717,717, /* block 152 */ -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, +718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,718, +718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,120, +120,120,120,120,120,120,120,719,719,719,719,719,719,719,719,719, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720, +720,720,720,120,720,720,120,120,120,120,120,721,721,721,721,721, /* block 153 */ -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, +722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,722, +722,722,722,722,722,722,723,723,723,723,723,723,120,120,120,724, +725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725, +725,725,725,725,725,725,725,725,725,725,120,120,120,120,120,726, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 154 */ -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, +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,728,728,728,728,728,728,728,728,728,728,728,728,728, +728,728,728,728,728,728,728,728,120,120,120,120,729,729,728,728, +729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729, +120,120,729,729,729,729,729,729,729,729,729,729,729,729,729,729, +729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729, +729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729, /* block 155 */ -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, +730,731,731,731,120,731,731,120,120,120,120,120,731,731,731,731, +730,730,730,730,120,730,730,730,120,730,730,730,730,730,730,730, +730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730, +730,730,730,730,730,730,120,120,731,731,731,120,120,120,120,731, +732,732,732,732,732,732,732,732,732,120,120,120,120,120,120,120, +733,733,733,733,733,733,733,733,733,120,120,120,120,120,120,120, +734,734,734,734,734,734,734,734,734,734,734,734,734,734,734,734, +734,734,734,734,734,734,734,734,734,734,734,734,734,735,735,736, /* block 156 */ -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, +737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737, +737,737,737,737,737,737,737,737,737,737,737,737,737,738,738,738, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +739,739,739,739,739,739,739,739,740,739,739,739,739,739,739,739, +739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739, +739,739,739,739,739,741,741,120,120,120,120,742,742,742,742,742, +743,743,743,743,743,743,743,120,120,120,120,120,120,120,120,120, /* block 157 */ -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, +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,744,744,744,744,744,744,744,744,744,744,744,744, +744,744,744,744,744,744,120,120,120,745,745,745,745,745,745,745, +746,746,746,746,746,746,746,746,746,746,746,746,746,746,746,746, +746,746,746,746,746,746,120,120,747,747,747,747,747,747,747,747, +748,748,748,748,748,748,748,748,748,748,748,748,748,748,748,748, +748,748,748,120,120,120,120,120,749,749,749,749,749,749,749,749, /* block 158 */ -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, +750,750,750,750,750,750,750,750,750,750,750,750,750,750,750,750, +750,750,120,120,120,120,120,120,120,751,751,751,751,120,120,120, +120,120,120,120,120,120,120,120,120,752,752,752,752,752,752,752, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 159 */ -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, +753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753, +753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753, +753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753, +753,753,753,753,753,753,753,753,753,753,753,753,753,753,753,753, +753,753,753,753,753,753,753,753,753,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 160 */ -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, +754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, +754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, +754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754, +754,754,754,120,120,120,120,120,120,120,120,120,120,120,120,120, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,755,755,755,755,755,755,755,755,755,755,755,755,755, +755,755,755,120,120,120,120,120,120,120,756,756,756,756,756,756, /* block 161 */ -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, +757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757, +757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757, +757,757,757,757,758,758,758,758,120,120,120,120,120,120,120,120, +759,759,759,759,759,759,759,759,759,759,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 162 */ -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760, +760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,120, /* block 163 */ -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, +761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761, +761,761,761,761,761,761,761,761,761,761,761,761,761,762,762,762, +762,762,762,762,762,762,762,761,120,120,120,120,120,120,120,120, +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,765,765,765,765,766,766,766,766,766,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 164 */ -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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767, +767,767,767,767,767,767,767,120,120,120,120,120,120,120,120,120, /* block 165 */ -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, +768,769,768,770,770,770,770,770,770,770,770,770,770,770,770,770, +770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,770, +770,770,770,770,770,770,770,770,770,770,770,770,770,770,770,770, +770,770,770,770,770,770,770,770,769,769,769,769,769,769,769,769, +769,769,769,769,769,769,769,771,771,771,771,771,771,771,120,120, +120,120,772,772,772,772,772,772,772,772,772,772,772,772,772,772, +772,772,772,772,772,772,773,773,773,773,773,773,773,773,773,773, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,769, /* block 166 */ -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, +774,774,775,776,776,776,776,776,776,776,776,776,776,776,776,776, +776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776, +776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776, +775,775,775,774,774,774,774,775,775,774,774,777,777,778,777,777, +777,777,120,120,120,120,120,120,120,120,120,120,120,778,120,120, +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,120,120,120,120,120,120,120, +780,780,780,780,780,780,780,780,780,780,120,120,120,120,120,120, /* block 167 */ -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, +781,781,781,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,782,782,782,782, +782,782,782,782,782,782,782,781,781,781,781,781,783,781,781,781, +781,781,781,781,781,120,784,784,784,784,784,784,784,784,784,784, +785,785,785,785,782,783,783,120,120,120,120,120,120,120,120,120, +786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786, +786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786, +786,786,786,787,788,788,786,120,120,120,120,120,120,120,120,120, /* block 168 */ -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, +789,789,790,791,791,791,791,791,791,791,791,791,791,791,791,791, +791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,791, +791,791,791,791,791,791,791,791,791,791,791,791,791,791,791,791, +791,791,791,790,790,790,789,789,789,789,789,789,789,789,789,790, +790,791,792,792,791,793,793,793,793,789,789,789,789,793,120,120, +794,794,794,794,794,794,794,794,794,794,791,793,791,793,793,793, +120,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795, +795,795,795,795,795,120,120,120,120,120,120,120,120,120,120,120, /* block 169 */ -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, +796,796,796,796,796,796,796,796,796,796,796,796,796,796,796,796, +796,796,120,796,796,796,796,796,796,796,796,796,796,796,796,796, +796,796,796,796,796,796,796,796,796,796,796,796,797,797,797,798, +798,798,797,797,798,797,798,798,799,799,799,799,799,799,798,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 170 */ -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, +800,800,800,800,800,800,800,120,800,120,800,800,800,800,120,800, +800,800,800,800,800,800,800,800,800,800,800,800,800,800,120,800, +800,800,800,800,800,800,800,800,800,801,120,120,120,120,120,120, +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,803, +804,804,804,803,803,803,803,803,803,803,803,120,120,120,120,120, +805,805,805,805,805,805,805,805,805,805,120,120,120,120,120,120, /* block 171 */ -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, +806,807,808,809,120,810,810,810,810,810,810,810,810,120,120,810, +810,120,120,810,810,810,810,810,810,810,810,810,810,810,810,810, +810,810,810,810,810,810,810,810,810,120,810,810,810,810,810,810, +810,120,810,810,120,810,810,810,810,810,120,811,807,810,812,808, +806,808,808,808,808,120,120,808,808,120,120,808,808,808,120,120, +810,120,120,120,120,120,120,812,120,120,120,120,120,810,810,810, +810,810,808,808,120,120,806,806,806,806,806,806,806,120,120,120, +806,806,806,806,806,120,120,120,120,120,120,120,120,120,120,120, /* block 172 */ -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, +813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813, +813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813, +813,813,813,813,813,813,813,813,813,813,813,813,813,813,813,813, +813,813,813,813,813,814,814,814,815,815,815,815,815,815,815,815, +814,814,815,815,815,814,815,813,813,813,813,816,816,816,816,816, +817,817,817,817,817,817,817,817,817,817,120,816,120,816,815,813, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 173 */ -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, +818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818, +818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818, +818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818, +819,820,820,821,821,821,821,821,821,820,821,820,820,819,820,821, +821,820,821,821,818,818,822,818,120,120,120,120,120,120,120,120, +823,823,823,823,823,823,823,823,823,823,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 174 */ -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, +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,824,825, +826,826,827,827,827,827,120,120,826,826,826,826,827,827,826,827, +827,828,828,828,828,828,828,828,828,828,828,828,828,828,828,828, +828,828,828,828,828,828,828,828,824,824,824,824,827,827,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 175 */ -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, +829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, +829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, +829,829,829,829,829,829,829,829,829,829,829,829,829,829,829,829, +830,830,830,831,831,831,831,831,831,831,831,830,830,831,830,831, +831,832,832,832,829,120,120,120,120,120,120,120,120,120,120,120, +833,833,833,833,833,833,833,833,833,833,120,120,120,120,120,120, +395,395,395,395,395,395,395,395,395,395,395,395,395,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 176 */ -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, +834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834, +834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834, +834,834,834,834,834,834,834,834,834,834,834,835,836,835,836,836, +835,835,835,835,835,835,836,835,834,120,120,120,120,120,120,120, +837,837,837,837,837,837,837,837,837,837,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 177 */ -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, +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,120,120,839,839,839, +840,840,839,839,839,839,840,839,839,839,839,839,120,120,120,120, +841,841,841,841,841,841,841,841,841,841,842,842,843,843,843,844, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 178 */ -119,119,119,119,119,119,119,119,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 */ -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, +845,845,845,845,845,845,845,845,845,845,845,845,846,846,846,847, +847,847,847,847,847,847,847,847,846,847,847,848,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 180 */ -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, +/* block 179 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +849,849,849,849,849,849,849,849,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,850,850,850,850,850,850, -850,850,850,850,850,850,850,850,850,119,119,119,119,119,119,119, +851,851,851,851,851,851,851,851,851,851,852,852,852,852,852,852, +852,852,852,120,120,120,120,120,120,120,120,120,120,120,120,853, + +/* block 180 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +854,854,854,854,854,854,854,854,120,120,854,854,854,854,854,854, +854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,854, +854,854,854,854,854,854,854,854,854,854,854,854,854,854,854,854, +854,855,855,855,856,856,856,856,120,120,856,856,855,855,855,855, +856,854,857,854,855,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 181 */ -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, +858,859,859,859,859,859,859,859,859,859,859,858,858,858,858,858, +858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858, +858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858, +858,858,858,859,859,859,859,859,859,860,861,859,859,859,859,862, +862,862,862,862,862,862,862,859,120,120,120,120,120,120,120,120, +863,864,864,864,864,864,864,865,865,864,864,864,863,863,863,863, +863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,863, +863,863,863,863,863,863,863,863,863,863,863,863,863,863,863,863, /* block 182 */ -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, +863,863,863,863,866,866,866,866,866,866,864,864,864,864,864,864, +864,864,864,864,864,864,864,865,864,864,867,867,867,863,867,867, +867,867,867,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868, +868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868, +868,868,868,868,868,868,868,868,868,868,868,868,868,868,868,868, +868,868,868,868,868,868,868,868,868,120,120,120,120,120,120,120, /* block 183 */ -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, +869,869,869,869,869,869,869,869,869,120,869,869,869,869,869,869, +869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,869, +869,869,869,869,869,869,869,869,869,869,869,869,869,869,869,870, +871,871,871,871,871,871,871,120,871,871,871,871,871,871,870,871, +869,872,872,872,872,872,120,120,120,120,120,120,120,120,120,120, +873,873,873,873,873,873,873,873,873,873,874,874,874,874,874,874, +874,874,874,874,874,874,874,874,874,874,874,874,874,120,120,120, +875,875,876,876,876,876,876,876,876,876,876,876,876,876,876,876, /* block 184 */ -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, +876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876, +120,120,877,877,877,877,877,877,877,877,877,877,877,877,877,877, +877,877,877,877,877,877,877,877,120,878,877,877,877,877,877,877, +877,878,877,877,878,877,877,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 185 */ -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,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, +879,879,879,879,879,879,879,120,879,879,120,879,879,879,879,879, +879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879, +879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879, +879,880,880,880,880,880,880,120,120,120,880,120,880,880,120,880, +880,880,880,880,880,880,881,880,120,120,120,120,120,120,120,120, +882,882,882,882,882,882,882,882,882,882,120,120,120,120,120,120, +883,883,883,883,883,883,120,883,883,120,883,883,883,883,883,883, +883,883,883,883,883,883,883,883,883,883,883,883,883,883,883,883, /* block 186 */ -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, +883,883,883,883,883,883,883,883,883,883,884,884,884,884,884,120, +885,885,120,884,884,885,884,885,883,120,120,120,120,120,120,120, +886,886,886,886,886,886,886,886,886,886,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 187 */ -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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +887,887,887,887,887,887,887,887,887,887,887,887,887,887,887,887, +887,887,887,888,888,889,889,890,890,120,120,120,120,120,120,120, /* block 188 */ -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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891, +294,294,891,294,891,296,296,296,296,296,296,296,296,297,297,297, +297,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296, +296,296,120,120,120,120,120,120,120,120,120,120,120,120,120,892, /* block 189 */ -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, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, /* block 190 */ -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, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 191 */ -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, +894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894, +894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894, +894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894, +894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894, +894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894, +894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,894, +894,894,894,894,894,894,894,894,894,894,894,894,894,894,894,120, +895,895,895,895,895,120,120,120,120,120,120,120,120,120,120,120, /* block 192 */ -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, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,893,893,893,893,893,893,893,893,893,893,893,893, +893,893,893,893,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 193 */ -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, +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,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,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, /* block 194 */ -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, +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,896,120, +897,897,897,897,897,897,897,897,897,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 195 */ -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, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, /* block 196 */ -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,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, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,898,898,898,898,898,898,898,898,898, +898,898,898,898,898,898,898,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 197 */ -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, +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,601,601,601,601,601, /* block 198 */ -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, +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,120,120,120,120,120,120,120, +899,899,899,899,899,899,899,899,899,899,899,899,899,899,899,899, +899,899,899,899,899,899,899,899,899,899,899,899,899,899,899,120, +900,900,900,900,900,900,900,900,900,900,120,120,120,120,901,901, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 199 */ -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +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,120,120, +903,903,903,903,903,904,120,120,120,120,120,120,120,120,120,120, /* block 200 */ -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, +905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905, +905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905, +905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905, +906,906,906,906,906,906,906,907,907,907,907,907,908,908,908,908, +909,909,909,909,907,908,120,120,120,120,120,120,120,120,120,120, +910,910,910,910,910,910,910,910,910,910,120,911,911,911,911,911, +911,911,120,905,905,905,905,905,905,905,905,905,905,905,905,905, +905,905,905,905,905,905,905,905,120,120,120,120,120,905,905,905, /* block 201 */ -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, +905,905,905,905,905,905,905,905,905,905,905,905,905,905,905,905, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 202 */ -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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +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, +913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,913, +913,913,913,913,913,913,913,913,913,913,913,913,913,913,913,913, /* block 203 */ -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, +914,914,914,914,914,914,914,914,914,914,914,914,914,914,914,914, +914,914,914,914,914,914,914,915,915,915,915,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 204 */ -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,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, +916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916, +916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916, +916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916, +916,916,916,916,916,916,916,916,916,916,916,916,916,916,916,916, +916,916,916,916,916,916,916,916,916,916,916,120,120,120,120,917, +916,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,918,918,918,918,918,918,918,918,918,918,918,918,918, /* block 205 */ -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,901,901,901,901,901, -901,901,901,901,901,901,901,901,901,901,901,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, +918,918,918,918,918,918,918,918,120,120,120,120,120,120,120,917, +917,917,917,919,919,919,919,919,919,919,919,919,919,919,919,919, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +920,921, 5,111,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 206 */ -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, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, /* block 207 */ -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, -564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,120,120,120,120,120,120,120,120, /* block 208 */ -564,564,564,564,564,564,564,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, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922, +922,922,922,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 209 */ -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, +578,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, +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,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, /* block 210 */ -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, +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,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,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, /* block 211 */ -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, +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,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +573,573,573,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,578,578,578,578,120,120,120,120,120,120,120,120, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, /* block 212 */ -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, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,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 213 */ +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, +923,923,923,923,923,923,923,923,923,923,923,923,120,120,120,120, + +/* block 214 */ +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,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,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,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,924,924,924,120,120,120,120,120, +924,924,924,924,924,924,924,924,924,924,924,924,924,120,120,120, + +/* block 215 */ +924,924,924,924,924,924,924,924,924,120,120,120,120,120,120,120, +924,924,924,924,924,924,924,924,924,924,120,120,925,926,926,927, +928,928,928,928,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 216 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -3802,309 +3867,339 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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, + 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120, -/* block 214 */ +/* block 217 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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, + 20, 20, 20, 20, 20,929,930,113,113,113, 20, 20, 20,930,929,929, +929,929,929, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113, -/* block 215 */ -112,112,112, 20, 20,112,112,112,112,112,112,112, 20, 20, 20, 20, +/* block 218 */ +113,113,113, 20, 20,113,113,113,113,113,113,113, 20, 20, 20, 20, 20, 20, 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,113,113,113,113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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, + 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 216 */ -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 219 */ +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,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,931,931,931,684,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 217 */ -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,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 220 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, 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, + 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,120, -/* block 218 */ +/* block 221 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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 */ -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 */ -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 */ -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, + 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120, +582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582, +582,582, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120, /* block 222 */ -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, +513,513,513,513,513,513,513,513,513,513,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,514,514,514,514,514,514, +514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514, +514,514,514,514,514,120,514,514,514,514,514,514,514,514,514,514, +514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, /* block 223 */ -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, +513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +514,514,514,514,514,514,514,514,514,514,514,514,513,120,513,513, +120,120,513,120,120,513,513,120,120,513,513,513,513,120,513,513, +513,513,513,513,513,513,514,514,514,514,120,514,120,514,514,514, +514,514,514,514,120,514,514,514,514,514,514,514,514,514,514,514, +513,513,513,513,513,513,513,513,513,513,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,514,514,514,514,514,514, /* block 224 */ -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, +514,514,514,514,513,513,120,513,513,513,513,120,120,513,513,513, +513,513,513,513,513,120,513,513,513,513,513,513,513,120,514,514, +514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +514,514,514,514,514,514,514,514,513,513,120,513,513,513,513,120, +513,513,513,513,513,120,513,120,120,120,513,513,513,513,513,513, +513,120,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, /* block 225 */ -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, +513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514, +514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +513,513,513,513,513,513,513,513,513,513,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,514,514,514,514,514,514, +514,514,514,514,513,513,513,513,513,513,513,513,513,513,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,514,514, /* block 226 */ -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, +514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513, +513,513,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,514,514,514,514,514,514,514,514,514,514,513,513,513,513, +513,513,513,513,513,513,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,514,514,514,514,514,514,514,514,514,514, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, /* block 227 */ -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, +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,514,514,514,514,514,514, +514,514,514,514,514,514,120,120,513,513,513,513,513,513,513,513, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +513, 9,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +514,514,514,514,514,514,514,514,514,514,514, 9,514,514,514,514, +514,514,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +513,513,513,513,513,513,513,513,513,513,513, 9,514,514,514,514, /* block 228 */ -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, +514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +514,514,514,514,514, 9,514,514,514,514,514,514,513,513,513,513, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +513,513,513,513,513, 9,514,514,514,514,514,514,514,514,514,514, +514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, 9, +514,514,514,514,514,514,513,513,513,513,513,513,513,513,513,513, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, 9, +514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, /* block 229 */ -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, +514,514,514,514,514,514,514,514,514, 9,514,514,514,514,514,514, +513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, +513,513,513,513,513,513,513,513,513, 9,514,514,514,514,514,514, +514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, +514,514,514, 9,514,514,514,514,514,514,513,514,120,120, 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 230 */ -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, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, +932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932, /* block 231 */ -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, +933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933, +933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933, +933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933, +933,933,933,933,933,933,933,932,932,932,932,933,933,933,933,933, +933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933, +933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933, +933,933,933,933,933,933,933,933,933,933,933,933,933,932,932,932, +932,932,932,932,932,933,932,932,932,932,932,932,932,932,932,932, /* block 232 */ -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, +932,932,932,932,933,932,932,934,934,934,934,934,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,933,933,933,933,933, +120,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 233 */ -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, +935,935,935,935,935,935,935,120,935,935,935,935,935,935,935,935, +935,935,935,935,935,935,935,935,935,120,120,935,935,935,935,935, +935,935,120,935,935,120,935,935,935,935,935,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 234 */ -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, -119,119,119,119,119,119,119,119,119,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, +936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936, +936,936,936,936,936,936,936,936,936,936,936,936,936,936,936,936, +936,936,936,936,936,936,936,936,936,936,936,936,936,120,120,120, +937,937,937,937,937,937,937,938,938,938,938,938,938,938,120,120, +939,939,939,939,939,939,939,939,939,939,120,120,120,120,936,940, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 235 */ - 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, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941, +941,941,941,941,941,941,941,941,941,941,941,941,941,941,941,941, +941,941,941,941,941,941,941,941,941,941,941,941,942,942,942,942, +943,943,943,943,943,943,943,943,943,943,120,120,120,120,120,944, /* block 236 */ -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, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, /* block 237 */ -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, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945, +945,945,945,945,945,120,120,946,946,946,946,946,946,946,946,946, +947,947,947,947,947,947,947,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 238 */ +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948, +948,948,949,949,949,949,949,949,949,949,949,949,949,949,949,949, +949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949, +949,949,949,949,950,950,950,950,950,950,950,951,120,120,120,120, +952,952,952,952,952,952,952,952,952,952,120,120,120,120,953,953, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 239 */ +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + +/* block 240 */ + 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,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 241 */ +120, 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, 25, 20, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 242 */ +225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225, +120,225,225,120,225,120,120,225,120,225,225,225,225,225,225,225, +225,225,225,120,225,225,225,225,120,225,120,225,120,120,120,120, +120,120,225,120,120,120,120,225,120,225,120,225,120,225,225,225, +120,225,225,120,225,120,120,225,120,225,120,225,120,225,120,225, +120,225,225,120,225,120,120,225,225,225,225,120,225,225,225,225, +225,225,225,120,225,225,225,225,120,225,225,225,225,120,225,120, + +/* block 243 */ +225,225,225,225,225,225,225,225,225,225,120,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120, +120,225,225,225,120,225,225,225,225,225,120,225,225,225,225,225, +225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +218,218,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* 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,923,923,923,923, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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 */ +/* block 245 */ 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,954,954,954,954,954,954,954,954,954,954,954,954, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954, +954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, +954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, +954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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, + 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954, -/* block 240 */ - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,923,923,923, +/* block 246 */ + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,954,954,954, 20, 20, 20, 20, 20, 20, 20, 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, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,954,954,954, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, -/* block 241 */ +/* block 247 */ 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, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,955,955,955,955,955,955,955,955,955,955, +955,955,955,955,955,955,955,955,955,955,955,955,955,955,955,955, -/* block 242 */ -925, 21, 21,923,923,923,923,923,923,923,923,923,923,923,923,923, +/* block 248 */ +956, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,954, 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, + 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,954,954,954,954, + 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,954, +584,584,954,954,954,954,954,954,954,954,954,954,954,954,954,954, + 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, -/* block 243 */ -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,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 249 */ +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, -/* block 244 */ +/* block 250 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4114,7 +4209,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 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 */ +/* block 251 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4122,9 +4217,9 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,957,957,957,957,957, -/* block 246 */ +/* block 252 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4134,7 +4229,7 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 21, 21, 21, 21, 21, 21, 21, 21, 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 */ +/* block 253 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4144,17 +4239,17 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 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 248 */ +/* block 254 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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, + 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954,954, -/* block 249 */ +/* block 255 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, @@ -4162,187 +4257,197 @@ const uint16_t PRIV(ucd_stage2)[] = { /* 68608 bytes, block = 128 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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, + 20, 20, 20, 20,954,954,954,954,954,954,954,954,954,954,954,954, -/* block 250 */ +/* block 256 */ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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, 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, + 20, 20, 20, 20, 20, 21, 21, 21, 21,954,954,954,954,954,954,954, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, -/* block 251 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923, +/* block 257 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 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,954,954,954,954,954,954,954,954, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954, 20, 20, 20, 20, 20, 20, 20, 20, 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 252 */ - 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923,923,923,923,923, +/* block 258 */ + 20, 20, 20, 20, 20, 20, 20, 20,954,954,954,954,954,954,954,954, 20, 20, 20, 20, 20, 20, 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, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, -/* block 253 */ - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,923,923,923,923, +/* block 259 */ + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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, 21, 21, 21, 21, 21, 20, 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,923,923, 21, 21, 21, 21,923,923,923, 21,923, 21, 21, 21, 21, + 21, 21,954, 21, 21, 21, 21,954,954,954, 21, 21, 21, 21, 21, 21, -/* block 254 */ +/* block 260 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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,954,954, 21, 21, 21, 21, 21, 21,954,954,954, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 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 */ -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,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 */ -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,923,923,923,923,923,923,923,923,923,923, -923,923,923,923,923,923,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 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,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 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,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 */ -577,577,577,577,577,577,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 */ -577,577,577,577,577,577,577,577,577,577,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 */ -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, -577,577,577,577,577,577,577,577,577,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, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,954,954, + 21, 21, 21, 21,954,954,954,954, 21, 21, 21,954,954,954,954,954, /* block 262 */ -577,577,577,577,577,577,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, + 21, 21, 21,954,954,954,954,954,954,954,954,954,954,954,954,954, + 21, 21, 21, 21, 21, 21,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, /* block 263 */ -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, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,954,954, +954,954,954,954,954,954,954,954,954,954,954,954,954,954,120,120, /* block 264 */ -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, +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,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,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,586,586,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, /* block 265 */ -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +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,586,586,586,586,586,586,586,586,586,586,586,586,586, +586,586,586,586,586,120,120,120,120,120,120,120,120,120,120,120, +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,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, /* block 266 */ -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, -112,112,112,112,112,112,112,112,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, +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,120,120, +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,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,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, /* 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, +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,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +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,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,586,586,586,586,586,586,586,586,586,586, + +/* block 268 */ +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,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,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,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 269 */ +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,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, +120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + +/* block 270 */ +511, 24,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, +958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958, + +/* block 271 */ +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, + +/* block 272 */ +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, + +/* block 273 */ +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, +511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511, + +/* block 274 */ +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,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,672,672,672,672,672,672,672,672,672,672, +672,672,672,672,672,672,672,672,672,672,672,672,672,672,120,120, }; diff --git a/thirdparty/pcre2/src/pcre2_ucp.h b/thirdparty/pcre2/src/pcre2_ucp.h index 483abd18fc..84b22fb064 100644 --- a/thirdparty/pcre2/src/pcre2_ucp.h +++ b/thirdparty/pcre2/src/pcre2_ucp.h @@ -281,7 +281,12 @@ enum { ucp_Makasar, ucp_Medefaidrin, ucp_Old_Sogdian, - ucp_Sogdian + ucp_Sogdian, + /* New for Unicode 12.0.0 */ + ucp_Elymaic, + ucp_Nandinagari, + ucp_Nyiakeng_Puachue_Hmong, + ucp_Wancho }; #endif /* PCRE2_UCP_H_IDEMPOTENT_GUARD */ diff --git a/thirdparty/pcre2/src/sljit/sljitConfigInternal.h b/thirdparty/pcre2/src/sljit/sljitConfigInternal.h index ba60311e45..acba9da4be 100644 --- a/thirdparty/pcre2/src/sljit/sljitConfigInternal.h +++ b/thirdparty/pcre2/src/sljit/sljitConfigInternal.h @@ -214,6 +214,10 @@ #define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len) #endif +#ifndef SLJIT_MEMMOVE +#define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len) +#endif + #ifndef SLJIT_ZEROMEM #define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len) #endif diff --git a/thirdparty/pcre2/src/sljit/sljitExecAllocator.c b/thirdparty/pcre2/src/sljit/sljitExecAllocator.c index 3b37a9751f..92ddb94914 100644 --- a/thirdparty/pcre2/src/sljit/sljitExecAllocator.c +++ b/thirdparty/pcre2/src/sljit/sljitExecAllocator.c @@ -118,10 +118,20 @@ static SLJIT_INLINE int get_map_jit_flag() if (map_jit_flag == -1) { struct utsname name; + map_jit_flag = 0; uname(&name); /* Kernel version for 10.14.0 (Mojave) */ - map_jit_flag = (atoi(name.release) >= 18) ? MAP_JIT : 0; + if (atoi(name.release) >= 18) { + /* Only use MAP_JIT if a hardened runtime is used, because MAP_JIT is incompatible with fork(). */ + void *ptr = mmap(NULL, getpagesize(), PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + + if (ptr == MAP_FAILED) { + map_jit_flag = MAP_JIT; + } else { + munmap(ptr, getpagesize()); + } + } } return map_jit_flag; @@ -137,6 +147,7 @@ static SLJIT_INLINE int get_map_jit_flag() static SLJIT_INLINE void* alloc_chunk(sljit_uw size) { void *retval; + const int prot = PROT_READ | PROT_WRITE | PROT_EXEC; #ifdef MAP_ANON @@ -146,16 +157,25 @@ static SLJIT_INLINE void* alloc_chunk(sljit_uw size) flags |= get_map_jit_flag(); #endif - retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, flags, -1, 0); + retval = mmap(NULL, size, prot, flags, -1, 0); #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); + retval = mmap(NULL, size, prot, MAP_PRIVATE, dev_zero, 0); #endif /* MAP_ANON */ - return (retval != MAP_FAILED) ? retval : NULL; + if (retval == MAP_FAILED) + retval = NULL; + else { + if (mprotect(retval, size, prot) < 0) { + munmap(retval, size); + retval = NULL; + } + } + + return retval; } static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size) diff --git a/thirdparty/pcre2/src/sljit/sljitLir.c b/thirdparty/pcre2/src/sljit/sljitLir.c index ded9541b31..9bab0c3ec6 100644 --- a/thirdparty/pcre2/src/sljit/sljitLir.c +++ b/thirdparty/pcre2/src/sljit/sljitLir.c @@ -144,6 +144,7 @@ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) # define PATCH_MD 0x10 #endif +# define TYPE_SHIFT 13 #endif #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) @@ -521,6 +522,12 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw } } +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label) +{ + if (SLJIT_LIKELY(!!put_label)) + put_label->label = label; +} + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags) { SLJIT_UNUSED_ARG(compiler); @@ -620,6 +627,30 @@ static SLJIT_INLINE sljit_s32 get_arg_count(sljit_s32 arg_types) return arg_count; } +#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) + +static SLJIT_INLINE sljit_uw compute_next_addr(struct sljit_label *label, struct sljit_jump *jump, + struct sljit_const *const_, struct sljit_put_label *put_label) +{ + sljit_uw result = ~(sljit_uw)0; + + if (label) + result = label->size; + + if (jump && jump->addr < result) + result = jump->addr; + + if (const_ && const_->addr < result) + result = const_->addr; + + if (put_label && put_label->addr < result) + result = put_label->addr; + + return result; +} + +#endif /* !SLJIT_CONFIG_X86 */ + static SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds, sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) @@ -687,6 +718,19 @@ static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_comp compiler->last_const = const_; } +static SLJIT_INLINE void set_put_label(struct sljit_put_label *put_label, struct sljit_compiler *compiler, sljit_uw offset) +{ + put_label->next = NULL; + put_label->label = NULL; + put_label->addr = compiler->size - offset; + put_label->flags = 0; + if (compiler->last_put_label) + compiler->last_put_label->next = put_label; + else + compiler->put_labels = put_label; + compiler->last_put_label = put_label; +} + #define ADDRESSING_DEPENDS_ON(exp, reg) \ (((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg)) @@ -1905,6 +1949,21 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_const(struct sljit_compil CHECK_RETURN_OK; } +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + FUNCTION_CHECK_DST(dst, dstw, 0); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " put_label "); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + #endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */ #define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \ @@ -2581,6 +2640,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return NULL; } +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + return NULL; +} + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) { SLJIT_UNUSED_ARG(addr); @@ -2597,4 +2664,4 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta SLJIT_UNREACHABLE(); } -#endif +#endif /* !SLJIT_CONFIG_UNSUPPORTED */ diff --git a/thirdparty/pcre2/src/sljit/sljitLir.h b/thirdparty/pcre2/src/sljit/sljitLir.h index e71890cf7b..836d25cf71 100644 --- a/thirdparty/pcre2/src/sljit/sljitLir.h +++ b/thirdparty/pcre2/src/sljit/sljitLir.h @@ -348,13 +348,20 @@ struct sljit_label { struct sljit_jump { struct sljit_jump *next; sljit_uw addr; - sljit_sw flags; + sljit_uw flags; union { sljit_uw target; - struct sljit_label* label; + struct sljit_label *label; } u; }; +struct sljit_put_label { + struct sljit_put_label *next; + struct sljit_label *label; + sljit_uw addr; + sljit_uw flags; +}; + struct sljit_const { struct sljit_const *next; sljit_uw addr; @@ -366,10 +373,12 @@ struct sljit_compiler { struct sljit_label *labels; struct sljit_jump *jumps; + struct sljit_put_label *put_labels; struct sljit_const *consts; struct sljit_label *last_label; struct sljit_jump *last_jump; struct sljit_const *last_const; + struct sljit_put_label *last_put_label; void *allocator_data; struct sljit_memory_fragment *buf; @@ -1314,10 +1323,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil Flags: - (may destroy flags) */ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset); -/* The constant can be changed runtime (see: sljit_set_const) +/* Store a value that can be changed runtime (see: sljit_get_const_addr / sljit_set_const) Flags: - (does not modify flags) */ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value); +/* Store the value of a label (see: sljit_set_put_label) + Flags: - (does not modify flags) */ +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw); + +/* Set the value stored by put_label to this label. */ +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label); + /* After the code generation the address for label, jump and const instructions are computed. Since these structures are freed by sljit_free_compiler, the addresses must be preserved by the user program elsewere. */ diff --git a/thirdparty/pcre2/src/sljit/sljitNativeARM_32.c b/thirdparty/pcre2/src/sljit/sljitNativeARM_32.c index 6d61eed9a7..71f7bcdadb 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeARM_32.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeARM_32.c @@ -583,8 +583,9 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_uw *buf_end; sljit_uw size; sljit_uw word_count; + sljit_uw next_addr; sljit_sw executable_offset; - sljit_sw jump_addr; + sljit_sw addr; #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) sljit_uw cpool_size; sljit_uw cpool_skip_alignment; @@ -597,6 +598,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; + struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); @@ -625,11 +627,13 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil code_ptr = code; word_count = 0; + next_addr = 1; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; + put_label = compiler->put_labels; if (label && label->size == 0) { label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); @@ -669,35 +673,45 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil else if ((*buf_ptr & 0xff000000) != PUSH_POOL) { #endif *code_ptr = *buf_ptr++; + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + /* These structures are ordered by their address. */ - SLJIT_ASSERT(!label || label->size >= word_count); - SLJIT_ASSERT(!jump || jump->addr >= word_count); - SLJIT_ASSERT(!const_ || const_->addr >= word_count); - if (jump && jump->addr == word_count) { + if (jump && jump->addr == word_count) { #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - if (detect_jump_type(jump, code_ptr, code, executable_offset)) - code_ptr--; - jump->addr = (sljit_uw)code_ptr; + if (detect_jump_type(jump, code_ptr, code, executable_offset)) + code_ptr--; + jump->addr = (sljit_uw)code_ptr; #else - jump->addr = (sljit_uw)(code_ptr - 2); - if (detect_jump_type(jump, code_ptr, code, executable_offset)) - code_ptr -= 2; + jump->addr = (sljit_uw)(code_ptr - 2); + if (detect_jump_type(jump, code_ptr, code, executable_offset)) + code_ptr -= 2; #endif - jump = jump->next; - } - if (label && label->size == word_count) { - /* code_ptr can be affected above. */ - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr + 1, executable_offset); - label->size = (code_ptr + 1) - code; - label = label->next; - } - if (const_ && const_->addr == word_count) { + jump = jump->next; + } + if (label && label->size == word_count) { + /* code_ptr can be affected above. */ + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr + 1, executable_offset); + label->size = (code_ptr + 1) - code; + label = label->next; + } + if (const_ && const_->addr == word_count) { #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - const_->addr = (sljit_uw)code_ptr; + const_->addr = (sljit_uw)code_ptr; #else - const_->addr = (sljit_uw)(code_ptr - 1); + const_->addr = (sljit_uw)(code_ptr - 1); #endif - const_ = const_->next; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); } code_ptr++; #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) @@ -725,6 +739,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) SLJIT_ASSERT(cpool_size == 0); @@ -755,15 +770,15 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil buf_ptr = (sljit_uw *)jump->addr; if (jump->flags & PATCH_B) { - jump_addr = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset); + addr = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset); if (!(jump->flags & JUMP_ADDR)) { SLJIT_ASSERT(jump->flags & JUMP_LABEL); - SLJIT_ASSERT(((sljit_sw)jump->u.label->addr - jump_addr) <= 0x01ffffff && ((sljit_sw)jump->u.label->addr - jump_addr) >= -0x02000000); - *buf_ptr |= (((sljit_sw)jump->u.label->addr - jump_addr) >> 2) & 0x00ffffff; + SLJIT_ASSERT(((sljit_sw)jump->u.label->addr - addr) <= 0x01ffffff && ((sljit_sw)jump->u.label->addr - addr) >= -0x02000000); + *buf_ptr |= (((sljit_sw)jump->u.label->addr - addr) >> 2) & 0x00ffffff; } else { - SLJIT_ASSERT(((sljit_sw)jump->u.target - jump_addr) <= 0x01ffffff && ((sljit_sw)jump->u.target - jump_addr) >= -0x02000000); - *buf_ptr |= (((sljit_sw)jump->u.target - jump_addr) >> 2) & 0x00ffffff; + SLJIT_ASSERT(((sljit_sw)jump->u.target - addr) <= 0x01ffffff && ((sljit_sw)jump->u.target - addr) >= -0x02000000); + *buf_ptr |= (((sljit_sw)jump->u.target - addr) >> 2) & 0x00ffffff; } } else if (jump->flags & SLJIT_REWRITABLE_JUMP) { @@ -813,6 +828,22 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil } #endif + put_label = compiler->put_labels; + while (put_label) { + addr = put_label->label->addr; + buf_ptr = (sljit_uw*)put_label->addr; + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + SLJIT_ASSERT((buf_ptr[0] & 0xffff0000) == 0xe59f0000); + buf_ptr[((buf_ptr[0] & 0xfff) >> 2) + 2] = addr; +#else + SLJIT_ASSERT((buf_ptr[-1] & 0xfff00000) == MOVW && (buf_ptr[0] & 0xfff00000) == MOVT); + buf_ptr[-1] |= ((addr << 4) & 0xf0000) | (addr & 0xfff); + buf_ptr[0] |= ((addr >> 12) & 0xf0000) | ((addr >> 16) & 0xfff); +#endif + put_label = put_label->next; + } + SLJIT_ASSERT(code_ptr - code <= (sljit_s32)size); compiler->error = SLJIT_ERR_COMPILED; @@ -2639,28 +2670,55 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compile SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) { struct sljit_const *const_; - sljit_s32 reg; + sljit_s32 dst_r; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); ADJUST_LOCAL_OFFSET(dst, dstw); + dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG2; + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), init_value)); + compiler->patches++; +#else + PTR_FAIL_IF(emit_imm(compiler, dst_r, init_value)); +#endif + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); PTR_FAIL_IF(!const_); + set_const(const_, compiler); - reg = SLOW_IS_REG(dst) ? dst : TMP_REG2; + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1)); + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG2; #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) - PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, reg, TMP_PC, 0), init_value)); + PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), 0)); compiler->patches++; #else - PTR_FAIL_IF(emit_imm(compiler, reg, init_value)); + PTR_FAIL_IF(emit_imm(compiler, dst_r, 0)); #endif - set_const(const_, compiler); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1)); - return const_; + return put_label; } SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) diff --git a/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c b/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c index b015695c52..e15b3451e8 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeARM_64.c @@ -161,7 +161,7 @@ static SLJIT_INLINE void modify_imm64_const(sljit_ins* inst, sljit_uw new_imm) inst[3] = MOVK | dst | ((new_imm >> 48) << 5) | (3 << 21); } -static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +static SLJIT_INLINE sljit_sw detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) { sljit_sw diff; sljit_uw target_addr; @@ -196,14 +196,14 @@ static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_in return 4; } - if (target_addr <= 0xffffffffl) { + if (target_addr < 0x100000000l) { if (jump->flags & IS_COND) code_ptr[-5] -= (2 << 5); code_ptr[-2] = code_ptr[0]; return 2; } - if (target_addr <= 0xffffffffffffl) { + if (target_addr < 0x1000000000000l) { if (jump->flags & IS_COND) code_ptr[-5] -= (1 << 5); jump->flags |= PATCH_ABS48; @@ -215,6 +215,22 @@ static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_in return 0; } +static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +{ + if (max_label < 0x100000000l) { + put_label->flags = 0; + return 2; + } + + if (max_label < 0x1000000000000l) { + put_label->flags = 1; + return 1; + } + + put_label->flags = 2; + return 0; +} + SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) { struct sljit_memory_fragment *buf; @@ -223,6 +239,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_ins *buf_ptr; sljit_ins *buf_end; sljit_uw word_count; + sljit_uw next_addr; sljit_sw executable_offset; sljit_uw addr; sljit_s32 dst; @@ -230,6 +247,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; + struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); @@ -241,34 +259,47 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil code_ptr = code; word_count = 0; + next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; + put_label = compiler->put_labels; do { buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { *code_ptr = *buf_ptr++; - /* These structures are ordered by their address. */ - SLJIT_ASSERT(!label || label->size >= word_count); - SLJIT_ASSERT(!jump || jump->addr >= word_count); - SLJIT_ASSERT(!const_ || const_->addr >= word_count); - if (label && label->size == word_count) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - label->size = code_ptr - code; - label = label->next; - } - if (jump && jump->addr == word_count) { - jump->addr = (sljit_uw)(code_ptr - 4); - code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset); - jump = jump->next; - } - if (const_ && const_->addr == word_count) { - const_->addr = (sljit_uw)code_ptr; - const_ = const_->next; + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == word_count) { + jump->addr = (sljit_uw)(code_ptr - 4); + code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == word_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)(code_ptr - 3); + code_ptr -= put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); } code_ptr ++; word_count ++; @@ -286,6 +317,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); jump = compiler->jumps; @@ -323,6 +355,23 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil jump = jump->next; } + put_label = compiler->put_labels; + while (put_label) { + addr = put_label->label->addr; + buf_ptr = (sljit_ins *)put_label->addr; + + buf_ptr[0] |= (addr & 0xffff) << 5; + buf_ptr[1] |= ((addr >> 16) & 0xffff) << 5; + + if (put_label->flags >= 1) + buf_ptr[2] |= ((addr >> 32) & 0xffff) << 5; + + if (put_label->flags >= 2) + buf_ptr[3] |= ((addr >> 48) & 0xffff) << 5; + + put_label = put_label->next; + } + compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins); @@ -1947,6 +1996,28 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + PTR_FAIL_IF(emit_imm64_const(compiler, dst_r, 0)); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 1); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2)); + + return put_label; +} + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) { sljit_ins* inst = (sljit_ins*)addr; diff --git a/thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c b/thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c index d7024b6d7d..cdfe4a4d24 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeARM_T2_32.c @@ -365,11 +365,13 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_u16 *buf_ptr; sljit_u16 *buf_end; sljit_uw half_count; + sljit_uw next_addr; sljit_sw executable_offset; struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; + struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); @@ -381,34 +383,46 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil code_ptr = code; half_count = 0; + next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; + put_label = compiler->put_labels; do { buf_ptr = (sljit_u16*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 1); do { *code_ptr = *buf_ptr++; - /* These structures are ordered by their address. */ - SLJIT_ASSERT(!label || label->size >= half_count); - SLJIT_ASSERT(!jump || jump->addr >= half_count); - SLJIT_ASSERT(!const_ || const_->addr >= half_count); - if (label && label->size == half_count) { - label->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1; - label->size = code_ptr - code; - label = label->next; - } - if (jump && jump->addr == half_count) { - jump->addr = (sljit_uw)code_ptr - ((jump->flags & IS_COND) ? 10 : 8); - code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset); - jump = jump->next; - } - if (const_ && const_->addr == half_count) { - const_->addr = (sljit_uw)code_ptr; - const_ = const_->next; + if (next_addr == half_count) { + SLJIT_ASSERT(!label || label->size >= half_count); + SLJIT_ASSERT(!jump || jump->addr >= half_count); + SLJIT_ASSERT(!const_ || const_->addr >= half_count); + SLJIT_ASSERT(!put_label || put_label->addr >= half_count); + + /* These structures are ordered by their address. */ + if (label && label->size == half_count) { + label->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1; + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == half_count) { + jump->addr = (sljit_uw)code_ptr - ((jump->flags & IS_COND) ? 10 : 8); + code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == half_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == half_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); } code_ptr ++; half_count ++; @@ -426,6 +440,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); jump = compiler->jumps; @@ -434,6 +449,12 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil jump = jump->next; } + put_label = compiler->put_labels; + while (put_label) { + modify_imm32_const((sljit_u16 *)put_label->addr, put_label->label->addr); + put_label = put_label->next; + } + compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = (code_ptr - code) * sizeof(sljit_u16); @@ -2311,6 +2332,27 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + PTR_FAIL_IF(emit_imm32_const(compiler, dst_r, 0)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2)); + return put_label; +} + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) { sljit_u16 *inst = (sljit_u16*)addr; diff --git a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c index ad970bf25a..16dec052fe 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_32.c @@ -425,6 +425,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_ta { sljit_ins *inst = (sljit_ins *)addr; + SLJIT_ASSERT((inst[0] & 0xffe00000) == LUI && (inst[1] & 0xfc000000) == ORI); inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff); inst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff); inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); @@ -435,6 +436,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta { sljit_ins *inst = (sljit_ins *)addr; + SLJIT_ASSERT((inst[0] & 0xffe00000) == LUI && (inst[1] & 0xfc000000) == ORI); inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff); inst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff); inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); diff --git a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c index e0d6a3f085..7d1d087496 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeMIPS_common.c @@ -449,6 +449,55 @@ static __attribute__ ((noinline)) void sljit_cache_flush(void* code, void* code_ } #endif +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + +static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +{ + if (max_label < 0x80000000l) { + put_label->flags = 0; + return 1; + } + + if (max_label < 0x800000000000l) { + put_label->flags = 1; + return 3; + } + + put_label->flags = 2; + return 5; +} + +static SLJIT_INLINE void put_label_set(struct sljit_put_label *put_label) +{ + sljit_uw addr = put_label->label->addr; + sljit_ins *inst = (sljit_ins *)put_label->addr; + sljit_s32 reg = *inst; + + if (put_label->flags == 0) { + SLJIT_ASSERT(addr < 0x80000000l); + inst[0] = LUI | T(reg) | IMM(addr >> 16); + } + else if (put_label->flags == 1) { + SLJIT_ASSERT(addr < 0x800000000000l); + inst[0] = LUI | T(reg) | IMM(addr >> 32); + inst[1] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff); + inst[2] = DSLL | T(reg) | D(reg) | SH_IMM(16); + inst += 2; + } + else { + inst[0] = LUI | T(reg) | IMM(addr >> 48); + inst[1] = ORI | S(reg) | T(reg) | IMM((addr >> 32) & 0xffff); + inst[2] = DSLL | T(reg) | D(reg) | SH_IMM(16); + inst[3] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff); + inst[4] = DSLL | T(reg) | D(reg) | SH_IMM(16); + inst += 4; + } + + inst[1] = ORI | S(reg) | T(reg) | IMM(addr & 0xffff); +} + +#endif + SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) { struct sljit_memory_fragment *buf; @@ -457,12 +506,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_ins *buf_ptr; sljit_ins *buf_end; sljit_uw word_count; + sljit_uw next_addr; sljit_sw executable_offset; sljit_uw addr; struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; + struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); @@ -474,39 +525,54 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil code_ptr = code; word_count = 0; + next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; + put_label = compiler->put_labels; do { buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { *code_ptr = *buf_ptr++; - SLJIT_ASSERT(!label || label->size >= word_count); - SLJIT_ASSERT(!jump || jump->addr >= word_count); - SLJIT_ASSERT(!const_ || const_->addr >= word_count); - /* These structures are ordered by their address. */ - if (label && label->size == word_count) { - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - label->size = code_ptr - code; - label = label->next; - } - if (jump && jump->addr == word_count) { + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == word_count) { #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) - jump->addr = (sljit_uw)(code_ptr - 3); + jump->addr = (sljit_uw)(code_ptr - 3); #else - jump->addr = (sljit_uw)(code_ptr - 7); + jump->addr = (sljit_uw)(code_ptr - 7); #endif - code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); - jump = jump->next; - } - if (const_ && const_->addr == word_count) { - /* Just recording the address. */ - const_->addr = (sljit_uw)code_ptr; - const_ = const_->next; + code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == word_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); + word_count += 5; +#endif + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); } code_ptr ++; word_count ++; @@ -524,6 +590,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); jump = compiler->jumps; @@ -571,6 +638,21 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil jump = jump->next; } + put_label = compiler->put_labels; + while (put_label) { +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + addr = put_label->label->addr; + buf_ptr = (sljit_ins *)put_label->addr; + + SLJIT_ASSERT((buf_ptr[0] & 0xffe00000) == LUI && (buf_ptr[1] & 0xfc000000) == ORI); + buf_ptr[0] |= (addr >> 16) & 0xffff; + buf_ptr[1] |= addr & 0xffff; +#else + put_label_set(put_label); +#endif + put_label = put_label->next; + } + compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins); @@ -2157,7 +2239,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) { struct sljit_const *const_; - sljit_s32 reg; + sljit_s32 dst_r; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); @@ -2167,11 +2249,38 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi PTR_FAIL_IF(!const_); set_const(const_, compiler); - reg = FAST_IS_REG(dst) ? dst : TMP_REG2; - - PTR_FAIL_IF(emit_const(compiler, reg, init_value)); + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, init_value)); if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + return const_; } + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + PTR_FAIL_IF(emit_const(compiler, dst_r, 0)); +#else + PTR_FAIL_IF(push_inst(compiler, dst_r, UNMOVABLE_INS)); + compiler->size += 5; +#endif + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + + return put_label; +} diff --git a/thirdparty/pcre2/src/sljit/sljitNativePPC_32.c b/thirdparty/pcre2/src/sljit/sljitNativePPC_32.c index fc185f7847..3ce741153f 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativePPC_32.c +++ b/thirdparty/pcre2/src/sljit/sljitNativePPC_32.c @@ -259,6 +259,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_ta { sljit_ins *inst = (sljit_ins *)addr; + SLJIT_ASSERT((inst[0] & 0xfc1f0000) == ADDIS && (inst[1] & 0xfc000000) == ORI); inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff); inst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff); inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); @@ -269,6 +270,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta { sljit_ins *inst = (sljit_ins *)addr; + SLJIT_ASSERT((inst[0] & 0xfc1f0000) == ADDIS && (inst[1] & 0xfc000000) == ORI); inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff); inst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff); inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); diff --git a/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c b/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c index 706b2ba20b..3b73021cc8 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c +++ b/thirdparty/pcre2/src/sljit/sljitNativePPC_64.c @@ -35,9 +35,6 @@ #error "Must implement count leading zeroes" #endif -#define RLDI(dst, src, sh, mb, type) \ - (HI(30) | S(src) | A(dst) | ((type) << 2) | (((sh) & 0x1f) << 11) | (((sh) & 0x20) >> 4) | (((mb) & 0x1f) << 6) | ((mb) & 0x20)) - #define PUSH_RLDICR(reg, shift) \ push_inst(compiler, RLDI(reg, reg, 63 - shift, shift, 1)) diff --git a/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c b/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c index b34e3965ed..e827514315 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c +++ b/thirdparty/pcre2/src/sljit/sljitNativePPC_common.c @@ -231,6 +231,9 @@ static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { #define SIMM_MIN (-0x8000) #define UIMM_MAX (0xffff) +#define RLDI(dst, src, sh, mb, type) \ + (HI(30) | S(src) | A(dst) | ((type) << 2) | (((sh) & 0x1f) << 11) | (((sh) & 0x20) >> 4) | (((mb) & 0x1f) << 6) | ((mb) & 0x20)) + #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) SLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_sw addr, void* func) { @@ -324,6 +327,55 @@ keep_address: return 0; } +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + +static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +{ + if (max_label < 0x100000000l) { + put_label->flags = 0; + return 1; + } + + if (max_label < 0x1000000000000l) { + put_label->flags = 1; + return 3; + } + + put_label->flags = 2; + return 4; +} + +static SLJIT_INLINE void put_label_set(struct sljit_put_label *put_label) +{ + sljit_uw addr = put_label->label->addr; + sljit_ins *inst = (sljit_ins *)put_label->addr; + sljit_s32 reg = *inst; + + if (put_label->flags == 0) { + SLJIT_ASSERT(addr < 0x100000000l); + inst[0] = ORIS | S(TMP_ZERO) | A(reg) | IMM(addr >> 16); + } + else { + if (put_label->flags == 1) { + SLJIT_ASSERT(addr < 0x1000000000000l); + inst[0] = ORI | S(TMP_ZERO) | A(reg) | IMM(addr >> 32); + } + else { + inst[0] = ORIS | S(TMP_ZERO) | A(reg) | IMM(addr >> 48); + inst[1] = ORI | S(reg) | A(reg) | IMM((addr >> 32) & 0xffff); + inst ++; + } + + inst[1] = RLDI(reg, reg, 32, 31, 1); + inst[2] = ORIS | S(reg) | A(reg) | IMM((addr >> 16) & 0xffff); + inst += 2; + } + + inst[1] = ORI | S(reg) | A(reg) | IMM(addr & 0xffff); +} + +#endif + SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) { struct sljit_memory_fragment *buf; @@ -332,12 +384,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_ins *buf_ptr; sljit_ins *buf_end; sljit_uw word_count; + sljit_uw next_addr; sljit_sw executable_offset; sljit_uw addr; struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; + struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); @@ -356,71 +410,87 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil code_ptr = code; word_count = 0; + next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; + put_label = compiler->put_labels; do { buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { *code_ptr = *buf_ptr++; - SLJIT_ASSERT(!label || label->size >= word_count); - SLJIT_ASSERT(!jump || jump->addr >= word_count); - SLJIT_ASSERT(!const_ || const_->addr >= word_count); - /* These structures are ordered by their address. */ - if (label && label->size == word_count) { - /* Just recording the address. */ - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - label->size = code_ptr - code; - label = label->next; - } - if (jump && jump->addr == word_count) { + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + /* Just recording the address. */ + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == word_count) { #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) - jump->addr = (sljit_uw)(code_ptr - 3); + jump->addr = (sljit_uw)(code_ptr - 3); #else - jump->addr = (sljit_uw)(code_ptr - 6); + jump->addr = (sljit_uw)(code_ptr - 6); #endif - if (detect_jump_type(jump, code_ptr, code, executable_offset)) { + if (detect_jump_type(jump, code_ptr, code, executable_offset)) { #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) - code_ptr[-3] = code_ptr[0]; - code_ptr -= 3; -#else - if (jump->flags & PATCH_ABS32) { + code_ptr[-3] = code_ptr[0]; code_ptr -= 3; - code_ptr[-1] = code_ptr[2]; - code_ptr[0] = code_ptr[3]; - } - else if (jump->flags & PATCH_ABS48) { - code_ptr--; - code_ptr[-1] = code_ptr[0]; - code_ptr[0] = code_ptr[1]; - /* rldicr rX,rX,32,31 -> rX,rX,16,47 */ - SLJIT_ASSERT((code_ptr[-3] & 0xfc00ffff) == 0x780007c6); - code_ptr[-3] ^= 0x8422; - /* oris -> ori */ - code_ptr[-2] ^= 0x4000000; - } - else { - code_ptr[-6] = code_ptr[0]; - code_ptr -= 6; - } +#else + if (jump->flags & PATCH_ABS32) { + code_ptr -= 3; + code_ptr[-1] = code_ptr[2]; + code_ptr[0] = code_ptr[3]; + } + else if (jump->flags & PATCH_ABS48) { + code_ptr--; + code_ptr[-1] = code_ptr[0]; + code_ptr[0] = code_ptr[1]; + /* rldicr rX,rX,32,31 -> rX,rX,16,47 */ + SLJIT_ASSERT((code_ptr[-3] & 0xfc00ffff) == 0x780007c6); + code_ptr[-3] ^= 0x8422; + /* oris -> ori */ + code_ptr[-2] ^= 0x4000000; + } + else { + code_ptr[-6] = code_ptr[0]; + code_ptr -= 6; + } #endif - if (jump->flags & REMOVE_COND) { - code_ptr[0] = BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001); - code_ptr++; - jump->addr += sizeof(sljit_ins); - code_ptr[0] = Bx; - jump->flags -= IS_COND; + if (jump->flags & REMOVE_COND) { + code_ptr[0] = BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001); + code_ptr++; + jump->addr += sizeof(sljit_ins); + code_ptr[0] = Bx; + jump->flags -= IS_COND; + } } + jump = jump->next; } - jump = jump->next; - } - if (const_ && const_->addr == word_count) { - const_->addr = (sljit_uw)code_ptr; - const_ = const_->next; + if (const_ && const_->addr == word_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); + word_count += 4; +#endif + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); } code_ptr ++; word_count ++; @@ -438,6 +508,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + #if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size - (sizeof(struct sljit_function_context) / sizeof(sljit_ins))); #else @@ -503,6 +575,21 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil jump = jump->next; } + put_label = compiler->put_labels; + while (put_label) { +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + addr = put_label->label->addr; + buf_ptr = (sljit_ins *)put_label->addr; + + SLJIT_ASSERT((buf_ptr[0] & 0xfc1f0000) == ADDIS && (buf_ptr[1] & 0xfc000000) == ORI); + buf_ptr[0] |= (addr >> 16) & 0xffff; + buf_ptr[1] |= addr & 0xffff; +#else + put_label_set(put_label); +#endif + put_label = put_label->next; + } + compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins); @@ -2261,7 +2348,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compil SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) { struct sljit_const *const_; - sljit_s32 reg; + sljit_s32 dst_r; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); @@ -2271,11 +2358,38 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi PTR_FAIL_IF(!const_); set_const(const_, compiler); - reg = FAST_IS_REG(dst) ? dst : TMP_REG2; - - PTR_FAIL_IF(emit_const(compiler, reg, init_value)); + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, init_value)); if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + return const_; } + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + PTR_FAIL_IF(emit_const(compiler, dst_r, 0)); +#else + PTR_FAIL_IF(push_inst(compiler, dst_r)); + compiler->size += 4; +#endif + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + + return put_label; +} diff --git a/thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c b/thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c index 0671b130cc..8079fad8df 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeSPARC_32.c @@ -267,6 +267,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_ta { sljit_ins *inst = (sljit_ins *)addr; + SLJIT_ASSERT(((inst[0] & 0xc1c00000) == 0x01000000) && ((inst[1] & 0xc1f82000) == 0x80102000)); inst[0] = (inst[0] & 0xffc00000) | ((new_target >> 10) & 0x3fffff); inst[1] = (inst[1] & 0xfffffc00) | (new_target & 0x3ff); inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); @@ -277,6 +278,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta { sljit_ins *inst = (sljit_ins *)addr; + SLJIT_ASSERT(((inst[0] & 0xc1c00000) == 0x01000000) && ((inst[1] & 0xc1f82000) == 0x80102000)); inst[0] = (inst[0] & 0xffc00000) | ((new_constant >> 10) & 0x3fffff); inst[1] = (inst[1] & 0xfffffc00) | (new_constant & 0x3ff); inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); diff --git a/thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c b/thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c index 669ecd8152..bfa4ecede2 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeSPARC_common.c @@ -298,12 +298,14 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil sljit_ins *buf_ptr; sljit_ins *buf_end; sljit_uw word_count; + sljit_uw next_addr; sljit_sw executable_offset; sljit_uw addr; struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; + struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); @@ -315,40 +317,52 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil code_ptr = code; word_count = 0; + next_addr = 0; executable_offset = SLJIT_EXEC_OFFSET(code); label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; + put_label = compiler->put_labels; do { buf_ptr = (sljit_ins*)buf->memory; buf_end = buf_ptr + (buf->used_size >> 2); do { *code_ptr = *buf_ptr++; - SLJIT_ASSERT(!label || label->size >= word_count); - SLJIT_ASSERT(!jump || jump->addr >= word_count); - SLJIT_ASSERT(!const_ || const_->addr >= word_count); - /* These structures are ordered by their address. */ - if (label && label->size == word_count) { - /* Just recording the address. */ - label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); - label->size = code_ptr - code; - label = label->next; - } - if (jump && jump->addr == word_count) { + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + /* Just recording the address. */ + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == word_count) { #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) - jump->addr = (sljit_uw)(code_ptr - 3); + jump->addr = (sljit_uw)(code_ptr - 3); #else - jump->addr = (sljit_uw)(code_ptr - 6); + jump->addr = (sljit_uw)(code_ptr - 6); #endif - code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); - jump = jump->next; - } - if (const_ && const_->addr == word_count) { - /* Just recording the address. */ - const_->addr = (sljit_uw)code_ptr; - const_ = const_->next; + code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == word_count) { + /* Just recording the address. */ + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); } code_ptr ++; word_count ++; @@ -366,6 +380,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); SLJIT_ASSERT(code_ptr - code <= (sljit_s32)compiler->size); jump = compiler->jumps; @@ -389,8 +404,9 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil /* Set the fields of immediate loads. */ #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) - buf_ptr[0] = (buf_ptr[0] & 0xffc00000) | ((addr >> 10) & 0x3fffff); - buf_ptr[1] = (buf_ptr[1] & 0xfffffc00) | (addr & 0x3ff); + SLJIT_ASSERT(((buf_ptr[0] & 0xc1cfffff) == 0x01000000) && ((buf_ptr[1] & 0xc1f83fff) == 0x80102000)); + buf_ptr[0] |= (addr >> 10) & 0x3fffff; + buf_ptr[1] |= addr & 0x3ff; #else #error "Implementation required" #endif @@ -398,6 +414,20 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil jump = jump->next; } + put_label = compiler->put_labels; + while (put_label) { + addr = put_label->label->addr; + buf_ptr = (sljit_ins *)put_label->addr; + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + SLJIT_ASSERT(((buf_ptr[0] & 0xc1cfffff) == 0x01000000) && ((buf_ptr[1] & 0xc1f83fff) == 0x80102000)); + buf_ptr[0] |= (addr >> 10) & 0x3fffff; + buf_ptr[1] |= addr & 0x3ff; +#else +#error "Implementation required" +#endif + put_label = put_label->next; + } compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; @@ -1465,8 +1495,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compil SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) { - sljit_s32 reg; struct sljit_const *const_; + sljit_s32 dst_r; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); @@ -1476,11 +1506,31 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi PTR_FAIL_IF(!const_); set_const(const_, compiler); - reg = FAST_IS_REG(dst) ? dst : TMP_REG2; - - PTR_FAIL_IF(emit_const(compiler, reg, init_value)); + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, init_value)); if (dst & SLJIT_MEM) PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw)); return const_; } + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, 0)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw)); + return put_label; +} diff --git a/thirdparty/pcre2/src/sljit/sljitNativeX86_32.c b/thirdparty/pcre2/src/sljit/sljitNativeX86_32.c index 074e64b9f2..34a3a3d940 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeX86_32.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeX86_32.c @@ -38,8 +38,10 @@ static sljit_s32 emit_do_imm(struct sljit_compiler *compiler, sljit_u8 opcode, s return SLJIT_SUCCESS; } -static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type, sljit_sw executable_offset) +static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset) { + sljit_s32 type = jump->flags >> TYPE_SHIFT; + if (type == SLJIT_JUMP) { *code_ptr++ = JMP_i32; jump->addr++; diff --git a/thirdparty/pcre2/src/sljit/sljitNativeX86_64.c b/thirdparty/pcre2/src/sljit/sljitNativeX86_64.c index 8506565614..5758711954 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeX86_64.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeX86_64.c @@ -39,8 +39,10 @@ static sljit_s32 emit_load_imm64(struct sljit_compiler *compiler, sljit_s32 reg, return SLJIT_SUCCESS; } -static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type) +static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr) { + sljit_s32 type = jump->flags >> TYPE_SHIFT; + int short_addr = !(jump->flags & SLJIT_REWRITABLE_JUMP) && !(jump->flags & JUMP_LABEL) && (jump->u.target <= 0xffffffff); /* The relative jump below specialized for this case. */ @@ -72,6 +74,56 @@ static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ return code_ptr; } +static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, sljit_u8 *code_ptr, sljit_uw max_label) +{ + if (max_label > HALFWORD_MAX) { + put_label->addr -= put_label->flags; + put_label->flags = PATCH_MD; + return code_ptr; + } + + if (put_label->flags == 0) { + /* Destination is register. */ + code_ptr = (sljit_u8*)put_label->addr - 2 - sizeof(sljit_uw); + + SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); + SLJIT_ASSERT((code_ptr[1] & 0xf8) == MOV_r_i32); + + if ((code_ptr[0] & 0x07) != 0) { + code_ptr[0] = (sljit_u8)(code_ptr[0] & ~0x08); + code_ptr += 2 + sizeof(sljit_s32); + } + else { + code_ptr[0] = code_ptr[1]; + code_ptr += 1 + sizeof(sljit_s32); + } + + put_label->addr = (sljit_uw)code_ptr; + return code_ptr; + } + + code_ptr -= put_label->flags + (2 + sizeof(sljit_uw)); + SLJIT_MEMMOVE(code_ptr, code_ptr + (2 + sizeof(sljit_uw)), put_label->flags); + + SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); + + if ((code_ptr[1] & 0xf8) == MOV_r_i32) { + code_ptr += 2 + sizeof(sljit_uw); + SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); + } + + SLJIT_ASSERT(code_ptr[1] == MOV_rm_r); + + code_ptr[0] = (sljit_u8)(code_ptr[0] & ~0x4); + code_ptr[1] = MOV_rm_i32; + code_ptr[2] = (sljit_u8)(code_ptr[2] & ~(0x7 << 3)); + + code_ptr = (sljit_u8*)(put_label->addr - (2 + sizeof(sljit_uw)) + sizeof(sljit_s32)); + put_label->addr = (sljit_uw)code_ptr; + put_label->flags = 0; + return code_ptr; +} + SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) diff --git a/thirdparty/pcre2/src/sljit/sljitNativeX86_common.c b/thirdparty/pcre2/src/sljit/sljitNativeX86_common.c index 6f02ee3e8b..6296da5382 100644 --- a/thirdparty/pcre2/src/sljit/sljitNativeX86_common.c +++ b/thirdparty/pcre2/src/sljit/sljitNativeX86_common.c @@ -428,13 +428,15 @@ static sljit_u8 get_jump_code(sljit_s32 type) } #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) -static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type, sljit_sw executable_offset); +static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset); #else -static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type); +static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr); +static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, sljit_u8 *code_ptr, sljit_uw max_label); #endif -static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_s32 type, sljit_sw executable_offset) +static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_sw executable_offset) { + sljit_s32 type = jump->flags >> TYPE_SHIFT; sljit_s32 short_jump; sljit_uw label_addr; @@ -447,7 +449,7 @@ static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if ((sljit_sw)(label_addr - (jump->addr + 1)) > HALFWORD_MAX || (sljit_sw)(label_addr - (jump->addr + 1)) < HALFWORD_MIN) - return generate_far_jump_code(jump, code_ptr, type); + return generate_far_jump_code(jump, code_ptr); #endif if (type == SLJIT_JUMP) { @@ -497,6 +499,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil struct sljit_label *label; struct sljit_jump *jump; struct sljit_const *const_; + struct sljit_put_label *put_label; CHECK_ERROR_PTR(); CHECK_PTR(check_sljit_generate_code(compiler)); @@ -511,6 +514,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil label = compiler->labels; jump = compiler->jumps; const_ = compiler->consts; + put_label = compiler->put_labels; executable_offset = SLJIT_EXEC_OFFSET(code); do { @@ -525,27 +529,38 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil buf_ptr += len; } else { - if (*buf_ptr >= 2) { + switch (*buf_ptr) { + case 0: + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + break; + case 1: jump->addr = (sljit_uw)code_ptr; if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) - code_ptr = generate_near_jump_code(jump, code_ptr, code, *buf_ptr - 2, executable_offset); + code_ptr = generate_near_jump_code(jump, code_ptr, code, executable_offset); else { #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) - code_ptr = generate_far_jump_code(jump, code_ptr, *buf_ptr - 2, executable_offset); + code_ptr = generate_far_jump_code(jump, code_ptr, executable_offset); #else - code_ptr = generate_far_jump_code(jump, code_ptr, *buf_ptr - 2); + code_ptr = generate_far_jump_code(jump, code_ptr); #endif } jump = jump->next; - } - else if (*buf_ptr == 0) { - label->addr = ((sljit_uw)code_ptr) + executable_offset; - label->size = code_ptr - code; - label = label->next; - } - else { /* *buf_ptr is 1 */ + break; + case 2: const_->addr = ((sljit_uw)code_ptr) - sizeof(sljit_sw); const_ = const_->next; + break; + default: + SLJIT_ASSERT(*buf_ptr == 3); + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + code_ptr = generate_put_label_code(put_label, code_ptr, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); +#endif + put_label = put_label->next; + break; } buf_ptr++; } @@ -557,6 +572,8 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil SLJIT_ASSERT(!label); SLJIT_ASSERT(!jump); SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + SLJIT_ASSERT(code_ptr <= code + compiler->size); jump = compiler->jumps; while (jump) { @@ -591,8 +608,24 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil jump = jump->next; } - /* Some space may be wasted because of short jumps. */ - SLJIT_ASSERT(code_ptr <= code + compiler->size); + put_label = compiler->put_labels; + while (put_label) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_unaligned_store_sw((void*)(put_label->addr - sizeof(sljit_sw)), (sljit_sw)put_label->label->addr); +#else + if (put_label->flags & PATCH_MD) { + SLJIT_ASSERT(put_label->label->addr > HALFWORD_MAX); + sljit_unaligned_store_sw((void*)(put_label->addr - sizeof(sljit_sw)), (sljit_sw)put_label->label->addr); + } + else { + SLJIT_ASSERT(put_label->label->addr <= HALFWORD_MAX); + sljit_unaligned_store_s32((void*)(put_label->addr - sizeof(sljit_s32)), (sljit_s32)put_label->label->addr); + } +#endif + + put_label = put_label->next; + } + compiler->error = SLJIT_ERR_COMPILED; compiler->executable_offset = executable_offset; compiler->executable_size = code_ptr - code; @@ -2481,7 +2514,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); PTR_FAIL_IF_NULL(jump); - set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + set_jump(jump, compiler, (type & SLJIT_REWRITABLE_JUMP) | ((type & 0xff) << TYPE_SHIFT)); type &= 0xff; /* Worst case size. */ @@ -2495,7 +2528,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile PTR_FAIL_IF_NULL(inst); *inst++ = 0; - *inst++ = type + 2; + *inst++ = 1; return jump; } @@ -2513,7 +2546,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi if (src == SLJIT_IMM) { jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); FAIL_IF_NULL(jump); - set_jump(jump, compiler, JUMP_ADDR); + set_jump(jump, compiler, JUMP_ADDR | (type << TYPE_SHIFT)); jump->u.target = srcw; /* Worst case size. */ @@ -2527,7 +2560,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compi FAIL_IF_NULL(inst); *inst++ = 0; - *inst++ = type + 2; + *inst++ = 1; } else { #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) @@ -2831,7 +2864,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi PTR_FAIL_IF(!inst); *inst++ = 0; - *inst++ = 1; + *inst++ = 2; #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) if (dst & SLJIT_MEM) @@ -2842,6 +2875,54 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi return const_; } +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_u8 *inst; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + sljit_s32 reg; + sljit_uw start_size; +#endif + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + CHECK_EXTRA_REGS(dst, dstw, (void)0); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; + reg = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (emit_load_imm64(compiler, reg, 0)) + return NULL; +#else + if (emit_mov(compiler, dst, dstw, SLJIT_IMM, 0)) + return NULL; +#endif + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (dst & SLJIT_MEM) { + start_size = compiler->size; + if (emit_mov(compiler, dst, dstw, TMP_REG1, 0)) + return NULL; + put_label->flags = compiler->size - start_size; + } +#endif + + inst = (sljit_u8*)ensure_buf(compiler, 2); + PTR_FAIL_IF(!inst); + + *inst++ = 0; + *inst++ = 3; + + return put_label; +} + SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) { SLJIT_UNUSED_ARG(executable_offset); diff --git a/thirdparty/pcre2/src/sljit/sljitUtils.c b/thirdparty/pcre2/src/sljit/sljitUtils.c index 5c2a838932..857492a174 100644 --- a/thirdparty/pcre2/src/sljit/sljitUtils.c +++ b/thirdparty/pcre2/src/sljit/sljitUtils.c @@ -154,7 +154,13 @@ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void) #include "windows.h" #else /* Provides mmap function. */ +#include <sys/types.h> #include <sys/mman.h> +#ifndef MAP_ANON +#ifdef MAP_ANONYMOUS +#define MAP_ANON MAP_ANONYMOUS +#endif +#endif /* For detecting the page size. */ #include <unistd.h> diff --git a/thirdparty/recastnavigation/Recast/Include/Recast.h b/thirdparty/recastnavigation/Recast/Include/Recast.h index e85c0d2e29..4d557389b5 100644 --- a/thirdparty/recastnavigation/Recast/Include/Recast.h +++ b/thirdparty/recastnavigation/Recast/Include/Recast.h @@ -332,6 +332,8 @@ struct rcCompactSpan /// @ingroup recast struct rcCompactHeightfield { + rcCompactHeightfield(); + ~rcCompactHeightfield(); int width; ///< The width of the heightfield. (Along the x-axis in cell units.) int height; ///< The height of the heightfield. (Along the z-axis in cell units.) int spanCount; ///< The number of spans in the heightfield. @@ -376,6 +378,8 @@ struct rcHeightfieldLayer /// @see rcAllocHeightfieldLayerSet, rcFreeHeightfieldLayerSet struct rcHeightfieldLayerSet { + rcHeightfieldLayerSet(); + ~rcHeightfieldLayerSet(); rcHeightfieldLayer* layers; ///< The layers in the set. [Size: #nlayers] int nlayers; ///< The number of layers in the set. }; @@ -395,6 +399,8 @@ struct rcContour /// @ingroup recast struct rcContourSet { + rcContourSet(); + ~rcContourSet(); rcContour* conts; ///< An array of the contours in the set. [Size: #nconts] int nconts; ///< The number of contours in the set. float bmin[3]; ///< The minimum bounds in world space. [(x, y, z)] @@ -411,6 +417,8 @@ struct rcContourSet /// @ingroup recast struct rcPolyMesh { + rcPolyMesh(); + ~rcPolyMesh(); unsigned short* verts; ///< The mesh vertices. [Form: (x, y, z) * #nverts] unsigned short* polys; ///< Polygon and neighbor data. [Length: #maxpolys * 2 * #nvp] unsigned short* regs; ///< The region id assigned to each polygon. [Length: #maxpolys] diff --git a/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h b/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h index 3cdd450d42..e436af9a01 100644 --- a/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h +++ b/thirdparty/recastnavigation/Recast/Include/RecastAlloc.h @@ -20,6 +20,9 @@ #define RECASTALLOC_H #include <stddef.h> +#include <stdint.h> + +#include <RecastAssert.h> /// Provides hint values to the memory allocator on how long the /// memory is expected to be used. @@ -58,64 +61,257 @@ void* rcAlloc(size_t size, rcAllocHint hint); /// @see rcAlloc void rcFree(void* ptr); +/// An implementation of operator new usable for placement new. The default one is part of STL (which we don't use). +/// rcNewTag is a dummy type used to differentiate our operator from the STL one, in case users import both Recast +/// and STL. +struct rcNewTag {}; +inline void* operator new(size_t, const rcNewTag&, void* p) { return p; } +inline void operator delete(void*, const rcNewTag&, void*) {} -/// A simple dynamic array of integers. -class rcIntArray -{ - int* m_data; - int m_size, m_cap; +/// Signed to avoid warnnings when comparing to int loop indexes, and common error with comparing to zero. +/// MSVC2010 has a bug where ssize_t is unsigned (!!!). +typedef intptr_t rcSizeType; +#define RC_SIZE_MAX INTPTR_MAX - void doResize(int n); - - // Explicitly disabled copy constructor and copy assignment operator. - rcIntArray(const rcIntArray&); - rcIntArray& operator=(const rcIntArray&); +/// Macros to hint to the compiler about the likeliest branch. Please add a benchmark that demonstrates a performance +/// improvement before introducing use cases. +#if defined(__GNUC__) || defined(__clang__) +#define rcLikely(x) __builtin_expect((x), true) +#define rcUnlikely(x) __builtin_expect((x), false) +#else +#define rcLikely(x) (x) +#define rcUnlikely(x) (x) +#endif -public: - /// Constructs an instance with an initial array size of zero. - rcIntArray() : m_data(0), m_size(0), m_cap(0) {} +/// Variable-sized storage type. Mimics the interface of std::vector<T> with some notable differences: +/// * Uses rcAlloc()/rcFree() to handle storage. +/// * No support for a custom allocator. +/// * Uses signed size instead of size_t to avoid warnings in for loops: "for (int i = 0; i < foo.size(); i++)" +/// * Omits methods of limited utility: insert/erase, (bad performance), at (we don't use exceptions), operator=. +/// * assign() and the pre-sizing constructor follow C++11 semantics -- they don't construct a temporary if no value is provided. +/// * push_back() and resize() support adding values from the current vector. Range-based constructors and assign(begin, end) do not. +/// * No specialization for bool. +template <typename T, rcAllocHint H> +class rcVectorBase { + rcSizeType m_size; + rcSizeType m_cap; + T* m_data; + // Constructs a T at the give address with either the copy constructor or the default. + static void construct(T* p, const T& v) { ::new(rcNewTag(), (void*)p) T(v); } + static void construct(T* p) { ::new(rcNewTag(), (void*)p) T; } + static void construct_range(T* begin, T* end); + static void construct_range(T* begin, T* end, const T& value); + static void copy_range(T* dst, const T* begin, const T* end); + void destroy_range(rcSizeType begin, rcSizeType end); + // Creates an array of the given size, copies all of this vector's data into it, and returns it. + T* allocate_and_copy(rcSizeType size); + void resize_impl(rcSizeType size, const T* value); + public: + typedef rcSizeType size_type; + typedef T value_type; - /// Constructs an instance initialized to the specified size. - /// @param[in] n The initial size of the integer array. - rcIntArray(int n) : m_data(0), m_size(0), m_cap(0) { resize(n); } - ~rcIntArray() { rcFree(m_data); } + rcVectorBase() : m_size(0), m_cap(0), m_data(0) {}; + rcVectorBase(const rcVectorBase<T, H>& other) : m_size(0), m_cap(0), m_data(0) { assign(other.begin(), other.end()); } + explicit rcVectorBase(rcSizeType count) : m_size(0), m_cap(0), m_data(0) { resize(count); } + rcVectorBase(rcSizeType count, const T& value) : m_size(0), m_cap(0), m_data(0) { resize(count, value); } + rcVectorBase(const T* begin, const T* end) : m_size(0), m_cap(0), m_data(0) { assign(begin, end); } + ~rcVectorBase() { destroy_range(0, m_size); rcFree(m_data); } - /// Specifies the new size of the integer array. - /// @param[in] n The new size of the integer array. - void resize(int n) - { - if (n > m_cap) - doResize(n); - - m_size = n; + // Unlike in std::vector, we return a bool to indicate whether the alloc was successful. + bool reserve(rcSizeType size); + + void assign(rcSizeType count, const T& value) { clear(); resize(count, value); } + void assign(const T* begin, const T* end); + + void resize(rcSizeType size) { resize_impl(size, NULL); } + void resize(rcSizeType size, const T& value) { resize_impl(size, &value); } + // Not implemented as resize(0) because resize requires T to be default-constructible. + void clear() { destroy_range(0, m_size); m_size = 0; } + + void push_back(const T& value); + void pop_back() { rcAssert(m_size > 0); back().~T(); m_size--; } + + rcSizeType size() const { return m_size; } + rcSizeType capacity() const { return m_cap; } + bool empty() const { return size() == 0; } + + const T& operator[](rcSizeType i) const { rcAssert(i >= 0 && i < m_size); return m_data[i]; } + T& operator[](rcSizeType i) { rcAssert(i >= 0 && i < m_size); return m_data[i]; } + + const T& front() const { rcAssert(m_size); return m_data[0]; } + T& front() { rcAssert(m_size); return m_data[0]; } + const T& back() const { rcAssert(m_size); return m_data[m_size - 1]; }; + T& back() { rcAssert(m_size); return m_data[m_size - 1]; }; + const T* data() const { return m_data; } + T* data() { return m_data; } + + T* begin() { return m_data; } + T* end() { return m_data + m_size; } + const T* begin() const { return m_data; } + const T* end() const { return m_data + m_size; } + + void swap(rcVectorBase<T, H>& other); + + // Explicitly deleted. + rcVectorBase& operator=(const rcVectorBase<T, H>& other); +}; + +template<typename T, rcAllocHint H> +bool rcVectorBase<T, H>::reserve(rcSizeType count) { + if (count <= m_cap) { + return true; + } + T* new_data = allocate_and_copy(count); + if (!new_data) { + return false; + } + destroy_range(0, m_size); + rcFree(m_data); + m_data = new_data; + m_cap = count; + return true; +} +template <typename T, rcAllocHint H> +T* rcVectorBase<T, H>::allocate_and_copy(rcSizeType size) { + rcAssert(RC_SIZE_MAX / static_cast<rcSizeType>(sizeof(T)) >= size); + T* new_data = static_cast<T*>(rcAlloc(sizeof(T) * size, H)); + if (new_data) { + copy_range(new_data, m_data, m_data + m_size); + } + return new_data; +} +template <typename T, rcAllocHint H> +void rcVectorBase<T, H>::assign(const T* begin, const T* end) { + clear(); + reserve(end - begin); + m_size = end - begin; + copy_range(m_data, begin, end); +} +template <typename T, rcAllocHint H> +void rcVectorBase<T, H>::push_back(const T& value) { + // rcLikely increases performance by ~50% on BM_rcVector_PushPreallocated, + // and by ~2-5% on BM_rcVector_Push. + if (rcLikely(m_size < m_cap)) { + construct(m_data + m_size++, value); + return; } - /// Push the specified integer onto the end of the array and increases the size by one. - /// @param[in] item The new value. - void push(int item) { resize(m_size+1); m_data[m_size-1] = item; } + rcAssert(RC_SIZE_MAX / 2 >= m_size); + rcSizeType new_cap = m_size ? 2*m_size : 1; + T* data = allocate_and_copy(new_cap); + // construct between allocate and destroy+free in case value is + // in this vector. + construct(data + m_size, value); + destroy_range(0, m_size); + m_size++; + m_cap = new_cap; + rcFree(m_data); + m_data = data; +} +template <typename T, rcAllocHint H> +void rcVectorBase<T, H>::resize_impl(rcSizeType size, const T* value) { + if (size < m_size) { + destroy_range(size, m_size); + m_size = size; + } else if (size > m_size) { + T* new_data = allocate_and_copy(size); + // We defer deconstructing/freeing old data until after constructing + // new elements in case "value" is there. + if (value) { + construct_range(new_data + m_size, new_data + size, *value); + } else { + construct_range(new_data + m_size, new_data + size); + } + destroy_range(0, m_size); + rcFree(m_data); + m_data = new_data; + m_cap = size; + m_size = size; + } +} +template <typename T, rcAllocHint H> +void rcVectorBase<T, H>::swap(rcVectorBase<T, H>& other) { + // TODO: Reorganize headers so we can use rcSwap here. + rcSizeType tmp_cap = other.m_cap; + rcSizeType tmp_size = other.m_size; + T* tmp_data = other.m_data; - /// Returns the value at the end of the array and reduces the size by one. - /// @return The value at the end of the array. - int pop() - { - if (m_size > 0) - m_size--; - - return m_data[m_size]; + other.m_cap = m_cap; + other.m_size = m_size; + other.m_data = m_data; + + m_cap = tmp_cap; + m_size = tmp_size; + m_data = tmp_data; +} +// static +template <typename T, rcAllocHint H> +void rcVectorBase<T, H>::construct_range(T* begin, T* end) { + for (T* p = begin; p < end; p++) { + construct(p); + } +} +// static +template <typename T, rcAllocHint H> +void rcVectorBase<T, H>::construct_range(T* begin, T* end, const T& value) { + for (T* p = begin; p < end; p++) { + construct(p, value); + } +} +// static +template <typename T, rcAllocHint H> +void rcVectorBase<T, H>::copy_range(T* dst, const T* begin, const T* end) { + for (rcSizeType i = 0 ; i < end - begin; i++) { + construct(dst + i, begin[i]); } +} +template <typename T, rcAllocHint H> +void rcVectorBase<T, H>::destroy_range(rcSizeType begin, rcSizeType end) { + for (rcSizeType i = begin; i < end; i++) { + m_data[i].~T(); + } +} - /// The value at the specified array index. - /// @warning Does not provide overflow protection. - /// @param[in] i The index of the value. - const int& operator[](int i) const { return m_data[i]; } +template <typename T> +class rcTempVector : public rcVectorBase<T, RC_ALLOC_TEMP> { + typedef rcVectorBase<T, RC_ALLOC_TEMP> Base; +public: + rcTempVector() : Base() {} + explicit rcTempVector(rcSizeType size) : Base(size) {} + rcTempVector(rcSizeType size, const T& value) : Base(size, value) {} + rcTempVector(const rcTempVector<T>& other) : Base(other) {} + rcTempVector(const T* begin, const T* end) : Base(begin, end) {} +}; +template <typename T> +class rcPermVector : public rcVectorBase<T, RC_ALLOC_PERM> { + typedef rcVectorBase<T, RC_ALLOC_PERM> Base; +public: + rcPermVector() : Base() {} + explicit rcPermVector(rcSizeType size) : Base(size) {} + rcPermVector(rcSizeType size, const T& value) : Base(size, value) {} + rcPermVector(const rcPermVector<T>& other) : Base(other) {} + rcPermVector(const T* begin, const T* end) : Base(begin, end) {} +}; - /// The value at the specified array index. - /// @warning Does not provide overflow protection. - /// @param[in] i The index of the value. - int& operator[](int i) { return m_data[i]; } - /// The current size of the integer array. - int size() const { return m_size; } +/// Legacy class. Prefer rcVector<int>. +class rcIntArray +{ + rcTempVector<int> m_impl; +public: + rcIntArray() {} + rcIntArray(int n) : m_impl(n, 0) {} + void push(int item) { m_impl.push_back(item); } + void resize(int size) { m_impl.resize(size); } + int pop() + { + int v = m_impl.back(); + m_impl.pop_back(); + return v; + } + int size() const { return static_cast<int>(m_impl.size()); } + int& operator[](int index) { return m_impl[index]; } + int operator[](int index) const { return m_impl[index]; } }; /// A simple helper class used to delete an array when it goes out of scope. diff --git a/thirdparty/recastnavigation/Recast/Source/Recast.cpp b/thirdparty/recastnavigation/Recast/Source/Recast.cpp index 8308d1973e..1b71710cdc 100644 --- a/thirdparty/recastnavigation/Recast/Source/Recast.cpp +++ b/thirdparty/recastnavigation/Recast/Source/Recast.cpp @@ -23,11 +23,34 @@ #include <stdlib.h> #include <stdio.h> #include <stdarg.h> -#include <new> #include "Recast.h" #include "RecastAlloc.h" #include "RecastAssert.h" +namespace +{ +/// Allocates and constructs an object of the given type, returning a pointer. +/// TODO: Support constructor args. +/// @param[in] hint Hint to the allocator. +template <typename T> +T* rcNew(rcAllocHint hint) { + T* ptr = (T*)rcAlloc(sizeof(T), hint); + ::new(rcNewTag(), (void*)ptr) T(); + return ptr; +} + +/// Destroys and frees an object allocated with rcNew. +/// @param[in] ptr The object pointer to delete. +template <typename T> +void rcDelete(T* ptr) { + if (ptr) { + ptr->~T(); + rcFree((void*)ptr); + } +} +} // namespace + + float rcSqrt(float x) { return sqrtf(x); @@ -73,9 +96,8 @@ void rcContext::log(const rcLogCategory category, const char* format, ...) rcHeightfield* rcAllocHeightfield() { - return new (rcAlloc(sizeof(rcHeightfield), RC_ALLOC_PERM)) rcHeightfield; + return rcNew<rcHeightfield>(RC_ALLOC_PERM); } - rcHeightfield::rcHeightfield() : width() , height() @@ -104,84 +126,133 @@ rcHeightfield::~rcHeightfield() void rcFreeHeightField(rcHeightfield* hf) { - if (!hf) return; - hf->~rcHeightfield(); - rcFree(hf); + rcDelete(hf); } rcCompactHeightfield* rcAllocCompactHeightfield() { - rcCompactHeightfield* chf = (rcCompactHeightfield*)rcAlloc(sizeof(rcCompactHeightfield), RC_ALLOC_PERM); - memset(chf, 0, sizeof(rcCompactHeightfield)); - return chf; + return rcNew<rcCompactHeightfield>(RC_ALLOC_PERM); } void rcFreeCompactHeightfield(rcCompactHeightfield* chf) { - if (!chf) return; - rcFree(chf->cells); - rcFree(chf->spans); - rcFree(chf->dist); - rcFree(chf->areas); - rcFree(chf); + rcDelete(chf); } -rcHeightfieldLayerSet* rcAllocHeightfieldLayerSet() +rcCompactHeightfield::rcCompactHeightfield() + : width(), + height(), + spanCount(), + walkableHeight(), + walkableClimb(), + borderSize(), + maxDistance(), + maxRegions(), + bmin(), + bmax(), + cs(), + ch(), + cells(), + spans(), + dist(), + areas() { - rcHeightfieldLayerSet* lset = (rcHeightfieldLayerSet*)rcAlloc(sizeof(rcHeightfieldLayerSet), RC_ALLOC_PERM); - memset(lset, 0, sizeof(rcHeightfieldLayerSet)); - return lset; +} +rcCompactHeightfield::~rcCompactHeightfield() +{ + rcFree(cells); + rcFree(spans); + rcFree(dist); + rcFree(areas); } +rcHeightfieldLayerSet* rcAllocHeightfieldLayerSet() +{ + return rcNew<rcHeightfieldLayerSet>(RC_ALLOC_PERM); +} void rcFreeHeightfieldLayerSet(rcHeightfieldLayerSet* lset) { - if (!lset) return; - for (int i = 0; i < lset->nlayers; ++i) + rcDelete(lset); +} + +rcHeightfieldLayerSet::rcHeightfieldLayerSet() + : layers(), nlayers() {} +rcHeightfieldLayerSet::~rcHeightfieldLayerSet() +{ + for (int i = 0; i < nlayers; ++i) { - rcFree(lset->layers[i].heights); - rcFree(lset->layers[i].areas); - rcFree(lset->layers[i].cons); + rcFree(layers[i].heights); + rcFree(layers[i].areas); + rcFree(layers[i].cons); } - rcFree(lset->layers); - rcFree(lset); + rcFree(layers); } rcContourSet* rcAllocContourSet() { - rcContourSet* cset = (rcContourSet*)rcAlloc(sizeof(rcContourSet), RC_ALLOC_PERM); - memset(cset, 0, sizeof(rcContourSet)); - return cset; + return rcNew<rcContourSet>(RC_ALLOC_PERM); } - void rcFreeContourSet(rcContourSet* cset) { - if (!cset) return; - for (int i = 0; i < cset->nconts; ++i) + rcDelete(cset); +} + +rcContourSet::rcContourSet() + : conts(), + nconts(), + bmin(), + bmax(), + cs(), + ch(), + width(), + height(), + borderSize(), + maxError() {} +rcContourSet::~rcContourSet() +{ + for (int i = 0; i < nconts; ++i) { - rcFree(cset->conts[i].verts); - rcFree(cset->conts[i].rverts); + rcFree(conts[i].verts); + rcFree(conts[i].rverts); } - rcFree(cset->conts); - rcFree(cset); + rcFree(conts); } + rcPolyMesh* rcAllocPolyMesh() { - rcPolyMesh* pmesh = (rcPolyMesh*)rcAlloc(sizeof(rcPolyMesh), RC_ALLOC_PERM); - memset(pmesh, 0, sizeof(rcPolyMesh)); - return pmesh; + return rcNew<rcPolyMesh>(RC_ALLOC_PERM); } - void rcFreePolyMesh(rcPolyMesh* pmesh) { - if (!pmesh) return; - rcFree(pmesh->verts); - rcFree(pmesh->polys); - rcFree(pmesh->regs); - rcFree(pmesh->flags); - rcFree(pmesh->areas); - rcFree(pmesh); + rcDelete(pmesh); +} + +rcPolyMesh::rcPolyMesh() + : verts(), + polys(), + regs(), + flags(), + areas(), + nverts(), + npolys(), + maxpolys(), + nvp(), + bmin(), + bmax(), + cs(), + ch(), + borderSize(), + maxEdgeError() {} + +rcPolyMesh::~rcPolyMesh() +{ + rcFree(verts); + rcFree(polys); + rcFree(regs); + rcFree(flags); + rcFree(areas); } rcPolyMeshDetail* rcAllocPolyMeshDetail() diff --git a/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp b/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp index 453b5fa6a6..bdc366116e 100644 --- a/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp +++ b/thirdparty/recastnavigation/Recast/Source/RecastAlloc.cpp @@ -58,29 +58,3 @@ void rcFree(void* ptr) if (ptr) sRecastFreeFunc(ptr); } - -/// @class rcIntArray -/// -/// While it is possible to pre-allocate a specific array size during -/// construction or by using the #resize method, certain methods will -/// automatically resize the array as needed. -/// -/// @warning The array memory is not initialized to zero when the size is -/// manually set during construction or when using #resize. - -/// @par -/// -/// Using this method ensures the array is at least large enough to hold -/// the specified number of elements. This can improve performance by -/// avoiding auto-resizing during use. -void rcIntArray::doResize(int n) -{ - if (!m_cap) m_cap = n; - while (m_cap < n) m_cap *= 2; - int* newData = (int*)rcAlloc(m_cap*sizeof(int), RC_ALLOC_TEMP); - rcAssert(newData); - if (m_size && newData) memcpy(newData, m_data, m_size*sizeof(int)); - rcFree(m_data); - m_data = newData; -} - diff --git a/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp b/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp index 277ab01501..6574c11b6b 100644 --- a/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp +++ b/thirdparty/recastnavigation/Recast/Source/RecastContour.cpp @@ -1009,7 +1009,7 @@ bool rcBuildContours(rcContext* ctx, rcCompactHeightfield& chf, if (cset.nconts > 0) { // Calculate winding of all polygons. - rcScopedDelete<char> winding((char*)rcAlloc(sizeof(char)*cset.nconts, RC_ALLOC_TEMP)); + rcScopedDelete<signed char> winding((signed char*)rcAlloc(sizeof(signed char)*cset.nconts, RC_ALLOC_TEMP)); if (!winding) { ctx->log(RC_LOG_ERROR, "rcBuildContours: Out of memory 'hole' (%d).", cset.nconts); diff --git a/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp b/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp index f953132f74..9a423cab8a 100644 --- a/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp +++ b/thirdparty/recastnavigation/Recast/Source/RecastMeshDetail.cpp @@ -557,15 +557,16 @@ static float polyMinExtent(const float* verts, const int nverts) inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; } inline int next(int i, int n) { return i+1 < n ? i+1 : 0; } -static void triangulateHull(const int /*nverts*/, const float* verts, const int nhull, const int* hull, rcIntArray& tris) +static void triangulateHull(const int /*nverts*/, const float* verts, const int nhull, const int* hull, const int nin, rcIntArray& tris) { int start = 0, left = 1, right = nhull-1; // Start from an ear with shortest perimeter. // This tends to favor well formed triangles as starting point. - float dmin = 0; + float dmin = FLT_MAX; for (int i = 0; i < nhull; i++) { + if (hull[i] >= nin) continue; // Ears are triangles with original vertices as middle vertex while others are actually line segments on edges int pi = prev(i, nhull); int ni = next(i, nhull); const float* pv = &verts[hull[pi]*3]; @@ -770,7 +771,7 @@ static bool buildPolyDetail(rcContext* ctx, const float* in, const int nin, // If the polygon minimum extent is small (sliver or small triangle), do not try to add internal points. if (minExtent < sampleDist*2) { - triangulateHull(nverts, verts, nhull, hull, tris); + triangulateHull(nverts, verts, nhull, hull, nin, tris); return true; } @@ -778,7 +779,7 @@ static bool buildPolyDetail(rcContext* ctx, const float* in, const int nin, // We're using the triangulateHull instead of delaunayHull as it tends to // create a bit better triangulation for long thin triangles when there // are no internal points. - triangulateHull(nverts, verts, nhull, hull, tris); + triangulateHull(nverts, verts, nhull, hull, nin, tris); if (tris.size() == 0) { @@ -1140,7 +1141,8 @@ static void getHeightData(rcContext* ctx, const rcCompactHeightfield& chf, static unsigned char getEdgeFlags(const float* va, const float* vb, const float* vpoly, const int npoly) { - // Return true if edge (va,vb) is part of the polygon. + // The flag returned by this function matches dtDetailTriEdgeFlags in Detour. + // Figure out if edge (va,vb) is part of the polygon boundary. static const float thrSqr = rcSqr(0.001f); for (int i = 0, j = npoly-1; i < npoly; j=i++) { diff --git a/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp b/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp index 38a2bd6bfa..e1fc0ee788 100644 --- a/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp +++ b/thirdparty/recastnavigation/Recast/Source/RecastRegion.cpp @@ -25,8 +25,17 @@ #include "Recast.h" #include "RecastAlloc.h" #include "RecastAssert.h" -#include <new> +namespace +{ +struct LevelStackEntry +{ + LevelStackEntry(int x_, int y_, int index_) : x(x_), y(y_), index(index_) {} + int x; + int y; + int index; +}; +} // namespace static void calculateDistanceField(rcCompactHeightfield& chf, unsigned short* src, unsigned short& maxDist) { @@ -245,17 +254,15 @@ static bool floodRegion(int x, int y, int i, unsigned short level, unsigned short r, rcCompactHeightfield& chf, unsigned short* srcReg, unsigned short* srcDist, - rcIntArray& stack) + rcTempVector<LevelStackEntry>& stack) { const int w = chf.width; const unsigned char area = chf.areas[i]; // Flood fill mark region. - stack.resize(0); - stack.push((int)x); - stack.push((int)y); - stack.push((int)i); + stack.clear(); + stack.push_back(LevelStackEntry(x, y, i)); srcReg[i] = r; srcDist[i] = 0; @@ -264,9 +271,11 @@ static bool floodRegion(int x, int y, int i, while (stack.size() > 0) { - int ci = stack.pop(); - int cy = stack.pop(); - int cx = stack.pop(); + LevelStackEntry& back = stack.back(); + int cx = back.x; + int cy = back.y; + int ci = back.index; + stack.pop_back(); const rcCompactSpan& cs = chf.spans[ci]; @@ -332,9 +341,7 @@ static bool floodRegion(int x, int y, int i, { srcReg[ai] = r; srcDist[ai] = 0; - stack.push(ax); - stack.push(ay); - stack.push(ai); + stack.push_back(LevelStackEntry(ax, ay, ai)); } } } @@ -343,12 +350,20 @@ static bool floodRegion(int x, int y, int i, return count > 0; } -static unsigned short* expandRegions(int maxIter, unsigned short level, - rcCompactHeightfield& chf, - unsigned short* srcReg, unsigned short* srcDist, - unsigned short* dstReg, unsigned short* dstDist, - rcIntArray& stack, - bool fillStack) +// Struct to keep track of entries in the region table that have been changed. +struct DirtyEntry +{ + DirtyEntry(int index_, unsigned short region_, unsigned short distance2_) + : index(index_), region(region_), distance2(distance2_) {} + int index; + unsigned short region; + unsigned short distance2; +}; +static void expandRegions(int maxIter, unsigned short level, + rcCompactHeightfield& chf, + unsigned short* srcReg, unsigned short* srcDist, + rcTempVector<LevelStackEntry>& stack, + bool fillStack) { const int w = chf.width; const int h = chf.height; @@ -356,7 +371,7 @@ static unsigned short* expandRegions(int maxIter, unsigned short level, if (fillStack) { // Find cells revealed by the raised level. - stack.resize(0); + stack.clear(); for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) @@ -366,9 +381,7 @@ static unsigned short* expandRegions(int maxIter, unsigned short level, { if (chf.dist[i] >= level && srcReg[i] == 0 && chf.areas[i] != RC_NULL_AREA) { - stack.push(x); - stack.push(y); - stack.push(i); + stack.push_back(LevelStackEntry(x, y, i)); } } } @@ -377,27 +390,26 @@ static unsigned short* expandRegions(int maxIter, unsigned short level, else // use cells in the input stack { // mark all cells which already have a region - for (int j=0; j<stack.size(); j+=3) + for (int j=0; j<stack.size(); j++) { - int i = stack[j+2]; + int i = stack[j].index; if (srcReg[i] != 0) - stack[j+2] = -1; + stack[j].index = -1; } } + rcTempVector<DirtyEntry> dirtyEntries; int iter = 0; while (stack.size() > 0) { int failed = 0; + dirtyEntries.clear(); - memcpy(dstReg, srcReg, sizeof(unsigned short)*chf.spanCount); - memcpy(dstDist, srcDist, sizeof(unsigned short)*chf.spanCount); - - for (int j = 0; j < stack.size(); j += 3) + for (int j = 0; j < stack.size(); j++) { - int x = stack[j+0]; - int y = stack[j+1]; - int i = stack[j+2]; + int x = stack[j].x; + int y = stack[j].y; + int i = stack[j].index; if (i < 0) { failed++; @@ -426,9 +438,8 @@ static unsigned short* expandRegions(int maxIter, unsigned short level, } if (r) { - stack[j+2] = -1; // mark as used - dstReg[i] = r; - dstDist[i] = d2; + stack[j].index = -1; // mark as used + dirtyEntries.push_back(DirtyEntry(i, r, d2)); } else { @@ -436,11 +447,14 @@ static unsigned short* expandRegions(int maxIter, unsigned short level, } } - // rcSwap source and dest. - rcSwap(srcReg, dstReg); - rcSwap(srcDist, dstDist); + // Copy entries that differ between src and dst to keep them in sync. + for (int i = 0; i < dirtyEntries.size(); i++) { + int idx = dirtyEntries[i].index; + srcReg[idx] = dirtyEntries[i].region; + srcDist[idx] = dirtyEntries[i].distance2; + } - if (failed*3 == stack.size()) + if (failed == stack.size()) break; if (level > 0) @@ -450,16 +464,14 @@ static unsigned short* expandRegions(int maxIter, unsigned short level, break; } } - - return srcReg; } static void sortCellsByLevel(unsigned short startLevel, rcCompactHeightfield& chf, - unsigned short* srcReg, - unsigned int nbStacks, rcIntArray* stacks, + const unsigned short* srcReg, + unsigned int nbStacks, rcTempVector<LevelStackEntry>* stacks, unsigned short loglevelsPerStack) // the levels per stack (2 in our case) as a bit shift { const int w = chf.width; @@ -467,7 +479,7 @@ static void sortCellsByLevel(unsigned short startLevel, startLevel = startLevel >> loglevelsPerStack; for (unsigned int j=0; j<nbStacks; ++j) - stacks[j].resize(0); + stacks[j].clear(); // put all cells in the level range into the appropriate stacks for (int y = 0; y < h; ++y) @@ -487,26 +499,23 @@ static void sortCellsByLevel(unsigned short startLevel, if (sId < 0) sId = 0; - stacks[sId].push(x); - stacks[sId].push(y); - stacks[sId].push(i); + stacks[sId].push_back(LevelStackEntry(x, y, i)); } } } } -static void appendStacks(rcIntArray& srcStack, rcIntArray& dstStack, - unsigned short* srcReg) +static void appendStacks(const rcTempVector<LevelStackEntry>& srcStack, + rcTempVector<LevelStackEntry>& dstStack, + const unsigned short* srcReg) { - for (int j=0; j<srcStack.size(); j+=3) + for (int j=0; j<srcStack.size(); j++) { - int i = srcStack[j+2]; + int i = srcStack[j].index; if ((i < 0) || (srcReg[i] != 0)) continue; - dstStack.push(srcStack[j]); - dstStack.push(srcStack[j+1]); - dstStack.push(srcStack[j+2]); + dstStack.push_back(srcStack[j]); } } @@ -671,7 +680,7 @@ static bool isRegionConnectedToBorder(const rcRegion& reg) return false; } -static bool isSolidEdge(rcCompactHeightfield& chf, unsigned short* srcReg, +static bool isSolidEdge(rcCompactHeightfield& chf, const unsigned short* srcReg, int x, int y, int i, int dir) { const rcCompactSpan& s = chf.spans[i]; @@ -690,7 +699,7 @@ static bool isSolidEdge(rcCompactHeightfield& chf, unsigned short* srcReg, static void walkContour(int x, int y, int i, int dir, rcCompactHeightfield& chf, - unsigned short* srcReg, + const unsigned short* srcReg, rcIntArray& cont) { int startDir = dir; @@ -786,16 +795,15 @@ static bool mergeAndFilterRegions(rcContext* ctx, int minRegionArea, int mergeRe const int h = chf.height; const int nreg = maxRegionId+1; - rcRegion* regions = (rcRegion*)rcAlloc(sizeof(rcRegion)*nreg, RC_ALLOC_TEMP); - if (!regions) - { + rcTempVector<rcRegion> regions; + if (!regions.reserve(nreg)) { ctx->log(RC_LOG_ERROR, "mergeAndFilterRegions: Out of memory 'regions' (%d).", nreg); return false; } // Construct regions for (int i = 0; i < nreg; ++i) - new(®ions[i]) rcRegion((unsigned short)i); + regions.push_back(rcRegion((unsigned short) i)); // Find edge of a region and find connections around the contour. for (int y = 0; y < h; ++y) @@ -1021,11 +1029,6 @@ static bool mergeAndFilterRegions(rcContext* ctx, int minRegionArea, int mergeRe if (regions[i].overlap) overlaps.push(regions[i].id); - for (int i = 0; i < nreg; ++i) - regions[i].~rcRegion(); - rcFree(regions); - - return true; } @@ -1041,22 +1044,21 @@ static void addUniqueConnection(rcRegion& reg, int n) static bool mergeAndFilterLayerRegions(rcContext* ctx, int minRegionArea, unsigned short& maxRegionId, rcCompactHeightfield& chf, - unsigned short* srcReg, rcIntArray& /*overlaps*/) + unsigned short* srcReg) { const int w = chf.width; const int h = chf.height; const int nreg = maxRegionId+1; - rcRegion* regions = (rcRegion*)rcAlloc(sizeof(rcRegion)*nreg, RC_ALLOC_TEMP); - if (!regions) - { + rcTempVector<rcRegion> regions; + + // Construct regions + if (!regions.reserve(nreg)) { ctx->log(RC_LOG_ERROR, "mergeAndFilterLayerRegions: Out of memory 'regions' (%d).", nreg); return false; } - - // Construct regions for (int i = 0; i < nreg; ++i) - new(®ions[i]) rcRegion((unsigned short)i); + regions.push_back(rcRegion((unsigned short) i)); // Find region neighbours and overlapping regions. rcIntArray lregs(32); @@ -1234,10 +1236,6 @@ static bool mergeAndFilterLayerRegions(rcContext* ctx, int minRegionArea, srcReg[i] = regions[srcReg[i]].id; } - for (int i = 0; i < nreg; ++i) - regions[i].~rcRegion(); - rcFree(regions); - return true; } @@ -1391,9 +1389,9 @@ bool rcBuildRegionsMonotone(rcContext* ctx, rcCompactHeightfield& chf, paintRectRegion(w-bw, w, 0, h, id|RC_BORDER_REG, chf, srcReg); id++; paintRectRegion(0, w, 0, bh, id|RC_BORDER_REG, chf, srcReg); id++; paintRectRegion(0, w, h-bh, h, id|RC_BORDER_REG, chf, srcReg); id++; - - chf.borderSize = borderSize; } + + chf.borderSize = borderSize; rcIntArray prev(256); @@ -1535,7 +1533,7 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf, const int w = chf.width; const int h = chf.height; - rcScopedDelete<unsigned short> buf((unsigned short*)rcAlloc(sizeof(unsigned short)*chf.spanCount*4, RC_ALLOC_TEMP)); + rcScopedDelete<unsigned short> buf((unsigned short*)rcAlloc(sizeof(unsigned short)*chf.spanCount*2, RC_ALLOC_TEMP)); if (!buf) { ctx->log(RC_LOG_ERROR, "rcBuildRegions: Out of memory 'tmp' (%d).", chf.spanCount*4); @@ -1546,17 +1544,15 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf, const int LOG_NB_STACKS = 3; const int NB_STACKS = 1 << LOG_NB_STACKS; - rcIntArray lvlStacks[NB_STACKS]; + rcTempVector<LevelStackEntry> lvlStacks[NB_STACKS]; for (int i=0; i<NB_STACKS; ++i) - lvlStacks[i].resize(1024); + lvlStacks[i].reserve(256); - rcIntArray stack(1024); - rcIntArray visited(1024); + rcTempVector<LevelStackEntry> stack; + stack.reserve(256); unsigned short* srcReg = buf; unsigned short* srcDist = buf+chf.spanCount; - unsigned short* dstReg = buf+chf.spanCount*2; - unsigned short* dstDist = buf+chf.spanCount*3; memset(srcReg, 0, sizeof(unsigned short)*chf.spanCount); memset(srcDist, 0, sizeof(unsigned short)*chf.spanCount); @@ -1581,9 +1577,9 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf, paintRectRegion(w-bw, w, 0, h, regionId|RC_BORDER_REG, chf, srcReg); regionId++; paintRectRegion(0, w, 0, bh, regionId|RC_BORDER_REG, chf, srcReg); regionId++; paintRectRegion(0, w, h-bh, h, regionId|RC_BORDER_REG, chf, srcReg); regionId++; - - chf.borderSize = borderSize; } + + chf.borderSize = borderSize; int sId = -1; while (level > 0) @@ -1604,22 +1600,19 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf, rcScopedTimer timerExpand(ctx, RC_TIMER_BUILD_REGIONS_EXPAND); // Expand current regions until no empty connected cells found. - if (expandRegions(expandIters, level, chf, srcReg, srcDist, dstReg, dstDist, lvlStacks[sId], false) != srcReg) - { - rcSwap(srcReg, dstReg); - rcSwap(srcDist, dstDist); - } + expandRegions(expandIters, level, chf, srcReg, srcDist, lvlStacks[sId], false); } { rcScopedTimer timerFloor(ctx, RC_TIMER_BUILD_REGIONS_FLOOD); // Mark new regions with IDs. - for (int j = 0; j<lvlStacks[sId].size(); j += 3) + for (int j = 0; j<lvlStacks[sId].size(); j++) { - int x = lvlStacks[sId][j]; - int y = lvlStacks[sId][j+1]; - int i = lvlStacks[sId][j+2]; + LevelStackEntry current = lvlStacks[sId][j]; + int x = current.x; + int y = current.y; + int i = current.index; if (i >= 0 && srcReg[i] == 0) { if (floodRegion(x, y, i, level, regionId, chf, srcReg, srcDist, stack)) @@ -1638,11 +1631,7 @@ bool rcBuildRegions(rcContext* ctx, rcCompactHeightfield& chf, } // Expand current regions until no empty connected cells found. - if (expandRegions(expandIters*8, 0, chf, srcReg, srcDist, dstReg, dstDist, stack, true) != srcReg) - { - rcSwap(srcReg, dstReg); - rcSwap(srcDist, dstDist); - } + expandRegions(expandIters*8, 0, chf, srcReg, srcDist, stack, true); ctx->stopTimer(RC_TIMER_BUILD_REGIONS_WATERSHED); @@ -1709,9 +1698,9 @@ bool rcBuildLayerRegions(rcContext* ctx, rcCompactHeightfield& chf, paintRectRegion(w-bw, w, 0, h, id|RC_BORDER_REG, chf, srcReg); id++; paintRectRegion(0, w, 0, bh, id|RC_BORDER_REG, chf, srcReg); id++; paintRectRegion(0, w, h-bh, h, id|RC_BORDER_REG, chf, srcReg); id++; - - chf.borderSize = borderSize; } + + chf.borderSize = borderSize; rcIntArray prev(256); @@ -1809,9 +1798,8 @@ bool rcBuildLayerRegions(rcContext* ctx, rcCompactHeightfield& chf, rcScopedTimer timerFilter(ctx, RC_TIMER_BUILD_REGIONS_FILTER); // Merge monotone regions to layers and remove small regions. - rcIntArray overlaps; chf.maxRegions = id; - if (!mergeAndFilterLayerRegions(ctx, minRegionArea, chf.maxRegions, chf, srcReg, overlaps)) + if (!mergeAndFilterLayerRegions(ctx, minRegionArea, chf.maxRegions, chf, srcReg)) return false; } diff --git a/thirdparty/tinyexr/tinyexr.h b/thirdparty/tinyexr/tinyexr.h index bfc52b51a5..7e8956f7d3 100644 --- a/thirdparty/tinyexr/tinyexr.h +++ b/thirdparty/tinyexr/tinyexr.h @@ -105,6 +105,19 @@ extern "C" { // http://computation.llnl.gov/projects/floating-point-compression #endif +#ifndef TINYEXR_USE_THREAD +#define TINYEXR_USE_THREAD (0) // No threaded loading. +// http://computation.llnl.gov/projects/floating-point-compression +#endif + +#ifndef TINYEXR_USE_OPENMP +#ifdef _OPENMP +#define TINYEXR_USE_OPENMP (1) +#else +#define TINYEXR_USE_OPENMP (0) +#endif +#endif + #define TINYEXR_SUCCESS (0) #define TINYEXR_ERROR_INVALID_MAGIC_NUMBER (-1) #define TINYEXR_ERROR_INVALID_EXR_VERSION (-2) @@ -118,6 +131,7 @@ extern "C" { #define TINYEXR_ERROR_UNSUPPORTED_FEATURE (-10) #define TINYEXR_ERROR_CANT_WRITE_FILE (-11) #define TINYEXR_ERROR_SERIALZATION_FAILED (-12) +#define TINYEXR_ERROR_LAYER_NOT_FOUND (-13) // @note { OpenEXR file format: http://www.openexr.com/openexrfilelayout.pdf } @@ -263,7 +277,7 @@ typedef struct _DeepImage { int pad0; } DeepImage; -// @deprecated { to be removed. } +// @deprecated { For backward compatibility. Not recommended to use. } // Loads single-frame OpenEXR image. Assume EXR image contains A(single channel // alpha) or RGB(A) channels. // Application must free image data as returned by `out_rgba` @@ -273,6 +287,27 @@ typedef struct _DeepImage { extern int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, const char **err); +// Loads single-frame OpenEXR image by specifing layer name. Assume EXR image contains A(single channel +// alpha) or RGB(A) channels. +// Application must free image data as returned by `out_rgba` +// Result image format is: float x RGBA x width x hight +// Returns negative value and may set error string in `err` when there's an +// error +// When the specified layer name is not found in the EXR file, the function will return `TINYEXR_ERROR_LAYER_NOT_FOUND`. +extern int LoadEXRWithLayer(float **out_rgba, int *width, int *height, + const char *filename, const char *layer_name, const char **err); + +// +// Get layer infos from EXR file. +// +// @param[out] layer_names List of layer names. Application must free memory after using this. +// @param[out] num_layers The number of layers +// @param[out] err Error string(wll be filled when the function returns error code). Free it using FreeEXRErrorMessage after using this value. +// +// @return TINYEXR_SUCCEES upon success. +// +extern int EXRLayers(const char *filename, const char **layer_names[], int *num_layers, const char **err); + // @deprecated { to be removed. } // Simple wrapper API for ParseEXRHeaderFromFile. // checking given file is a EXR file(by just look up header) @@ -472,7 +507,7 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height, #include <cstring> #include <sstream> -//#include <iostream> // debug +// #include <iostream> // debug #include <limits> #include <string> @@ -481,9 +516,15 @@ extern int LoadEXRFromMemory(float **out_rgba, int *width, int *height, #if __cplusplus > 199711L // C++11 #include <cstdint> + +#if TINYEXR_USE_THREAD +#include <atomic> +#include <thread> +#endif + #endif // __cplusplus > 199711L -#ifdef _OPENMP +#if TINYEXR_USE_OPENMP #include <omp.h> #endif @@ -6917,6 +6958,10 @@ void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, } #endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + #endif // MINIZ_HEADER_FILE_ONLY /* @@ -6952,9 +6997,6 @@ void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, #pragma clang diagnostic pop #endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif } // namespace miniz #else @@ -9954,9 +9996,9 @@ static bool DecodePixelData(/* out */ unsigned char **out_images, return false; } - if (!tinyexr::DecompressRle(reinterpret_cast<unsigned char *>(&outBuf.at(0)), - dstLen, data_ptr, - static_cast<unsigned long>(data_len))) { + if (!tinyexr::DecompressRle( + reinterpret_cast<unsigned char *>(&outBuf.at(0)), dstLen, data_ptr, + static_cast<unsigned long>(data_len))) { return false; } @@ -10272,7 +10314,7 @@ static bool DecodePixelData(/* out */ unsigned char **out_images, return true; } -static void DecodeTiledPixelData( +static bool DecodeTiledPixelData( unsigned char **out_images, int *width, int *height, const int *requested_pixel_types, const unsigned char *data_ptr, size_t data_len, int compression_type, int line_order, int data_width, @@ -10298,11 +10340,11 @@ static void DecodeTiledPixelData( } // Image size = tile size. - DecodePixelData(out_images, requested_pixel_types, data_ptr, data_len, - compression_type, line_order, (*width), tile_size_y, - /* stride */ tile_size_x, /* y */ 0, /* line_no */ 0, - (*height), pixel_data_size, num_attributes, attributes, - num_channels, channels, channel_offset_list); + return DecodePixelData(out_images, requested_pixel_types, data_ptr, data_len, + compression_type, line_order, (*width), tile_size_y, + /* stride */ tile_size_x, /* y */ 0, /* line_no */ 0, + (*height), pixel_data_size, num_attributes, attributes, + num_channels, channels, channel_offset_list); } static bool ComputeChannelLayout(std::vector<size_t> *channel_offset_list, @@ -10851,85 +10893,141 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, exr_image->tiles = static_cast<EXRTile *>( calloc(sizeof(EXRTile), static_cast<size_t>(num_tiles))); + int err_code = TINYEXR_SUCCESS; + +#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0) + + std::vector<std::thread> workers; + std::atomic<size_t> tile_count(0); + + int num_threads = std::max(1, int(std::thread::hardware_concurrency())); + if (num_threads > int(num_tiles)) { + num_threads = int(num_tiles); + } + + for (int t = 0; t < num_threads; t++) { + workers.emplace_back(std::thread([&]() { + size_t tile_idx = 0; + while ((tile_idx = tile_count++) < num_tiles) { + +#else for (size_t tile_idx = 0; tile_idx < num_tiles; tile_idx++) { - // Allocate memory for each tile. - exr_image->tiles[tile_idx].images = tinyexr::AllocateImage( - num_channels, exr_header->channels, exr_header->requested_pixel_types, - exr_header->tile_size_x, exr_header->tile_size_y); - - // 16 byte: tile coordinates - // 4 byte : data size - // ~ : data(uncompressed or compressed) - if (offsets[tile_idx] + sizeof(int) * 5 > size) { - if (err) { - (*err) += "Insufficient data size.\n"; - } - return TINYEXR_ERROR_INVALID_DATA; - } +#endif + // Allocate memory for each tile. + exr_image->tiles[tile_idx].images = tinyexr::AllocateImage( + num_channels, exr_header->channels, + exr_header->requested_pixel_types, exr_header->tile_size_x, + exr_header->tile_size_y); + + // 16 byte: tile coordinates + // 4 byte : data size + // ~ : data(uncompressed or compressed) + if (offsets[tile_idx] + sizeof(int) * 5 > size) { + // TODO(LTE): atomic + if (err) { + (*err) += "Insufficient data size.\n"; + } + err_code = TINYEXR_ERROR_INVALID_DATA; + break; + } - size_t data_size = size_t(size - (offsets[tile_idx] + sizeof(int) * 5)); - const unsigned char *data_ptr = - reinterpret_cast<const unsigned char *>(head + offsets[tile_idx]); + size_t data_size = + size_t(size - (offsets[tile_idx] + sizeof(int) * 5)); + const unsigned char *data_ptr = + reinterpret_cast<const unsigned char *>(head + offsets[tile_idx]); + + int tile_coordinates[4]; + memcpy(tile_coordinates, data_ptr, sizeof(int) * 4); + tinyexr::swap4( + reinterpret_cast<unsigned int *>(&tile_coordinates[0])); + tinyexr::swap4( + reinterpret_cast<unsigned int *>(&tile_coordinates[1])); + tinyexr::swap4( + reinterpret_cast<unsigned int *>(&tile_coordinates[2])); + tinyexr::swap4( + reinterpret_cast<unsigned int *>(&tile_coordinates[3])); + + // @todo{ LoD } + if (tile_coordinates[2] != 0) { + err_code = TINYEXR_ERROR_UNSUPPORTED_FEATURE; + break; + } + if (tile_coordinates[3] != 0) { + err_code = TINYEXR_ERROR_UNSUPPORTED_FEATURE; + break; + } - int tile_coordinates[4]; - memcpy(tile_coordinates, data_ptr, sizeof(int) * 4); - tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[0])); - tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[1])); - tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[2])); - tinyexr::swap4(reinterpret_cast<unsigned int *>(&tile_coordinates[3])); + int data_len; + memcpy(&data_len, data_ptr + 16, + sizeof(int)); // 16 = sizeof(tile_coordinates) + tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len)); - // @todo{ LoD } - if (tile_coordinates[2] != 0) { - return TINYEXR_ERROR_UNSUPPORTED_FEATURE; - } - if (tile_coordinates[3] != 0) { - return TINYEXR_ERROR_UNSUPPORTED_FEATURE; - } + if (data_len < 4 || size_t(data_len) > data_size) { + // TODO(LTE): atomic + if (err) { + (*err) += "Insufficient data length.\n"; + } + err_code = TINYEXR_ERROR_INVALID_DATA; + break; + } - int data_len; - memcpy(&data_len, data_ptr + 16, - sizeof(int)); // 16 = sizeof(tile_coordinates) - tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len)); + // Move to data addr: 20 = 16 + 4; + data_ptr += 20; + + bool ret = tinyexr::DecodeTiledPixelData( + exr_image->tiles[tile_idx].images, + &(exr_image->tiles[tile_idx].width), + &(exr_image->tiles[tile_idx].height), + exr_header->requested_pixel_types, data_ptr, + static_cast<size_t>(data_len), exr_header->compression_type, + exr_header->line_order, data_width, data_height, + tile_coordinates[0], tile_coordinates[1], exr_header->tile_size_x, + exr_header->tile_size_y, static_cast<size_t>(pixel_data_size), + static_cast<size_t>(exr_header->num_custom_attributes), + exr_header->custom_attributes, + static_cast<size_t>(exr_header->num_channels), + exr_header->channels, channel_offset_list); + + if (!ret) { + // TODO(LTE): atomic + if (err) { + (*err) += "Failed to decode tile data.\n"; + } + err_code = TINYEXR_ERROR_INVALID_DATA; + } - if (data_len < 4 || size_t(data_len) > data_size) { - if (err) { - (*err) += "Insufficient data length.\n"; + exr_image->tiles[tile_idx].offset_x = tile_coordinates[0]; + exr_image->tiles[tile_idx].offset_y = tile_coordinates[1]; + exr_image->tiles[tile_idx].level_x = tile_coordinates[2]; + exr_image->tiles[tile_idx].level_y = tile_coordinates[3]; + +#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0) } - return TINYEXR_ERROR_INVALID_DATA; - } + })); + } // num_thread loop - // Move to data addr: 20 = 16 + 4; - data_ptr += 20; - - tinyexr::DecodeTiledPixelData( - exr_image->tiles[tile_idx].images, - &(exr_image->tiles[tile_idx].width), - &(exr_image->tiles[tile_idx].height), - exr_header->requested_pixel_types, data_ptr, - static_cast<size_t>(data_len), exr_header->compression_type, - exr_header->line_order, data_width, data_height, tile_coordinates[0], - tile_coordinates[1], exr_header->tile_size_x, exr_header->tile_size_y, - static_cast<size_t>(pixel_data_size), - static_cast<size_t>(exr_header->num_custom_attributes), - exr_header->custom_attributes, - static_cast<size_t>(exr_header->num_channels), exr_header->channels, - channel_offset_list); - - exr_image->tiles[tile_idx].offset_x = tile_coordinates[0]; - exr_image->tiles[tile_idx].offset_y = tile_coordinates[1]; - exr_image->tiles[tile_idx].level_x = tile_coordinates[2]; - exr_image->tiles[tile_idx].level_y = tile_coordinates[3]; - - exr_image->num_tiles = static_cast<int>(num_tiles); + for (auto &t : workers) { + t.join(); } + +#else + } +#endif + + if (err_code != TINYEXR_SUCCESS) { + return err_code; + } + + exr_image->num_tiles = static_cast<int>(num_tiles); } else { // scanline format // 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 ) { + 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 @@ -10944,85 +11042,118 @@ static int DecodeChunk(EXRImage *exr_image, const EXRHeader *exr_header, num_channels, exr_header->channels, exr_header->requested_pixel_types, data_width, data_height); -#ifdef _OPENMP +#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0) + std::vector<std::thread> workers; + std::atomic<int> y_count(0); + + int num_threads = std::max(1, int(std::thread::hardware_concurrency())); + if (num_threads > int(num_blocks)) { + num_threads = int(num_blocks); + } + + for (int t = 0; t < num_threads; t++) { + workers.emplace_back(std::thread([&]() { + int y = 0; + while ((y = y_count++) < int(num_blocks)) { + +#else + +#if TINYEXR_USE_OPENMP #pragma omp parallel for #endif for (int y = 0; y < static_cast<int>(num_blocks); y++) { - size_t y_idx = static_cast<size_t>(y); - - if (offsets[y_idx] + sizeof(int) * 2 > size) { - invalid_data = true; - } else { - // 4 byte: scan line - // 4 byte: data size - // ~ : pixel data(uncompressed or compressed) - size_t data_size = size_t(size - (offsets[y_idx] + sizeof(int) * 2)); - const unsigned char *data_ptr = - reinterpret_cast<const unsigned char *>(head + offsets[y_idx]); - - int line_no; - memcpy(&line_no, data_ptr, sizeof(int)); - int data_len; - memcpy(&data_len, data_ptr + 4, sizeof(int)); - tinyexr::swap4(reinterpret_cast<unsigned int *>(&line_no)); - tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len)); - - 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; +#endif + size_t y_idx = static_cast<size_t>(y); - if (num_lines <= 0) { + if (offsets[y_idx] + sizeof(int) * 2 > size) { invalid_data = true; } else { - // Move to data addr: 8 = 4 + 4; - data_ptr += 8; - - // Adjust line_no with data_window.bmin.y - - // 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]; - } + // 4 byte: scan line + // 4 byte: data size + // ~ : pixel data(uncompressed or compressed) + size_t data_size = + size_t(size - (offsets[y_idx] + sizeof(int) * 2)); + const unsigned char *data_ptr = + reinterpret_cast<const unsigned char *>(head + offsets[y_idx]); + + int line_no; + memcpy(&line_no, data_ptr, sizeof(int)); + int data_len; + memcpy(&data_len, data_ptr + 4, sizeof(int)); + tinyexr::swap4(reinterpret_cast<unsigned int *>(&line_no)); + tinyexr::swap4(reinterpret_cast<unsigned int *>(&data_len)); + + if (size_t(data_len) > data_size) { + invalid_data = true; - if (line_no < 0) { + } 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 { - if (!tinyexr::DecodePixelData( - exr_image->images, exr_header->requested_pixel_types, - data_ptr, static_cast<size_t>(data_len), - exr_header->compression_type, exr_header->line_order, - data_width, data_height, data_width, y, line_no, - num_lines, static_cast<size_t>(pixel_data_size), - static_cast<size_t>(exr_header->num_custom_attributes), - exr_header->custom_attributes, - static_cast<size_t>(exr_header->num_channels), - exr_header->channels, channel_offset_list)) { + // 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; + + if (num_lines <= 0) { invalid_data = true; + } else { + // Move to data addr: 8 = 4 + 4; + data_ptr += 8; + + // Adjust line_no with data_window.bmin.y + + // 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; + } else { + if (!tinyexr::DecodePixelData( + exr_image->images, exr_header->requested_pixel_types, + data_ptr, static_cast<size_t>(data_len), + exr_header->compression_type, exr_header->line_order, + data_width, data_height, data_width, y, line_no, + num_lines, static_cast<size_t>(pixel_data_size), + static_cast<size_t>( + exr_header->num_custom_attributes), + exr_header->custom_attributes, + static_cast<size_t>(exr_header->num_channels), + exr_header->channels, channel_offset_list)) { + invalid_data = true; + } + } } } } + +#if (__cplusplus > 199711L) && (TINYEXR_USE_THREAD > 0) } - } + })); + } + + for (auto &t : workers) { + t.join(); + } +#else } // omp parallel +#endif } if (invalid_data) { @@ -11219,6 +11350,9 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header, tinyexr::SetErrorMessage(e, err); } +#if 1 + FreeEXRImage(exr_image); +#else // release memory(if exists) if ((exr_header->num_channels > 0) && exr_image && exr_image->images) { for (size_t c = 0; c < size_t(exr_header->num_channels); c++) { @@ -11230,16 +11364,114 @@ static int DecodeEXRImage(EXRImage *exr_image, const EXRHeader *exr_header, free(exr_image->images); exr_image->images = NULL; } +#endif } return ret; } } +static void GetLayers(const EXRHeader& exr_header, std::vector<std::string>& layer_names) { + // Naive implementation + // Group channels by layers + // go over all channel names, split by periods + // collect unique names + layer_names.clear(); + for (int c = 0; c < exr_header.num_channels; c++) { + std::string full_name(exr_header.channels[c].name); + const size_t pos = full_name.find_last_of('.'); + if (pos != std::string::npos && pos != 0 && pos + 1 < full_name.size()) { + full_name.erase(pos); + if (std::find(layer_names.begin(), layer_names.end(), full_name) == layer_names.end()) + layer_names.push_back(full_name); + } + } +} + +struct LayerChannel { + explicit LayerChannel (size_t i, std::string n) + : index(i) + , name(n) + {} + size_t index; + std::string name; +}; + +static void ChannelsInLayer(const EXRHeader& exr_header, const std::string layer_name, std::vector<LayerChannel>& channels) { + channels.clear(); + for (int c = 0; c < exr_header.num_channels; c++) { + std::string ch_name(exr_header.channels[c].name); + if (layer_name.empty()) { + const size_t pos = ch_name.find_last_of('.'); + if (pos != std::string::npos && pos < ch_name.size()) { + ch_name = ch_name.substr(pos + 1); + } + } else { + const size_t pos = ch_name.find(layer_name + '.'); + if (pos == std::string::npos) + continue; + if (pos == 0) { + ch_name = ch_name.substr(layer_name.size() + 1); + } + } + LayerChannel ch(size_t(c), ch_name); + channels.push_back(ch); + } +} + } // namespace tinyexr +int EXRLayers(const char *filename, const char **layer_names[], int *num_layers, const char **err) { + EXRVersion exr_version; + EXRHeader exr_header; + InitEXRHeader(&exr_header); + + { + int ret = ParseEXRVersionFromFile(&exr_version, filename); + if (ret != TINYEXR_SUCCESS) { + tinyexr::SetErrorMessage("Invalid EXR header.", err); + return ret; + } + + if (exr_version.multipart || exr_version.non_image) { + tinyexr::SetErrorMessage( + "Loading multipart or DeepImage is not supported in LoadEXR() API", + err); + return TINYEXR_ERROR_INVALID_DATA; // @fixme. + } + } + + int ret = ParseEXRHeaderFromFile(&exr_header, &exr_version, filename, err); + if (ret != TINYEXR_SUCCESS) { + FreeEXRHeader(&exr_header); + return ret; + } + + std::vector<std::string> layer_vec; + tinyexr::GetLayers(exr_header, layer_vec); + + (*num_layers) = int(layer_vec.size()); + (*layer_names) = static_cast<const char **>( + malloc(sizeof(const char *) * static_cast<size_t>(layer_vec.size()))); + for (size_t c = 0; c < static_cast<size_t>(layer_vec.size()); c++) { +#ifdef _MSC_VER + (*layer_names)[c] = _strdup(layer_vec[c].c_str()); +#else + (*layer_names)[c] = strdup(layer_vec[c].c_str()); +#endif + } + + FreeEXRHeader(&exr_header); + return TINYEXR_SUCCESS; +} + int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, const char **err) { + return LoadEXRWithLayer(out_rgba, width, height, filename, /* layername */NULL, err); +} + +int LoadEXRWithLayer(float **out_rgba, int *width, int *height, const char *filename, const char *layername, + const char **err) { if (out_rgba == NULL) { tinyexr::SetErrorMessage("Invalid argument for LoadEXR()", err); return TINYEXR_ERROR_INVALID_ARGUMENT; @@ -11254,7 +11486,9 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, { int ret = ParseEXRVersionFromFile(&exr_version, filename); if (ret != TINYEXR_SUCCESS) { - tinyexr::SetErrorMessage("Invalid EXR header.", err); + std::stringstream ss; + ss << "Failed to open EXR file or read version info from EXR file. code(" << ret << ")"; + tinyexr::SetErrorMessage(ss.str(), err); return ret; } @@ -11281,6 +11515,7 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, } } + // TODO: Probably limit loading to layers (channels) selected by layer index { int ret = LoadEXRImageFromFile(&exr_image, &exr_header, filename, err); if (ret != TINYEXR_SUCCESS) { @@ -11294,19 +11529,40 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, int idxG = -1; int idxB = -1; int idxA = -1; - for (int c = 0; c < exr_header.num_channels; c++) { - if (strcmp(exr_header.channels[c].name, "R") == 0) { - idxR = c; - } else if (strcmp(exr_header.channels[c].name, "G") == 0) { - idxG = c; - } else if (strcmp(exr_header.channels[c].name, "B") == 0) { - idxB = c; - } else if (strcmp(exr_header.channels[c].name, "A") == 0) { - idxA = c; + + std::vector<std::string> layer_names; + tinyexr::GetLayers(exr_header, layer_names); + + std::vector<tinyexr::LayerChannel> channels; + tinyexr::ChannelsInLayer(exr_header, layername == NULL ? "" : std::string(layername), channels); + + if (channels.size() < 1) { + tinyexr::SetErrorMessage("Layer Not Found", err); + FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); + return TINYEXR_ERROR_LAYER_NOT_FOUND; + } + + size_t ch_count = channels.size() < 4 ? channels.size() : 4; + for (size_t c = 0; c < ch_count; c++) { + const tinyexr::LayerChannel &ch = channels[c]; + + if (ch.name == "R") { + idxR = int(ch.index); + } + else if (ch.name == "G") { + idxG = int(ch.index); + } + else if (ch.name == "B") { + idxB = int(ch.index); + } + else if (ch.name == "A") { + idxA = int(ch.index); } } - if (exr_header.num_channels == 1) { + if (channels.size() == 1) { + int chIdx = int(channels.front().index); // Grayscale channel only. (*out_rgba) = reinterpret_cast<float *>( @@ -11333,19 +11589,19 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, const int srcIdx = i + j * exr_header.tile_size_x; unsigned char **src = exr_image.tiles[it].images; (*out_rgba)[4 * idx + 0] = - reinterpret_cast<float **>(src)[0][srcIdx]; + reinterpret_cast<float **>(src)[chIdx][srcIdx]; (*out_rgba)[4 * idx + 1] = - reinterpret_cast<float **>(src)[0][srcIdx]; + reinterpret_cast<float **>(src)[chIdx][srcIdx]; (*out_rgba)[4 * idx + 2] = - reinterpret_cast<float **>(src)[0][srcIdx]; + reinterpret_cast<float **>(src)[chIdx][srcIdx]; (*out_rgba)[4 * idx + 3] = - reinterpret_cast<float **>(src)[0][srcIdx]; + reinterpret_cast<float **>(src)[chIdx][srcIdx]; } } } } else { for (int i = 0; i < exr_image.width * exr_image.height; i++) { - const float val = reinterpret_cast<float **>(exr_image.images)[0][i]; + const float val = reinterpret_cast<float **>(exr_image.images)[chIdx][i]; (*out_rgba)[4 * i + 0] = val; (*out_rgba)[4 * i + 1] = val; (*out_rgba)[4 * i + 2] = val; @@ -11358,22 +11614,22 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename, if (idxR == -1) { tinyexr::SetErrorMessage("R channel not found", err); - // @todo { free exr_image } FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); return TINYEXR_ERROR_INVALID_DATA; } if (idxG == -1) { tinyexr::SetErrorMessage("G channel not found", err); - // @todo { free exr_image } FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); return TINYEXR_ERROR_INVALID_DATA; } if (idxB == -1) { tinyexr::SetErrorMessage("B channel not found", err); - // @todo { free exr_image } FreeEXRHeader(&exr_header); + FreeEXRImage(&exr_image); return TINYEXR_ERROR_INVALID_DATA; } @@ -11446,7 +11702,7 @@ int IsEXR(const char *filename) { int ret = ParseEXRVersionFromFile(&exr_version, filename); if (ret != TINYEXR_SUCCESS) { - return TINYEXR_ERROR_INVALID_HEADER; + return ret; } return TINYEXR_SUCCESS; @@ -11509,7 +11765,9 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height, int ret = ParseEXRVersionFromMemory(&exr_version, memory, size); if (ret != TINYEXR_SUCCESS) { - tinyexr::SetErrorMessage("Failed to parse EXR version", err); + std::stringstream ss; + ss << "Failed to parse EXR version. code(" << ret << ")"; + tinyexr::SetErrorMessage(ss.str(), err); return ret; } @@ -11967,9 +12225,11 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image, } #endif + // TOOD(LTE): C++11 thread + // Use signed int since some OpenMP compiler doesn't allow unsigned type for // `parallel for` -#ifdef _OPENMP +#if TINYEXR_USE_OPENMP #pragma omp parallel for #endif for (int i = 0; i < num_blocks; i++) { diff --git a/thirdparty/vhacd/0005-fix-scale-calculation.patch b/thirdparty/vhacd/0005-fix-scale-calculation.patch new file mode 100644 index 0000000000..4b05f64fbf --- /dev/null +++ b/thirdparty/vhacd/0005-fix-scale-calculation.patch @@ -0,0 +1,20 @@ +diff --git a/thirdparty/vhacd/inc/vhacdVolume.h b/thirdparty/vhacd/inc/vhacdVolume.h +index 8c47fa1e2c..c445f20122 100644 +--- a/thirdparty/vhacd/inc/vhacdVolume.h ++++ b/thirdparty/vhacd/inc/vhacdVolume.h +@@ -316,13 +316,13 @@ void Volume::Voxelize(const T* const points, const uint32_t stridePoints, const + + double d[3] = { m_maxBB[0] - m_minBB[0], m_maxBB[1] - m_minBB[1], m_maxBB[2] - m_minBB[2] }; + double r; +- if (d[0] > d[1] && d[0] > d[2]) { ++ if (d[0] >= d[1] && d[0] >= d[2]) { + r = d[0]; + m_dim[0] = dim; + m_dim[1] = 2 + static_cast<size_t>(dim * d[1] / d[0]); + m_dim[2] = 2 + static_cast<size_t>(dim * d[2] / d[0]); + } +- else if (d[1] > d[0] && d[1] > d[2]) { ++ else if (d[1] >= d[0] && d[1] >= d[2]) { + r = d[1]; + m_dim[1] = dim; + m_dim[0] = 2 + static_cast<size_t>(dim * d[0] / d[1]); diff --git a/thirdparty/vhacd/inc/vhacdVolume.h b/thirdparty/vhacd/inc/vhacdVolume.h index 8c47fa1e2c..c445f20122 100644 --- a/thirdparty/vhacd/inc/vhacdVolume.h +++ b/thirdparty/vhacd/inc/vhacdVolume.h @@ -316,13 +316,13 @@ void Volume::Voxelize(const T* const points, const uint32_t stridePoints, const double d[3] = { m_maxBB[0] - m_minBB[0], m_maxBB[1] - m_minBB[1], m_maxBB[2] - m_minBB[2] }; double r; - if (d[0] > d[1] && d[0] > d[2]) { + if (d[0] >= d[1] && d[0] >= d[2]) { r = d[0]; m_dim[0] = dim; m_dim[1] = 2 + static_cast<size_t>(dim * d[1] / d[0]); m_dim[2] = 2 + static_cast<size_t>(dim * d[2] / d[0]); } - else if (d[1] > d[0] && d[1] > d[2]) { + else if (d[1] >= d[0] && d[1] >= d[2]) { r = d[1]; m_dim[1] = dim; m_dim[0] = 2 + static_cast<size_t>(dim * d[0] / d[1]); |